CephFSを利用する(Windows/Samba編)

ということで前の記事の続き。CephFSを作ったは良いけど、Windowsからどうやって利用しよう、という話。ということで、しょうがないので、オーバヘッドはあるけど、Sambaサーバを立てることにした。手順は以下。

  1. Sambaサーバ用のコンテナを作成し、マウントされているCephFSをコンテナ内から見えるようにする。
  2. Sambaサーバをインストールして設定する。
  3. 認証用ユーザを登録してWindowsからアクセスする。(Windows11を想定)

コンテナの作成

Ceph→ホストカーネル→コンテナ→sambaと段階が深くなるため、なるべく高速に動作させるため、OSDがいるCephサーバ上で動かした。コンテナは何でもよいのだが、Debian12で作成した。ここで、普通に作るとホスト側のCephFSは参照できないため、以下の設定をコンテナ設定に入れる。

$ sudo /etc/pve/nodes/<em>&lt;node_name&gt;</em>/<em>&lt;container_id&gt;</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のほうに書いてある。

  • LANMAN1: 最初の 近代的な プロトコルであり、長いファイル名をサポートしている。
  • LANMAN2: LANMAN1 プロトコルを改良したものである。
  • NT1: 最新のプロトコルであり、Windows NTで使用されている。CIFS としても知られている。
  • SMB2: SMBプロトコルを実装しなおしたもので、 Windows Vista以降で使用されている。SMB2には幾つかのサブプロトコルが 存在する。
    • SMB2_02: 最初期の SMB2 プロトコル
    • SMB2_10: Windows 7 の SMB2 プロトコル
    aSMB2 を指定した場合、デフォルトでは SMB2_10 が選択される。
  • SMB3: SMB2と同じく、SMBプロトコルを実装し直したものであり、 Windows 8 で使用されている。 SMB3 にもサブプロトコルが存在する。
    • SMB3_00: Windows 8 の SMB3 プロトコル。
    • SMB3 を指定した場合、デフォルトでは SMB3_00 が選択される。
    • SMB3_02: Windows 8.1 の SMB3 プロトコル
    • SMB3_11: Windows 10 SMB3 バージョン。
    SMB3 の既定値は SMB3_11 である。
http://www.samba.gr.jp/project/translation/current/htmldocs/manpages/smb.conf.5.html#SERVERMAXPROTOCOL

自宅環境では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を付与して使うことにした。


投稿日

カテゴリー:

投稿者:

コメント

コメントを残す

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