ということで前の記事の続き。CephFSを作ったは良いけど、Windowsからどうやって利用しよう、という話。ということで、しょうがないので、オーバヘッドはあるけど、Sambaサーバを立てることにした。手順は以下。
- Sambaサーバ用のコンテナを作成し、マウントされているCephFSをコンテナ内から見えるようにする。
- Sambaサーバをインストールして設定する。
- 認証用ユーザを登録してWindowsからアクセスする。(Windows11を想定)
コンテナの作成
Ceph→ホストカーネル→コンテナ→sambaと段階が深くなるため、なるべく高速に動作させるため、OSDがいるCephサーバ上で動かした。コンテナは何でもよいのだが、Debian12で作成した。ここで、普通に作るとホスト側のCephFSは参照できないため、以下の設定をコンテナ設定に入れる。
$ sudo /etc/pve/nodes/<em><node_name></em>/<em><container_id></em>.conf
ノード名とコンテナ名は環境に合わせる。ここに以下の一文を追加する。
mp0: /mnt/pve/cephfs,mp=/cephfs
mp0は、mount pointの略。0は、マウントポイントIDでゼロ以上整数。最初のパスはホストのcephfsの位置で、mp=以下はコンテナ側のマウントポイント。このポイントはコンテナ側で作成する必要がある。
Sambaのインストールと設定
コンテナ側でsambaを導入して設定ファイルsmb.confを設定する。(その前にユーザの作成とapt update/upgradeをすませてある)
$ sudo apt install samba <中略> $ sudo vi /etc/samba/smb.conf
ここで行った設定は以下。
- 不要な設定のコメントアウト
- WORKGROUP (Windows環境に合わせる)
- プロトコルバージョン (Windows11がSMB1をサポートしないため)
- 公開ディレクトリの設定
公開ディレクトリの設定は例えば、以下のようなもの。これはまあ、どこにでも例が載っているので好きに設定すればよい。冒頭の[]でくくった中のcephfsが公開名になる。pathに記載したディレクトリ以下が公開される。CephFSは、デフォルトだと書き込みにroot権限が必要なため、rwx属性を付与した公開用のディレクトリを先に作成して起き、この下をsambaで公開することにした。これで、Windowsクライアントから一般ユーザでアクセスしてもファイルを作成することができる。
[cephfs] comment = CephFS path = /cephfs/samba_fs/ browsable = yes read only = no writable = yes create mask = 0777 directory mask = 0777
今回一番の難関は、プロトコルバージョン。結論から言うと次の一行を加えればよい。
server min protocol = SMB3
これは、最近のWindowsは、セキュリティ上の理由からSMB1を拒否する(クライアントがインストールされていない)ようになっているにも関わらず、sambaは古いバージョンからnegotiationするかららしい。そこで、SMB3以上を強制すればWindows11で接続できるようになる。これは、defaultのsmb.confには書かれていないので探すのに苦労した。ちなみに、私の環境ではSMB1のネゴシエーションで出るエラーは「アクセスが拒否されました」詳細をクリックすると0x80004005 エラーを特定できません、と出る。これで上記の設定へは知らないとたどり着けない。。。
Samba開発元によるこの項目の公式のマニュアルはここ(日本語訳)プロトコルの意味は、server max protocolのほうに書いてある。
http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html#SERVERMAXPROTOCOL
LANMAN1
: 最初の 近代的な プロトコルであり、長いファイル名をサポートしている。LANMAN2
: LANMAN1 プロトコルを改良したものである。NT1
: 最新のプロトコルであり、Windows NTで使用されている。CIFS としても知られている。SMB2
: SMBプロトコルを実装しなおしたもので、 Windows Vista以降で使用されている。SMB2には幾つかのサブプロトコルが 存在する。aSMB2 を指定した場合、デフォルトでは SMB2_10 が選択される。
SMB2_02
: 最初期の SMB2 プロトコルSMB2_10
: Windows 7 の SMB2 プロトコルSMB3
: SMB2と同じく、SMBプロトコルを実装し直したものであり、 Windows 8 で使用されている。 SMB3 にもサブプロトコルが存在する。SMB3 の既定値は SMB3_11 である。
SMB3_00
: Windows 8 の SMB3 プロトコル。- SMB3 を指定した場合、デフォルトでは SMB3_00 が選択される。
SMB3_02
: Windows 8.1 の SMB3 プロトコルSMB3_11
: Windows 10 SMB3 バージョン。
自宅環境ではWindows10のクライアントすらない(会社のPCはWindows10だけど)ので、SMB3(=SMB3_11)にした。ここはどれだけ古いクライアントを繋げるかで決めるところ。ちなみに、マニュアルでは以下の記述があるが、全然、そんなことはない。いや、本当、こんなページもあるし、SambaとWindowsは仲が悪いらしい。(冗談ですよ)
通常は、SMB プロトコルの自動ネゴシエーションフェーズにより 適切なプロトコルが選択されるため、SMB1 しか対応していない古いクライアントを 使う場合を除き、このオプションを設定する必要はない。
http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html#SERVERMINPROTOCOL
Sambaユーザの登録
これで、Windowsからアクセスできる、と思いきや、もう一つ関門がある。それがユーザの登録。ファイルシステムを公開する、というコンセプトに由来してSambaの認証はDebianのテンプレート設定ではOS認証と一体化している。(Sambaデフォルトはnoのようであるが)
# This boolean parameter controls whether Samba attempts to sync the Unix # password with the SMB password when the encrypted SMB password in the # passdb is changed. unix password sync = yes
ただし、認証DBは別に持っており、ここにユーザ登録が必要。一昔前はこの操作はsmbpasswd(8)で行うことになっていたが、パスワードDBでの認証以外の様々な認証手段が増えてきたこともあり、抽象化のレイヤが一段あがって、新しくpdbedit(8)(日本語訳)というコマンドができた。追加は-aオプションで行う。
$ sudo pdfedit -a -u <em>user_name</em>
マニュアル内でのオプションの書き順の意図がよくわからない(素直にアルファベット順にするかユースケース順にすればよいのに微妙にそうなっていない)けど、真ん中くらいに記述がある。実行時にパスワードを設定するが、Debianテンプレートから変更しないと上記のようにOS認証情報と同期しようとするので素直にOS認証のパスワードを入れておく。smbpasswd(8)では即同期していたが、事故が多いのか、同期設定を入れていても作成時のみ同期はされない、という微妙な仕様になっている。
いやいや、意外と長くなった。これで終了、と思いきや、Sambaのマニュアルを斜め読みしたことで、このやり方は本来の意図と違うことに気が付いた。ということで次回は、この方法とは違う方法を試してみる。
追記:
クライアントのWindowsでCrystalDiskMarkを動かしたところsambaがフリーズしてしまい、対応にかなり困った。原因は切り分けていないが、この方法はやめておいたほうが良さそう。→ 結局、oplocks = noを付与して使うことにした。
コメントを残す