Network File System (NFS)

分散ファイルシステムプロトコル。ネットワーク経由でリモートファイルシステムをマウント。UNIX/Linux環境でのファイル共有標準。

ファイルサーバーNFS分散ファイルシステムUNIXLinuxネットワークストレージ

サーバー

Network File System (NFS)

概要

Network File System(NFS)は、ネットワーク上でファイルシステムを共有するための分散ファイルシステムプロトコルです。Sun Microsystems(現Oracle)により開発され、UNIX/Linux環境での標準的なファイル共有ソリューションとして長い歴史を持ちます。リモートファイルシステムをローカルファイルシステムのように透明にマウントでき、複数のクライアントが同じファイルリソースに同時アクセス可能。NFSv4では強化されたセキュリティ、パフォーマンス、信頼性が実現され、エンタープライズ環境やクラウドインフラストラクチャで広く採用されています。

詳細

NFS 2025年版は、UNIX/Linux環境における分散ファイルシステムの基盤技術として進化を続けています。40年以上の実績により証明された安定性と成熟度を誇り、High Performance Computing(HPC)、クラウドネイティブアプリケーション、コンテナ環境でのボリューム共有まで対応範囲が拡大しています。NFSv4.2では並列NFS(pNFS)、セッション管理、強化されたセキュリティ機能が導入され、大規模分散環境でのパフォーマンスとスケーラビリティが大幅に向上。Kubernetes環境でのPersistent Volumeとしても活用され、現代のコンテナオーケストレーション基盤における重要なストレージソリューションとなっています。

主な特徴

  • 透明なファイルアクセス: ローカルファイルシステムと同様の操作性
  • プロトコルの成熟度: 40年以上の実績による高い安定性
  • クロスプラットフォーム対応: UNIX/Linux間の完全互換性
  • スケーラビリティ: 大規模分散環境での高いパフォーマンス
  • セキュリティ強化: Kerberos認証、暗号化通信対応
  • pNFSサポート: 並列アクセスによる高いスループット

メリット・デメリット

メリット

  • UNIX/Linux環境での長年の実績による信頼性と安定性
  • シンプルなクライアント・サーバーアーキテクチャによる管理しやすさ
  • 多くのLinuxディストリビューションで標準サポート
  • Kubernetesをはじめとするコンテナ環境での豊富な実装例
  • 高いパフォーマンスと低いオーバーヘッド
  • ファイルロック、アクセス制御などの高度なファイルシステム機能

デメリット

  • Windowsクライアントでの利用には追加ソフトウェアが必要
  • ネットワーク障害に対する耐性がSMB/CIFSより低い
  • セキュリティ設定が複雑で専門知識が必要
  • 大容量ファイルの取り扱いでパフォーマンスが低下する場合
  • WANでの利用には帯域幅とレイテンシの制約
  • クライアント側でのキャッシュ管理の複雑さ

参考ページ

書き方の例

インストールと基本セットアップ

# Ubuntu/Debianでのインストール
sudo apt update
sudo apt install nfs-kernel-server nfs-common

# CentOS/RHEL/Fedoraでのインストール
sudo dnf install nfs-utils

# サービス状態確認
sudo systemctl status nfs-server
sudo systemctl status rpcbind

# サービス有効化・起動
sudo systemctl enable nfs-server rpcbind
sudo systemctl start nfs-server rpcbind

# NFS バージョン確認
rpcinfo -p | grep nfs

# 利用可能なNFSサービス確認
showmount -e localhost

基本的なエクスポート設定(/etc/exports)

# エクスポート設定ファイル作成
sudo tee /etc/exports << 'EOF'
# 基本的な読み書き共有
/srv/nfs/public *(rw,sync,no_subtree_check)

# 特定ネットワークのみアクセス許可
/srv/nfs/private 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)

# 読み取り専用共有
/srv/nfs/readonly *(ro,sync,no_subtree_check)

# ホームディレクトリ共有
/home *.example.com(rw,sync,no_subtree_check,root_squash)

# 高パフォーマンス設定
/srv/nfs/fast 192.168.1.100(rw,async,no_subtree_check,no_root_squash,wdelay,nohide)

# セキュア設定(Kerberosなし)
/srv/nfs/secure 192.168.1.0/24(rw,sync,no_subtree_check,secure,root_squash)
EOF

# 共有ディレクトリ作成
sudo mkdir -p /srv/nfs/{public,private,readonly,fast,secure}

# 権限設定
sudo chown -R nobody:nogroup /srv/nfs/
sudo chmod -R 755 /srv/nfs/

# エクスポート設定の再読み込み
sudo exportfs -ra

# エクスポート状況確認
sudo exportfs -v
showmount -e

クライアント側マウント設定

# NFSクライアントパッケージインストール
sudo apt install nfs-common  # Ubuntu/Debian
sudo dnf install nfs-utils   # CentOS/RHEL/Fedora

# 手動マウント
sudo mkdir -p /mnt/nfs/{public,private}

# 基本的なマウント
sudo mount -t nfs server.example.com:/srv/nfs/public /mnt/nfs/public

# 高パフォーマンスマウント
sudo mount -t nfs -o vers=4.2,proto=tcp,rsize=32768,wsize=32768,timeo=14,intr \
    server.example.com:/srv/nfs/fast /mnt/nfs/fast

# /etc/fstabでの永続化設定
sudo tee -a /etc/fstab << 'EOF'
# NFS マウント設定
server.example.com:/srv/nfs/public /mnt/nfs/public nfs4 defaults,user,auto,noatime,intr 0 0
server.example.com:/srv/nfs/private /mnt/nfs/private nfs4 rw,hard,intr,rsize=8192,wsize=8192,timeo=14 0 0
EOF

# fstab設定テスト
sudo mount -a

# マウント状況確認
mount | grep nfs
df -h | grep nfs

セキュリティ設定とKerberos統合

# Kerberos関連パッケージインストール
sudo apt install krb5-user krb5-config  # Ubuntu/Debian
sudo dnf install krb5-workstation        # CentOS/RHEL/Fedora

# Kerberos設定(/etc/krb5.conf)
sudo tee /etc/krb5.conf << 'EOF'
[libdefaults]
    default_realm = EXAMPLE.COM
    dns_lookup_realm = false
    dns_lookup_kdc = true
    ticket_lifetime = 24h
    renew_lifetime = 7d
    forwardable = true

[realms]
    EXAMPLE.COM = {
        kdc = kdc.example.com
        admin_server = kdc.example.com
    }

[domain_realm]
    .example.com = EXAMPLE.COM
    example.com = EXAMPLE.COM
EOF

# Kerberos認証付きNFS設定(/etc/exports)
sudo tee /etc/exports << 'EOF'
# Kerberos認証必須
/srv/nfs/krb5 *(rw,sync,sec=krb5,no_subtree_check)

# Kerberos暗号化
/srv/nfs/krb5p *(rw,sync,sec=krb5p,no_subtree_check)

# Kerberos整合性チェック
/srv/nfs/krb5i *(rw,sync,sec=krb5i,no_subtree_check)
EOF

# NFS Kerberos設定(/etc/default/nfs-kernel-server)
sudo tee -a /etc/default/nfs-kernel-server << 'EOF'
# Kerberos設定
NEED_SVCGSSD="yes"
RPCGSSDOPTS="-vvv"
EOF

# gssd デーモン設定
sudo systemctl enable nfs-idmapd rpc-gssd
sudo systemctl start nfs-idmapd rpc-gssd

# ホストプリンシパル作成(KDCで実行)
kadmin.local -q "addprinc -randkey nfs/nfsserver.example.com"
kadmin.local -q "ktadd -k /etc/krb5.keytab nfs/nfsserver.example.com"

# キータブファイル権限設定
sudo chmod 600 /etc/krb5.keytab
sudo chown root:root /etc/krb5.keytab

高度な設定とパフォーマンスチューニング

# 高パフォーマンスNFS設定(/etc/default/nfs-kernel-server)
sudo tee /etc/default/nfs-kernel-server << 'EOF'
# NFS スレッド数増加
RPCNFSDCOUNT=16

# NFS ポート固定(ファイアウォール設定用)
RPCNFSDOPTS="--port 2049 --udp-port 2049"
RPCMOUNTDOPTS="--port 20048"
RPCSTATDOPTS="--port 32765 --outgoing-port 32766"

# ログレベル設定
RPCNFSDOPTS="$RPCNFSDOPTS --debug 1"
EOF

# カーネルパラメータチューニング(/etc/sysctl.conf)
sudo tee -a /etc/sysctl.conf << 'EOF'
# NFS パフォーマンス向上
fs.nfs.nfs_congestion_kb = 164000
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
EOF

# カーネルパラメータ適用
sudo sysctl -p

# 高速エクスポート設定(/etc/exports)
sudo tee /etc/exports << 'EOF'
# 高パフォーマンス設定
/srv/nfs/hpc *(rw,async,no_wdelay,no_subtree_check,no_root_squash,insecure)

# pNFS対応設定
/srv/nfs/pnfs *(rw,sync,pnfs,no_subtree_check)

# キャッシュ最適化
/srv/nfs/cache *(rw,sync,no_subtree_check,no_acl,fsc)
EOF

# NFSv4.2 専用設定
echo "vers4.2" | sudo tee /proc/fs/nfsd/versions

# エクスポート再読み込み
sudo exportfs -ra

モニタリングとトラブルシューティング

# NFS統計情報表示
nfsstat -s  # サーバー統計
nfsstat -c  # クライアント統計
nfsstat -m  # マウント統計

# RPC統計情報
rpcinfo -p
rpcinfo -t localhost nfs

# アクティブな接続確認
sudo netstat -an | grep :2049
sudo ss -tuln | grep :2049

# NFSファイルハンドル確認
sudo cat /proc/net/rpc/nfsd.fh/content

# クライアント接続状況
sudo showmount -a

# ログ監視
sudo journalctl -u nfs-server -f
sudo tail -f /var/log/messages | grep nfs

# デバッグモード有効化
echo 'module nfs +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
echo 'module nfsd +p' | sudo tee /sys/kernel/debug/dynamic_debug/control

# パフォーマンス測定
# 書き込み性能テスト
time dd if=/dev/zero of=/mnt/nfs/test bs=1M count=1000

# 読み込み性能テスト
echo 3 | sudo tee /proc/sys/vm/drop_caches
time dd if=/mnt/nfs/test of=/dev/null bs=1M

# 並列アクセステスト
for i in {1..4}; do
    (dd if=/dev/zero of=/mnt/nfs/test$i bs=1M count=250) &
done
wait

セキュリティ強化とベストプラクティス

# ファイアウォール設定(UFW)
sudo ufw allow from 192.168.1.0/24 to any port 2049
sudo ufw allow from 192.168.1.0/24 to any port 111
sudo ufw allow from 192.168.1.0/24 to any port 20048

# ファイアウォール設定(firewalld)
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload

# セキュア エクスポート設定例
sudo tee /etc/exports << 'EOF'
# 最小権限の原則
/srv/nfs/data 192.168.1.0/24(rw,sync,no_subtree_check,root_squash,all_squash,anonuid=65534,anongid=65534)

# read-only で安全に共有
/srv/nfs/shared *(ro,sync,no_subtree_check,root_squash)

# 管理者のみアクセス可能
/srv/nfs/admin 192.168.1.10(rw,sync,no_subtree_check,no_root_squash) 192.168.1.11(ro,sync,no_subtree_check,root_squash)
EOF

# ログ監査設定
sudo tee -a /etc/rsyslog.conf << 'EOF'
# NFS ログ分離
daemon.info                     /var/log/nfs.log
kern.info                       /var/log/nfs-kernel.log
EOF

sudo systemctl restart rsyslog

# 定期バックアップスクリプト
cat > /etc/cron.daily/nfs-backup << 'EOF'
#!/bin/bash
# NFS設定バックアップ
BACKUP_DIR="/backup/nfs/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 設定ファイルバックアップ
cp /etc/exports $BACKUP_DIR/
cp /etc/default/nfs-kernel-server $BACKUP_DIR/
cp /etc/krb5.conf $BACKUP_DIR/
cp /etc/fstab $BACKUP_DIR/

# 現在のエクスポート状況保存
exportfs -v > $BACKUP_DIR/current-exports.txt
showmount -a > $BACKUP_DIR/current-mounts.txt

# 古いバックアップ削除(30日保持)
find /backup/nfs/ -type d -mtime +30 -exec rm -rf {} \;
EOF

chmod +x /etc/cron.daily/nfs-backup

# NFS統計情報監視スクリプト
cat > /usr/local/bin/nfs-monitor << 'EOF'
#!/bin/bash
# NFS監視スクリプト
echo "=== NFS Server Status $(date) ==="
systemctl is-active nfs-server
echo

echo "=== Current Exports ==="
exportfs -v
echo

echo "=== Active Connections ==="
showmount -a
echo

echo "=== Performance Statistics ==="
nfsstat -s | head -20
echo

echo "=== Disk Usage ==="
df -h | grep "/srv/nfs"
EOF

chmod +x /usr/local/bin/nfs-monitor