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
cronの設定
# vim /usr/jails/JAILNAME/etc/crontab

これで、以下の一行をコメントアウト

1,31 0-5 * * * root adjkerntz -a 
/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に、デフォで付いているコメントが載っているかどうかだけの違いですが。

sshd

jail環境側のsshdの設定をする。

vim /usr/jails/JAILNAME/etc/ssh/sshd_config

以下を一行追加。

ListenAddress 192.168.xxx.xxx


以上で、ezjailのサーバの仮想化が完了!

portsツリーをjail環境とHOST環境で分けた人は以上で作業完了です!お疲れ様でした!
良いFreeBSDライフを!

portsツリーをhost環境からマウントする人は、まだまだです。
つづきへGO。
http://d.hatena.ne.jp/m-bird/20080118/1200651293

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/portsportsツリーを構築しまっす。

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  
portsツリーのマウント

設定が完了したら、実際にjail環境にportsツリーをマウントしてやります。

HOST# mount /usr/jails/JAILNAME/basejail/usr/ports
HOST# mount /usr/jails/JAILNAME/basejail/usr/src


以上で、jail環境でもportsツリーが使えるようになりました。
良いFreeBSDライフを!

2007/2/10追記

遅れましたが、以下にportsツリーを分ける場合の手順を追記しました。
それに合わせ、全ての記事を大幅修正しました。
http://d.hatena.ne.jp/m-bird/20080118/1202583191