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)?