KSMBDでSMB共有

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

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

sambaの停止

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

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

ksmbd-toolsの導入

KSMBD自体はkernel moduleですが,ユーザランドの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 = %Hpath = /home/%u のような環境変数はうまく動かない感じです.以下のようなissueがあるので恐らく未実装かなと.

詳細は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で動画再生を試みました.問題なく動作します.

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

家庭内の個人用ファイルサーバーなんかだと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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です