VirtualBox ゲスト Solaris 上で CIFS サーバを立ち上げる
デスクトップ環境において、以前は「ホスト側 OpenSolaris で CIFS サーバ稼動」+「VirtualBox ゲスト側 Windows でファイル共有」という運用を企んでいたのだが、ホスト/ゲストを逆転させて運用することに。
OpenSolaris CIFS にこだわるのは、ZFS によるバックアップ機能を利用したいから。
tar + ssh とかでも良いのだけれど、ファイル名の扱いとか、世代管理とか色々考えると、やっぱり ZFS を使いたいところだよなぁ。
基本的には "Solaris CIFS Administration Guide" の手順に従って進めれば良いのだけれど、自身の備忘録も兼ねて、作業記録を残しておくことに。
SUN が Oracle に買収された際に、オンラインドキュメント類の URL が軒並み変更になって、以前のブックマーク情報が使い物にならなくなった経験があるので、多少の冗長さは必要なのだよ(笑)。
CIFS 共有のサーバ設定
まずは、カーネルベースの CIFS 共有機能がインストールされているかを確認。
$ svcs -a | grep smb
$
初期状態だと、カーネルベース CIFS 共有サーバ機能はインストールされていないので、pkg コマンドを使ってインストール&svcadm コマンドを使ってサービス開始。
$ pkg install pkg:/service/file-system/smb $ svcadm enable svc:/network/smb/server:default
パッケージ名指定は OS のビルドに応じて異なるので注意(SUNWsmbs の場合も)。
サービスが起動できたなら、次は Windows の workgroup に関する設定を。
企業内ネットワーク等で、Windows の DOMAIN モードによる共有を行う場合は、別途あれこれしなければいけないのだが、とりあえず workgroup モードの場合は、以下の設定をすれば OK。
まずはシステムワイドに実施する設定として、共有を行う WORKGROUP 名を指定して:
$ smbadm join -w WORKGROUP-NAME
認証系設定の変更として、/etc/pam.conf ファイルに以下の行を追加する。
other password required pam_smb_passwd.so.1 nowarn
次に、(既存の)各ユーザ毎の設定として、passwd コマンドによるパスワードの変更を行う必要がある。
このパスワード変更は、パスワード格納時の符号化方式において、Solaris 標準と CIFS 仕様では互換性が無いことから、/etc/shadow の格納値を使うことが出来ないことに由来している(らしい)。
# 出展忘れたので要確認....
パスワード変更操作において入力されたパスワードは、pam_smb_passwd PAM モジュールによって CIFS 共有仕様で符号化され、/var/smb/smbpasswd ファイルに保存される模様。
管理用の最初のユーザはしょうがないにしても、後々 CIFS 共有を行う予定がある場合は、早々に /etc/pam.conf ファイルを変更しておいた方が吉。
CIFS 共有対象のファイルシステム作成
ZFS の場合、権限の委譲を行うことで、スナップショット作成(zfs snapshot)とか、バックアップ作成(zfs send)とか、サブファイルシステムの作成(zfs create)等も、ユーザ権限で実施することが可能になるので、まずは権限委譲をしてしまう。
# 初期状態の確認 $ zfs allow zhomepool/export/home/fujiwara # zhomepool/export/home/fujiwara 配下の権限を委譲 $ zfs allow -u fujiwara create,destroy,mount,share zhomepool/export/home/fujiwara # zhomepool/export/home/fujiwara 配下の権限を確認 $ zfs allow zhomepool/export/home/fujiwara ---- Permissions on zhomepool/export/home/fujiwara ------------------- Local+Descendent permissions: user fujiwara create,destroy,mount,share $
権限委譲したなら、早速自分の HOME 配下に CIFS/NFS 共有可能なファイルシステムを作成したいところなのだが....
CIFS 共有において設定が必須/推奨な以下の属性のうち、nbmand と sharesmb に関しては、権限委譲が実施されていても、root 権限がないと設定できないという罠が .... orz
- nbmand (強制ロックの扱いに関する挙動の設定)
- sharesmb (CIFS 共有の有無の設定)
- casesensitivity (ファイル名一致判定に関する挙動の設定)
権限委譲の意味ねぇ....
以前調べた際には、sharesmb=on での "zfs create" の延長で、ファイルシステムを export するための share コマンドが起動されていることを確認できたので、その際のプロセス権限設定に問題があるのだと思われる。
export 処理絡みで予想されるように、NFS 共有のための sharenfs 属性も、やはり roo t 権限が無いと指定不能。
ちなみに、その際にどうやって share コマンドの起動を確認したのかは、とんと忘れてしまったんだよなぁ .... orz
truss だと ZFS 固有の ioctl() から先の挙動がわからないので、確か DTrace を使ったと思ったのだが ....
やっぱり、手を動かした結果は、間を置かずにメモしないと駄目だ。
しょうがないので、root 権限を使って必要な属性を持ったファイルシステムを作成。
$ zfs create \
-o nbmand=on \
-o sharesmb=on \
-o casesensitivity=mixed \
zhomepool/export/home/fujiwara/cifs_shared
$
/etc/dfs/sharetab を確認してみると、新規作成したファイルシステムが export されているのが確認できる。
root 権限で "zfs create" したので、所有者情報を変更しておくのを忘れないように....
CIFS クライアントからのアクセス
とりあえずここまで出来たら、CIFS クライアントからアクセス出来る筈。
Windows7 の場合、ネットワークの種別指定(「ホーム」「社内」「パブリック」)や共有設定次第では、自動的な CIFS 資源の列挙とかをしてくれないっぽいのだが、「ツール」→「ネットワークドライブの割り当て」で、ゲスト側の IP アドレスと共有対象名を直接入力すれば OK。
共有対象名は、sharemgr 出力の以下の部分。
$ sharemgr show -vp default nfs=() zfs zfs/zhomepool/export/home/fujiwara/cifs_shared smb=() zhomepool_export_home_fujiwara_cifs_shared=/export/home/fujiwara/cifs_shared
zfs の sharesmb プロパティに name=resource-name 指定を行うことで、別な名前に改変できるとのことだけど、まぁ、別に長くても良いでしょう。