lxc-stopせずにshutdownしてしまった場合の対処方法。¶
年末年始に2, 3回、Sidでgrub-pc, grub-commonのアップデートがあったのだが、まぁ自宅鯖ではないので再起動できずに放置していた。最近のBIOSは、MBRを書き換えてしまうとブートセクタのハッシュ値がチゲぇよと、ご丁寧にハードディスクからのブートを停止してくれちゃうもんだから面倒くさい。再起動かけてPF1を押してブートセクタを書き換えたことを許可してSid自体はちゃんと立ち上がったので、lxcのコンテナを起動させるためにいつも実行しているスクリプトを実行した。
$ sudo bash start-lxc.sh
$
ム?いつもと違う。おかしい。
$ sudo lxc-info -n hoge
'hoge' is RUNNING
ム?コンテナ起動してないのに動いていることになってる? ………あ、再起動用のスクリプトじゃなくてshutdown -r now実行してた…。
start-lxc.shは
#!/bin/sh
for i in `lxc-ls`
do
if (lxc-info -n $i | grep -q "STOPPED" ) then
echo -en $i"\t:"
lxc-start -n $i -d
test $? -eq 0 && echo starting ok.
sleep 3
fi
done
exit 0
と、ステータスがSTOPPEDになっていたら、lxc-startコマンドで起動するようにしているのだが、幸か不幸か、lxcの状態制御はファイルで行われている。Debianパッケージで導入した場合は、/var/lib/lxc/yourcontainer/stateだ。
$ sudo grep RUNNING /var/lib/lxc/*/state
/var/lib/lxc/hoge/state:RUNNING
/var/lib/lxc/hoge2/state:RUNNING
/var/lib/lxc/hoge3/state:RUNNING
/var/lib/lxc/hoge4/state:RUNNING
/var/lib/lxc/hoge5/state:RUNNING
/var/lib/lxc/hoge6/state:RUNNING
オーナーにはちゃんと書き込み権限が付いている。なので、sedで一発書き換えてしまおう。
$ ls -l /var/lib/lxc/*/state
-rw------- 1 root root 7 2010-01-04 09:23 /var/lib/lxc/hoge/state
-rw------- 1 root root 7 2010-01-04 09:23 /var/lib/lxc/hoge2/state
-rw------- 1 root root 7 2010-01-04 09:23 /var/lib/lxc/hoge3/state
-rw------- 1 root root 7 2010-01-04 09:23 /var/lib/lxc/hoge4/state
-rw------- 1 root root 7 2010-01-04 09:23 /var/lib/lxc/hoge5/state
-rw------- 1 root root 7 2010-01-04 09:23 /var/lib/lxc/hoge6/state
$ sudo sed -i 's/RUNNING/STOPPED/g' /var/lib/lxc/*/state
これで起動できるようになった。プロセス自体も特に問題なし。
$ sudo bash start-lxc.sh
hoge starting ok.
hoge2 starting ok.
hoge3 starting ok.
hoge4 starting ok.
hoge5 starting ok.
hoge6 starting ok.
しかし、これで本当にええんか、これ(lxc)?