ユーザ用ツール

サイト用ツール


os:freebsd:jail

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
os:freebsd:jail [2017/05/17 04:33] – [参考] hayashios:freebsd:jail [2023/07/28 10:13] (現在) – [共有メモリは推奨されない] hayashi
行 1: 行 1:
 +====== 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
 +
 +<del>//**※baseシステムをupdateしているとftpで10.0-RELEASE-p1ディレクトリにアクセスしようとして、失敗するので注意**//</del>((<del>/usr/libexec/bsdinstall/mirrorselect ディレクトリ名に uname -r を使用しているため。9.0-p3あたりから改善要望が出ているが、今のところ未対応の模様</del>))\\
 +2015.05.20 直った模様(10.1-RELEASE-p10で確認)
 +
 +//※最初のサイト選択で、<Other> を選択して、-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
 +<code>
 +# 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; }
 +</code>
 +
 +この例では、ホストと同じネットワークに接続する設定で、起動時にIP alias を振ってる。
 +
 +ホストと同じIPならこんな感じ
 +<code>
 +# 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等が使用できるようにするため)
 +}
 +</code>
 +/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
 +    -               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
 +
 +<del>ただし、先にjail内でpkgのインストールが必要です</del>((現在は不要。12.1で確認))
 +
 +<del>  jail# pkg
 +
 +ちなみに、jail内でpkgコマンドを使う場合、updateもしておかないと、動かないので注意
 +
 +  jail# pkg update</del>
 +
 +===== 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してくれるはず
 +
 +<code>
 +jail名 {
 +    exec.prestart   += "mount /jail/jail名/usr/ports";
 +    exec.poststop   += "umount /jail/jail名/usr/ports";
 +}
 +</code>
 +
 +/etc/jail.confで完結させる場合((12.0からmount_nullfsを使用するようになりました))
 +
 +<file ini /etc/jail.conf>
 +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";
 +
 +</file>
 +==== /usr/portsの場合 ====
 +リードオンリーでマウントしてるので、このままではビルドが失敗します。以下のように **/etc/make.conf** で作業用のディレクトリを指定します。
 +<file>
 +WRKDIRPREFIX = /var/ports
 +DISTDIR = /var/ports/distfiles
 +PACKAGES = /var/ports/packages
 +</file>
 +==== 共有メモリは推奨されない ====
 +
 +**PostgreSQL**のように共有メモリを使用するものはJAILでの動作は推奨されない
 +[[http://www.jp.freebsd.org/QandA/HTML/1866.html]]((# sysctl -w security.jail.sysvipc_allowed=1))
 +
 +===== ListenポートとIPアドレスの調整 =====
 +
 +ホストとjailで別々のIPを振った場合、サーバソフトでもそれを意識した設定が必要\\
 +つまり、listenアドレスをきちんと指定しないとエラーを起こす。
 +
 +ホストで待ち受けているポートを見る
 +
 +<code>
 +# 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 *:*
 +</code>
 +==== 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アドレス>
 +
 +<code>
 +# 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 *:*
 +</code>
 +
 +==== syslogd ====
 +
 +/etc/rc.confに以下を追記する
 +
 +  syslogd_flags="-ss"
 +
 +<code>
 +# 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 *:*
 +</code>
 +
 +==== 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 - スナップショットいつやるか?今でしょ!]]
 +
  
os/freebsd/jail.txt · 最終更新: 2023/07/28 10:13 by hayashi