ufwの設定

様々なportを開ける

ufwをenableにするとportが全部閉じます。したがって、まずsshを通しておくか、

sudo ufw allow 22 

もしくは、クラスタの内側のポートを全部開けてもいいなら

sudo ufw allow from 192.168.1.0/24 
sudo ufw allow from 123.123.0.0/16 

などとすればよいです。設定の確認は次のようにします。

sudo ufw status 

ufwをオンにするには、

sudo ufw enable 

停止は次のとおり。

sudo ufw disable

設定を消すには、例えば、

sudo ufw delete allow 22

NAT

/etc/default/ufwの変更

DEFAULT_FORWARD_POLICY="ACCEPT"

/etc/ufw/sysctl.confの変更

net/ipv4/ip_forward=1 

/etc/ufw/before.rulesの最初に次の設定を追加する。

# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]

# Forward traffic from eth1 through eth0.
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT

ufwの再起動が必要。

sudo ufw disable && sudo ufw enable

LDAP設定まとめ

設定の流れはこちら。https://help.ubuntu.com/community/OpenLDAPServer

インストール

LDAPサーバ

slapdのインストールの前に、/etc/hostsの

127.0.1.1 hostname.local.domain hostname 

部分を、dc=local,dc=domainと対応するように書きかえて再起動。これはインストールが終わったあとに元に戻してもよい。 rootDNがインストール時に自動的に作成される。rootDNはslapcatで確認できる。

sudo apt-get install slapd ldap-utils

LDAPクライアント

sudo apt install -y libnss-ldapd ldap-auth-config ldap-auth-client
sudo auth-client-config -t nss -p lac_ldap
sudo pam-auth-update

設定を聞かれるので、適当に答える。 例えば

ldap://192.168.1.1/
dc=local,dc=domain
1
yes
no
cn=admin,dc=local,dc=domain
ldappassword

設定に失敗した場合は、

sudo dpkg-reconfigure ldap-auth-config 

とすればやり直すことができる。そして、

sudo auth-client-config -t nss -p lac_ldap

と、ただコマンドをうつ(おまじない)。次に、

sudo pam-auth-update 

でデフォルトのまま(全部選ぶ)OKする。動作確認は

% ldapsearch -x -LLL -b dc=local,dc=domain -h 192.168.1.1

Ubuntu 18.04ではlibnss-ldapが原因でログインが進まなかった。この場合代わりにlabnss-ldapdを使う。 https://askubuntu.com/questions/797896/16-04-server-enabling-ldap-authentication-causes-systemd-logind-to-fail

認証がうまくいかないとき

LDAPアカウントとローカルマシンのUNIXアカウントなど、アカウントが衝突するときは、/etc/nsswitch.confにしたがって、優先順位が決まる。前に書いてある方が優先される。次の例の場合は、LDAP > ロカールファイル。

# pre_auth-client-config # passwd:         compat systemd ldap
passwd: ldap files
# pre_auth-client-config # group:          compat systemd ldap
group: ldap files
# pre_auth-client-config # shadow:         compat ldap
shadow: ldap files

これでもうまくいかない時は、uderdelでUNIXアカウントを消す。

passwdコマンドでのpasswordの変更

passwdコマンドを使うには、/etc/pam.d/common-passwordの編集が必要。 use_authtokを消すと良い。

設定など

状況確認。

% ldapsearch -x -LLL -H ldap:/// -b dc=local,dc=domain dn
dn: dc=local,dc=domain
dn: cn=admin,dc=local,dc=domain

ユーザとグループを管理するためのpeopleとgroupsノードを作る。

dn: ou=people,dc=local,dc=domain
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=local,dc=domain
objectClass: organizationalUnit
ou: groups

ldapsearch

ldapsearch -x -D "cn=admin,dc=local,dc=domain" -b "dc=local,dc=domain" "*" -w "<ldappassword>"

gridengineのまとめ

無くなりそうでなくならないのでしぶとく使っています。

Ubuntu 22.04

対応するパッケージはこれかな? (https://packages.ubuntu.com/search?keywords=gridengine)

% wget http://ftp.debian.org/debian/pool/main/g/gridengine/gridengine-client_8.1.9+dfsg-10+b1_amd64.deb

Ubuntu 20.04へのインストール

Ubuntu 18.04と同様apt installが失敗する。パッケージは変わっていないようなので、対応は以下のページ書いている方法(3.2. gridengine-clientの修正)でうまくいくようだ。ありがとうございます。とても助かりました。

手順: gridengine-clientが他のパッケージのインストールを阻害するということなので、

% sudo apt install gridengine-client
% wget http://ftp.debian.org/debian/pool/main/g/gridengine/gridengine-client_8.1.9+dfsg-9_amd64.deb
% mkdir gec
% dpkg -X gridengine-client_8.1.9+dfsg-9_amd64.deb gec
% cd gec/usr/lib/gridengine
% sudo cp libspoolb.so libspoolc.so spooldefaults.bin /usr/lib/gridengine
% sudo apt install gridengine-master gridengine-qmon gridengine-exec

(参照先に書いているシンボリックリンク先のファイルがある場合はシンボリックリンクは不要であるか)

qmonが以下のようにうまくいかない時は空の.Xauthorityを作れば良い(つまりtouch /root/.Xauthority)。

% sudo qmon
X11 connection rejected because of wrong authentication. Error: Can't open display: localhost:10.0

ワイルドカード

キューや並列環境を指定するときにワイルドカードが使えます(例えば*)。man sge_types

例1:

qsub -q "queue*" calc.sh 

例2:

#$ -pe mpi* 4 

リソースオプション

h_rt 単位は秒。

qsub -l h_rt=3600 

は1時間。

qsub -l h_rt=1:20:30 

は1時間20分30秒。

qstatコマンド

qstat -f( -f はfullの意味)だとノード毎に自分のジョブの情報しか出力されません.

qstat -u "*"

とすると,全てのユーザのジョブの情報が出力されます.

インストール

Ubuntuならaptitudeで可能です。

親ノード

gridengine-client gridengine-common gridengine-master gridengine-qmon 

qmasterは/var/lib/gridengine/boston/common/act_qmasterに書いてある。hostnameで決まる名前を見て自動的にact_qmasterが書き換えられるもよう。qmasterへの接続にはこの名前が重要そうだ。

子ノード

gridengine-exec gridengine-client 

PEのパラメータ

  • slots: トータルの動かしたいコア数
  • Control Slaves: よく分からないけどとにかくTrueにする。
  • Allocation rule: $fill_upがよさそう。詳しくはman sge_pe。

ハブをまたがないようにする

ハブをまたがないホストグループごとに複数のキューを作ります。それに加え、別々の名前で作った並列環境(PE)をそれぞれのキューに割り当てます。ジョブを投げるときにアスタリスクつきのPEオプションを付けると、リソースマネージャが適当にジョブの分配をやってくれます。

スケジューリング、ポリシーの設定

Policy configuration --> Share Tree Policy を開く。ツリーのRoot --> defaultusers にユーザーを追加する。shareは他のユーザーのshareを見てバランスを見て決める。

ジョブの走っていないノードにのみジョブを配る

qconf -mcで次の行を追加

exclusive excl BOOL EXCL YES YES 1 1000 

各ノードにexclusive schedulingを理解させるために、qconf -me <hostname>

complex_values exclusive=true 

とします。実際はノードがたくさんあるのでqconf -Meを使ったほうが効率的です。

私のクラスタの上記defaultは1にしています。つまり、デフォルトスケジューリングがexclusiveになっています。例えば1コアだけの計算を大量に投げたいなど、exclusiveにスケジューリングする必要がないジョブに関しては、

qsub -l exclusive=false 

としてジョブを投げれば良いです。

コマンドラインからの設定

qconfで行う。Ubuntu18.04の場合、デフォルトの基本設定は/etc/gridengine/configurationに書いているが、このファイルを書き換えてもなにもおこらない。このファイルに対応する設定は、qocnf -mconfで行う。man qconfおよび、man sge_confを参照のこと。

administration hostの追加

qconf -ah 

Submit hostの追加

qconf -as 

execution hostの追加

qconf -ae 

execution hostの表示

qconf -sel 

execution hostのファイルを使った追加

qconf -seで表示された内容をファイルに書き出して、hostnameの部分だけ書き換えて、

qconf -Ae filename

で追加すると楽かもしれません。

usersetへの追加

qconf -au user-name userset-name 

usersetの表示

qconf -sul 

usersetの中身の表示

qconf -su userset-name 

defined userへの追加

qconf -auser 

defined userを表示する

qconf -suserl 

defined userの中身の表示

qconf -suser user-name 

ホストグループの追加

qconf -ahgrp group-name 

group-nameは@から始まるようにする。

ホストグループの変更

qconf -mhgrp group-name 

ホストグループのリスト

qconf -shgrpl 

PEのリスト

qconf -spl 

PEの内容の表示

qconf -sp pe_name 

ファイルからPEの追加

qconf -Ap pe-conf-file 

設定ファイルの例:

pe_name            mpia
slots              720
user_lists         arusers
xuser_lists        NONE
start_proc_args    /bin/true
stop_proc_args     /bin/true
allocation_rule    $fill_up
control_slaves     TRUE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary FALSE
qsort_args         NONE

キューのリスト

qconf -sql 

キューの内容の表示

qconf -sq queue_name 

ファイルからのキューの追加

qconf -Aq queue_file 

Policyの内容の表示

qconf -sstree 

Policy内容の変更

qconf -mstree 

スケジューラの内容の表示

qconf -ssconf 

キューインスタンスのコントロール

マシンへジョブが走らないようにしたり、もとに戻したりするためにはqmodを使います。

キューインスタンスを止める(例えばqueue-aのnode05)

qmod -d queue-a@node05 

キューインスタンスの名前はqhost -qで見ることができます。

キューインスタンスの状態の確認

qhost -q 

トラブル

ジョブを大量投入したときにsge_qmasterがメモリを使いまくる

schedd_job_infoをfalseにすると改善する。qmonのスケジューラの設定で変更できる。もしくはqconf -msconf

ホスト名の食い違いでgridengine-masterと通信できない

error: commlib error: access denied (client IP resolved to host name "localhost". This is not identical to clients host name "myhostname")
unable to contact qmaster using port 6444 on host "myhostname"

gridengineがどの名前を優先しているかは、gridengine-masterを起動した時に/var/lib/gridengine/cluster-name/common/act_qmasterに書き込まれるものを参考にする。

ゴールはシステム側の名前解決の優先順位との食い違いをなくすこと。

DNSから名前が降りてくる場合は、/etc/hosts内にlocalhost以外にDNSから来る名前を書き込んで、/etc/hosts内の順番を上にする。

kvmなどで固定IPアドレスと名前が決まっている場合は127.0.1.1をそのアドレスに変更したのち/etc/hosts内の順番を上にする。

locahostへの設定

localhostの名前(仮myhostname)をチェックする。

% hostname
myhostname

Submit hostへの追加。

% sudo qconf -as myhostname

arusersに自分のアカウント名(仮myname)を追加。

% sudo qconf -au myname arusers
% qconf -su arusers
name    arusers
type    ACL
fshare  0
oticket 0
entries myname

defaultという名前のqueueとdefaultという名前のpeを作る。 (名前はdefaultじゃなくてもなんでも良い。)

% sudo qconf -Ap default-pe
% sudo qconf -Aq default-q

default-peとdefault-qはたとえば以下のような内容。

% qconf -spl
default
% qconf -sp default
pe_name            default
slots              1
user_lists         arusers
xuser_lists        NONE
start_proc_args    /bin/true
stop_proc_args     /bin/true
allocation_rule    $fill_up
control_slaves     TRUE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary FALSE
qsort_args         NONE
% qconf -sql
default

(mylocalhostを書き換えを忘れずに)

% qconf -sq default
qname                 default
hostlist              mylocalhost
seq_no                0
load_thresholds       np_load_avg=1.75
suspend_thresholds    NONE
nsuspend              1
suspend_interval      00:05:00
priority              0
min_cpu_interval      00:05:00
processors            UNDEFINED
qtype                 BATCH INTERACTIVE
ckpt_list             NONE
pe_list               default make
rerun                 FALSE
slots                 1
tmpdir                /tmp
shell                 /bin/csh
prolog                NONE
epilog                NONE
shell_start_mode      posix_compliant
starter_method        NONE
suspend_method        NONE
resume_method         NONE
terminate_method      NONE
notify                00:00:60
owner_list            NONE
user_lists            arusers
xuser_lists           NONE
subordinate_list      NONE
complex_values        NONE
projects              NONE
xprojects             NONE
calendar              NONE
initial_state         default
s_rt                  INFINITY
h_rt                  INFINITY
s_cpu                 INFINITY
h_cpu                 INFINITY
s_fsize               INFINITY
h_fsize               INFINITY
s_data                INFINITY
h_data                INFINITY
s_stack               INFINITY
h_stack               INFINITY
s_core                INFINITY
h_core                INFINITY
s_rss                 INFINITY
h_rss                 INFINITY
s_vmem                INFINITY
h_vmem                INFINITY

localhostのhostnameが変わった時 (queueの名前はdefaultとする)

sudo qconf -ds oldhostname
sudo qconf -dh oldhostname
sudo qconf -mq default    # oldhostname -> newhostname
sudo qconf -de oldhostname
sudo qconf -as newhostname

NFS上でのHDF5

HDF5のv1.10.0から"File Locking under SWMR"から実装されたことで、NFSマウントしたファイルシステム上でhdf5にアクセスできなくなった。

https://support.hdfgroup.org/HDF5/docNewFeatures/SWMR/Design-HDF5-FileLocking.pdf

以前はHDF5をダウングレードしていたが、環境変数の設定でfile lockingを外すことができるとのこと。

export HDF5_USE_FILE_LOCKING=FALSE

これはv1.10.1で実装されたようだ。 https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.1/src/hdf5-1.10.1-RELEASE.txt

anacondaのhdf5

hdf5(1.10.x)がNFSクライアント側で使えない。hdf5(1.8.x)は大丈夫そうなのでダウングレードする。anacondaチャネルのものは依存関係がややこしいのでconda-forgeのものを使う。インストールは以下のようにする。

conda install -c conda-forge hdf5=1.8.20

conda build実行時のパッケージの依存関係でハマった

原因はこれのようだ。

No numpy version specified in conda_build_config.yaml.  Falling back to default numpy value of 1.11
WARNING:conda_build.metadata:No numpy version specified in conda_build_config.yaml.  Falling back to default numpy value of 1.11

meta.yamlに以下のようにすれば、適当に解決してくれた。

    - numpy>=1.11

conda buildで複数のチャネルを与える

つなげて書くと良いようだ。左から順に優先順位が高い模様。

% conda build conda -c https://conda.anaconda.org/conda-forge -c https://conda.anaconda.org/somechannel ...

travis-CI上でpypi manylinux wheelを作ってdeployする方法

まずは、パッケージを作る。この例に従って作れば良い。

GitHub - pypa/python-manylinux-demo: Demo project for building Python wheels for Linux with Travis-CI

次に、setup.pyと同じディレクトリにdistというディレクトリを作り、上のパッケージをこの中にコピーする。

最後に、コピーしたwheel達がなくならないように、.travis.ymlskip_cleanup: truecleanup: falseを加える。前者はwarningが出るけど、今は気にしない。

- provider: pypi
  skip_existing: true
  skip_cleanup: true
  cleanup: false

KVMゲストOSのvda容量を広げる

How To extend/increase KVM Virtual Machine (VM) disk size | ComputingForGeeks

How To resize an ext2/3/4 and XFS root partition without LVM | ComputingForGeeks

% sudo qemu-img resize /kvm_images/mykvm.qcow2 +50G
% sudo qemu-img info /kvm_images/mykvm.qcow2
% sudo virsh start mykvm
% ssh mykvm
% lsblk
% sudo apt -y install cloud-guest-utils
% sudo growpart /dev/vda 1
% lsblk
% sudo resize2fs /dev/vda1
% df -hT|grep /dev/vda