差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン | |||
memo:freebsd_jail [2018-11-14 13:59] Decomo 削除 |
— (現在) | ||
---|---|---|---|
行 1: | 行 1: | ||
- | ====== FreeBSD 10.1-RELEASEでjail環境を作る ====== | ||
- | |||
- | ===== 用語 ===== | ||
- | |||
- | ? jail [監獄] | ||
- | : FreeBSDのjail機能そのものを指したり、同機能を用いて構築された(仮想)システム[=hosted/ | ||
- | ? hosted | ||
- | : jailシステムで隔離されたシステム、プロセス、サービスを表す。 | ||
- | ? host | ||
- | : jailシステムが動いているシステム、プロセス、サービスを表す。名前の通りの意味。 | ||
- | ? prisoner [囚人] | ||
- | : hostedに同じ | ||
- | ? jailer [看守] | ||
- | : hostに同じ | ||
- | |||
- | ===== 試した環境 ===== | ||
- | |||
- | * FreeBSD 10.1-RELEASE | ||
- | * FreeBSD 11.1-RELEASE | ||
- | |||
- | ===== 種jailの準備 ===== | ||
- | |||
- | ==== jailの有効化 ==== | ||
- | |||
- | お馴染'' | ||
- | |||
- | <file conf / | ||
- | jail_enable=" | ||
- | </ | ||
- | |||
- | ==== jailのインストール ==== | ||
- | |||
- | ZFSでjail用のFSを作り''/ | ||
- | |||
- | < | ||
- | # zfs create zdata/ | ||
- | # cd /jails | ||
- | </ | ||
- | |||
- | jailディレクトリに展開されたシステムファイル群でしかないので、他のjailの種となるjailを1個用意しておけば、ただのディレクトリコピーで簡単にjailを増やすことができるのだ。ZFSのsnapshotなどと組み合わせれば、言わずもがな超高速かつ無駄を省いたjail環境を作ることも可能となる。 | ||
- | |||
- | というわけで、種jailを作る。 | ||
- | |||
- | '' | ||
- | < | ||
- | # bsdinstall jail _seed | ||
- | </ | ||
- | |||
- | {{ : | ||
- | |||
- | これまたお馴染みのFreeBSD Installerの画面が出てくる。lib32だけ入れとけば問題ないと思う。portsはnullfsでjailerのツリーを共用すれば容量の節約になる。packagesしか使わねーぜ!!ってんならportsすら不要。その他設定は以下のとおりだが、種jailなのでなるべくクリーンな状態の方針で。 | ||
- | |||
- | * rootのパスワード | ||
- | * 何でもいいので取り敢えず設定。コピーjailを作った時に変更する。 | ||
- | * System Configuration | ||
- | * チェックを全部外す(デフォでは何のデーモンも起動させない。) | ||
- | * ユーザー追加 | ||
- | * 誰も追加しない。 | ||
- | |||
- | ==== jailの追加と動作確認 ==== | ||
- | |||
- | 試しに、作成した種jailにjailerと同じIPアドレスを割り当て、監獄の中から通信できるか試してみる。 | ||
- | |||
- | ''/ | ||
- | |||
- | <file conf / | ||
- | exec.start = "/ | ||
- | exec.stop | ||
- | exec.clean; | ||
- | mount.devfs; | ||
- | path = "/ | ||
- | host.hostname = $name; | ||
- | |||
- | _seed { | ||
- | | ||
- | | ||
- | | ||
- | } | ||
- | </ | ||
- | |||
- | jail環境を起動。 | ||
- | < | ||
- | # service jail start _seed | ||
- | Starting jails: _seed. | ||
- | </ | ||
- | |||
- | <note warning> | ||
- | < | ||
- | / | ||
- | expr: illegal option -- 2 | ||
- | expr: usage: expr [-e] expression | ||
- | </ | ||
- | </ | ||
- | |||
- | 無事起動したら中に入ってみる。必要なのは'' | ||
- | < | ||
- | $ uname -a | ||
- | FreeBSD jail.example.com 10.1-RELEASE-p10 FreeBSD 10.1-RELEASE-p10 #0: Wed May 13 06:54:13 UTC 2015 | ||
- | # jexec _seed /bin/sh | ||
- | # uname -a | ||
- | FreeBSD _seed 10.1-RELEASE-p10 FreeBSD 10.1-RELEASE-p10 #0: Wed May 13 06:54:13 UTC 2015 | ||
- | </ | ||
- | |||
- | pingを打ってみる。 | ||
- | < | ||
- | # ping decomo.info | ||
- | PING decomo.info (59.106.13.158): | ||
- | 64 bytes from 59.106.13.158: | ||
- | 64 bytes from 59.106.13.158: | ||
- | 64 bytes from 59.106.13.158: | ||
- | 64 bytes from 59.106.13.158: | ||
- | ^C | ||
- | --- decomo.info ping statistics --- | ||
- | 4 packets transmitted, | ||
- | round-trip min/ | ||
- | </ | ||
- | |||
- | jailから抜けてjailを止める | ||
- | < | ||
- | # exit | ||
- | # service jail stop _seed | ||
- | Stopping jails: _seed. | ||
- | </ | ||
- | |||
- | ==== portsツリーの共有設定 ==== | ||
- | |||
- | 各jailでportsツリーを持つのは無駄なので、jail外に共有portsツリーを作りnullfsでマウントするようにする。 | ||
- | |||
- | 共有リソース用のFSを作る | ||
- | < | ||
- | # zfs create -o compression=gzip-5 zdata/ | ||
- | </ | ||
- | |||
- | 共有portsツリーを展開 | ||
- | < | ||
- | $ cd / | ||
- | # mkdir ports | ||
- | # portsnap -p ports fetch | ||
- | # portsnap -p ports extract | ||
- | # portsnap -p ports update | ||
- | </ | ||
- | |||
- | jail起動時に共有portsツリーのマウント、終了時にアンマウントするようにjail.confを修正。 | ||
- | |||
- | < | ||
- | exec.prestart += "mount -t nullfs -o ro / | ||
- | exec.prestart += "mount -t nullfs -o rw / | ||
- | exec.start = "/ | ||
- | exec.stop | ||
- | exec.poststop += " | ||
- | exec.poststop += " | ||
- | |||
- | exec.clean; | ||
- | mount.devfs; | ||
- | path = "/ | ||
- | host.hostname = $name; | ||
- | |||
- | _seed { | ||
- | | ||
- | | ||
- | | ||
- | } | ||
- | </ | ||
- | |||
- | portsの作業ディレクトリの設定 | ||
- | < | ||
- | # mkdir / | ||
- | # mkdir -p / | ||
- | # mkdir -p / | ||
- | </ | ||
- | |||
- | make.confに作業ディレクトリの指定を追加。ついでに、Xなどの使わないであろう機能のビルドオプションをデフォルトオフにしておく。 | ||
- | / | ||
- | < | ||
- | WRKDIRPREFIX = /var/ports/ | ||
- | DISTDIR = / | ||
- | PACKAGES = / | ||
- | |||
- | OPTIONS_UNSET=CUPS DEBUG DOCS FONTCONFIG NLS X11 | ||
- | WITHOUT_MODULES=sound ntfs linux | ||
- | WITHOUT_X11=yes | ||
- | </ | ||
- | |||
- | ==== 種jailの設定 ==== | ||
- | |||
- | 再び種jailの中に入り、諸々設定する。 | ||
- | |||
- | '' | ||
- | |||
- | <file conf / | ||
- | Components world kernel # srcを消す | ||
- | </ | ||
- | |||
- | < | ||
- | # freebsd-update fetch | ||
- | # freebsd-update install | ||
- | </ | ||
- | |||
- | どのprisonerでもportmaster/ | ||
- | < | ||
- | # pkg | ||
- | The package management tool is not yet installed on your system. | ||
- | Do you want to fetch and install it now? [y/N]: y | ||
- | Bootstrapping pkg from pkg+http:// | ||
- | (略) | ||
- | # pkg install portmaster | ||
- | </ | ||
- | |||
- | 他に同様のパッケージがあれば、この段階でインストールしておくと便利。参考までに自分が仕込んだのは以下の通り:autoconf automake bash emacs-nox gmake m4 perl texinfo | ||
- | |||
- | 一応、hostとjailでUID, | ||
- | <file conf / | ||
- | minuid 30000 | ||
- | mingid 30000 | ||
- | </ | ||
- | |||
- | ===== 種jailから本番jailを生やす ===== | ||
- | |||
- | ZFSのスナップショット&クローンを活用すれば、一瞬で種jailから本番jail環境を複製する事ができる。 | ||
- | |||
- | まずはスナップショットを作る。 | ||
- | < | ||
- | # zfs snapshot zdata/ | ||
- | </ | ||
- | |||
- | スナップショットは読み込み専用なので、cloneしてFSを作る。 | ||
- | < | ||
- | # zfs clone zdata/ | ||
- | </ | ||
- | |||
- | こんな感じで本番jail環境が出来上がる。 | ||
- | < | ||
- | $ zfs list | ||
- | zfs list | ||
- | NAME | ||
- | zdata | ||
- | zdata/ | ||
- | zdata/ | ||
- | zdata/ | ||
- | zdata/ | ||
- | zdata/ | ||
- | zdata/ | ||
- | </ | ||
- | |||
- | あとは/ | ||