やるきなし

2017/12/20 13:38 / 90-second timeout during boot on cryptroot with passdev

dm-crypt 関連メモ (cryptroot)のように / 自体をLUKSで暗号化している場合に,起動時に90秒間待たされる問題について.

/ 自体をLUKSで暗号化している場合,通常は /etc/crypttab を以下のようにして,鍵ファイルを用いて自動で cryptsetup open <device> <name> --type luksする.

[/etc/crypttab]
sda5_crypt UUID=<snip> /dev/disk/by-uuid/<snip>:luks_key luks,keyscript=/lib/cryptsetup/scripts/passdev

ここで/dev/disk/by-uuid/<snip>は鍵ファイルを置いている partition 等(/boot等)で,luks_key (/boot/luks_key等)が鍵ファイル,/lib/cryptsetup/scripts/passdevはinitrdに組み込まれるscriptになる.

このままだと以下のように 90 秒のタイムアウト待ちが生じる.

A start job is running for dev-disk...:luks_key.device (1min 3s / 1min 30s)

というのは sda5_crypt として open するために /dev/disk/by-uuid/<snip>:luks_key という device が ready 状態になるのを待つため.以下のように systemd-cryptsetup@sda5_crypt.servicedev-disk-by\x2duuid-(略):luks_key.device に依存してしまう.:luks_key というのはファイルを示していて,device ではないので,当然 ready 状態になるわけがなくタイムアウト待ちが生じる.

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618862 として systemd の important bug として登録されている.

% systemctl cat systemd-cryptsetup@sda5_crypt.service
# /run/systemd/generator/systemd-cryptsetup@sda5_crypt.service
# Automatically generated by systemd-cryptsetup-generator

[Unit]
Description=Cryptography Setup for %I
Documentation=man:crypttab(5) man:systemd-cryptsetup-generator(8) man:systemd-cryptsetup@.service(8)
SourcePath=/etc/crypttab
DefaultDependencies=no
Conflicts=umount.target
IgnoreOnIsolate=true
After=cryptsetup-pre.target
Before=cryptsetup.target
After=dev-disk-by\x2duuid-(略):luks_key.device
Requires=dev-disk-by\x2duuid-(略):luks_key.device
BindsTo=dev-disk-by\x2duuid-(略).device
After=dev-disk-by\x2duuid-(略).device
Before=umount.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutSec=0
KeyringMode=shared
ExecStart=/lib/systemd/systemd-cryptsetup attach 'sda5_crypt' '/dev/disk/by-uuid/(略)' '/dev/disk/by-uuid/(略)
ExecStop=/lib/systemd/systemd-cryptsetup detach 'sda5_crypt'

最もシンプルな解決策は systemd にこのような依存関係を自動生成させないこと(device は通常 ready だと想定されるので).https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618862 にもあるとおり,起動時の kernel option に luks=no と追加するだけで良い.詳細はman systemd-cryptsetup-generator参照.具体的には以下の通り.

他には/etc/systemd/system.confにてDefaultTimeoutStopSec=90sのコメントアウトを外して,短めに設定する等がある.

追記 (2019/9/1)

これ,上記の場合で sda5_crypt が / であれば sda5_crypt を initrd から luksOpen されるので luks=no の kernel option を使ってもよいのだが,他に起動してから luksOpen (cryptdisks_start) するものがあれば,その unit が systemd-cryptsetup-generator により生成されず,自動 start/open されない(see man systemd-cryptsetup-generator)...

Related articles