memo

2016-10-27

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