CUBE SUGAR CONTAINER

技術系のこと書きます。

macOS Sierra から Ubuntu 16.04 LTS のディスクを NFS でマウントする

普段の開発環境として 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 をマウントして作業するための準備が整った。

めでたしめでたし。