memo:freebsd_jail

差分

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

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
memo:freebsd_jail [2016-06-10 19:15]
Decomo
memo:freebsd_jail [2018-11-14 13:59]
Decomo 削除
行 4: 行 4:
  
   ? jail [監獄]   ? jail [監獄]
-    : FreeBSDのjail機能そのものを指したり、同機能を用いて構築された(仮想)システム[=prisoner]を指したりする。要はサンドボックス。 +    : FreeBSDのjail機能そのものを指したり、同機能を用いて構築された(仮想)システム[=hosted/prisoner]を指したりする。要はサンドボックス。 
-  ? jailer [看守] +  ? hosted 
-    : (仮想)システム[=prisoner/jail]を動かしている実際のシステム。要はホ+    : jailシステムで隔離されたシステム、プロセス、サービス表す。 
 +  ? host 
 +    : jailシステムがているシステム、プロセ、サービスを表す。名前の通りの意味
   ? prisoner [囚人]   ? prisoner [囚人]
-    : jail機能で構築され動いている(仮想)システム。要は仮想マシン・・・と言いたい所だが、一般的な意味である所の"仮想マシン"とは明らか思想も構造も違うので、個人的はjailを仮想マシンとは呼びくはない。jailはjailなのである。+    : hosted同じ 
 +  ? jailer [看守] 
 +    : host同じ 
 + 
 +===== 試し環境 ===== 
 + 
 +  * FreeBSD 10.1-RELEASE 
 +  * FreeBSD 11.1-RELEASE
  
 ===== 種jailの準備 ===== ===== 種jailの準備 =====
行 22: 行 31:
 ==== jailのインストール ==== ==== jailのインストール ====
  
-jail環境は''/usr/home/jail''置く事とする。+ZFSでjail用のFSを作り''/jail''マウントする。もちろん、パスは任意でおk。 
 <code> <code>
-cd /usr/home +zfs create zdata/ROOT/jail -o mountpoint=/jail 
-mkdir jail+cd /jails
 </code> </code>
 +
 +jailディレクトリに展開されたシステムファイル群でしかないので、他のjailの種となるjailを1個用意しておけば、ただのディレクトリコピーで簡単にjailを増やすことができるのだ。ZFSのsnapshotなどと組み合わせれば、言わずもがな超高速かつ無駄を省いたjail環境を作ることも可能となる。
 +
 +というわけで、種jailを作る。
  
 ''bsdinstall''でjail環境をインストールする。第二引数でインストールする場所≒jail名を指定するが、jail名にハイフンは含めないこと(詳しくは後述)。 ''bsdinstall''でjail環境をインストールする。第二引数でインストールする場所≒jail名を指定するが、jail名にハイフンは含めないこと(詳しくは後述)。
 <code> <code>
-# bsdinstall jail jail/jseed20160101+# bsdinstall jail _seed
 </code> </code>
  
 {{ :freebsd:jail:bsdinstall_jail_install.png |}} {{ :freebsd:jail:bsdinstall_jail_install.png |}}
  
-これまたお馴染みのFreeBSD Installerの画面が出てくる。lib32, portsだけ入れとけば問題ないと思う。packagesしか使わねーぜ!!ってんならportsすら不要。その他設定は以下のとおりだが、種jailなのでなるべくクリーンな状態の方針で。+これまたお馴染みのFreeBSD Installerの画面が出てくる。lib32だけ入れとけば問題ないと思う。portsはnullfsでjailerのツリーを共用すれば容量の節約になる。packagesしか使わねーぜ!!ってんならportsすら不要。その他設定は以下のとおりだが、種jailなのでなるべくクリーンな状態の方針で。
  
   * rootのパスワード   * rootのパスワード
行 55: 行 69:
 exec.clean; exec.clean;
 mount.devfs; mount.devfs;
-path = "/home/jail/$name";+path = "/jail/$name";
 host.hostname = $name; host.hostname = $name;
  
-jseed20160101 {+_seed {
      ip4.addr = ホストのIPアドレス;      ip4.addr = ホストのIPアドレス;
      allow.chflags;      allow.chflags;
行 67: 行 81:
 jail環境を起動。 jail環境を起動。
 <code> <code>
-# service jail start jseed20160101 +# service jail start _seed 
-Starting jails: jseed20160101.+Starting jails: _seed.
 </code> </code>
  
行 83: 行 97:
 $ uname -a $ uname -a
 FreeBSD jail.example.com 10.1-RELEASE-p10 FreeBSD 10.1-RELEASE-p10 #0: Wed May 13 06:54:13 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64 FreeBSD jail.example.com 10.1-RELEASE-p10 FreeBSD 10.1-RELEASE-p10 #0: Wed May 13 06:54:13 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
-# jexec jseed20160101 /bin/sh+# jexec _seed /bin/sh
 # uname -a # uname -a
-FreeBSD jseed20160101 10.1-RELEASE-p10 FreeBSD 10.1-RELEASE-p10 #0: Wed May 13 06:54:13 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64+FreeBSD _seed 10.1-RELEASE-p10 FreeBSD 10.1-RELEASE-p10 #0: Wed May 13 06:54:13 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
 </code> </code>
  
行 100: 行 114:
 4 packets transmitted, 4 packets received, 0.0% packet loss 4 packets transmitted, 4 packets received, 0.0% packet loss
 round-trip min/avg/max/stddev = 17.151/17.192/17.236/0.035 ms round-trip min/avg/max/stddev = 17.151/17.192/17.236/0.035 ms
 +</code>
 +
 +jailから抜けてjailを止める
 +<code>
 +# exit
 +# service jail stop _seed
 +Stopping jails: _seed.
 +</code>
 +
 +==== portsツリーの共有設定 ====
 +
 +各jailでportsツリーを持つのは無駄なので、jail外に共有portsツリーを作りnullfsでマウントするようにする。
 +
 +共有リソース用のFSを作る
 +<code>
 +# zfs create -o compression=gzip-5 zdata/R/jail/_share
 +</code>
 +
 +共有portsツリーを展開
 +<code>
 +$ cd /jail/_share
 +# mkdir ports
 +# portsnap -p ports fetch
 +# portsnap -p ports extract
 +# portsnap -p ports update
 +</code>
 +
 +jail起動時に共有portsツリーのマウント、終了時にアンマウントするようにjail.confを修正。
 +
 +<code>
 +exec.prestart += "mount -t nullfs -o ro /jail/_share/ports /jail/${name}/usr/ports";
 +exec.prestart += "mount -t nullfs -o rw /jail/_share/distfiles /jail/${name}/var/ports/distfiles";
 +exec.start = "/bin/sh /etc/rc";
 +exec.stop  = "/bin/sh /etc/rc.shutdown";
 +exec.poststop += "umount /jail/${name}/var/ports/distfiles";
 +exec.poststop += "umount /jail/${name}/usr/ports";
 +
 +exec.clean;
 +mount.devfs;
 +path = "/jail/$name";
 +host.hostname = $name;
 +
 +_seed {
 +     ip4.addr = 218.251.112.107;
 +     allow.chflags;
 +     allow.raw_sockets;
 +}
 +</code>
 +
 +portsの作業ディレクトリの設定
 +<code>
 +# mkdir /jail/_seed/usr/ports
 +# mkdir -p /jail/_seed/var/ports/distfiles
 +# mkdir -p /jail/_seed/var/ports/packages
 +</code>
 +
 +make.confに作業ディレクトリの指定を追加。ついでに、Xなどの使わないであろう機能のビルドオプションをデフォルトオフにしておく。
 +/jail/_seed/etc/make.conf
 +<code>
 +WRKDIRPREFIX = /var/ports/
 +DISTDIR = /var/ports/distfiles/
 +PACKAGES = /var/ports/packages/
 +
 +OPTIONS_UNSET=CUPS DEBUG DOCS FONTCONFIG NLS X11
 +WITHOUT_MODULES=sound ntfs linux
 +WITHOUT_X11=yes
 </code> </code>
  
 ==== 種jailの設定 ==== ==== 種jailの設定 ====
 +
 +再び種jailの中に入り、諸々設定する。
  
 ''freebsd-update''をしておく。srcは更新対象から外しておく(src込みでインストールしたならこの限りではない)。 ''freebsd-update''をしておく。srcは更新対象から外しておく(src込みでインストールしたならこの限りではない)。
行 115: 行 197:
 </code> </code>
  
-どのprisonerでもpkgは使うことになると思うので、種に仕込んでおく。他に同様のパッケージがあれば、この段階でインストールしておいても良いだろう(bashとかemacsとか…)+どのprisonerでもportmaster/pkgは使うことになると思うので、種に仕込んでおく。
 <code> <code>
 # pkg # pkg
行 122: 行 204:
 Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait... Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest, please wait...
 (略) (略)
 +# pkg install portmaster
 </code> </code>
  
-prisoner間でUID, GIDが被らないように設定。+他に同様のパッケージがあれば、この段階でインストールしておくと便利。参考までに自分が仕込んだのは以下の通り:autoconf automake bash emacs-nox gmake m4 perl texinfo 
 + 
 +一応、hostとjailでUID, GIDが被らないように設定。といっても、システムが自動で作るユーザー/グループ(rootとかwwwとかmysqlとか)には無力だし、ユーザー追加時に手動でいくらでも好きな数値が指定できるので、あんまり神経質なっても仕方がないと思う。jail間の被りも避けたいなら、maxuid/maxgidも使っていい感じの値を設定してくだしあ
 <file conf /etc/pw.conf> <file conf /etc/pw.conf>
-minuid 65000 +minuid 30000 
-maxuid 65500 +mingid 30000
-mingid 65000 +
-maxgid 65500+
 </file> </file>
  
 +===== 種jailから本番jailを生やす =====
 +
 +ZFSのスナップショット&クローンを活用すれば、一瞬で種jailから本番jail環境を複製する事ができる。
 +
 +まずはスナップショットを作る。
 +<code>
 +# zfs snapshot zdata/R/jail/_seed@20180831
 +</code>
 +
 +スナップショットは読み込み専用なので、cloneしてFSを作る。
 +<code>
 +# zfs clone zdata/R/jail/_seed@20180831 zdata/R/jail/www
 +</code>
 +
 +こんな感じで本番jail環境が出来上がる。
 +<code>
 +$ zfs list
 +zfs list
 +NAME                     USED  AVAIL  REFER  MOUNTPOINT
 +zdata                   1.97G  36.5G    96K  legacy
 +zdata/                1.96G  36.5G    96K  legacy
 +zdata/R/home            5.19M  36.5G  5.19M  /usr/home
 +zdata/R/jail            1.96G  36.5G   104K  /jail
 +zdata/R/jail/_seed      1.20G  36.5G  1.20G  /jail/_seed
 +zdata/R/jail/_share      773M  36.5G   773M  /jail/_share
 +zdata/R/jail/www           8K  36.5G  1.20G  /jail/www
 +</code>
 +
 +あとは/etc/jail.confに作成したjailの記述を追加する。
  
-$ service jail status 
- JID             IP Address      Hostname                      Path 
- jseed20160605   133.242.169.85  jseed20160605                 /usr/home/jail/jseed20160605 
-$ jls 
-   JID  IP Address      Hostname                      Path 
-      133.242.169.85  jseed20160605                 /usr/home/jail/jseed20160605 
-      
-http://blog.fff.io/2011/07/freebsd_jail_1ip.html