はじめに

FreeBSDでsmbfsをマウントする際に利用するmount_smbfsですが、jail内(=prisoner)では、どんなに頑張ってもsmbfsをマウントできません。
mount_smbfsはkernel内にあるiconv機能を利用するのですが、これがkernelの利用を制限するprisonerからの呼び出しで利用できないからです。

例えば、prisoner内で、

prisonerでのmount_smbfsによるsmbfsのマウント
$ mount_smbfs -I "nelfis1.local.kishiro.com" -E UTF-8:UTF-8 -N //guest@backup/share "/mnt/nelfis1/"

としてみると、jailホスト(=jailer)側でsmbfs.koがロードされていない旨の以下のエラーが発生します。

prisonerで発生するmount_smbfsのエラー(その1)
mount_smbfs: kldload(smbfs): Operation not permitted

ここで、jailerの「/boot/loader.conf」に以下の記述を追加し、jailer側でsmbfs.koがロードされている状況を作ったとしても、prisoner内では以下のエラーが発生します。

jailerの「/boot/loader.conf」への追記
smbfs_load="YES"
jailerでsmbfs.koがロードできているかの確認
$ kldstat
Id Refs Address                Size Name
 1   22 0xffffffff80200000  1f3e2d0 kernel
 2    1 0xffffffff8213f000    31030 smbfs.ko
 3    3 0xffffffff82171000     44f8 libmchain.ko
 4    3 0xffffffff82176000     9148 libiconv.ko
 5    1 0xffffffff82520000     4700 nullfs.ko
 6    1 0xffffffff82525000    11cd8 fusefs.ko
 7    1 0xffffffff82537000     3250 ichsmb.ko
 8    1 0xffffffff8253b000     2180 smbus.ko
 9    1 0xffffffff8253e000     2a08 mac_ntpd.ko
prisonerで発生するmount_smbfsのエラー(その2)
mount_smbfs: can not setup kernel iconv table (UTF-8:tolower): syserr = Operation not permitted

エラーの通り、mount_smbfsで必要なkernel内のiconvテーブルをprisonerから構成できないため、mount_smbfsが動作しません。
また、「lsvfs」で確認しても、smbfsはjail-friendlyではないとされていて、如何ともし難い状態です。

このページでは、別のアプローチでprisoner内からsmbfsをマウントする方法方法について説明します。

ユーザースペースで動作可能なfusefs-smbfsの設定と導入

前述の通り、prisonerからはkernel内実装であるmount_smbfsが利用できないため、ユーザースペースで利用可能なFUSEとFUSEモジュールを利用して代替します。
FreeBSDでは6.0からFUSEのサポートが追加されており、適切なFUSEモジュールをpkgで導入することにより、任意のファイルシステムを導入可能です。

まず、jailerの「/etc/rc.conf」に以下の設定を追記し、FUSEのkernelモジュールを有効化します。

jailerの「/etc/rc.conf」への追記
kld_list="fusefs"

上記の設定を加えると、次回のシステム起動時に、fusefs.koが自動的にロードされます。

また、「/etc/jail.conf」を編集し、対象のprisoner内でfusefsをマウントできるようにします。

jailerの「/etc/jail.conf」への追記
enforce_statfs=1;
allow.mount=1;
allow.mount.fusefs=1;

smbfsをマウントしたい任意のprisonerの設定に以上の行を追記してください。

続いて、prisoner内にfuse-smbfsのパッケージを導入します。

prisonerでのfuse-smbfsの導入
$ pkg install fusefs-smbnetfs

これで、smbnetfsが導入されます。
smbnetfsですが、mount_smbfsとはだいぶ作法が違い、多くの設定を設定ファイル内に記述し、コマンド自体ではマウントポイントのみを指定するような使い方をします。
設定ファイルがないと動作しませんので、これを準備します。

prisonerでのsmbnetfsの設定ファイル「smbnetfs.conf」のコピーと編集
$ mkdir ~/.smb/
$ cp -p /usr/local/share/doc/smbnetfs-0.6.3/smbnetfs.conf ~/.smb/
$ vi ~/.smb/smbnetfs.conf

設定ファイルのサンプルのパスは、smbnetfsのバージョンによって変更されますので、注意してください。

smbnetfs.confで最低限必要な設定は以下の通りです。
以下の行を追加してください。

prisonerの「smbnetfs.conf」への追記
auth                    "guest" ""

host nas.local.kishiro.com
link share nas.local.kishiro.com/share

1行目はguestアカウントで接続できるようにするための設定、3行目は接続先ホストの設定、4行目はマウントポイント内に作成されるシンボリックリングの設定です。
host及びlinkを複数組設定することにより、1回のsmbnetfsの実行で、複数のsmbfsを一括してマウントします。
ご自身の利用環境に合わせて適宜変更してください。

smbnetfsの利用方法

smbnetfsの利用方法は以下の通りです。

マウントポイントのみ指定すると、設定ファイルに記述されたホストに一括で接続し、マウントポイント内に複数のシンボリックリンクを作成します。
smbnetfsも他のmountツールと同様、マウントポイントは実際のパスとして予め存在している必要があります。

prisonerでのsmbnetfsの設定ファイル「smbnetfs.conf」のコピーと編集
$ smbnetfs /home/helmer1/

一方、マウントを解除する際には、fusermountではなく、umountを利用します。

prisonerでのsmbnetfsの設定ファイル「smbnetfs.conf」のコピーと編集
$ umount /home/helmer1/

その他の注意事項

mount_smbfsはSMBV1までしか対応していないのに対し、smbnetfsはSMBV2にも対応しています。
SMBV1プロトコルには、様々な脆弱性があるため、mount_smbfsでマウントするために、sambaサーバーのプロトコルバージョンをV1に設定することは望ましくありません。

そういった意味でも、可能な限りfusefs-smbnetfsパッケージを導入し、smbnetfsを利用することが望ましいです。
ただ、fusefs-smbnetfsパッケージを導入すると、samba本体もごっそりインストールされるのが玉にキズだったりします。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。