Linux – NFS でリモートマシンのディレクトリをマウントする

目次

概要

Ubuntu で他のマシンのディレクトリをマウントする方法について解説します。

NFS (Network File System)

Unix 系の OS で利用されるネットワーク越しにストレージを共有するために利用される分散ファイルシステムです。NFS にはいくつかのバージョンがあり、現在のメジャーバージョンは v4 です。

  • NFS v1: サン・マイクロシステムズで開発された NFS の最初のバージョンです。社内で実験的な目的での使用にとどまり、リリースはされませんでした。(RFC 1094 – NFS: Network File System Protocol specification)
  • NFS v2: NFS v1 に改良を加えてリリースされたバージョンです。32ビットの制限により、2GBを超えるファイルは扱えませんでした。
  • NFS v3: NFS v2 から以下の機能を追加したバージョンです。
    • 2GB を超えるファイルのサポート
    • 非同期での NFS サーバーへの書き込みをサポートによるパフォーマンスの改善
  • NFS v4: NFS v3 からセキュリティ向上などの機能追加が行われました。4.1 が2010年、4.2が2016年にリリースされました。現在のシステムでは基本的に NFS v4 が使用されます。

NFS の仕組み

共有するマシン上に NFS サーバーを起動し、利用したいマシンの NFS クライアントからアクセスすることで実現します。 NFS クライアント、NFS サーバーのソフトウェアは OS によって異なりますが、Ubuntu 18.04/Ubuntu 20.04 の場合、以下の手順で実現できます。

NFS によるファイル共有の例

ディレクトリを共有するマシンの作業 (サーバー側)

1. NFS サーバーをインストールする

NFS サーバーをインストールします。

sudo apt install nfs-kernel-server

2. 共有ディレクトリを作成する

共有するディレクトリを作成します。既存のディレクトリを公開する場合は作成する必要はありません。 共有するディレクトリの所有をユーザーを nobody、グループを nogroup に変更します。

sudo mkdir -p /mnt/nfs_share
sudo chown -R nobody:nogroup /mnt/nfs_share

3. 設定ファイル /etc/exports を編集する

NFS サーバーの公開するファイルを規定する /etc/exports を編集します。

sudo vim /etc/exports

書式は 共有するディレクトリ 共有先のホスト(オプション) という形式で記載します。詳しい書式は 8.6. NFS サーバーの設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal を参照してください。

例えば、/mnt/nfs_share というディレクトリをホスト 192.168.3.30 に対して共有する場合、以下の記述します。

/mnt/nfs_share 192.168.3.30

4. NFS サーバーを起動する

NFS サーバーを起動します。

sudo service nfs-kernel-server restart

マウントするマシンの作業 (クライアント側)

1. NFS クライアントをインストールする

NFS クライアントをインストールします。

sudo apt install nfs-common

2. マウント先のディレクトリを作成する

マウントするためのディレクトリを作成します。

sudo mkdir -p /mnt/nfs_share

3. マウントする

mount コマンドでマウントします。

sudo mount -t nfs 共有するマシンのホスト:共有するディレクトリ マウント先のディレクトリ

例えば、共有するマシンのホスト 192.168.3.3、共有するディレクトリが /mnt/nfs_share、マウント先が /mnt/nfs_share とした場合、以下のコマンドでマウントできます。

sudo mount -t nfs 192.168.3.3:/mnt/nfs_share /mnt/nfs_share

アンマウントする

マウントを解除したい場合、umount マウント先のディレクトリ を実行します。

sudo umount /mnt/nfs_share

マウント中のディレクトリ一覧を表示する

mount コマンドでマウントしているディレクトリの一覧が出力されるので、そのうち、種類が nfs のものを抽出します。

mount | grep "type nfs"

再起動した場合に自動でマウントする場合

クライアント側のマシンが再起動した場合、再び mount コマンドでマウントしなおす必要があります。これを自動で行う場合は、/etc/fstab にマウントの設定を記載しておきます。

共有するマシンのホスト:共有するディレクトリ マウント先のディレクトリ nfs マウントの設定 0 0

例えば、共有するマシンのホスト 192.168.3.3、共有するディレクトリが /mnt/nfs_share、マウント先が /mnt/nfs_share とした場合、以下の行を追加します。

192.168.3.3:/mnt/nfs_share /mnt/nfs_share nfs defaults

/etc/exports の設定項目

公開先の指定方法

  1. 単一の IP またはホスト名を指定する (例: 192.168.3.30)
  2. サブネットマスクで IP アドレスを範囲指定する (例: 192.168.3.0/24)
  3. 指定がホスト名の場合にワイルドカードが使用できます。IP アドレスの指定には使用できません。(例: *hoge.com)

公開先は空白で区切ることで複数指定できます。

/mnt/nfs_share 192.168.3.30 192.168.3.31 192.168.3.32

オプションを指定する

ホストのあとに()をつけることで、その中に設定をカンマ区切りで指定できます。ただし、空白は複数の公開先を指定する際の区切り文字として認識されるため、空白を入れてはいけません。

/mnt/nfs_share 192.168.3.30(rw,no_root_squash) # OK
/mnt/nfs_share 192.168.3.30(rw,no_root_squash) 192.168.3.31(rw) # OK
/mnt/nfs_share 192.168.3.30 (rw,no_root_squash) # NG
/mnt/nfs_share 192.168.3.30(rw, no_root_squash) # NG

指定できるオプションには以下のものがあります。

  • 書き込み権限
    • ro: 共有ディレクトリに対する読み込みのみを許可します。(デフォルト)
    • rw: 共有ディレクトリに対する読み込み及び書き込みを許可します。rw を指定していても Linux の権限の仕組みは適用されるため、権限がないとマウント側から書き込むことはできません。
  • root ユーザーのマッピング
    • サーバー側のファイルに対するアクセス権限は、クライアント側のユーザーの uid、グループの gid に基づいて処理されます。
    • root_squash: クライアント側の root がサーバー側の root と同じアクセス権限があるのはセキュリティ上好ましくないため、クライアント側の uid=0 (root) または gid=0 (root) のリクエストは、それぞれ uid=65534 (nobady)、gid=65534 (nogroup) にマッピングします。(デフォルト)
  • root 以外のユーザーのマッピング
    • no_root_squash: クライアント側の uid=0 (root) または gid=0 (root) のリクエストをそのままマッピングします。
    • all_squash: クライアント側のすべての uid/gid のリクエストをそれぞれ uid=65534 (nobady)、gid=65534 (nogroup) にマッピングします。
    • no_all_squash: クライアント側の uid/gid のリクエスト (root は除く) をそのままマッピングします。(デフォルト)
  • anonuid=: マッピングする際の uid を指定します。デフォルトは 65534 (nobady) にマッピングされます。
  • anongid=: マッピングする際の gid を指定します。デフォルトは 65534 (nogroup) にマッピングされます。

設定変更後は sudo service nfs-kernel-server restart で NFS サーバーを再起動するか、sudo exportfs -a で NFS サーバーに変更を通知して反映させます。

参照先が削除され、Stale file handle というエラーが発生した場合

共有するマシン側で共有しているディレクトリが削除された場合、クライアント側のマシンのディレクトリでは、参照しようとすると、Stale file handle というエラーが発生します。

$ ls /mnt/nfs_share
ls: '/mnt/nfs_share' にアクセスできません: Stale file handle

umount しようとすると、device is busy となり、マウントの解除もできません。

$ umount /mnt/nfs_share
umount.nfs4: /mnt/nfs_share: device is busy

このようになった場合、mount -l でマウントを解除できます。

$ umount -l /mnt/nfs_share

コメント

コメントする

目次