systemd のバージョンを上げたら nspawn container がぶっ壊れた件について
とりあえず記録として残す。
やったこと
systemd を 229 → 231 にバージョンアップ
OS 再起動後、いつもどおり
machinectl startで nspawn container を起動
起きたこと
やたらディスクをガリガリやっていて、 container がなかなか立ち上がってこない
最終的に systemd の unit 起動のタイムアウトに引っかかり、
Start operation timed out. Terminating.,State 'stop-final-sigterm' timed out. Killing.などのログを残して強制終了された。
↑ の後、再度
machinectl startを実行すると今度は container が立ち上がってきた。... が、ログインができなくなっている。
ssh で繋いでもすぐに切断される。
machinectl loginだとプロンプトは出るが、パスワードが違うと言われる。root でも一般ユーザーでもダメ。
machinectl shellでも shell が立ち上がらない。
原因
systemd-230 から、
systemd-nspawn@.serviceに-Uオプションが追加されていた。(
-Uは user namespace を有効にしつつ、 UID/GID を自動でいい感じに選択するオプション。)
-Uは初回起動時に namespace の UID/GID に合わせてファイルの ownership を変更してくれるのだが、 container 内の全てのファイルを処理するために、当然これにはかなりの時間がかかる。↑ に時間がかかりすぎた結果、 systemd に KILL され、中途半端な状態の directory tree が後に残った。
中途半端な状態なせいで
/etc/passwdが読み出せなくなったりとかした結果、ログイン不能となった。
対応
chmod root:root /var/lib/machines/<mymachine>として、systemd-nspawnの ownership 変更処理が再実行されるようにした。systemd の timeout 処理に引っかからないように、
machinectlを使わず端末から手動でsystemd-nspawnを実行した。