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
$ sudo cp -p /etc/samba/smbd.conf /etc/ksmbd/ksmbd.conf
$ sudo cp -p /etc/ksmbd/ksmbd.conf.example /etc/ksmbd/ksmbd.conf
smb.confとだいたい同じようにかけますが,[homes]のような特殊な共有名や,path = %H
や path = /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
永続化
動いたので次回起動時以降に起動してくるよう永続化します.
$ sudo systemctl disable smbd nmbd winbind samba-ad-dc
$ echo ksmbd | sudo tee -a /etc/modules
$ sudo systemctl enable ksmbd
再起動して動作確認.
Androidからのアクセス
まずSMBに対応した動画プレイヤーのVLCで動画再生を試みました.問題なく動作します.
次にPDFを読めるか試そうと思ったのですが,FilesアプリなどではSMBにアクセスできなそうです.F-DroidからCIFS Documents Providerというアプリケションを導入することでSMB内のファイルにアクセスできました.PDFファイルも読めます.しかし一旦ダウンロードしないと読めないようで少し待ち時間が必要でした.探せばストリーミングに対応したアプリはありそうです.
家庭内の個人用ファイルサーバーなんかだとKSMBDが向いているかもしれません.
環境
$ 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
$ 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
$ 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