NFS and Samba File Sharing

NFS と Samba ファイル共有 包括ガイド

目次

  1. はじめに
  2. NFS アーキテクチャ概要
  3. NFS サーバー構成
  4. NFS クライアント構成
  5. NFSv4 ACL
  6. NFS セキュリティ(Kerberos 認証)
  7. NFS パフォーマンスチューニング
  8. Samba アーキテクチャ概要
  9. Samba サーバー構成
  10. Samba クライアント操作
  11. Samba を AD ドメインメンバーとして構成
  12. NFS vs Samba 比較表
  13. トラブルシューティング
  14. ベストプラクティス
  15. 参考資料

はじめに

ネットワークファイル共有は、企業インフラの中核となる技術である。Linux 環境では主に NFS(Network File System)Samba(SMB/CIFS) の 2 つのプロトコルが広く使用される。NFS は UNIX/Linux 間のファイル共有に最適化されており、Samba は Windows クライアントとの相互運用性を提供する。本記事では、両方のプロトコルについてアーキテクチャから実践的な設定、セキュリティ、パフォーマンスチューニングまで包括的に解説する。


NFS アーキテクチャ概要

NFS バージョン比較

特徴NFSv3NFSv4NFSv4.1/pNFS
プロトコルUDP/TCPTCP のみTCP のみ
ポート複数(2049, 111 等)2049 のみ2049 のみ
ステート管理ステートレスステートフルステートフル
ファイルロックNLM(別プロトコル)プロトコル内蔵プロトコル内蔵
認証AUTH_SYS(UID/GID)RPCSEC_GSS(Kerberos)RPCSEC_GSS(Kerberos)
ACLPOSIX ACLNFSv4 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_squashroot を nobody にマッピング(デフォルト)
no_root_squashroot を root のまま扱う(信頼ホスト用)
all_squashすべてのユーザーを nobody にマッピング
anonuid=N匿名ユーザーの UID を指定
anongid=N匿名グループの GID を指定
nohide入れ子のエクスポートを自動的に見せる
crossmntマウントポイントを越えてエクスポート
sec=modeセキュリティモード(sys, krb5, krb5i, krb5p)
fsid=0NFSv4 擬似ファイルシステムのルート

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タイムアウトでエラー返却非推奨(データ破損リスク)
intrhard マウントで割り込み許可推奨
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=tcpTCP プロトコル指定推奨
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=sysUID/GIDなしなし最速
sec=krb5Kerberosなしなし速い
sec=krb5iKerberosありなし中程度
sec=krb5pKerberosありあり遅い

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 比較表

項目NFSSamba (SMB/CIFS)
プロトコルNFS (v3/v4/v4.1/v4.2)SMB/CIFS (SMB2/SMB3)
最適な用途Linux/UNIX 間Windows 混在環境
ポート2049 (v4), 複数 (v3)445
認証AUTH_SYS, KerberosNTLM, Kerberos
ACLPOSIX ACL, NFSv4 ACLWindows 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 ベストプラクティス

  1. NFSv4 以上を使用する: ファイアウォール設定が容易で、セキュリティが向上する
  2. sync オプションを使用する: データ整合性を確保(async はデータ損失リスクあり)
  3. no_subtree_check を有効にする: パフォーマンスが向上し、エクスポート変更時の問題を回避
  4. root_squash を維持する: 信頼できないクライアントからの root アクセスを防止
  5. Kerberos 認証を導入する: 特にセキュリティが重要な環境で krb5i または krb5p を使用
  6. nconnect オプションを活用する: 高スループットが必要な場合、複数TCP接続を使用
  7. hard マウントを使用する: サーバーダウン時のデータ破損を防止
  8. _netdev オプションを忘れない: fstab では必須(ネットワーク起動前のマウント失敗を防止)
  9. autofs を活用する: 必要時のみマウントすることでリソースを節約
  10. 監視を設定する: nfsstat、mountstats で定期的にパフォーマンスを確認

Samba ベストプラクティス

  1. SMB2 以上を強制する: server min protocol = SMB2_10 で SMB1 を無効化
  2. 暗号化を有効にする: server smb encrypt = desired または required
  3. 署名を強制する: server signing = mandatory
  4. 認証情報ファイルを使用する: マウント時にパスワードを直接記述しない
  5. ゲストアクセスを制限する: 必要最小限の共有のみゲストを許可
  6. VFS オブジェクトを活用する: recycle(ごみ箱)、full_audit(監査)
  7. SELinux コンテキストを正しく設定する: samba_share_t を使用
  8. ドメイン参加時は idmap を適切に設定する: rid バックエンドで一貫したUID/GIDマッピング
  9. testparm で設定を検証する: サービス再起動前に必ず構文チェック
  10. ログローテーションを設定する: 大量のログが蓄積しないように管理

参考資料


最終更新日: 2026-04-10
対象OS: RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS
NFS バージョン: nfs-utils 2.5+
Samba バージョン: Samba 4.19+