====== 概要 ======
* 実際に数値計算を行う際、たくさんある計算ノードの一つ一つにプログラムや入力ファイルをコピーするのは面倒です
* そこで、ファイルは1つのファイルサーバに集約して置いておき、各計算ノードは計算のたびにそこからファイルを読み込むようにします
* 分散ファイルシステムの一つであるNetwork File System (NFS)を利用します
* ファイルサーバとして管理ノード(IPアドレス: 192.168.0.1)を使用しますが、複数ノードを使った並列計算中にファイルのやりとりが加わると通信速度が著しく低下するので、別途専用のサーバーを立てるのもありです。
====== 設定手順 ======
===== 管理ノード =====
- NFSのファイルサーバ用のパッケージをインストールします
$ sudo apt install nfs-kernel-server
- 設定ファイルに、共有したいディレクトリと、そのディレクトリを共有するネットワークを指定します
$ sudo vi /etc/exports
/home 192.168.0.0/24(rw,async,no_subtree_check)
/opt 192.168.0.0/24(ro,no_subtree_check)
* ここでは次のディレクトリを共有します
* /home/ ... ホーム・ディレクトリ
* /opt/ ... 各種ソフトウェアがインストールされるディレクトリ
* オプションの意味は次の通りです
* rw ... ファイルの読み書き (read-and-write) が可能。設定しなければ ro (read-only)となり、ファイルの書き換えができない
* async ... 非同期書き込み。設定しなければ sync (同期) になり、クライアントでファイルの書き換えが実行されたときはファイルサーバのファイルもその都度書き換わるが、パフォーマンスが落ちる。ただし、同期前にクライアントがシャットダウンするなどした場合、ファイルの情報は完全に失われる(そういう状況はあまり発生しないと思います)。
* no_subtree_check ... サブツリーチェックを無効化。サブツリーチェックとは、エクスポートしたディレクトリの中にあるファイルを読み込む際に、そのファイルが本当にそのディレクトリに存在するかをチェックすること。これをなくすと動作が少し早くなる。エクスポートつけておくのが推奨
- (UFWを使用している場合)NFS用のポートを開放します
$ sudo ufw allow from 192.168.0.0/24 to any port nfs
- NFSサーバを再起動します
$ sudo systemctl restart nfs-kernel-server
===== 計算ノード =====
すべての計算ノードで作業する必要があります。
管理ノードからSSHでつないで作業しましょう。
- NFSのクライアント用のパッケージをインストールします
$ sudo apt install nfs-common
- ファイルサーバーのIPアドレスと同期するディレクトリを指定します
$ sudo vi /etc/fstab
#ファイルの最後に次のように書き加えます
192.168.0.1:/home /home nfs defaults 0 0
192.168.0.1:/opt /opt nfs defaults 0 0
* 名前解決ができる場合、IPアドレスの代わりにホスト名でも可能です
- ファイルサーバのディレクトリをマウントします
$ sudo mount -a
- マウントが成功したか確認します
$ df -h
Filesystem Size Used Avail Use% Mounted on
(略)
192.168.0.1:/home 1.8T 8.0G 1.7T 1% /home
192.168.0.1:/opt 1.8T 8.0G 1.7T 1% /opt
- 実際に管理ノードでファイルを作ってみて、計算ノードでそのファイルが反映したか確認してみましょう
NFSサーバを使用しなくなった場合、次のようにマウントを解除します
$ sudo umount -a
==== トラブルシューティング ====
=== 起動時に自動マウントされない ===
(自分の環境では未解決です)
ネットワークよりも先にNFSが立ち上がると、このようなことがおきます。
/home以外がマウントされないことが多いようです。
(起動後に sudo mount -a と手動でコマンドを打てばマウントされます)
== _netdevを使ってみる ==
192.168.0.1:/home /home nfs defaults 0 0
192.168.0.1:/opt /opt nfs defaults,_netdev,nofail 0 0
* _netdev: ネットワークからマウントすることを明示
* nofail: エラーが出ても起動を続行
* 参考:https://docs.oracle.com/ja-jp/iaas/Content/Block/References/fstaboptions.htm
自分の環境では解決しませんでした。
== systemdのautomountを使ってみる ==
当該のディレクトリの初回アクセス時にマウントするように設定します。
192.168.0.1:/home /home nfs defaults 0 0
192.168.0.1:/opt /opt nfs x-systemd.automount 0 0
自分の環境だと/usr/localにx-systemd.automountを使うと計算ノードが起動しなくなりました。