Ubuntu Weekly Recipe

第851回KSMBDでSambaではないSMBサーバーを実行する

今回はSMBサーバーの別実装、KSMBDを紹介します。

SambaとKSMBD

UbuntuでSMB(Server Message Block)サーバーを仕立てる場合は、通常はSambaを使用します。なんならUbuntu誕生前からそうです。

SMBはMicrosoftが策定しているプロトコルで、仕様書が公開されています。したがって、Sambaのような実装の開発が可能となります。

ご存知のとおりSambaは大きくsmbdとnmbdから構成されており、smbdはシングルスレッドで動作しています。また、ユーザースペースで動作するデーモンであり、SMBの仕様書にある内容をすべて実装するのが困難です。

そんな中登場したのがKSMBDです。こちらはカーネルスペースで動作しており、Sambaが抱えるいくつかの問題を解決します。そのうちの1つはマルチスレッド化による高速化です。ただしSambaを置き換えることを目標に開発されているわけではありません。

KSMBDはUbuntu 22.04 LTSで採用されたカーネルのバージョンである5.15からメインラインにマージされました。その後カーネル6.6で安定版とされました。24.04 LTSのカーネルは6.8以降なので、KSMBDを使用するにはちょうどいいタイミングです。なお、少なくとも24.04 LTSではKSMBDはカーネルモジュールとしてビルドされています。

KSMBDを動作させるには、ユーザースペースで動作するユーティリティであるksmbd-toolsも必要です。カーネルモジュールについては特に気にする必要はなく、使用するのはもっぱらこちらです。

動作環境

前述のとおり、カーネル6.6から安定版とされたことにより、使用するUbuntuのバージョンは24.04.2 LTSです。カーネルのバージョンは6.11で、ksmbd-toolsのバージョンは3.5.1です。

なお、特徴上Sambaとは同居できず排他利用です。したがって、Sambaが動作していない24.04 LTSを用意するのがおすすめです。

インストールと初期設定

では進めていきましょう。まずインストールですが、前述のとおりksmbd-toolsが対象です。

$ sudo apt install ksmbd-tools

次に設定ファイルを編集します。Sambaだと/etc/samba/smb.confですが、KSMBDでは/etc/ksmbd/ksmbd.confです。ただしデフォルトでは存在せず、/etc/ksmbd/ksmbd.conf.exampleがあるので、これをコピーします。

$ sudo cp /etc/ksmbd/ksmbd.conf.example /etc/ksmbd/ksmbd.conf

あとはksmbd.confを編集していきます。

ksmbd.confは、中身を見るとわかるのですが、smb.confと書式が似ています。

もちろん違いもあって、SambaとKSMBDでは機能が違うので[global]セクションの項目には違いがあります。また、変数は使用できません。具体的には、smb.confでは%hはホスト名を表す変数ですが、ksmbd.confにはこの機能はありません。したがってnetbios nameはデフォルトではKSMBD SERVERですが、ここはホスト名に変えておくといいでしょう。

共有設定に関しては、よほど凝ったことをしていなければそのままコピー&ペーストすると動きます。

Sambaにはsmb.confの設定を確認するtestparmコマンドがありますが、KSMBDにはこれに類するものはありません。

設定を書き換えたら、適用します。

$ sudo systemctl restart ksmbd.service

エラーが出なければ成功です。

Windowsはデフォルトの設定だとユーザーアカウントなしでのログインはできないため、ログインユーザーを作成します。

$ sudo ksmbd.adduser --add $USER

名前解決

これで共有フォルダーとしては使用できるようになりましたが、Ubuntuの「ファイル」やWindowsのエクスプローラーなどからは共有フォルダーとしては見えません。Sambaにあるnmbdに相当するものがKSMBDにはないため、他の方法を用意します。

avahi

Ubuntuで見えるようにするためには、Avahiに設定を追加します。Ubuntu Serverにはインストールされないので、avahi-daemonパッケージをインストールしてください。そして/etc/avahi/services/smb.serviceを次の内容で作成します。

<?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.5GbEではネットワークの速度がボトルネックになり、あまり差が出ないのではないかと考えたからです。

では見てみましょう。図1がSambaでの結果です。

図1 Sambaでの測定結果

ご覧のとおり3回計測し、平均は1015176.7KB/sで、これは約8.1Gb/sです。

続けて図2がKSMBDでの結果です。

図2 KSMBDでの測定結果

こちらの平均は1072236.7KB/sで、これは約8.5Gb/sです。あまり速度差は出ませんでした。

CPUをより遅いIntel N100にしても、また1GBのファイルを10個転送してもあまり速度差は出ませんでした。さらに小さなファイルをたくさん転送するなど、条件を変更すれば違った結果になるかもしれません。

とはいえ、最小限の変更で速度が向上されるのであれば、それはそれでメリットではないでしょうか。

おすすめ記事

記事・ニュース一覧