第 回 ワークショップ30 FreeBSD
Jailが起動しない
発端
1
環境
• OS:FreeBSD10.3 on XenServer
– Linden 1cpu、2GByte
• この上で3つのJail環境を動かしています
– tuba、viola、pianica
• /etc/rc.conf.local
– Jail_enabled=“YES”
• /etc/jail.conf
<省略>
# each jail
tuba { ip4.addr = 192.168.1.71;}
pianica { ip4.addr = 192.168.1.72;}
viola {ip4.addr = 192.168.1.73;}
2017-6-30
3
1
あれ?サーバ上がってない?
• Jailを確認する
* JID IP Address Hostname Path
1 192.168.1.72 pianica /jail/pianica
2 192.168.1.71 tuba /jail/tuba
• ( ゚д゚) ・・・
• (つд⊂)ゴシゴシ
• (;゚д゚) ・・・
• なぜ、2つしか上がってない?
2017-6-30
4
1
教えて!ふりーびーえすでーのえらい人!
• ということで、折よくFreeBSD Workshopがあったので聞いてみる。
• Q: こんなんありましたが知ってます?
• A: 知りません! (๑•̀д•́๑)キリッ
• Q: え?
• A: じゃ、次回のLTで
• えぇぇぇぇぇ、めんど(ry
• まぁ、しらべましょ
2017-6-30
5
1
調査するのかぁ…
2
Rc_debug=“YES”でログをとる
• うん、ちゃんと動いてる
Jun 27 18:47:17 linden root: /etc/rc: DEBUG: run_rc_command: doit: /usr/sbin/cron -s
Jun 27 18:47:17 linden root: /etc/rc: DEBUG: checkyesno: jail_enable is set to YES.
Jun 27 18:47:17 linden root: /etc/rc: DEBUG: run_rc_command: doit: jail_start _ALL
Jun 27 18:47:21 linden root: /etc/rc: DEBUG: run_rc_command: start_postcmd: jail_warn _ALL
Jun 27 18:47:21 linden kernel: pianica tuba viola
JID IP Address Hostname Path
1 192.168.1.72 pianica /jail/pianica
2 192.168.1.71 tuba /jail/tuba
3 192.168.1.73 viola /jail/viola
• おっとぉ
Jun 27 18:47:17 linden root: /etc/rc: DEBUG: run_rc_command: doit: /usr/sbin/cron -s
Jun 27 18:47:17 linden root: /etc/rc: DEBUG: checkyesno: jail_enable is set to YES.
Jun 27 18:47:17 linden root: /etc/rc: DEBUG: run_rc_command: doit: jail_start _ALL
Jun 27 18:47:21 linden root: /etc/rc: DEBUG: run_rc_command: start_postcmd: jail_warn _ALL
Jun 27 18:47:21 chives kernel: tuba: created
JID IP Address Hostname Path
1 192.168.1.72 pianica /jail/pianica
2 192.168.1.71 tuba /jail/tuba
2017-6-30
7
2
いろいろやった結果
• 別のVMでも症状は再現した
• コマンドラインでserviceコマンドを利用した場合も同じように失敗する
• 失敗するときは「kernel: jail名:created」と出る
• でも、失敗してるjail名ではない
• Jail_listを指定すると出ないようだ
2017-6-30
8
2
/etc/rc.d/jailを読んでみまひょ
_ALL)
command=$jail_program
rc_flags=$jail_flags
command_args="-f $jail_conf -c"
_tmp=`mktemp -t jail` || exit 3
if $command $rc_flags $command_args >> $_tmp 2>&1; then
$jail_jls jid name | while read _id _name; do
echo -n " $_name"
echo $_id > /var/run/jail_${_name}.id
done
else
tail -1 $_tmp
fi
rm -f $_tmp
echo '.'
return
;;
esac
指定なしでくるところ
2017-6-30
COPYRIGHT
9
for _j in $@; do
_j=$(echo $_j | tr /. _)
_jv=$(echo -n $_j | tr -c '[:alnum:]' _)
parse_options $_j $_jv || continue
eval rc_flags=¥${jail_${_jv}_flags:-$jail_flags}
eval command=¥${jail_${_jv}_program:-$jail_program}
command_args="-i -f $_conf -c $_j"
_tmp=`mktemp -t jail` || exit 3
if $command $rc_flags $command_args ¥
>> $_tmp 2>&1 </dev/null; then
echo -n " ${_hostname:-${_j}}"
_jid=$($jail_jls -j $_j jid)
echo $_jid > /var/run/jail_${_j}.id
else
rm -f /var/run/jail_${_j}.id
echo " cannot start jail " ¥
"¥"${_hostname:-${_j}}¥": "
cat $_tmp
fi
rm -f $_tmp
done
Jail名を指定している場合
2
なんか、こうやって動いてるらしい
• どうも、jail_listを指定した場合と指定しない場合で動きが違う
• jail_listを指定した場合
– jail –c –f /etc/jail.conf –j jail名 でLoopしてる
• jail_listを指定しない場合
– jail –c –f /etc/jail.conf
2017-6-30
10
2
再現するかな?
# jail -f /etc/jail.conf -c ; jls
pianica: created
tuba: created
viola: created
JID IPAddress Hostname Path
23 192.168.1.72 pianica /jail/pianica
24 192.168.1.71 tuba /jail/tuba
25 192.168.1.73 viola /jail/viola
# jail -f /etc/jail.conf -c ; jls
ifconfig: ioctl (SIOCAIFADDR): Address already in use
jail: pianica: ifconfig xn0 inet 192.168.1.72 add: failed
tuba: created
viola: created
JID IPAddress Hostname Path
26 192.168.1.71 tuba /jail/tuba
27 192.168.1.73 viola /jail/viola
2017-6-30
11
2
一台ずつでloopと同じように起動してみる
root@linden:~ # jail -f /etc/jail.conf -c pianica
pianica: created
root@linden:~ # jail -f /etc/jail.conf -c viola
viola: created
root@linden:~ # jail -f /etc/jail.conf -c tuba ; jls;
tuba: created
JID IPAddress Hostname Path
436 192.168.1.72 pianica /jail/pianica
437 192.168.1.73 viola /jail/viola
438 192.168.1.71 tuba /jail/tuba
• まぁ回避はできたみたいだ
• 再起動でも症状は出ないみたいだ
2017-6-30
12
2
まとめ
3
なんとか、回避はできるようになった?
• jail_listを指定するのが吉
• どうも、原因はjailコマンド内部、またはifconfig関連のライブラリに潜んで
いるようだ
• とりあえずは、回避できたので良し、とする…
• …
• ………
• ………………
• ……………………… 「parallel_start」は?………………………
• えっ………!?
2017-6-30
14
3
jail_parallel_start=“YES”
• 再起動してJailを確認する
* JID IP Address Hostname Path
1 192.168.1.72 pianica /jail/pianica
2 192.168.1.71 tuba /jail/tuba
• コマンドラインでも再現する
ifconfig: ioctl (SIOCAIFADDR): Address already in use
jail: pianica: ifconfig xn0 inet 192.168.1.72 add: failed
2017-6-30
15
3
なんとか、回避策
• jail_list を指定するのが吉
• とりあえずは、回避できたので良し、とする…
• ……………………… 「parallel_start」は?………………………
2017-6-30
16
3
おしまい
2017-6-30
17
3
はんぱですが、ここまでです
ありがとうございました

Jailが起動しないので調査してみた