Sambaサーバーを構築してみた記録(2024年版)

西山
2024-09-11
2024-09-17

こんにちは。日々是発見が楽しみな西山です。

自宅サーバーの構成をいろいろ変更した関係で、これまで仮想WindowsServerで動かしていたファイルサーバーをSambaを使って再構築しました。
が、ネット上の情報が新旧入り混じって設定の正解が見つけられずとても大変だったので、苦心して作ったミドルウェア構成とコンフィグをここに晒します。

Sambaインストールと設定

以下の前提条件に基づいてSambaファイルサーバーを構築しました。

  • ワークグループ環境
  • Windows端末は全てWindows10以降(=SMB1.0や2.0の古い端末は考慮外)
  • 共有フォルダ以外の機能(プリンター共有、ユーザーホームディレクトリなど)は使用しない

私はAlmaLinux9上で構築しましたので、dnfで必要なパッケージを入れます。
AlmaLinux9.4のdnfからはSamba 4.19.4 がインストールされました。

dnf install epel-release
dnf install samba
dnf install samba-vfs-iouring samba-tools

Windows10以降では、ネットワークブラウズがNetBIOSの代わりにWSD(Web Service Discovery)を使うようになりました。ですので本構成でnmbdは起動させません(起動するとネットワークブラウズが非常に遅くなる、等のトラブルが起きます)。
代わりにWSD機能を提供するwsddをインストールして起動します。

dnf install wsdd
※Active Directory環境ではドメインコントローラーとの通信でNetBIOSが必要なパターンがあるので、その場合はnmbdを起動する必要があるかも知れません(手元では未検証)。

Sambaのコンフィグはこうなりました。

/etc/samba/smb.conf

[global]
       workgroup = WORKGROUP
       security = user
       passdb backend = tdbsam
       hosts allow = 2001:db8::/64 fe80::/64 192.168.0.0/24 127.0.0.0/8
       map to guest = bad user
       unix password sync = yes
       passwd program = /usr/bin/passwd %u
       passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
       pam password change = yes
       smb ports = 445
       min protocol = SMB3
       unix extensions = no
       load printers = no
       use sendfile = Yes
       min receivefile size = 16384
       aio read size = 16384
       aio write size = 16384
       dfree cache time = 60
       block size = 4096
[samba]
       path = /data/samba/
       browsable = yes
       writable = yes
       read only = no
       force create mode = 0666
       force directory mode = 0777
       vfs objects = streams_xattr acl_xattr
       acl_xattr:ignore system acls = yes
       store dos attributes = yes
       map archive = no
       dos filemode = yes
       map acl inherit = yes

以下、デフォルトから変更した設定を説明していきます。

hosts allow = 2001:db8::/64 fe80::/64 192.168.0.0/24 127.0.0.0/8

ローカルネットワーク外からの接続を拒否します。IPv6のグローバルアドレスが来てる場合は忘れずに指定しておきます(かく言う私もよく、IPv6の許可ルールを忘れてdenyされる失敗をやらかしちゃいます;;)。

min protocol = SMB3

ネットワーク内の端末は全てSMB3で通信できる前提なので、SMB1や2の通信を出さないようにします。

use sendfile = yes
min receivefile size = 16384
aio read size = 16384
aio write size = 16384
dfree cache time = 60
block size = 4096

共有の性能向上のためバッファサイズ等を設定しました。
ただ、wsddを入れる前に試行錯誤した名残なので、入れなくても問題なく動くかも知れません(もう疲れたのでそのままにしています(苦笑)。

vfs objects = streams_xattr acl_xattr
acl_xattr:ignore system acls = yes
map acl inherit = yes

WindowsファイルのACLとNTFS代替データストリームをLinux上のSamba共有に格納するための設定です。
これに必要な拡張モジュールを「dnf install samba-vfs-iouring」でインストールしています。

store dos attributes = yes
map archive = no
dos filemode = yes

Windowsファイルのファイル属性(実行/アーカイブ等)やアクセス権の動作をWindowsに近い動作にする設定です。この辺は昔から鉄板の内容かと思います。

 

Sambaの設定はここまで、次にwsddを設定します。
と言っても必須の設定は一つだけで、wsddがlistenするNICをsysconfigで指定し、デーモンの起動オプションとして渡します。

/etc/sysconfig/wsdd

OPTIONS="-i eth0"

「testparm」コマンドでコンフィグチェックし、問題なければsmbdとwsddを起動します。

systemctl start smbd
systemctl start wsdd

systemctl enable smbd
systemctl enable wsdd

Windowsクライアントからはマシン名やIPアドレス指定でSambaマシンに接続し、設定したユーザー・パスワードを入力すれば共有フォルダが見られます。
LinuxユーザーとSambaユーザーのパスワード同期、共有フォルダのパーミッションも注意して下さい。
ファイアウォールをサービス単位で開ける場合はSMB(445/TCP)、WSD(3702/UDP、5357-5358/TCP)あたりを開ける必要があるでしょう。

2024年にWindowsServerとSambaを使い比べた感想

あくまで私の私見ですが、率直なところを書きます。

  • ライセンスを持ってるならWindowsServerをおススメします。GUIで共有ディレクトリとユーザーを設定すればポン付けで確実動作し、複数の設定が絡んだ不可解な現象に悩まされずに済みます。ファイル操作のレスポンスも(体感ですが)仮想WindowsServerの方が物理Linux+Samba構成を上回っていました。
  • WindowsServerのライセンスを持ってない(高価ですしホームユーザーは大体持ってないですね)場合は、実績あるメーカーのNASを購入してWindows共有機能を使うのがおススメです。複雑なSambaの設定もメーカー調整済みなので悩むことなく快適に使えます。
  • 予算が許せば「Azure Files」や「Amazon FSx for Windows File Server」等のクラウドソリューションを利用してもいいでしょう。

Sambaって商用製品(Windows)の互換ソフトで、Windows側の仕様変更によく追随してくれているのですが、それゆえに設定が複雑怪奇化してあちこちに落とし穴ができてしまい、結局出来合いの製品を買ってきた方が安パイ、という状況だと思います。
Samba公式がアップデートされた推奨設定を出してくれればまだ何とかなるのですが、探した限りではそういう情報も出ておらず、10年、20年前の賞味期限切れの情報が検索でごろごろ引っかかってしまう状態でした。
確かにWindowsのライセンス費用はかからないですが、構築や調整・メンテナンスの手間、性能差を考えると、イチから構築はちょっとおススメできない……というのが、今回の感想でした。