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
を実行した。