FreeBSD6.2Rでjail環境構築中 - ナウいezjailの構築法
http://d.hatena.ne.jp/m-bird/20080118/1200643734の続き。
portsツリーを分けるかどうか。
さて、この後portsツリーを使えるようにする必要があります。
今まで仮想環境を使わずにFreeBSDを使うときは、portsツリーをcvsup等で持ってきていました。
しかし、ezjailで複数台マシンを作る場合、portsツリーがマシンの数だけできてしまい、メンテナンスの手間が増え、HDD容量も無駄になります。
そこで、nullfsを使って、HOST環境のportsツリーをリードオンリーでマウントします。
これにより、
- host環境のportsツリー一個分のHDD容量だけで済む
- host環境のportsツリーを更新するだけで、全ての仮想マシンのportsツリーが更新される
- nullfsでリードオンリーなので、「マウントしてるから、host環境に辿られたり…」という心配が無くなります(...多分
しかし。
FreeBSD7.0-currentで/etc/fstabでro(Read-Only)でnullfsなマウントしても、なぜかwriteが立ってるというバグがあったらしいです。
つまり、「jail環境でportsツリーを書き換えたら、マウント元であるhostのportsツリーまで書き換わってしまう」という事です。
これじゃ、hostマシンと完全に隔離したんだってVA!なんて言えませんね。
6.2-Rや6.3-Rでは問題ないですが、jailの公式では
忠実な訳:「またそんなバグあったら危ないから、ホスト環境とjail環境では完璧に環境を分離させた方が良いと思うお。portsツリーもHOST環境とjail環境で分けた方が良いと思うお。」
とあったりします。
「多少ディスク容量が無駄になったとしてもhostのツリーと分けようぜ、その方が夜も安心だろ?」という事です。
以上を読んで、
「よし、俺ナウいezjailの構築方法を実行するZE!」
って言う人はこのまま読み進めて下さい。
「危険性は分かったけど、リリースなバージョンではそんなバグ無いだろ?ディスクを少しでも節約したいZE!」という人は次のリンク先へ行ってください。
http://d.hatena.ne.jp/m-bird/20080118/1200643734
jail用のportsツリー構築
ezjailはデフォルトで/basejail/usr/portsをマウントするようになっています。
そこにportsツリー構築してやれば、jail環境でもportsツリーが使えるようになります。
まず以下をチェック
/usr/jails/basejail/usr/ports /usr/jails/basejail/usr/src
この二つのディレクトリがあるかどうか確認(私はここで詰まりましたorz)。
portsツリーをごっすんごっすん
次に、portsツリーを作っちゃいます。
今回はcvsupを使ってportsツリーを持ってくる場合について書きます。
# cp /usr/share/examples/cvsup/ports /root/jail-ports-supfile
とりあえず、rootのホームディレクトリあたりに、standard-supfileのexampleをコピー。
*default host=CHANGE_THIS.FreeBSD.org *default base=/var/db *default prefix=/home/ncvs *default release=cvs *default delete use-rel-suffix
上のような感じになっているのを、下のような感じに。
*default host=cvsup3.jp.FreeBSD.org *default base=/usr/YOUR_JAIL_PATH/jails *default prefix=/usr/YOUR_JAIL_PATH/jails/basejail/usr
YOUR_JAIL_PATHは、適当にjailsディレクトリへのパスと置き換えてください。
で、実行。
# cvsup /root/jail-ports-supfile
ごっすんごっすんportsツリー構築。
以上で終わり。
後は、時々portsツリーを更新してやらなきゃなりませんが、hostとjailの両方を更新わすれないように、適当なシェルスクリプトでも書いて、常にそれを実行するようにした方が良いと思います。
cvsup /root/ports-supfile cvsup /root/jail-ports-supfile
とか、適当に。
以上設定が終わったら、いよいよjail環境内の仮想マシンを実行します。
http://d.hatena.ne.jp/m-bird/20080118/1200647446
続きへGO
おまけ。
/jails/flavours/defaultとかありますが、ここのezjail.flavourとかを編集するとezjailを初めて走らせる時にscreenとかvimとかmakeしてもらえます。
cd /usr/ports/sysutils/screen && make install cd /usr/ports/sysutils/vim && make install cd /usr/ports/sysutils/sudo && make install
こんな感じで列挙。
ただ、portsからインストールする時みたくportsのconfig画面は出ません。
つまり、デフォルト設定のまんまmakeが走ります。ギャース。
で、打開策としてはWITHOUT_GUI=yes...とか延々と書く。
めどいですか?ええ、めどいです。
で、もう一つの方法としてはhost環境でconfigしてから、そのconfigファイルだけ持ってくる。
たとえば、sudoとかだと
# cd /usr/ports/security/sudo # make rmconfig # make config
こんな感じ。
sudoのディレクトリまで行って、make rmconfigで今までのconfigファイルを飛ばす。
んで、make configで設定ファイルを再生成。
一旦configファイルを吹っ飛ばしておかないと、host環境で設定したものと同じものになってしまうので。
hostと同じ設定で良くても、設定見直しを兼ねて再設定した方が無難です。
設定が終わったら、その設定ファイルをコピーしてやります。
# mkdir -p /usr/local/jails/flavours/default/var/db/ports/sudo # cp /var/db/ports/sudo/options /usr/local/jails/flavours/default/var/db/ports/sudo
これで、make時のオプションが指定できます。
が。
これだけだと、GUIで設定できる分しか設定してやれません。
例えば、WITHOUT_GUI=yesとか、WITHOUT_X11=yesとか。
そうじゃないと、サーバなのにX11とかいう憎き敵がごっすんごっすんmakeされてしまいます。
回避する為に、flavoursディレクトリ以下の/etc/make.confをきちんと書いておきましょう。
で、結論。
flavoursディレクトリに入れるのは、make.confとかresolv.confとか、そういったものだけでよくね?と。
ezjail.flavourの設定をミスってて、途中でmakeが終わってたとしても端末を通して見る事は無理なんですよね。
いつmakeが終わるとも知れないし(ロードアベレージ見てりゃ大体分かりますし、sshで構築中の仮想マシンにログインしちゃえばpsで何makeしてるか分かりますが面倒)。
10個20個作って貸し出しする人でないなら、とりあえずmake.confとかresolv.confとかをfravours以下の/etc/に置いておく、位が丁度いいんでないかなー、と。
FreeBSD6.2Rでjail環境構築中 - hostの環境を整える
やっぱり途中ミスったりするんで、メモ書き。
参考サイトのデッドコピーになるけど、気づいた所を。
参考サイト:http://free-vv.dyndns.org/d/?q=node/406
FreeBSD6.2Rで構築。
Portsからインストールするお
# cd /usr/ports/sysutils/ezjail # make install clean # rehash
以上でインストール完了。
ezjailは単なるスクリプトなので、速攻でインストール完了。
cp -p /usr/local/etc/ezjail.conf.sample /usr/local/etc/ezjail.conf
とりあえず、サンプルのコンフィグファイルをコピーしておきます。
ところで、「サンプルのコンフィグファイルや、デフォルトの設定を/root/default-configとかに取って置くのが行儀いいかなぁ、一緒にインストールログと一緒に。」と思いつつ、いつもやってないm-birdで御座います。
ezjail.confは以下の通り。
参考にさせて貰っているサイトさんとほぼ同じです。はい。
# ezjail.conf - Example file, see ezjail.conf(5) # # Note: If you alter some of those variables AFTER creating your first # jail, you may have to adapt /etc/fstab.* and EZJAIL_PREFIX/etc/ezjail/* by # hand # Location of jail root directories # # Note: If you have spread your jails to multiple locations, use softlinks # to collect them in this directory ezjail_jaildir=/usr/local/jails # Location of the tiny skeleton jail template # ezjail_jailtemplate=${ezjail_jaildir}/newjail # Location of the huge base jail ezjail_jailbase=${ezjail_jaildir}/basejail # Location of your copy of FreeBSD's source tree # ezjail_sourcetree=/usr/src # In case you want to provide a copy of ports tree in base jail, set this to # a cvsroot near you # ezjail_portscvsroot=:pserver:anoncvs@anoncvs.at.FreeBSD.org:/home/ncvs # This is where the install sub command defaults to fetch its packages from # ezjail_ftphost=ftp.freebsd.org # base jail will provide a soft link from /usr/bin/perl to /usr/local/bin/perl # to accomodate all scripts using '#!/usr/bin/perl'... # ezjail_uglyperlhack="YES" # Default options for newly created jails # # Note: Be VERY careful about disabling ezjail_mount_enable. Mounting # basejail via nullfs depends on this. You will have to find other # ways to provide your jail with essential system files ezjail_mount_enable="YES" ezjail_devfs_enable="YES" ezjail_devfs_ruleset="devfsrules_jail" ezjail_procfs_enable="YES" ezjail_fdescfs_enable="YES"
ベースシステムを構築する。
# ezjail-admin update -i
-iを付ける事によって、buildworldされずにinstallworldされます。
最近worldを再構築したばかりなら、-iオプションを付けてくだしあ。
そうじゃないんなら、-iを付けずに。
HOST側の環境の設定をするお
次に、ホスト側の設定を。
/etc/rc.confの設定
# vim /etc/rc.conf inetd_flags="-wW -C 60 -a 192.168.hoge.hoge" ezjail_enable="YES" ifconfig_xxx_alias0="inet 192.168.fuga.fuga netmask 255.255.255.255"
192.168.hoge.hogeな部分を、host側のIPアドレスに。
192.168.fuga.fugaな部分を、jail側のIPアドレスに。
ifconfig_xxx_alias0のxxxの部分については、自分のNICの名前を入れてください。
ifconfigできちんと名前を確認した上で、入れてくださいな。
/etc/sysctl.conf
# vim /etc/sysctl.conf security.jail.allow_raw_sockets=1
raw socketsを使わないんだったら、これ要らない。。。っぽい?
/etc/ssh/sshd_config
# vim /etc/ssh/sshd_config ListenAddress 192.168.hoge.hoge
ListenAddressの部分を、host環境のIPアドレスを設定して下さい。
デフォルトの設定だとJail側に送られるパケットまで拾ってしまうので、HOST側のIPでListenするように>します。
(今回のjailの設定でも、jailの数だけNICがアドレスを持ちます)
とりあえず、ここまで。
続きはhttp://d.hatena.ne.jp/m-bird/20080118/1202583191
FreeBSD6.2Rでjail環境構築中 - ezjail内の環境を整える
http://d.hatena.ne.jp/m-bird/20080118/1200643734
又は
http://d.hatena.ne.jp/m-bird/20080118/1200647446
からの続きです。
jail環境を作っちゃうぅぅぅう!
# ezjail-admin create -f default JAIL-NAME 192.168.fuga.fuga
jail-nameの部分を、jailで作られるマシンに付けたい名前にしてくだしあ。
IPアドレスは、jailマシンに割り当てたいアドレスで。
この、-f defaultという引数を設定する事により、flavorの設定が反映されるようになります。
無しだとFreeBSDデフォルトの設定でjail環境が構築されてしまうので、rc.confとか色々無いまんま環境がcreateされてしまいますので、注意。
# /usr/local/etc/rc.d/ezjail.sh start
これで、jail環境走行開始!
動作確認する
cat /var/run/jail_JAILNAME.id
数字入っていればおk
jail環境側の設定。
# jexec 1 /bin/tcsh/
jexecの後の数字は、jlsで確認した数字で。
シェルがshでおkな人は、/tcsh/を/sh/に。
このコマンドでjail環境の中に!
やったね♪
とりあえず、何はともわれrootパスワードを設定しておく。
# passwd root
んで、取りあえずパスワードの設定だけ終わったら、jail環境から抜けてhost環境に戻ります。
# exit
/etc/fstab
# touch /usr/jails/JAILNAME/etc/fstab
これで、とりあえず空のfstabを作成。
|
resolv.conf
HOST環境のマシンからresolv.confをjail環境のマシンにコピーして、名前解決を出来るようにします。
# cp /etc/resolv.conf /usr/jails/JAILNAME/etc/
ローカルタイムを設定する
# cd /usr/jails/JAILNAME/etc # touch wall_cmos_clock # ln -sf ../usr/share/zoneinfo/Asia/Tokyo localtime
因みに、実際にはファイルないっぽいんですが、これでおk...っぽいです。はい。
/usr/jails/JAILNAME/etc/rc.conf
私の環境でのデフォルト設定は以下の通り。
# Pretuned by German Engineers # No network interfaces in jails network_interfaces="" # Prevent rpc rpcbind_enable="NO" # Prevent loads of jails doing their cron jobs at the same time cron_flags="$cron_flags -J 15" # Prevent syslog to open sockets syslogd_flags="-ss" # Prevent sendmail to try to connect to localhost sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" # Bring up sshd, it takes some time and uses some entropy on first startup # sshd_enable="YES"
んで、以下参考に書き換え。
defaultrouter="192.168.hoge.hoge" hostname="domain example.com" network_interfaces="" inetd_enable="YES" inetd_flags="-wW -C 60 -a 192.168.fuga.fuga" rpcbind_enable="NO" sendmail_enable="NONE" sendmail_submit_enable="NONE" sendmail_outbound_enable="NONE" sendmail_msp_queue_enable="NONE" sshd_enable="YES" sshd_flags="-4" syslogd_flags="-ss" tcp_keepalive="NO" tcp_extensions="NO" cron_flags="-J 15"
192.168.hoge.hogeの部分を、host環境のIPアドレスに。
192.168.fuga.fugaの部分を、jail環境のIPアドレスに。
因みに、私の設定は以下の通りとなりました。参考までに。
デフォルト設定。
# Pretuned by German Engineers # No network interfaces in jails network_interfaces="" # Prevent rpc rpcbind_enable="NO" # Prevent loads of jails doing their cron jobs at the same time cron_flags="$cron_flags -J 15" # Prevent syslog to open sockets syslogd_flags="-ss" # Prevent sendmail to try to connect to localhost sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" # Bring up sshd, it takes some time and uses some entropy on first startup # sshd_enable="YES"
んで、以下に書き換え。
# Pretuned by German Engineers #add-settings defaultrouter="192.168.2.2" hostname="asakurawebserver.local" inetd_enable="YES" inetd_flags="-wW -C 60 -a 192.168.2.10" # No network interfaces in jails network_interfaces="" # Prevent rpc rpcbind_enable="NO" # Prevent loads of jails doing their cron jobs at the same time cron_flags="$cron_flags -J 15" # Prevent syslog to open sockets syslogd_flags="-ss" # Prevent sendmail to try to connect to localhost sendmail_enable="NO" sendmail_submit_enable="NO" sendmail_outbound_enable="NO" sendmail_msp_queue_enable="NO" # Bring up sshd, it takes some time and uses some entropy on first startup # sshd_enable="YES" # add-settings sshd_enable="YES" sshd_flags="-4" syslogd_flags="-ss" tcp_keepalive="NO" tcp_extensions="NO" cron_flags="-j 15"
参考サイトさんのconfigに、デフォで付いているコメントが載っているかどうかだけの違いですが。
FreeBSD6.2Rでjail環境構築中その3(nullfsでhostとportsツリーを共有する場合) - ezjail
http://d.hatena.ne.jp/m-bird/20080118/1200647446からのつづき。
portsツリー導入しようぜ - 始めに
portsツリーを導入するのに、jail環境毎に構築してたら、HDDがもったいない。
ということで、nullfsとかでマウントしちゃえば無駄にならないじゃん、というのが今回のお話。
# ls -all /usr/jails/JAILNAME
total 29 drwxr-xr-x 12 root wheel 512 Jan 18 03:22 . drwxr-xr-x 6 root wheel 512 Jan 18 02:32 .. -r--r--r-- 1 root wheel 6196 Jan 18 02:32 COPYRIGHT drwxr-xr-x 9 root wheel 512 Jan 17 22:17 basejail lrwxrwxrwx 1 root wheel 13 Jan 18 02:32 bin -> /basejail/bin lrwxrwxrwx 1 root wheel 14 Jan 18 02:32 boot -> /basejail/boot dr-xr-xr-x 4 root wheel 512 Jan 18 03:28 dev drwxr-xr-x 18 root wheel 2048 Jan 18 17:24 etc lrwxrwxrwx 1 root wheel 13 Jan 18 02:32 lib -> /basejail/lib lrwxrwxrwx 1 root wheel 17 Jan 18 02:32 libexec -> /basejail/libexec drwxr-xr-x 2 root wheel 512 Jan 18 02:32 media drwxr-xr-x 2 root wheel 512 Jan 18 02:32 mnt dr-xr-xr-x 1 root wheel 0 Jan 18 17:24 proc lrwxrwxrwx 1 root wheel 16 Jan 18 02:32 rescue -> /basejail/rescue drwxr-xr-x 2 root wheel 512 Jan 18 03:19 root lrwxrwxrwx 1 root wheel 14 Jan 18 02:32 sbin -> /basejail/sbin lrwxrwxrwx 1 root wheel 11 Jan 18 02:32 sys -> usr/src/sys drwxrwxrwt 6 root wheel 512 Jan 18 03:28 tmp drwxr-xr-x 4 root wheel 512 Jan 18 02:32 usr drwxr-xr-x 23 root wheel 512 Jan 18 03:28 var
なんか、/basejailにリンクが。
/usrも見てみると。
# ls -all /usr/jails/JAILNAME/usr
total 8 drwxr-xr-x 4 root wheel 512 Jan 18 02:32 . drwxr-xr-x 12 root wheel 512 Jan 18 03:22 .. lrwxrwxrwx 1 root wheel 17 Jan 18 02:32 bin -> /basejail/usr/bin lrwxrwxrwx 1 root wheel 19 Jan 18 02:32 games -> /basejail/usr/games lrwxrwxrwx 1 root wheel 21 Jan 18 02:32 include -> /basejail/usr/include lrwxrwxrwx 1 root wheel 17 Jan 18 02:32 lib -> /basejail/usr/lib lrwxrwxrwx 1 root wheel 19 Jan 18 02:32 lib32 -> /basejail/usr/lib32 lrwxrwxrwx 1 root wheel 21 Jan 18 02:32 libdata -> /basejail/usr/libdata lrwxrwxrwx 1 root wheel 21 Jan 18 02:32 libexec -> /basejail/usr/libexec drwxr-xr-x 3 root wheel 512 Jan 18 02:32 local drwxr-xr-x 2 root wheel 512 Jan 18 02:32 obj lrwxrwxrwx 1 root wheel 19 Jan 18 02:32 ports -> /basejail/usr/ports lrwxrwxrwx 1 root wheel 18 Jan 18 02:32 sbin -> /basejail/usr/sbin lrwxrwxrwx 1 root wheel 19 Jan 18 02:32 share -> /basejail/usr/share lrwxrwxrwx 1 root wheel 17 Jan 18 02:32 src -> /basejail/usr/src
portsも/basejail/usr/portsに。
ってことで、/basejail/usr/portsにportsツリーを構築しまっす。
jail環境にportsツリーを導入する。
マウントポイントの設定
とりあえず、
/usr/jails/basejail/usr/ports /usr/jails/basejail/usr/src
この二つのディレクトリがあるかどうか確認(私はここで詰まりましたorz)。
無かったらmkdir。
nullfsでHOST環境のportsツリーをリードオンリーでマウント。
以下を編集(HOST)
# vim /etc/fstab
以下を追記。
/usr/ports /usr/jails/JAILNAME/basejail/usr/ports nullfs ro,noauto 0 0 /usr/src /usr/jails/JAILNAME/basejail/usr/src nullfs ro,noauto 0 0
jail環境のportsを整備
portsでインストールする場合は、作業用ディレクトリとソース保存ディレクトリが必要になるので、make.confで以下の指定が必要です。
jail環境の/etc/make.confに以下の記述があるかどうか、確認して下さい(デフォルトで記述されているはず)。
WRKDIRPREFIX= /var/ports DISTDIR= /var/ports/distfiles PACKAGES= /var/ports/packages
以上の設定でよければ、これらのディレクトリを作成してあげます。jexecでjail環境に入って、以下の通りディレクトリを作成して下さい。
JAILNAME# mkdir /var/ports JAILNAME# mkdir /var/ports/distfiles JAILNAME# mkdir /var/ports/packages
2007/2/10追記
遅れましたが、以下にportsツリーを分ける場合の手順を追記しました。
それに合わせ、全ての記事を大幅修正しました。
http://d.hatena.ne.jp/m-bird/20080118/1202583191