普段の開発環境として Mac を使っているものの、一部の作業を別の Linux マシンでやりたい、という場面があった。 そこで Mac から Ubuntu のディスクを NFS でマウントすることにした。 こうすれば開発環境としては Mac を使いつつ、成果物を使った作業は Ubuntu に SSH でログインして実施できる。
今回使った環境は次の通り。 まず、NFS クライアントとなる Mac の OS は macOS Sierra を使っている。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.12.3 BuildVersion: 16D32
そして、NFS サーバとなる Ubuntu については 16.04 LTS を使った。 クライアントからマウントするときに IP アドレスの指定が必要なので 192.168.0.10/24 を割り振ってある。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS" $ uname -r 4.4.0-64-generic
Ubuntu
まずは Ubuntu で NFS サーバを構築していく。 NFS サーバの構築に必要なパッケージをインストールしよう。
$ sudo apt-get install -y nfs-kernel-server
次に NFS サーバで外部に公開するディレクトリを作成する。
ここでは /srv/nfs
を使うことにした。
クライアントからファイルの書き込みができるように権限も調整しておく。
$ sudo mkdir -p /srv/nfs $ sudo chmod a+w /srv/nfs
ディレクトリが用意できたら、次に NFS サーバの設定を行う。
これには /etc/exports
という設定ファイルを使う。
公開するディレクトリと、公開先のネットワーク、そしてオプションを指定する。
$ cat << 'EOF' | sudo tee -a /etc/exports > /dev/null /srv/nfs 192.168.0.0/24(rw,no_subtree_check) EOF
上記で指定しているオプションの意味は次の通り。 - rw: 書き込み権限を付与する - no_subtree_check: ファイルが見つからないときに子ディレクトリを探さない
設定が終わったら NFS サーバのサービスを起動する。
$ sudo systemctl start nfs-kernel-server
$ sudo systemctl enable nfs-kernel-server
exportfs
コマンドを使って状況を確認する。
次のように公開しているディレクトリやネットワーク、オプションが表示されれば上手くいっている。
$ sudo exportfs -v /srv/nfs 192.168.0.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,root_squash,no_all_squash)
手動マウント
これで NFS サーバは構築ができたので、次は NFS クライアントの Mac からそれをマウントしていく。 まずは手動で一時的にマウントするやり方から。
最初に NFS でマウントするための空ディレクトリを用意しておく。
$ sudo mkdir -p /Volumes/NFS
あとは mount_nfs
コマンドを使ってマウントするだけ。
NFS でマウントする元となる IP アドレスとディレクトリと、マウントする先のディレクトリを指定する。
$ sudo mount_nfs -P 192.168.0.10:/srv/nfs /Volumes/NFS
あとは、マウントしたディレクトリで色々と作業すれば良い。
$ cat << 'EOF' > /Volumes/NFS/greeting.txt Hello, World! EOF
ちゃんとファイルの書き込みもできている。
$ cat /Volumes/NFS/greeting.txt Hello, World!
Ubuntu の方で確認しても、ちゃんとファイルが書き込まれている。
$ cat /srv/nfs/greeting.txt Hello, World!
使い終わったらアンマウントしよう。
$ sudo umount /Volumes/NFS
自動マウント
先ほどのやり方では再起動するとアンマウントされてしまうので、主に一時的に使うための方法だった。 しかし、今回のユースケースでは恒常的にマウントしておきたい。 次は再起動してもマウントされ続けるやり方について。
まずは、先ほどと同じようにマウントするための空ディレクトリを用意しておく。 ただし、今回は新しくルートディレクトリ配下にディレクトリを用意することにした。 なぜなら、このやり方では指定したディレクトリを丸ごと使ってしまうため。 /Volumes は外付けハードディスクなどもマウントされる場所なので、専有してしまうのは困る。
$ sudo mkdir -p /mnt
次に /etc/auto_master という設定ファイルに先ほど用意したマウントポイントを書く。 そして、そのマウントポイントの設定ファイルの場所を指定する。 今回の例では設定ファイルを /etc/autofs_nfs という名前にしたけど、これは別になんでも構わない。
$ cat << EOF | sudo tee -a /etc/auto_master > /dev/null /mnt /etc/autofs_nfs EOF
上記のコマンドを実行すると、設定ファイルは次のようになる。 書式については auto_master(5) を参照のこと。
$ cat /etc/auto_master # # Automounter master map # +auto_master # Use directory service /net -hosts -nobrowse,hidefromfinder,nosuid /home auto_home -nobrowse,hidefromfinder /Network/Servers -fstab /- -static /mnt /etc/autofs_nfs
次に、先ほど指定したマウントポイントに対する設定ファイルを記述する。
ここはなんとなく NFS のオプションと近いので分かりやすいと思う。
最初に指定した NFS
というのがマウントするときのディレクトリ名になる。
つまり、/mnt/NFS という形でマウントされる。
$ cat << 'EOF' | sudo tee -a /etc/autofs_nfs > /dev/null NFS -fstype=nfs,rw,resvport 192.168.0.10:/srv/nfs EOF
できあがる設定ファイルは、こんな感じ。
$ cat /etc/autofs_nfs NFS -fstype=nfs,rw,resvport 192.168.0.10:/srv/nfs
あとは autofsd のサービスを起動する。
$ sudo launchctl stop com.apple.autofsd $ sudo launchctl start com.apple.autofsd
これでマウントされる。
$ mount | grep mnt map /etc/autofs_nfs on /mnt (autofs, automounted, nobrowse) 192.168.0.10:/srv/nfs on /mnt/NFS (nfs, nodev, nosuid, automounted, nobrowse) $ df -ah | grep mnt map /etc/autofs_nfs 0Bi 0Bi 0Bi 100% 0 0 100% /mnt 192.168.0.10:/srv/nfs 901Gi 7.6Gi 848Gi 1% 169558 59836842 0% /mnt/NFS
マウントされたディレクトリを見ると、先ほど書き込んだファイルも見えている。
$ cat /mnt/NFS/greeting.txt Hello, World!
これで、恒常的に NFS をマウントして作業するための準備が整った。
めでたしめでたし。
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログ (1件) を見る