今回はSMBサーバーの別実装、KSMBDを紹介します。
SambaとKSMBD
UbuntuでSMB
SMBはMicrosoftが策定しているプロトコルで、仕様書が公開されています。したがって、Sambaのような実装の開発が可能となります。
ご存知のとおりSambaは大きくsmbdとnmbdから構成されており、smbdはシングルスレッドで動作しています。また、ユーザースペースで動作するデーモンであり、SMBの仕様書にある内容をすべて実装するのが困難です。
そんな中登場したのがKSMBDです。こちらはカーネルスペースで動作しており、Sambaが抱えるいくつかの問題を解決します。そのうちの1つはマルチスレッド化による高速化です。ただしSambaを置き換えることを目標に開発されているわけではありません。
KSMBDはUbuntu 22.
KSMBDを動作させるには、ユーザースペースで動作するユーティリティであるksmbd-toolsも必要です。カーネルモジュールについては特に気にする必要はなく、使用するのはもっぱらこちらです。
動作環境
前述のとおり、カーネル6.
なお、特徴上Sambaとは同居できず排他利用です。したがって、Sambaが動作していない24.
インストールと初期設定
では進めていきましょう。まずインストールですが、前述のとおりksmbd-toolsが対象です。
$ sudo apt install ksmbd-tools
次に設定ファイルを編集します。Sambaだと/etc/
ですが、KSMBDでは/etc/
です。ただしデフォルトでは存在せず、/etc/
があるので、これをコピーします。
$ sudo cp /etc/ksmbd/ksmbd.conf.example /etc/ksmbd/ksmbd.conf
あとはksmbd.
を編集していきます。
ksmbd.
は、中身を見るとわかるのですが、smb.
と書式が似ています。
もちろん違いもあって、SambaとKSMBDでは機能が違うので[global]
セクションの項目には違いがあります。また、変数は使用できません。具体的には、smb.
では%h
はホスト名を表す変数ですが、ksmbd.
にはこの機能はありません。したがってnetbios name
はデフォルトではKSMBD SERVER
ですが、ここはホスト名に変えておくといいでしょう。
共有設定に関しては、よほど凝ったことをしていなければそのままコピー&ペーストすると動きます。
Sambaにはsmb.
の設定を確認するtestparm
コマンドがありますが、KSMBDにはこれに類するものはありません。
設定を書き換えたら、適用します。
$ sudo systemctl restart ksmbd.service
エラーが出なければ成功です。
Windowsはデフォルトの設定だとユーザーアカウントなしでのログインはできないため、ログインユーザーを作成します。
$ sudo ksmbd.adduser --add $USER
名前解決
これで共有フォルダーとしては使用できるようになりましたが、Ubuntuの
avahi
Ubuntuで見えるようにするためには、Avahiに設定を追加します。Ubuntu Serverにはインストールされないので、avahi-daemon
パッケージをインストールしてください。そして/etc/
を次の内容で作成します。
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_smb._tcp</type>
<port>445</port>
</service>
</service-group>
その後、avahi-daemon
を再起動します。
$ sudo systemctl restart avahi-daemon.service
wsdd2
Windowsで見えるようにするためには、wsdd2
パッケージをインストールして、必要な設定を施します。
ということで、まずはwsdd2
パッケージをインストールします。
$ sudo apt install wsdd2
wsdd2はSamba向けの設定になっているので、これをKSMBD向けに書き換えます。
$ sudo systemctl edit --full wsdd2.service
[Unit]
Description=WSD/LLMNR Discovery/Name Service Daemon
BindsTo=ksmbd.service
After=ksmbd.service
PartOf=ksmbd.service
[Service]
ExecStart=/usr/sbin/wsdd2
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
DynamicUser=true
AmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN
PrivateTmp=true
PrivateDevices=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
以上のように書き換えたら、wsdd2を再起動します。
$ sudo systemctl restart wsdd2.service
これで、おおむねSambaと同等に使用できるようになりました。
ベンチマーク
KSMBDはSambaよりも速いか、ベンチマークを実行してみます。fallocate
コマンドで作成した10GBのファイルを、10GbEで転送します。使用するのはsmbclientコマンドです。
10GbEにした理由は、1GbEや2.
では見てみましょう。図1がSambaでの結果です。

ご覧のとおり3回計測し、平均は1015176.
続けて図2がKSMBDでの結果です。

こちらの平均は1072236.
CPUをより遅いIntel N100にしても、また1GBのファイルを10個転送してもあまり速度差は出ませんでした。さらに小さなファイルをたくさん転送するなど、条件を変更すれば違った結果になるかもしれません。
とはいえ、最小限の変更で速度が向上されるのであれば、それはそれでメリットではないでしょうか。