大量jail環境の構築

1〜2個のjailなら rc.conf に変数を書く方式で何とか行けるが 50個、100個ともなるとrc.confに書くのがかったるい。

よし、50個のjail環境を作ろうじぇー。

50個ともなると

ということで、自前でやっちゃった方が楽。作業手順は以下のとおり。

  1. jailにreadonlyマウントさせる基本環境(1個)の作成
  2. jailにread/writeマウントさせる/varの大量作成
  3. 大量マウントさせるfstabの生成
  4. /etc/rc の調整

基本環境の作成

mountの基盤ディレクトリを作る。必要なディレクトリは

あたり。

まず土台となるディレクトリを作り、必須ディレクトリをコピー。

# cd /jail
# mkdir BASE
# cd /
# tar cf - *bin lib* /usr/{*bin,include,lib*,share} \
    | tar xpfC - /jail/BASE

ただし /sbin や /usr/lib にはjail環境で不要なものが多いので 明らかに分かるものはすぐに削除する。ちなみに /sbin は こんな感じにした。

bsdlabel*       ldconfig*       mount*          ping6*
fdisk*          md5*            newfs*          rcorder*
ifconfig*       mdconfig*       ping*           sysctl*

でももっと削れる。/etc/rc /etc/rc.sub /etc/rc.d を使う場合 rcorder と sysctl は必要。ping とかはあってもしょうがないの だが、pingできないことを確認するために置いとくと心が和む。

/root は必要と思うものをコピーする。

次、/etc はこんな感じ。

Makefile        localtime       pam.d/          rc.d/           spwd.db
auth.conf       mail@           passwd          rc.local@       ssh/
defaults/       manpath.config  protocols       rc.shutdown     sudoers
fstab           master.passwd   pswd.tab        rc.subr         syslog.conf
group           mkhome.sh*      pwd.db          resolv.conf     termcap@
guest.shadow    mkmaster.sh*    rc              services        varetc@
host.conf       opiekeys        rc.conf         skel/

各jailごとに異なる設定が必要なものは

Makefilemaster.masswd から passwd pwd.db spwd.db を生成するための定義。

#
# Makefile for generating spwd.db from master.passwd
#
all:            spwd.db passwd

spwd.db:        master.passwd
		pwd_mkdb -d . $>

passwd:         master.passwd
		pwd_mkdb -d . -p $>

最後に /var を作る。実際にはjail内のプロセスが書き込むこ とになるので、必要なディレクトリを作っておけばよい。50個作ろう。

# exec zsh
# mkdir -p v/var00/{empty,log,run,tmp}
# touch v/var00/log/{messages,auth.log,maillog,security}
# for i in {01..49}; do
  cp -r v/var00 v/var$i
  done

マウントポイントを作成し、一気にマウントするfstabを作成。

# mkdir j{00..49}
# mkdir CONFIG; cd CONFIG
# for i in {00..49}; do
  echo "/jail/BASE\t/jail/j$i\tnullfs\tro\t0\t0"
  echo "/jail/v/var$i\t/jail/j$i/var\tnullfs\trw\t0\t0"
  echo "devfs\t\t/jail/j$i/dev\tdevfs\trw\t0\t0"
  done > fstab

最後に50個分の IP alias を設定し、jailを起動するスクリプトを作る。

rno=50
devfs rule -s $rno delset
devfs rule -s $rno add hide
devfs rule -s $rno add path null unhide
devfs rule -s $rno add path zero unhide
devfs rule -s $rno add path random unhide
devfs rule -s $rno add path uraondom unhide
devfs rule -s $rno add path fd unhide
devfs rule -s $rno add path fd/* unhide
devfs rule -s $rno add path kmem unhide
devfs rule -s $rno add path log unhide
devfs rule -s $rno add path 'pty[pqrs]*' unhide

mount -f /jail/CONFIG/fstab -a

if=fxp0
i=0; end=49

for i in `jot -w '%02d' 50 00`; do
  ifconfig ${if} alias 172.19.5.$((i)) netmask 255.255.255.255

  devfs -m /jail/j$i/dev rule -s $rno applyset
  jail /jail/j$i jail-$i 172.19.5.$((i)) /bin/sh /etc/rc
  i=`expr $i + 1`
done

かな。

実際に動かしたPATHを書き換えてこのスクリプト例を書いているので、 ちょこまか書き換え間違いのところがあるはず。


叱咤激励感想ツッコミはゲストブック

Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]