NFS and Samba File Sharing
NFS と Samba ファイル共有 包括ガイド
目次
- はじめに
- NFS アーキテクチャ概要
- NFS サーバー構成
- NFS クライアント構成
- NFSv4 ACL
- NFS セキュリティ(Kerberos 認証)
- NFS パフォーマンスチューニング
- Samba アーキテクチャ概要
- Samba サーバー構成
- Samba クライアント操作
- Samba を AD ドメインメンバーとして構成
- NFS vs Samba 比較表
- トラブルシューティング
- ベストプラクティス
- 参考資料
はじめに
ネットワークファイル共有は、企業インフラの中核となる技術である。Linux 環境では主に NFS(Network File System) と Samba(SMB/CIFS) の 2 つのプロトコルが広く使用される。NFS は UNIX/Linux 間のファイル共有に最適化されており、Samba は Windows クライアントとの相互運用性を提供する。本記事では、両方のプロトコルについてアーキテクチャから実践的な設定、セキュリティ、パフォーマンスチューニングまで包括的に解説する。
NFS アーキテクチャ概要
NFS バージョン比較
| 特徴 | NFSv3 | NFSv4 | NFSv4.1/pNFS |
|---|---|---|---|
| プロトコル | UDP/TCP | TCP のみ | TCP のみ |
| ポート | 複数(2049, 111 等) | 2049 のみ | 2049 のみ |
| ステート管理 | ステートレス | ステートフル | ステートフル |
| ファイルロック | NLM(別プロトコル) | プロトコル内蔵 | プロトコル内蔵 |
| 認証 | AUTH_SYS(UID/GID) | RPCSEC_GSS(Kerberos) | RPCSEC_GSS(Kerberos) |
| ACL | POSIX ACL | NFSv4 ACL(Windows 互換) | NFSv4 ACL |
| ファイアウォール | 複雑(複数ポート) | 単純(2049 のみ) | 単純(2049 のみ) |
| 擬似ファイルシステム | なし | あり | あり |
| 委任(Delegation) | なし | あり | あり |
| 並列アクセス | なし | なし | pNFS(並列NFS) |
| セッション管理 | なし | なし | セッショントランキング |
NFS の仕組み
NFSv3 アーキテクチャ:
クライアント サーバー
+------------------+ +------------------+
| アプリケーション | | |
+--------+---------+ | NFS サーバー |
| | (nfsd) |
+--------+---------+ +--------+---------+
| VFS (仮想FS) | | VFS |
+--------+---------+ +--------+---------+
| | ローカルFS |
+--------+---------+ RPC/XDR | (ext4/xfs等) |
| NFS クライアント +------------>+------------------+
| (nfs モジュール) |
+--------+---------+ portmap +------------------+
+------------>| rpcbind (111) |
| mountd |
| nlockmgr |
| statd |
+------------------+
NFSv4 アーキテクチャ:
クライアント サーバー
+------------------+ +------------------+
| アプリケーション | | |
+--------+---------+ | NFS サーバー |
| | (nfsd) |
+--------+---------+ +--------+---------+
| VFS | TCP | VFS |
+--------+---------+ Port +--------+---------+
| NFS クライアント +---->2049--->| ローカルFS |
+------------------+ +------------------+
(ロック・マウント・
ACLすべて統合)
NFSv4.1/pNFS(Parallel NFS)のアーキテクチャ:
メタデータサーバー (MDS)
+------------------+
| レイアウト管理 |
+-------+ メタデータ操作 +-------+
| +------------------+ |
| |
レイアウト取得 レイアウト取得
| |
+-------v--------+ +----------v-----+
| クライアント A | | クライアント B |
+-------+--------+ +----------+-----+
| |
データI/O データI/O
| |
+-------v--------+ +----------+ +-------v------+
| データサーバー 1 | |データサーバー2| |データサーバー3|
+----------------+ +----------+ +--------------+
NFS サーバー構成
NFS パッケージのインストール
RHEL/CentOS/Rocky Linux:
# NFSサーバーパッケージのインストール
sudo dnf install nfs-utils
# インストール確認
rpm -qa | grep nfs
出力例:
nfs-utils-2.5.4-20.el9.x86_64
libnfsidmap-2.5.4-20.el9.x86_64
Debian/Ubuntu:
sudo apt install nfs-kernel-server nfs-common
dpkg -l | grep nfs
出力例:
ii nfs-common 1:2.6.2-4ubuntu1 amd64 NFS support files common to client and server
ii nfs-kernel-server 1:2.6.2-4ubuntu1 amd64 support for NFS kernel server
/etc/exports の設定
/etc/exports は NFS サーバーのメイン設定ファイルで、どのディレクトリをどのクライアントにどのオプションで公開するかを定義する。
# /etc/exports の基本構文
# エクスポートパス クライアント(オプション) [クライアント2(オプション)]
# === 基本的なエクスポート例 ===
# 特定ホストへの読み書き許可
/data/shared 192.168.1.100(rw,sync,no_subtree_check)
# サブネット全体への読み取り専用
/data/public 192.168.1.0/24(ro,sync,no_subtree_check)
# 複数クライアントへのエクスポート
/data/project server1.example.com(rw,sync,no_root_squash) \
server2.example.com(rw,sync,no_root_squash)
# ワイルドカードによるドメイン指定
/data/dept *.example.com(rw,sync,no_subtree_check)
# 全ホストへの公開(非推奨・テスト用)
/data/test *(ro,sync,no_subtree_check)
# NFSv4 用エクスポート(fsid=0 でルートエクスポート)
/export *(rw,fsid=0,no_subtree_check)
/export/data 192.168.1.0/24(rw,sync,no_subtree_check,nohide)
/export/home 192.168.1.0/24(rw,sync,no_subtree_check,nohide)
# Kerberos 認証を使用するエクスポート
/data/secure *.example.com(rw,sync,sec=krb5p,no_subtree_check)
主要なエクスポートオプション:
| オプション | 説明 |
|---|---|
rw | 読み書き許可 |
ro | 読み取り専用 |
sync | 書き込みをディスクに同期してから応答(推奨) |
async | 書き込みを非同期で処理(高速だがデータ損失リスク) |
no_subtree_check | サブツリーチェックを無効化(推奨) |
root_squash | root を nobody にマッピング(デフォルト) |
no_root_squash | root を root のまま扱う(信頼ホスト用) |
all_squash | すべてのユーザーを nobody にマッピング |
anonuid=N | 匿名ユーザーの UID を指定 |
anongid=N | 匿名グループの GID を指定 |
nohide | 入れ子のエクスポートを自動的に見せる |
crossmnt | マウントポイントを越えてエクスポート |
sec=mode | セキュリティモード(sys, krb5, krb5i, krb5p) |
fsid=0 | NFSv4 擬似ファイルシステムのルート |
exportfs コマンド
# 現在のエクスポート一覧を表示
sudo exportfs -v
出力例:
/data/shared 192.168.1.100(rw,sync,wdelay,hide,no_subtree_check,sec=sys,
rw,secure,root_squash,no_all_squash)
/data/public 192.168.1.0/24(ro,sync,wdelay,hide,no_subtree_check,sec=sys,
ro,secure,root_squash,no_all_squash)
# /etc/exports を再読み込みして反映
sudo exportfs -ra
# 特定のエクスポートを追加(/etc/exports を変更せずに一時的に)
sudo exportfs -o rw,sync,no_subtree_check 192.168.1.200:/data/temp
# 特定のエクスポートを削除
sudo exportfs -u 192.168.1.200:/data/temp
# すべてのエクスポートを解除
sudo exportfs -ua
# エクスポートの詳細確認
cat /var/lib/nfs/etab
NFS サービス管理
# NFSサーバーの起動・有効化
sudo systemctl enable --now nfs-server
# 関連サービスの状態確認
sudo systemctl status nfs-server
sudo systemctl status rpcbind
sudo systemctl status nfs-mountd
sudo systemctl status nfs-idmapd
出力例:
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)
Active: active (exited) since Fri 2026-04-10 09:00:00 JST; 2h ago
Process: 1234 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 1235 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Main PID: 1235 (code=exited, status=0/SUCCESS)
# ファイアウォール設定(firewalld)
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind # NFSv3用
sudo firewall-cmd --permanent --add-service=mountd # NFSv3用
sudo firewall-cmd --reload
# NFSv4のみの場合(ポート2049のみ)
sudo firewall-cmd --permanent --add-port=2049/tcp
sudo firewall-cmd --reload
# NFS統計の確認
nfsstat -s # サーバー側統計
nfsstat -c # クライアント側統計
nfsstat -m # マウント統計
# RPC情報の確認
rpcinfo -p localhost
出力例(rpcinfo):
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100005 1 tcp 20048 mountd
100005 3 tcp 20048 mountd
100021 1 tcp 32803 nlockmgr
100024 1 tcp 41599 status
NFS クライアント構成
手動マウント
# NFSv4 でマウント
sudo mount -t nfs4 192.168.1.10:/data/shared /mnt/nfs_shared
# NFSv3 を明示的に指定してマウント
sudo mount -t nfs -o vers=3 192.168.1.10:/data/shared /mnt/nfs_shared
# オプション付きマウント
sudo mount -t nfs4 -o rw,hard,timeo=600,retrans=2,rsize=1048576,wsize=1048576 \
192.168.1.10:/data/shared /mnt/nfs_shared
# マウント確認
mount | grep nfs
df -hT | grep nfs
出力例:
192.168.1.10:/data/shared on /mnt/nfs_shared type nfs4 (rw,relatime,vers=4.2,
rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,
sec=sys,clientaddr=192.168.1.100,local_lock=none,addr=192.168.1.10)
/etc/fstab による永続マウント
# /etc/fstab の NFS エントリ例
# NFSv4 - 基本的なマウント
192.168.1.10:/data/shared /mnt/nfs_shared nfs4 defaults,_netdev 0 0
# NFSv4 - パフォーマンス最適化
192.168.1.10:/data/shared /mnt/nfs_shared nfs4 rw,hard,intr,rsize=1048576,wsize=1048576,timeo=600,retrans=2,_netdev 0 0
# NFSv3 明示指定
192.168.1.10:/data/shared /mnt/nfs_shared nfs vers=3,rw,hard,intr,_netdev 0 0
# 遅延マウント(起動時に失敗しないように)
192.168.1.10:/data/shared /mnt/nfs_shared nfs4 defaults,_netdev,x-systemd.automount,x-systemd.idle-timeout=300 0 0
# Kerberos セキュリティ
192.168.1.10:/data/secure /mnt/secure nfs4 sec=krb5p,_netdev 0 0
# fstab を反映(再起動不要)
sudo mount -a
autofs による自動マウント
# autofs のインストール
sudo dnf install autofs # RHEL系
sudo apt install autofs # Debian系
# /etc/auto.master - マスターマップ
/mnt/nfs /etc/auto.nfs --timeout=300
# /etc/auto.master.d/nfs.autofs(ドロップインファイル)
/mnt/nfs /etc/auto.nfs --timeout=300
# /etc/auto.nfs - マップファイル
# キー [マウントオプション] サーバー:エクスポートパス
shared -rw,hard,intr 192.168.1.10:/data/shared
public -ro 192.168.1.10:/data/public
home -rw,hard,intr 192.168.1.10:/export/home
# ワイルドカードマッピング(ホームディレクトリ用)
# /etc/auto.master:
/home /etc/auto.home
# /etc/auto.home:
* -rw,hard,intr 192.168.1.10:/export/home/&
# autofs の起動
sudo systemctl enable --now autofs
# テスト(ディレクトリにアクセスすると自動マウント)
ls /mnt/nfs/shared
マウントオプション詳細
| オプション | 説明 | 推奨値 |
|---|---|---|
hard | サーバー無応答時にリトライを継続 | 本番環境で推奨 |
soft | タイムアウトでエラー返却 | 非推奨(データ破損リスク) |
intr | hard マウントで割り込み許可 | 推奨 |
timeo=N | タイムアウト(1/10秒単位) | 600(60秒) |
retrans=N | リトライ回数 | 2-3 |
rsize=N | 読み取りブロックサイズ | 1048576(1MB) |
wsize=N | 書き込みブロックサイズ | 1048576(1MB) |
_netdev | ネットワーク起動後にマウント | fstab で必須 |
noatime | アクセス時刻を更新しない | パフォーマンス向上 |
nolock | ファイルロックを無効化 | 特殊用途のみ |
nconnect=N | 複数TCP接続(カーネル5.3+) | 4-16 |
proto=tcp | TCP プロトコル指定 | 推奨 |
sec=mode | セキュリティフレーバー | sys/krb5/krb5i/krb5p |
NFSv4 ACL
NFSv4 では POSIX ACL とは異なる Windows 互換の ACL モデルを使用する。
# nfs4-acl-tools のインストール
sudo dnf install nfs4-acl-tools # RHEL系
sudo apt install nfs4-acl-tools # Debian系
# 現在のACLを表示
nfs4_getfacl /mnt/nfs_shared/testfile
出力例:
A::OWNER@:rwatTnNcCy
A::GROUP@:rtncy
A::EVERYONE@:rtncy
# ACL エントリの構造:
# タイプ:フラグ:プリンシパル:権限
#
# タイプ: A(Allow), D(Deny), U(Audit), L(Alarm)
# フラグ: g(group), d(directory-inherit), f(file-inherit)
# プリンシパル: OWNER@, GROUP@, EVERYONE@, user@domain, group@domain
# 権限: r(read), w(write), a(append), x(execute), t(read-attrs),
# T(write-attrs), n(read-named-attrs), N(write-named-attrs),
# c(read-ACL), C(write-ACL), o(write-owner), d(delete),
# D(delete-child), y(synchronize)
# ユーザーに読み書き権限を付与
nfs4_setfacl -a A::user1@example.com:rwatTnNcCy /mnt/nfs_shared/testfile
# グループにのみ読み取り権限を付与
nfs4_setfacl -a A:g:devteam@example.com:rtncy /mnt/nfs_shared/project/
# ディレクトリ配下に継承ACLを設定
nfs4_setfacl -a A:fd:user1@example.com:rwatTnNcCy /mnt/nfs_shared/project/
# 特定ACLエントリの削除
nfs4_setfacl -x A::user1@example.com:rwatTnNcCy /mnt/nfs_shared/testfile
# ACLの完全置換
nfs4_setfacl -s "A::OWNER@:rwatTnNcCy
A::GROUP@:rtncy
A::EVERYONE@:rtncy" /mnt/nfs_shared/testfile
# idmapd 設定(ユーザーマッピング)
cat /etc/idmapd.conf
[General]
Verbosity = 0
Domain = example.com
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
[Translation]
Method = nsswitch
NFS セキュリティ(Kerberos 認証)
Kerberos セキュリティレベル
| セキュリティモード | 認証 | 整合性チェック | 暗号化 | パフォーマンス |
|---|---|---|---|---|
sec=sys | UID/GID | なし | なし | 最速 |
sec=krb5 | Kerberos | なし | なし | 速い |
sec=krb5i | Kerberos | あり | なし | 中程度 |
sec=krb5p | Kerberos | あり | あり | 遅い |
Kerberos 付き NFS の設定
# === サーバー側 ===
# Kerberos キータブの取得(KDCで作成済み前提)
# NFS サーバーのプリンシパル: nfs/server.example.com@EXAMPLE.COM
kadmin -p admin/admin
kadmin: addprinc -randkey nfs/nfs-server.example.com@EXAMPLE.COM
kadmin: ktadd -k /etc/krb5.keytab nfs/nfs-server.example.com@EXAMPLE.COM
# /etc/krb5.conf
cat /etc/krb5.conf
[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = false
dns_lookup_kdc = true
[realms]
EXAMPLE.COM = {
kdc = kdc.example.com
admin_server = kdc.example.com
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
# /etc/exports でKerberos認証を指定
# /data/secure *.example.com(rw,sync,sec=krb5p,no_subtree_check)
# rpc.gssd デーモンの起動
sudo systemctl enable --now rpc-gssd
sudo systemctl enable --now nfs-server
# === クライアント側 ===
# キータブの取得
kadmin -p admin/admin
kadmin: addprinc -randkey nfs/nfs-client.example.com@EXAMPLE.COM
kadmin: ktadd -k /etc/krb5.keytab nfs/nfs-client.example.com@EXAMPLE.COM
# rpc.gssd の起動
sudo systemctl enable --now rpc-gssd
# Kerberos認証でマウント
sudo mount -t nfs4 -o sec=krb5p nfs-server.example.com:/data/secure /mnt/secure
# ユーザーがKerberosチケットを取得
kinit user1@EXAMPLE.COM
klist # チケット確認
NFS パフォーマンスチューニング
サーバー側チューニング
# NFS デーモンスレッド数の調整
# /etc/nfs.conf(RHEL 8+/最新ディストリビューション)
cat /etc/nfs.conf
[nfsd]
threads = 64 # デフォルト8、CPUコア数×8が目安
# vers3 = n # NFSv3を無効化(v4のみ使用する場合)
# vers4 = y
# vers4.1 = y
# vers4.2 = y
[mountd]
port = 20048
[statd]
port = 32765
[lockd]
port = 32803
# または古い方法でスレッド数変更
echo 64 > /proc/fs/nfsd/threads
# 永続化: /etc/sysconfig/nfs (RHEL系)
# RPCNFSDCOUNT=64
# カーネルパラメータのチューニング
# /etc/sysctl.d/99-nfs-tuning.conf
# ネットワークバッファの拡大
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# NFS読み取り先行(readahead)の調整
# /sys/class/bdi/$(mountpoint のデバイスID)/read_ahead_kb
echo 4096 > /sys/class/bdi/0:42/read_ahead_kb
# 適用
sudo sysctl -p /etc/sysctl.d/99-nfs-tuning.conf
クライアント側チューニング
# 最適化されたマウントオプション
sudo mount -t nfs4 \
-o rw,hard,intr,\
rsize=1048576,wsize=1048576,\
timeo=600,retrans=2,\
noatime,nodiratime,\
nconnect=8 \
192.168.1.10:/data/shared /mnt/nfs_shared
# nconnect オプション(カーネル 5.3+、NFSv3/v4対応)
# 複数のTCP接続を使用してスループット向上
sudo mount -t nfs4 -o nconnect=16 192.168.1.10:/data/shared /mnt/nfs_shared
# パフォーマンス計測
# IOPSテスト
fio --name=nfs-test --directory=/mnt/nfs_shared --rw=randrw \
--bs=4k --numjobs=4 --size=1G --runtime=60 --group_reporting
# スループットテスト
dd if=/dev/zero of=/mnt/nfs_shared/testfile bs=1M count=1024 oflag=direct
dd if=/mnt/nfs_shared/testfile of=/dev/null bs=1M iflag=direct
# NFS統計の確認
nfsstat -c
mountstats /mnt/nfs_shared
出力例(mountstats):
Device 192.168.1.10:/data/shared mounted on /mnt/nfs_shared with fstype nfs4 statvers=1.1
opts: rw,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,acregmin=3,
acregmax=60,acdirmin=30,acdirmax=60,hard,proto=tcp,nconnect=8,
timeo=600,retrans=2,sec=sys
age: 86400
caps: caps=0x3ffdf,wtmult=512,dtsize=1048576,bsize=0,namlen=255
NFS byte counts:
applications read 12884901888 bytes via read(2)
applications wrote 8589934592 bytes via write(2)
Samba アーキテクチャ概要
Samba は SMB/CIFS プロトコルを Linux 上で実装し、Windows クライアントとのファイル・プリンタ共有を可能にするソフトウェアスイートである。
Samba アーキテクチャ:
+------------------+ +------------------+ +------------------+
| Windows Client | | Linux Client | | macOS Client |
| (エクスプローラ) | | (smbclient/cifs) | | (Finder) |
+--------+---------+ +--------+---------+ +--------+---------+
| | |
+------------+-----------+------------+-----------+
| SMB/CIFS (TCP 445) |
v v
+-------+----------------------------+-------+
| Samba Server |
| |
| +----------+ +----------+ +----------+ |
| | smbd | | nmbd | | winbindd | |
| | (ファイル | | (NetBIOS | | (AD連携 | |
| | 共有) | | 名前解決)| | 認証) | |
| +----------+ +----------+ +----------+ |
| |
| +-------------------+ +---------------+ |
| | tdb データベース | | passdb | |
| | (共有情報等) | | (ユーザーDB) | |
| +-------------------+ +---------------+ |
+--------------------------------------------+
Samba コンポーネント:
- smbd: SMBプロトコル処理(ファイル共有、認証、印刷)
- nmbd: NetBIOS名前解決、ブラウジング
- winbindd: Active Directory連携、名前/ID マッピング
- samba: AD DC機能(Samba 4+)
Samba サーバー構成
パッケージのインストール
# RHEL/CentOS/Rocky Linux
sudo dnf install samba samba-client samba-common
# Debian/Ubuntu
sudo apt install samba samba-client smbclient cifs-utils
# バージョン確認
smbd --version
出力例:
Version 4.19.4
smb.conf 設定
# 設定ファイルのパス
# /etc/samba/smb.conf
# テスト前にバックアップ
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
# 設定ファイル構文チェック
testparm
# /etc/samba/smb.conf - 包括的な設定例
# ============================================================
# [global] セクション - サーバー全体の設定
# ============================================================
[global]
# --- 基本設定 ---
workgroup = WORKGROUP
server string = Samba File Server %v
netbios name = FILESERVER
server role = standalone server
# server role = member server # AD ドメインメンバーの場合
# --- ネットワーク設定 ---
interfaces = lo eth0 192.168.1.0/24
bind interfaces only = yes
smb ports = 445
# --- プロトコルバージョン ---
server min protocol = SMB2_10
server max protocol = SMB3_11
# client min protocol = SMB2_10 # クライアント設定
# --- 認証設定 ---
security = user
# security = ads # AD ドメインメンバーの場合
passdb backend = tdbsam
# passdb backend = ldapsam:ldap://ldap.example.com
encrypt passwords = yes
map to guest = Bad User
guest account = nobody
# --- ログ設定 ---
log file = /var/log/samba/log.%m
max log size = 10000
log level = 1
# log level = 3 auth:5 winbind:3 # デバッグ用
# --- パフォーマンス設定 ---
socket options = TCP_NODELAY SO_RCVBUF=131072 SO_SNDBUF=131072
read raw = yes
write raw = yes
use sendfile = yes
aio read size = 16384
aio write size = 16384
min receivefile size = 16384
# マルチチャネル(SMB3)
server multi channel support = yes
# --- セキュリティ強化 ---
server signing = mandatory
server smb encrypt = desired
# server smb encrypt = required # 暗号化必須
# --- 名前解決 ---
name resolve order = wins lmhosts host bcast
dns proxy = no
# --- 印刷の無効化(ファイルサーバー専用時) ---
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
# --- VFS オブジェクト ---
# ごみ箱機能
vfs objects = recycle
recycle:repository = .recycle
recycle:keeptree = yes
recycle:versions = yes
# ============================================================
# 共有定義
# ============================================================
# --- ホームディレクトリ共有 ---
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S
create mask = 0700
directory mask = 0700
# --- 一般共有 ---
[shared]
comment = Shared Directory
path = /data/samba/shared
browseable = yes
writable = yes
valid users = @samba_users
create mask = 0664
directory mask = 0775
force group = samba_users
# --- プロジェクト共有(アクセス制御付き) ---
[projects]
comment = Project Files
path = /data/samba/projects
browseable = yes
writable = yes
valid users = @dev_team @project_managers
write list = @dev_team
read list = @project_managers
create mask = 0660
directory mask = 0770
force group = dev_team
inherit permissions = yes
# ごみ箱機能
vfs objects = recycle
recycle:repository = .recycle/%U
recycle:keeptree = yes
recycle:versions = yes
recycle:maxsize = 104857600
# --- 読み取り専用公開共有 ---
[public]
comment = Public Files (Read Only)
path = /data/samba/public
browseable = yes
writable = no
guest ok = yes
force user = nobody
# --- 管理者専用共有 ---
[admin$]
comment = Admin Share
path = /data/samba/admin
browseable = no
writable = yes
valid users = @wheel
admin users = @wheel
hosts allow = 192.168.1.0/24 127.0.0.1
hosts deny = ALL
# --- タイムマシンバックアップ共有(macOS用) ---
[timemachine]
comment = Time Machine Backup
path = /data/samba/timemachine/%U
browseable = yes
writable = yes
valid users = %S
vfs objects = catia fruit streams_xattr
fruit:time machine = yes
fruit:time machine max size = 500G
create mask = 0600
directory mask = 0700
# --- 監査ログ付き共有 ---
[audit_share]
comment = Audited Share
path = /data/samba/audited
browseable = yes
writable = yes
valid users = @samba_users
vfs objects = full_audit
full_audit:prefix = %u|%I|%S
full_audit:success = connect disconnect mkdir rmdir open read write rename unlink
full_audit:failure = connect
full_audit:facility = local5
full_audit:priority = notice
共有設定
# 共有ディレクトリの作成とパーミッション設定
sudo mkdir -p /data/samba/{shared,projects,public,admin,audited}
# グループの作成
sudo groupadd samba_users
sudo groupadd dev_team
sudo groupadd project_managers
# パーミッション設定
sudo chown root:samba_users /data/samba/shared
sudo chmod 2775 /data/samba/shared
sudo chown root:dev_team /data/samba/projects
sudo chmod 2770 /data/samba/projects
sudo chown nobody:nobody /data/samba/public
sudo chmod 755 /data/samba/public
# SELinux コンテキスト設定(RHEL系)
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on
sudo semanage fcontext -a -t samba_share_t "/data/samba(/.*)?"
sudo restorecon -Rv /data/samba/
ユーザーとパスワード管理
# Linux ユーザーの作成(Samba ユーザーは Linux ユーザーが前提)
sudo useradd -M -s /sbin/nologin sambauser1
sudo usermod -aG samba_users sambauser1
# Samba パスワードの設定
sudo smbpasswd -a sambauser1
# パスワードを2回入力
# Samba ユーザーの有効化/無効化
sudo smbpasswd -e sambauser1 # 有効化
sudo smbpasswd -d sambauser1 # 無効化
sudo smbpasswd -x sambauser1 # 削除
# Samba ユーザー一覧
sudo pdbedit -L
出力例:
sambauser1:1001:
sambauser2:1002:
admin:1000:Administrator
# ユーザー詳細情報
sudo pdbedit -Lv sambauser1
出力例:
Unix username: sambauser1
NT username: sambauser1
Account Flags: [U ]
User SID: S-1-5-21-3456789012-1234567890-0987654321-1001
Primary Group SID: S-1-5-21-3456789012-1234567890-0987654321-513
Full Name:
Home Directory: \\FILESERVER\sambauser1
HomeDir Drive:
Logon Script:
Profile Path: \\FILESERVER\sambauser1\profile
Account desc:
Munged dial:
Logon time: 0
Logoff time: Thu, 07 Feb 2036 00:06:39 JST
Kickoff time: Thu, 07 Feb 2036 00:06:39 JST
Password last set: Fri, 10 Apr 2026 09:00:00 JST
Password can change: Fri, 10 Apr 2026 09:00:00 JST
Password must change: never
Last bad password : 0
Bad password count : 0
# Samba サービスの管理
sudo systemctl enable --now smb nmb
sudo systemctl status smb
# ファイアウォール設定
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload
# 設定テスト
testparm -s
Samba クライアント操作
smbclient の使用
# 利用可能な共有の一覧
smbclient -L //192.168.1.10 -U sambauser1
出力例:
Password for [WORKGROUP\sambauser1]:
Sharename Type Comment
--------- ---- -------
shared Disk Shared Directory
projects Disk Project Files
public Disk Public Files (Read Only)
IPC$ IPC IPC Service (Samba File Server 4.19.4)
SMB1 disabled -- no workgroup available
# 共有に接続(対話モード)
smbclient //192.168.1.10/shared -U sambauser1
出力例:
Password for [WORKGROUP\sambauser1]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Apr 10 09:00:00 2026
.. D 0 Fri Apr 10 08:00:00 2026
documents D 0 Fri Apr 10 07:00:00 2026
reports.xlsx A 25600 Thu Apr 9 15:30:00 2026
readme.txt A 512 Wed Apr 8 10:00:00 2026
50331648 blocks of size 1024. 35234816 blocks available
smb: \> get reports.xlsx
getting file \reports.xlsx of size 25600 as reports.xlsx (2500.0 KiloBytes/sec)
smb: \> put localfile.txt
putting file localfile.txt as \localfile.txt (1500.0 KiloBytes/sec)
smb: \> mkdir new_directory
smb: \> cd documents
smb: \documents\> lcd /tmp
smb: \documents\> mget *.pdf
smb: \documents\> exit
# 非対話モードでファイル操作
smbclient //192.168.1.10/shared -U sambauser1%password -c "ls"
smbclient //192.168.1.10/shared -U sambauser1%password -c "get reports.xlsx /tmp/reports.xlsx"
smbclient //192.168.1.10/shared -U sambauser1%password -c "put /tmp/upload.txt upload.txt"
# tar バックアップ
smbclient //192.168.1.10/shared -U sambauser1 -Tc backup.tar
# ゲストアクセス
smbclient //192.168.1.10/public -N
CIFS マウント
# cifs-utils のインストール
sudo dnf install cifs-utils # RHEL系
sudo apt install cifs-utils # Debian系
# 手動マウント
sudo mount -t cifs //192.168.1.10/shared /mnt/samba_shared \
-o username=sambauser1,password=secret,uid=1000,gid=1000
# 認証情報ファイルを使用(推奨)
cat /root/.smbcredentials
username=sambauser1
password=secret
domain=WORKGROUP
sudo chmod 600 /root/.smbcredentials
# 認証情報ファイルを使用してマウント
sudo mount -t cifs //192.168.1.10/shared /mnt/samba_shared \
-o credentials=/root/.smbcredentials,uid=1000,gid=1000,file_mode=0664,dir_mode=0775
# /etc/fstab での永続マウント
# //192.168.1.10/shared /mnt/samba_shared cifs credentials=/root/.smbcredentials,uid=1000,gid=1000,file_mode=0664,dir_mode=0775,_netdev 0 0
# systemd による自動マウント
# //192.168.1.10/shared /mnt/samba_shared cifs credentials=/root/.smbcredentials,x-systemd.automount,x-systemd.idle-timeout=60,_netdev 0 0
# Kerberos 認証でマウント
sudo mount -t cifs //192.168.1.10/shared /mnt/samba_shared \
-o sec=krb5,cruid=1000,uid=1000,gid=1000
# マルチチャネル(SMB3)
sudo mount -t cifs //192.168.1.10/shared /mnt/samba_shared \
-o credentials=/root/.smbcredentials,multichannel,max_channels=4
# マウント確認
mount | grep cifs
Samba を AD ドメインメンバーとして構成
# 必要パッケージのインストール
sudo dnf install samba samba-winbind samba-winbind-clients \
krb5-workstation oddjob oddjob-mkhomedir
# /etc/krb5.conf の設定
cat /etc/krb5.conf
[libdefaults]
default_realm = EXAMPLE.COM
dns_lookup_realm = true
dns_lookup_kdc = true
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
EXAMPLE.COM = {
kdc = dc1.example.com
admin_server = dc1.example.com
}
[domain_realm]
.example.com = EXAMPLE.COM
example.com = EXAMPLE.COM
# /etc/samba/smb.conf の AD メンバー設定
cat /etc/samba/smb.conf
[global]
workgroup = EXAMPLE
security = ads
realm = EXAMPLE.COM
server string = Linux File Server
# Winbind 設定
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config EXAMPLE : backend = rid
idmap config EXAMPLE : range = 10000-999999
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
winbind refresh tickets = yes
winbind offline logon = yes
# テンプレート設定
template homedir = /home/%D/%U
template shell = /bin/bash
# Kerberos
kerberos method = secrets and keytab
dedicated keytab file = /etc/krb5.keytab
# パフォーマンス
socket options = TCP_NODELAY SO_RCVBUF=131072 SO_SNDBUF=131072
[shared]
comment = Domain Shared Files
path = /data/samba/shared
browseable = yes
writable = yes
valid users = @"EXAMPLE\Domain Users"
write list = @"EXAMPLE\Domain Admins"
create mask = 0664
directory mask = 0775
force group = "EXAMPLE\Domain Users"
# ドメインへの参加
sudo net ads join -U Administrator
出力例:
Enter Administrator's password:
Using short domain name -- EXAMPLE
Joined 'FILESERVER' to dns domain 'example.com'
# NSSwitch の設定
# /etc/nsswitch.conf に winbind を追加
# passwd: files winbind
# group: files winbind
# 必要サービスの起動
sudo systemctl enable --now smb nmb winbind
sudo authselect select winbind with-mkhomedir --force
# ドメイン参加の確認
sudo net ads testjoin
出力例:
Join is OK
# ドメインユーザー/グループの確認
wbinfo -u # ドメインユーザー一覧
wbinfo -g # ドメイングループ一覧
wbinfo -i administrator # ユーザー情報
id "EXAMPLE\administrator"
出力例:
uid=10500(administrator) gid=10513(domain users) groups=10513(domain users),
10512(domain admins),10520(group policy creator owners),10519(enterprise admins),
10518(schema admins)
NFS vs Samba 比較表
| 項目 | NFS | Samba (SMB/CIFS) |
|---|---|---|
| プロトコル | NFS (v3/v4/v4.1/v4.2) | SMB/CIFS (SMB2/SMB3) |
| 最適な用途 | Linux/UNIX 間 | Windows 混在環境 |
| ポート | 2049 (v4), 複数 (v3) | 445 |
| 認証 | AUTH_SYS, Kerberos | NTLM, Kerberos |
| ACL | POSIX ACL, NFSv4 ACL | Windows ACL |
| パフォーマンス | 高い(特にLinux間) | 中~高 |
| ファイルロック | NLM (v3), 内蔵 (v4) | Opportunistic Lock |
| 暗号化 | Kerberos (krb5p) | SMB3 暗号化 |
| Windows 互換性 | 低い | 高い |
| macOS 互換性 | 良好 | 良好(fruit VFS) |
| 設定の複雑さ | 低い | 中程度 |
| UID/GID マッピング | 直接対応 | idmap が必要 |
| シンボリックリンク | 透過的にサポート | 制限あり |
| 大量小ファイル | 良好 | NFSより遅い場合あり |
| 大容量ファイル | 優れている | 良好 |
トラブルシューティング
NFS トラブルシューティング
# === 接続問題の診断 ===
# サーバーのエクスポート確認
showmount -e 192.168.1.10
出力例:
Export list for 192.168.1.10:
/data/shared 192.168.1.0/24
/data/public *
# RPC サービスの確認
rpcinfo -p 192.168.1.10
# ネットワーク接続のテスト
nc -zv 192.168.1.10 2049
telnet 192.168.1.10 2049
# NFS マウントのデバッグ
sudo mount -t nfs4 -v 192.168.1.10:/data/shared /mnt/test
# === パフォーマンス問題の診断 ===
# NFS 統計の確認
nfsstat -c # クライアント側
nfsstat -s # サーバー側
# マウントポイントの統計
mountstats /mnt/nfs_shared
# NFS リトランスミッション確認
nfsstat -rc
出力例:
Client rpc stats:
calls retrans authrefrsh
1548721 12 1548721
# retrans が高い場合 → ネットワーク問題の可能性
# tcpdump での NFS トラフィック解析
sudo tcpdump -i eth0 port 2049 -nn -c 100
# === ファイルロック問題 ===
# ロック状態の確認(NFSv3)
cat /proc/locks
# NFSv4 のロック状態
cat /proc/fs/nfsd/clients/*/states
# ロックのリカバリ
# サーバー側: NFSデーモンの再起動
sudo systemctl restart nfs-server
# === 権限問題 ===
# UID/GID マッピングの確認
id username # クライアント側
id username # サーバー側
# NFSv4 idmapd のデバッグ
sudo rpcdebug -m nfsd -s all
sudo rpcdebug -m nfsd -c all # デバッグ解除
# /var/log/messages または journalctl でログ確認
sudo journalctl -u nfs-server -f
sudo journalctl -u nfs-mountd -f
Samba トラブルシューティング
# === 設定の検証 ===
# 設定ファイルの構文チェック
testparm
testparm -s # 簡潔出力
# === 接続問題 ===
# サーバーへの接続テスト
smbclient -L //192.168.1.10 -U sambauser1 -d3
# ステータス確認
sudo smbstatus
出力例:
Samba version 4.19.4
PID Username Group Machine Protocol Version Encryption
--- -------- ----- ------- ---------------- ----------
12345 sambauser1 samba_users 192.168.1.100 SMB3_11 -
Service pid Machine Connected at Encryption Signing
------------ ------- ------------- -------------------------------- ------------ -------
shared 12345 192.168.1.100 Fri Apr 10 09:00:00 2026 JST - -
Locked files:
Pid User(ID) DenyMode Access R/W Oplock SharePath Name
------------ ---------- ---------- --------- --------- ---------- ------------ ----
12345 1001 DENY_NONE 0x120089 RDONLY NONE /data/samba/shared readme.txt
# === ログの確認 ===
# Samba ログ
sudo tail -f /var/log/samba/log.smbd
sudo tail -f /var/log/samba/log.nmbd
sudo tail -f /var/log/samba/log.winbindd
# デバッグレベルの一時的な変更
sudo smbcontrol smbd debug 3
sudo smbcontrol smbd debug 1 # 通常に戻す
# === AD ドメイン関連 ===
# ドメイン参加状態の確認
sudo net ads testjoin
sudo net ads info
# Kerberos チケットの確認
klist -e
kinit administrator@EXAMPLE.COM
# Winbind の確認
wbinfo --ping-dc
wbinfo -t # 信頼関係の確認
wbinfo -u # ドメインユーザー一覧
wbinfo -g # ドメイングループ一覧
# NSSwitch のテスト
getent passwd administrator
getent group "domain users"
# === SELinux 関連 ===
# SELinux が Samba をブロックしている場合
sudo getsebool -a | grep samba
sudo setsebool -P samba_enable_home_dirs on
sudo setsebool -P samba_export_all_rw on
# SELinux 監査ログの確認
sudo ausearch -m AVC -ts recent | grep smbd
ベストプラクティス
NFS ベストプラクティス
- NFSv4 以上を使用する: ファイアウォール設定が容易で、セキュリティが向上する
- sync オプションを使用する: データ整合性を確保(async はデータ損失リスクあり)
- no_subtree_check を有効にする: パフォーマンスが向上し、エクスポート変更時の問題を回避
- root_squash を維持する: 信頼できないクライアントからの root アクセスを防止
- Kerberos 認証を導入する: 特にセキュリティが重要な環境で krb5i または krb5p を使用
- nconnect オプションを活用する: 高スループットが必要な場合、複数TCP接続を使用
- hard マウントを使用する: サーバーダウン時のデータ破損を防止
- _netdev オプションを忘れない: fstab では必須(ネットワーク起動前のマウント失敗を防止)
- autofs を活用する: 必要時のみマウントすることでリソースを節約
- 監視を設定する: nfsstat、mountstats で定期的にパフォーマンスを確認
Samba ベストプラクティス
- SMB2 以上を強制する:
server min protocol = SMB2_10で SMB1 を無効化 - 暗号化を有効にする:
server smb encrypt = desiredまたはrequired - 署名を強制する:
server signing = mandatory - 認証情報ファイルを使用する: マウント時にパスワードを直接記述しない
- ゲストアクセスを制限する: 必要最小限の共有のみゲストを許可
- VFS オブジェクトを活用する: recycle(ごみ箱)、full_audit(監査)
- SELinux コンテキストを正しく設定する: samba_share_t を使用
- ドメイン参加時は idmap を適切に設定する: rid バックエンドで一貫したUID/GIDマッピング
- testparm で設定を検証する: サービス再起動前に必ず構文チェック
- ログローテーションを設定する: 大量のログが蓄積しないように管理
参考資料
- NFS - ArchWiki
- Red Hat - NFS 管理ガイド
- NFSv4 RFC 7530
- pNFS RFC 5661
- Samba 公式ドキュメント
- Red Hat - Samba 管理ガイド
- Ubuntu Server Guide - Samba
- smb.conf マニュアル
- Linux NFS FAQ
最終更新日: 2026-04-10
対象OS: RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS
NFS バージョン: nfs-utils 2.5+
Samba バージョン: Samba 4.19+