KSMBDでSMB共有

AndroidスマートフォンからLinux Boxのファイルにアクセスしたい．AndroidからだとSMBがいいのかな?でも今回に用途にsambaは大袈裟な感じということで久々にKSMBDを設定したメモです．

ホストはRaspberry Pi bookworm armhfとDebian sid amd64で確認しました．
KSMBDはLinux KernelベースのSMBサーバー実装です．Linux kernel 5.11以降に含まれています．

KSMBD – SMB3 Kernel Server — The Linux Kernel documentation

sambaの停止

sambaを動かしている場合停止します．

$ sudo systemctl stop smbd nmbd winbind samba-ad-dc

ksmbd-toolsの導入

KSMBD自体はkernel moduleですが，ユーザランドのksmbd-toolsというツールが別途必要なので導入します．

namjaejeon/ksmbd-tools: ksmbd kernel server userspace utilities

Debianでは ksmbd-tools というパッケージです．

Debian — パッケージ検索結果 — ksmbd-tools

$ sudo apt install ksmbd-tools
$ dpkg -L ksmbd-tools
/.
/etc
/etc/ksmbd
/etc/ksmbd/ksmbd.conf.example
/usr
/usr/lib
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/ksmbd.service
/usr/libexec
/usr/libexec/ksmbd.tools
/usr/sbin
/usr/share
/usr/share/doc
/usr/share/doc/ksmbd-tools
/usr/share/doc/ksmbd-tools/PFIF.txt
/usr/share/doc/ksmbd-tools/README.Debian
/usr/share/doc/ksmbd-tools/README.md.gz
/usr/share/doc/ksmbd-tools/changelog.Debian.gz
/usr/share/doc/ksmbd-tools/copyright
/usr/share/doc/ksmbd-tools/examples
/usr/share/doc/ksmbd-tools/examples/ksmbd.conf.example
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/ksmbd.conf.5.gz
/usr/share/man/man5/ksmbdpwd.db.5.gz
/usr/share/man/man8
/usr/share/man/man8/ksmbd.addshare.8.gz
/usr/share/man/man8/ksmbd.adduser.8.gz
/usr/share/man/man8/ksmbd.control.8.gz
/usr/share/man/man8/ksmbd.mountd.8.gz
/usr/sbin/ksmbd.addshare
/usr/sbin/ksmbd.adduser
/usr/sbin/ksmbd.control
/usr/sbin/ksmbd.mountd

設定ファイルの用意

次に設定ファイルを用意します．

最低限の設定を書いたり．

$ echo '[global]

[share]
path=/tmp
' | sudo tee /etc/ksmbd/ksmbd.conf

既存のsmb.confを流用したり，

$ sudo cp -p /etc/samba/smbd.conf /etc/ksmbd/ksmbd.conf

ksmbd-toolsに付属のksmbd.conf.exampleをコピーして使ったり，

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

smb.confとだいたい同じようにかけますが，[homes]のような特殊な共有名や，path = %H や path = /home/%u のような環境変数はうまく動かない感じです．以下のようなissueがあるので恐らく未実装かなと．

Add support for special [homes] section · Issue #229 · cifsd-team/ksmbd-tools

Variable substitutions · Issue #215 · cifsd-team/ksmbd-tools

詳細はKSMBD.CONF(5)を．

$ man ksmbd.conf

SMB共有のユーザ，パスワードの設定

ksmbd-tools付属のksmbd.adduserコマンドで共有にアクセスするためのユーザ名とパスワードを設定します．

$ sudo ksmbd.adduser -a <KSMBDアクセス用ユーザ名>

パスワードファイルは /etc/ksmbd/ksmbdpwd.db で， ID:passwordhash のような形式で保存されるようです．

KSMBDモジュールの読み込み

KSMBDモジュールを読み込みます．モジュールがない場合kernel sourceからmenuconfigなどでKSMBDモジュールを有効にします．

$ modinfo ksmbd
filename: /lib/modules/6.6.64-v7+/kernel/fs/smb/server/ksmbd.ko.xz
softdep: pre: crc32
softdep: pre: gcm
softdep: pre: ccm
softdep: pre: aead2
softdep: pre: sha512
softdep: pre: sha256
softdep: pre: cmac
softdep: pre: aes
softdep: pre: nls
softdep: pre: md5
softdep: pre: hmac
softdep: pre: ecb
license: GPL
description: Linux kernel CIFS/SMB SERVER
version: 3.4.2
author: Namjae Jeon <linkinjeon@kernel.org>
srcversion: 615D8D4CE63537A48C03456
depends: nls_ucs2_utils,cifs_arc4
intree: Y
name: ksmbd
vermagic: 6.6.64-v7+ SMP mod_unload modversions ARMv7 p2v8
$ sudo modprobe -v ksmbd
$ lsmod | grep ksmbd
ksmbd 249856 1
cifs_arc4 12288 1 ksmbd
nls_ucs2_utils 12288 1 ksmbd

ksmbd.mountdの起動

ユーザー空間用のデーモンを起動します．

$ sudo ksmbd.mountd

共有にアクセス

適当なファイラーや，smbclientなどからアクセス出来るのを確認します．

$ smbclient //192.168.0.23/home
Password for [WORKGROUP\matoken]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Tue Nov 17 06:17:29 2020
.. D 0 Mon May 20 18:03:24 2024
nitter D 0 Mon Nov 23 23:14:29 2020
huginn D 0 Sat Oct 24 16:03:31 2020
pi D 0 Mon Aug 12 06:12:17 2024
matoken D 0 Thu Dec 12 22:39:12 2024
gitea D 0 Fri Nov 13 09:43:48 2020

29948557 blocks of size 4096. 2499637 blocks available

設定の再読込

設定ファイルを編集した場合，設定を反映するために再読込をします．

$ sudo ksmbd.control --reload

KSMBD停止

$ sudo ksmbd.control -s
[ksmbd.control/30908]: INFO: Terminated ksmbd.mountd
[ksmbd.control/30908]: INFO: Killed ksmbd
$ sudo modprobe -r ksmbd

永続化

動いたので次回起動時以降に起動してくるよう永続化します．

sambaの無効化

$ sudo systemctl disable smbd nmbd winbind samba-ad-dc

モジュールの自動読み込み

$ echo ksmbd | sudo tee -a /etc/modules

ksmbdデーモンの自動起動

$ sudo systemctl enable ksmbd

再起動して動作確認．

Androidからのアクセス

まずSMBに対応した動画プレイヤーのVLCで動画再生を試みました．問題なく動作します．

VLC | F-Droid – Free and Open Source Android App Repository

次にPDFを読めるか試そうと思ったのですが，FilesアプリなどではSMBにアクセスできなそうです．F-DroidからCIFS Documents Providerというアプリケションを導入することでSMB内のファイルにアクセスできました．PDFファイルも読めます．しかし一旦ダウンロードしないと読めないようで少し待ち時間が必要でした．探せばストリーミングに対応したアプリはありそうです．

CIFS Documents Provider | F-Droid – Free and Open Source Android App Repository

家庭内の個人用ファイルサーバーなんかだとKSMBDが向いているかもしれません．

環境

サーバー1

$ uname -a
Linux raspberrypi 6.6.64-v7+ #1829 SMP Tue Dec 10 20:04:50 GMT 2024 armv7l GNU/Linux
$ apt list ksmbd-tools
Listing... Done
ksmbd-tools/stable,now 3.4.7-1 armhf [installed]
$ lsb_release -dr
No LSB modules are available.
Description: Raspbian GNU/Linux 12 (bookworm)
Release: 12
$ arch
armv7l
$ grep "^Model" /proc/cpuinfo
Model : Raspberry Pi 3 Model B Rev 1.2

サーバー2

$ uname -a
Linux tp-l13 6.11.10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.11.10-1 (2024-11-23) x86_64 GNU/Linux
$ apt list ksmbd-tools
ksmbd-tools/unstable,now 3.5.2-3 amd64 [installed]
$ lsb_release -dr
Description: Debian GNU/Linux trixie/sid
Release: n/a
$ arch
x86_64

クライアント(Android)

$ adb shell pm list packages --show-versioncode | grep -e vlc -e cifs
package:com.wa2c.android.cifsdocumentsprovider versionCode:29
package:org.videolan.vlc versionCode:13050749
$ adb shell getprop ro.build.version.release
14
$ adb shell getprop ro.product.model
moto g24