jailでwebサーバやSambaを動かすとき、ホストの特定ディレクトリを参照するのはよくあること。 たとえば以下のようなディレクトリ構成で、ホストのpicturesディレクトリを、jailである “jail_samba” のshared_folderで見られるようにしたい。

.
|-- jails
|   `-- jail_samba
|       `-- shared_folder
`-- pictures

こういう場合には、nullfsで/picturesを/jails/jail_samba/shared_folderにマウントするのが定石。
ただこの問題点は、jailが増えていくと、ホストでmountコマンドを実行したときにズラズラと表示が増えて見にくくなること。
しょうがないと言えばしょうがないのだが、もうちょっとなんとかならんか。

jailのfstab

jailには専用のfstabがあるのでそれを使う。
使うと、jailが実行されたときにマウントされ、停止したときにはアンマウントされる。 ファイルは/etc/fstab.<jailname>。 ただこの仕組みを使うと今度は/etcディレクトリの下が取っ散らかるのでjailのサポートツールを使う。
ここではqjailを使う。

qjailでjailごとのfstabを設定する。

/usr/local/etc/qjail.fstab/<jailname>で決める。

デフォルトの状態では以下の通り。
ここではplexという名前のjailである。

$ cat ./plex
/usr/jails/sharedfs /usr/jails/plex/sharedfs nullfs ro 0 0

mountの状態を見てみる。

$ sudo qjail start plex
Jail successfully started  plex
[doe@camazotz /usr/local/etc/qjail.fstab]$ mount
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
devfs on /dev (devfs, local, multilabel)
(略)
/usr/jails/sharedfs on /usr/jails/plex/sharedfs (nullfs, local, read-only)
devfs on /usr/jails/plex/dev (devfs, local, multilabel)

では、以下のように参照させる。

Hostディレクトリjail側のディレクトリ
/itunes/pictures/usr/jails/plex/pictures
/itunes/music/usr/jails/plex/music
/itunes/homevideo/usr/jails/plex/homevideo

まずjail側に、対応するディレクトリを作る。
もちろん作業前にjailは停止させましょう。

$ sudo qjail list


STATUS JID  NIC    IP              Jailname
------ ---- ------ --------------- --------------------------------------------
DS     N/A  re0    192.168.1.15    plex
$
$ cd /usr/jails/plex/
$ sudo mkdir pictures music homevideo
Password:
$ ls
COPYRIGHT       etc             lib             mnt             pictures        sbin            tmp
bin             home            libexec         music           proc            sharedfs        usr
dev             homevideo       media           net             root            sys             var

次にfstabの書き換え。

$ cd /usr/local/etc/qjail.fstab/
$ sudo vi ./plex
$ cat ./plex
/usr/jails/sharedfs /usr/jails/plex/sharedfs nullfs ro 0 0
/itunes/pictures        /usr/jails/plex/pictures        nullfs ro 0 0
/itunes/music           /usr/jails/plex/music           nullfs ro 0 0
/itunes/homevideo       /usr/jails/plex/homevideo       nullfs ro 0 0

で、jail plexをスタート。

$ sudo qjail start plex
Jail successfully started  plex
$ mount
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
devfs on /dev (devfs, local, multilabel)
(略)
zroot on /zroot (zfs, local, noatime, nfsv4acls)
/usr/jails/sharedfs on /usr/jails/plex/sharedfs (nullfs, local, read-only)
/itunes/pictures on /usr/jails/plex/pictures (nullfs, local, read-only)
/itunes/music on /usr/jails/plex/music (nullfs, local, read-only)
/itunes/homevideo on /usr/jails/plex/homevideo (nullfs, local, read-only)
devfs on /usr/jails/plex/dev (devfs, local, multilabel)

無事にマウントされた。
jail plexを止めて見てみよう。

$ sudo qjail stop plex
Jail successfully stopped  plex
$ mount
zroot/ROOT/default on / (zfs, local, noatime, nfsv4acls)
devfs on /dev (devfs, local, multilabel)
(略)
zroot on /zroot (zfs, local, noatime, nfsv4acls)

狙い通りmountが外れている。
以上。