Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話...

15
2016/02/27(Sat), 38th CBUG meeting Debian の start-stop-daemon の LXC のののののののの のののののの ののの kFreeBSD のののののののののののの Genta IHA

Transcript of Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話...

Page 1: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

2016/02/27(Sat), 38th CBUG meeting

Debian の start-stop-daemon が LXC 対応じゃないのでいじってたら何故か kFreeBSD も触ることになった的な話Genta IHA

Page 2: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

LXC とは• Linux の jail っぽいあれ。 namespaces(7) 使う。詳細 google

• IPC namespace• network namespace (FIB とか分離するやつ )• pid namespace — pid_namespaces(7)• user namespace (uid / gid 分離 )• uts namespace ( ホスト名 / NIS domain name分離 )

2

← 今日この話

Page 3: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

問題• LXC コンテナを 100 個くらい上げました• 監視したくなり、 LXC ホスト側で snmpd 上げました• コンテナも監視したくなり、 snmpd 上げました• LXC ホスト側で /etc/init.d/snmpd restart しました→ LXC コンテナ内の snmpd が全滅しました (!)

3

Page 4: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

なぜか• /etc/init.d/snmpd で呼ばれている start-stop-daemon が PID namespace 分離に対応していなかった

• /etc/init.d/snmpd restart すると、 killall snmpdする• コンテナ内のプロセスも、親からは見えるので、もれなく滅亡する

4

Page 5: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

回避策• /sbin/start-stop-daemon に — pid-file <FILE_NAME> を指定すると、その PID だけ相手にしてくれるので回避できる ( 何も指定しないと killall 相当をしてくれる )• 手元では /etc/init.d/snmpd を修正して回避した

• start-stop-daemon が PID namespace 分離に対応するのが正しい気がする (FreeBSD の /etc/rc.subrは Jail ID 見てる )

5

Page 6: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

パッチ• dpkg という名前の dpkg パッケージに start-stop-daemon 入ってる

• ちょっといじったら、 Linux 対応 (/proc/<PID>/ns/pid も見るだけ ) のものはできた

• が、コード中に不穏な文字列が…• #if defined (OSFreeBSD)

6

Page 7: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

GNU/kFreeBSD 用だった• kFreeBSD も触らなければならないか… ( 入れた )• /proc/<PID>/ns/pid は見えない ( カーネルはFreeBSD だし pid namespace 分離は Linux カーネルの機能だし当然 )

• あぁこれ jail id 取らないとだめなやつや…

7

Page 8: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

s-s-d を PID 名前空間対応する

8

Linux には jail id という概念は存在しない ( つらい )「 /proc/PID/ns/pid の inode が同じなら同じ namespace 」ということだけは決まっている

Page 9: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

s-s-d を PID 名前空間対応する

9

Page 10: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

s-s-d を PID 名前空間対応する

10

自分の jail ID( 的なもの ) を確認

同じ jail ID( というものはない )のやつだけ対象にする

Page 11: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

jail ID( というものは略 ) の確認

11

/proc/PID/ns/pid の inode 取るだけ

Linux なので jail ID というものはない

Page 12: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

jail ID( というものはある ) 確認

12

sysctl 叩いて jid 取ってるだけこれでいいんだっけ…( 動作未確認 )

FreeBSD なので jail ID がある

kvm_getprocs 使うべき ?→sysctl でいいらしい

Page 13: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

要調査• /lib/lsb/init-functions の pidof(8) を呼んでいる箇所でpidof -c を呼ぶようにすればだいたい救えるのでは ?• -c で救える理由 : コンテナは大抵 chroot するから• CentOS だと pidof -c 指定している• Ubuntu / Debian は -c ついてない

• 他の OS の PID namespace 分離的な実装 (Solaris)対応 ? 13

Page 14: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

TODO

• kFreeBSD jail 環境での動き確認する ( 多分うごくけど )• バグレポート書く ( 英語… )

14

Page 15: Debianのstart-stop-daemonがLXC対応じゃないのでいじってたら何故かkFreeBSDも触ることになった話

38th CBUG Meeting

見なかったことにしたい

15