NFSの設定とその理解
この記事ではNFSの設定方法をまとめます。また、ややこしい部分は解説としてまとめました。
※環境はラズパイにUbuntu server 25.04です。
NFSとは
ネットで共有
NFSはNetwork file system の略で、ネットワーク越しに他のサーバーが公開しているものを、ローカルディスクのようにマウントして使えるプロトコルです。
Googleドライブの共有みたいなもので、みんなでファイルやフォルダを見たり、編集できるようにします。
サーバーとクライアント
NFSはネット越しにディレクトリを共有するので、当然ディレクトリの元々の所有者は公開者(サーバー)となり、共有される側は閲覧者(クライアント)となります。
サーバーは公開したい(共有したい)ディレクトリをみんなで使えるようにし、クライアントはそれをマウントして使います。

構築
今回はラズパイを2台使ってNFSをやってみました。
この二つのラズパイはあらかじめSSHで繋がっています。SSHの設定方法はこの記事を参考にしてください。
上で説明した通り、NFSではサーバーとクライアントがいます。両者でやることが異なるので順番に解説します。
NFS Server
やることはこんな感じです↓
- インストール
- ディレクトリの作成
- ディレクトリの権限設定
- ディレクトリの公開
- ファイアウォールの設定
まずはNFSのサーバーとして必要なものをインストールします。
sudo apt update
sudo apt install nfs-kernel-server
インストールが終わったら、ディレクトリを公開するまでの設定を進めます。
今回はnfs_shareというディレクトリ/mntに作り、それを公開します。
また、このディレクトリがNFSでクライアントが使えるように権限の設定も以下のように行います。ここで何をやっているかはあとで説明します。
sudo mkdir -p /mnt/nfs_share
sudo chown nobody:nogroup /mnt/nfs_share
sudo chmod 777 /mnt/nfs_share
Linuxでは/etc/exportsというファイルで「どのディレクトリやファイルをどこに公開するか」を設定できます。
NFSで用いるディレクトリについても同ファイルに設定を書き込みます。
/mnt/nfs_share <client_ip>(rw,sync,no_subtree_check)
# 同じネットワーク内の全員に
/mnt/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check)
NFSのシステム本体(カーネル)に編集し/etc/exportsを読み込ませます。
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
さらに、ファイアウォールの設定もします。
これについても解説は後ほど、
sudo ufw allow from <client_ip> to any port nfs
# 同じネットワークにいる全員を許可する場合: 192.168.1.x の例
sudo ufw allow from 192.168.1.0/24 to any port nfs
NFS Client
クライアント側もNFS を使うにあたり必要な設定があります。
でも、サーバー側ほど面倒ではないです↓
- インストール
- ディレクトリの作成
- マウント
まずはクライアントとして必要なものをインストールします。
サーバー側とは別のものなので注意してください。
sudo apt update
sudo apt install nfs-common
NFS で使うディレクトリを作ります。今回はnfs_clientshareというディレクトリにします。
sudo mkdir -p /mnt/nfs_clientshare
サーバー側で/mnt/nfs_shareディレクトリを作ったのでそれをさっき作ったnfs_clientshareにマウントします。
sudo mount <server_ip>:/mnt/nfs_share /mnt/nfs_clientshare
これで完了です。テストとしててきとうにファイルを作ったり書き込んで、それがサーバーでもクライアントでも確認できるか見てみてください。
また、NFS も物理的なディスク同様、ただマウントするだけでは再起動後にアンマウントされてしまいます。永続的にする場合は/etc/fstabにも設定を加えます。
<server_ip>:/mnt/nfs_share /mnt/nfs_clientshare nfs defaults,user,exec 0 0
解説
ややこしのはディレクトリの権限ととファイアウォールだと思います。
公開するディレクトリの権限について
Linux のユーザー
権限の理解を進めるためにはLinuxのユーザーについて知っておく必要があります。それは「つよつよのroot」と「モブのnobody」です。
root はスーパーユーザーのことで、とりあえず色々な権限の制約を無視できるつよつよユーザーです。これは皆さん知っていると思います。
対してnobody は権限の制約を受けまくる、なんにもできないユーザーです。
root squash
root の状態でNFS に利用されると、できることが多すぎてシステムを壊しかねません。
なのでNFS では、root ユーザーを狙い撃ちしてnobody ユーザーとして扱うroot squash という機能が用いられます。
root squash は体育の先生だと思ってください。学校でブイブイ言わせてるやんちゃな中学生も体育教師がいると大人しくなります。

ディレクトリの所有者をnobody へ
squash のお陰でroot もnobody になったのですが、もともとnobody は何もできないユーザーです。このままでNFS で共有されても何もできないので、共有するディレクトリの所有者をnobody とします。
それがこのコマンドです。/mnt/nfs_share はnogroup のnobody が所有者ですよと宣言しています↓
sudo chown nobody:nogroup /mnt/nfs_share
一般ユーザーはどうなる?
chown コマンドでディレクトリの所有者はnobody になりroot の強すぎる権力を回避できたのですが、このままでは一般ユーザー入り込もうとすると弾かれてしまします。
これでは不便なのでchmod コマンドで一般ユーザーの権限も設定します。
今回はクラスタの勉強の一貫としてNFS を構築したのでとりあえずなんでもできる777としました。
まとめると、こんな感じです↓
# NFS のデフォルト機能で root → nobody(root squash)
# ディレクトリの所有者をnobody へ
# これでroot からNFS に侵入されても安全に操作可能に
sudo chown nobody:nogroup /mnt/nfs_share
# nobody や一般ユーザーに与える権限を設定
sudo chmod 777 /mnt/nfs_share
ファイアウォールについて
上の例ではファイルウォールを以下のように設定しました。
sudo ufw allow from 192.168.1.0/24 to any port nfs
to any port nfs ってなに?
このコマンドはto any port nfs部分がややこしいと思います。これを直訳すると「どのIPからでも良いけどポートはNFSだけね」です。
各ノードにはたくさんの通信手段があります。有線LAN、Wi-Fiなど色々選べると思います。そしてそれらには固有のIPが割り振られています。
上の例では192.168.1.xであればどのIPから入ってきてもOKだよと許可しています。ただし、開いているポートはNFSのみだということです。
また学校で例えます。
IPは門だと思ってください。学校には正門や裏門、西口とか色々あると思います、これがIPです。生徒(ユーザー)はどこの門(IP)から入ってもOKです。ただし、生徒の行先(ポート)は教室しかありません。職員室とか校長室には行けません。それらには行っちゃいけない雰囲気が漂っています(ファイアウォールが守っています)。

同じネットワーク内にいる全員に許可
192.168.1.xをコマンドで表現するには、0とサブネットマスクの組み合わせで実現します。
まとめ: 学校での例え
書いているうちに学校での例えがわかりやすいと思ったのでそのまま学校を例にまとめます。
- NFSで共有されるディレクトリは学校の教室
- 生徒は先生が作った環境(教室)で過ごす
- その教室はモブ専用のものである(chown nobody:nogroup)
- やんちゃな生徒(root)がいても、担任の先生は体育教師なので、大人しくモブ化する(root squash)
- 先生(root)黒板(ディレクトリやファイル)に書いたことが生徒にも共有される。もちろんは生徒は板書を読める(read)し、許可(chmod)次第では生徒も板書することもできる(そういう先生たまにいたよね)
- 生徒たちはどの門(IP)を使って通学(通信)してもいいけど、行先は指定された自分の教室のみ(sudo ufw allow from <ip> to any port nfs)
Discussion