問題
LinuxサーバにiSCSIデバイスを含むLVM VGがあると、システムシャットダウンが遅延・失敗する。
状況
Ubuntu 20.04のopen-iscsi + lvmcacheを使用したリモートストレージにデータを置く構成で発生。
open-iscsiでオートログインによりターゲットをsdaにアタッチ、_netdevマウントオプションで起動時は遅延マウントしている。
sdaはLVM PVとしてフォーマットし、ローカルNVMeの一部を混ぜてLVM VGにしている。(lvmcacheに必要なため)
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda remote lvm2 a-- <200.00g 0
/dev/vda2 vg lvm2 a-- <40.00g 520.00m
/dev/vg/cachepv remote lvm2 a-- <5.00g 0
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
data remote Cwi-aoC--- <200.00g [cache_cvol] [data_corig] 100.00 12.40 0.00
boot vg -wi-ao---- 500.00m
cachepv vg -wi-ao---- 5.00g
root vg -wi-ao---- 30.00g
swap vg -wi-ao---- 4.00g
このままシャットダウンしようとすると、高頻度でシャットダウンが途中でブロックされ、カーネルスタックトレースが表示されて電源が落ちない。
原因
iscsiデバイスの管理は、systemd unit open-iscsi.service
で行われている。
このunitはAfter=network-online.target
によりネットワーク構築後に起動され、シャットダウン中はネットワーク停止前に終了される。
終了時はblkdeactivate
により自動的に依存ファイルシステムのアンマウントやLVMの非アクティブ化が行われている。
ほとんどの場合これで問題ないが、複雑なlvm構成に関わるすべてを必ずしも対象としてはくれない。
ファイルシステムかLVMのいずれか、あるいは両方を正しい順序でアンマウントしてやらないと、sdaやネットワークスタックが消えたあとにiscsiデバイスにアクセスリトライしようとして恒久的にブロックされてしまう。
対処
open-iscsi.serviceのAfterかつ、他の依存serviceのBeforeになるよう、シャットダウン時だけ動くsystemd serviceを作成し、適切な順序でumount/lvchange -anで非アクティブ化しておく。
[Unit]
Wants=network-online.target remote-fs-pre.target
# open-iscsiを追加
After=network-online.target iscsid.service open-iscsi.service
# remote/dataが必要なサービスをすべて列挙
Before=snap.lxd.daemon.service snap.lxd.activate.service
DefaultDependencies=no
Conflicts=shutdown.target
Before=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=-/bin/true
# 依存順にアンマウント・非アクティブ化。
# 他のunitでアンマウントされているかもしれないのでExecStop=- でエラー無視している
ExecStop=-/bin/umount -R /data
ExecStop=-/sbin/vgchange -an remote -vv
ExecStop=-/sbin/lvchange -an vg/cachepv -vv
[Install]
WantedBy=sysinit.target
依存関係はopen-iscsi.serviceを引き写した上で、After/Beforeを追加している。
remote/dataに依存するunitはBeforeに列挙している。いちいち書かなくてすむよう、適当なtargetがないか探してみたが、それらしいremote-fs.targetをAfterで指定しているサービスはほとんどなく適当なものが見つからなかった。