====== jail+zfs ======
jailとzfsと組み合わせて、種になるjailを作成して、そのスナップショットをテンプレートにしてzfs cloneで作成します。\\
設定周りのスクリプトがあればezjailとかなくても良いかも…
===== 場所の確保 =====
# zfs create -o mountpoint=/jail tank01/jail
# zfs create tank01/jail/base
===== 元となるjailの構築 =====
入れるのはbaseとlib32でとりあえず大丈夫でしょう。
# bsdinstall jail /jail/base
//**※baseシステムをupdateしているとftpで10.0-RELEASE-p1ディレクトリにアクセスしようとして、失敗するので注意**//((/usr/libexec/bsdinstall/mirrorselect ディレクトリ名に uname -r を使用しているため。9.0-p3あたりから改善要望が出ているが、今のところ未対応の模様))\\
2015.05.20 直った模様(10.1-RELEASE-p10で確認)
//※最初のサイト選択で、 を選択して、-pn (nはパッチレベル)を取り除くことでも対応可能//
===== 元となるjailのupdate =====
必要に応じて元jailをupdateしておく((-b でbaseディレクトリを -d でtempを指定している))((jailが起動していなくてもOK))
# freebsd-update -b /jail/base -d /jail/base/var/db/freebsd-update fetch
# freebsd-update -b /jail/base -d /jail/base/var/db/freebsd-update install
jail環境で
# sysctl security.jail.param.allow.chflags=1
とすることで、jail環境内でも freebsd-update を利用できる模様。((2014.05.07現在未確認))
===== 設定 =====
/etc/jail.conf
# common variables
exec.prestart += "ifconfig ${nic} inet ${ip4.addr} add";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.poststop += "ifconfig ${nic} inet ${ip4.addr} -alias";
exec.clean;
$nic = "xn0";
mount.devfs;
path = "/jail/$name";
host.hostname = $name;
# each jail
base { ip4.addr = 192.168.0.128; }
この例では、ホストと同じネットワークに接続する設定で、起動時にIP alias を振ってる。
ホストと同じIPならこんな感じ
# common variables
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
path = "/jail/$name";
host.hostname = $name;
# each jail
base {
ip4.addr = <ホストのIPアドレス>;
allow.chflags; <= chflagsの使用許可(freebsd-updateが実行できるようにするため)
allow.raw_sockets; <= RAW SOCKETの使用許可(ping等が使用できるようにするため)
}
/etc/rc.conf
jail_enable="YES"
起動するjailを指定する場合
jail_list="jail01 jail02 jail05"
並列起動((起動に失敗するケースが有ったのでOFFにしてる))
jail_parallel_start="YES"
===== スナップショット =====
# zfs snapshot tank01/jail/base@10.0p1
スナップショットの一覧
# zfs list -t snapshot
===== 新しい監獄をzfs cloneで作る =====
# zfs clone tank01/jail/base@10.0p1 tank01/jail/NewJail
/etc/jail.confを忘れないように
===== 起動 =====
# service jail start base
===== 一覧 =====
# service jail status
OR
# jls
JID IP Address Hostname Path
1 - yourjail.localdomain /path/to/yourjail
===== jailに入る =====
# jexec 1 /bin/sh
↑ ↑ ログイン用シェル
↑ jail ID (jail名でも可)
===== 止める =====
# service jail stop base
===== 削除 =====
# service jail stop base
# chflags -R noschg /jail/base/*
# rm -R /jail/base/*
===== pkgngの利用 =====
[[os:freebsd:pkg_8|pkgコマンド]]はjailの外から利用可能です
# pkg -j jail名|jailID info
ただし、先にjail内でpkgのインストールが必要です((現在は不要。12.1で確認))
jail# pkg
ちなみに、jail内でpkgコマンドを使う場合、updateもしておかないと、動かないので注意
jail# pkg update
===== Host側のディレクトリをマウント =====
nullfsを利用します。((古い記述だとカーネルの再構築が必要となっていますが、10.0では不要でした))\\
例:/usr/ports を jailで共有する\\
/etc/fstabに以下のような記述\\
/usr/ports/ /jail/jail名/usr/ports nullfs ro,noauto 0 0
mountすればjail側で使えるようになります
# mount /jail/jail名/usr/ports
/etc/jail.confだとこんな感じで書けば、jailの起動時にマウントして停止時にumountしてくれるはず
jail名 {
exec.prestart += "mount /jail/jail名/usr/ports";
exec.poststop += "umount /jail/jail名/usr/ports";
}
/etc/jail.confで完結させる場合((12.0からmount_nullfsを使用するようになりました))
exec.prestart += "mount_nullfs -o ro /usr/ports/ /jail/$name/usr/ports";
exec.prestart += "mount_nullfs /var/cache/pkg/ /jail/$name/var/cache/pkg";
exec.poststop += "umount /jail/$name/usr/ports";
exec.poststop += "umount /jail/$name/var/cache/pkg";
==== /usr/portsの場合 ====
リードオンリーでマウントしてるので、このままではビルドが失敗します。以下のように **/etc/make.conf** で作業用のディレクトリを指定します。
WRKDIRPREFIX = /var/ports
DISTDIR = /var/ports/distfiles
PACKAGES = /var/ports/packages
==== 共有メモリは推奨されない ====
**PostgreSQL**のように共有メモリを使用するものはJAILでの動作は推奨されない
[[http://www.jp.freebsd.org/QandA/HTML/1866.html]]((# sysctl -w security.jail.sysvipc_allowed=1))
===== ListenポートとIPアドレスの調整 =====
ホストとjailで別々のIPを振った場合、サーバソフトでもそれを意識した設定が必要\\
つまり、listenアドレスをきちんと指定しないとエラーを起こす。
ホストで待ち受けているポートを見る
# sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1359 3 tcp4 127.0.0.1:25 *:*
root sshd 1356 4 tcp4 *:22 *:*
root syslogd 1293 7 udp4 *:514 *:*
==== apache ====
/usr/local/etc/apache/httpd.conf
Listen 192.168.1.jailアドレス:80
Listen 192.168.1.jailアドレス:443
==== Nginx ====
/usr/local/etc/nginx/nginx.conf((前述手順でjailを作った場合なくても動いた))
listen 192.168.1.jailアドレス:80
==== lighttpd ====
/usr/local/etc/lighttpd/lighttpd.conf
server.bind = "192.168.1.jailアドレス"
......
$SERVER["socket"] == "192.168.1.jailアドレス:80" { }
==== sshd ====
/etc/ssh/sshd_config((前述手順でjailを作った場合なくても動いた))
ListenAddress <ホストのIPアドレス>
# service sshd restart
# sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1359 3 tcp4 127.0.0.1:25 *:*
root sshd 1356 4 tcp4 <ホストのIPアドレス>:22 *:*
root syslogd 1293 7 udp4 *:514 *:*
==== syslogd ====
/etc/rc.confに以下を追記する
syslogd_flags="-ss"
# service syslogd restart
# sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1359 3 tcp4 127.0.0.1:25 *:*
root sshd 1356 4 tcp4 <ホストのIPアドレス>:22 *:*
root syslogd 1293 7 udp4 <ホストのIPアドレス>:514 *:*
==== inetd ====
/etc/rc.confに以下を追記する
inetd_flags="-wW -C 60 -a <ホストのIPアドレス>"
===== jail内のUID/GIDの範囲を指定する =====
jail内の/etc/pw.conf(/jail/jail名/etc/pw.conf)で指定
defaultpasswd no
minuid 10000
maxuid 19999
mingid 10000
maxgid 19999
===== Memo =====
デフォルトの状態では、traceroute、ping、bpfを利用したWIDE-DHCP等のraw socketを利用するプログラムが正常に動作しません。 これらを利用するためには、hostの「/etc/sysctl.conf」に以下の記述を追記
security.jail.allow_raw_sockets=1
/etc/resolv.confの直し忘れが多いので注意
===== 参考 =====
* [[https://people.allbsd.org/~hrs/FreeBSD/sato-FBSDW20200925-jail.pdf|復習 FreeBSD Jail]]
* [[http://journal.reallyenglish.com/2009/10/21/freebsd-jail-for-programmer-1.html|FreeBSD/Jailを使用したプログラマのための仮想環境]]
* [[http://bompopo.wordpress.com/2014/02/16/freebsd10-0r%E3%81%A7jail%E3%81%AE%E8%A8%AD%E5%AE%9A/|FreeBSD10.0Rでjailの設定]]
* [[http://bompopo.wordpress.com/2014/02/17/%E4%B8%80%E6%AD%A9%E9%80%B2%E3%82%81%E3%81%9Fjail-conf%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/|一歩進めたjail.confの書き方]]
* [[http://blog.livedoor.jp/dankogai/archives/51916648.html|FreeBSD - Jailは仮想化ではなく半仮想化と呼ぶべきではないか]]
* [[http://rauq04.blogspot.jp/2012/03/freebsd-memo-qjail.html|qjail を使って簡易仮想環境作成]]
* [[http://www.bugbearr.jp/?FreeBSD%2FJail|FreeBSD/Jail]]
* [[http://d.zinrai.info/blog/html/2013/08/22/freebsd_jail_vimage_zfs.html|FreeBSD 9.1 VIMAGE + ZFS で Jail環境構築]]
* [[http://gihyo.jp/admin/serial/01/bsd-yomoyama/0003|複数バージョンのFreeBSDをJailで共有させる方法]]
* [[https://therub.org/2014/08/11/convert-freebsd-jails-from-rc.conf-to-jail.conf/|Convert FreeBSD 10 Jails from rc.conf to jail.conf]]
* [[https://gist.github.com/sdebnath/086874c5df8b68e0df69|FreeBSD Jails with VLAN HOWTO]]
* [[https://bastille.readthedocs.io/en/latest/chapters/jail-config.html|jail.conf]]
* [[https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=233310|jails: Modularize configuration system (conf.d)]]
* [[https://qiita.com/dankogai/items/ffc4f31a8a949bd7ec01|ZFS - スナップショットいつやるか?今でしょ!]]