彷徨えるフジワラ

年がら年中さまよってます

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 指定を行うことで、別な名前に改変できるとのことだけど、まぁ、別に長くても良いでしょう。