🐕
Arch Linux でハイバネートからの復帰が失敗していたので調査・修正した
概要
Arch Linux で休止状態(ハイバネーション)からの復帰が失敗し、通常の起動が行われる問題が発生しました。ブートログに以下のようなエラーメッセージが表示されていました。
Mar 02 16:25:09 archlinux kernel: Hibernate inconsistent memory map detected!
Mar 02 16:25:09 archlinux kernel: PM: hibernation: Image mismatch: architecture specific data
Mar 02 16:25:09 archlinux kernel: PM: hibernation: Failed to load image, recovering.
Mar 02 16:25:09 archlinux kernel: PM: hibernation: Read 5764372 kbytes in 0.01 seconds (576437.20 MB/s)
PM: Error -1 resuming
swapon --summary
を確認すると、スワップが有効になっていないことが判明しました。
Swap: 0B 0B 0B
blkid
コマンドでスワップパーティションの UUID を確認したところ、/boot/loader/entries/arch.conf
で設定されていた resume=UUID=...
の UUID と一致していませんでした。
解決方法
1. Swap Partition を設定し直す
そもそも Swap Partition の設定がなんか変だった。
変更前:
sudo cfdisk /dev/nvme0n1
該当パーティションに swap タイプを設定し直して書き込み。
変更後:
2. スワップの有効化
sudo mkswap /dev/nvme0n1p2
sudo swapon /dev/nvme0n1p2
# 確認
swapon --summary
これでスワップが認識されれば OK。
/etc/fstab
の修正
3. 再起動後もスワップを維持するために次の手順を実行する必要がある。
sudo vim /etc/fstab
# 以下のようにスワップの UUID を更新
UUID=新しいUUID none swap defaults 0 0
なお上記手順は genfstab -U / > /etc/fstab
で一発で修正できる。
変更後、スワップを再有効化。
sudo swapon -a
4. カーネルパラメーターとブートローダーの設定
sudo vim /boot/loader/entries/arch.conf
resume=UUID=古いUUID
を resume=UUID=新しいUUID
に変更して、以下を実行する。
# ブートローダーを更新
sudo bootctl update
# 念の為、実行する(しなくても良いかも)
sudo mkinitcpio -P
5. 再起動して確認
sudo reboot
# 再起動、スワップとハイバネーションの動作を確認
swapon --summary
free -h
sudo systemctl hibernate
なぜ Swap されなくなったのか
理由は不明ですが、直近のシステムアップデート (pacman -Syyu
) によりスワップもしくはパーティション設定がリセットされた可能性くらいしか考えられません。パーティション周りは何もいじっていないので不明です。
まとめ
問題
- swap パーティションが破損?していた。かつ
resume=
の設定とズレていた -
/etc/fstab
やsystemd-boot
の設定がスワップの UUID に対応していなかった - スワップが正常にマウントされていなかった
解決策
- swap パーティションを再作成
-
/etc/fstab
の UUID を正しく設定 -
resume=
の UUID をboot/loader/entries/arch.conf
で更新 -
mkinitcpio -P
で initramfs を再生成 -
swapon --summary
でスワップを確認し、systemctl hibernate
で動作チェック
これで Arch Linux のハイバネーションが正しく機能するようになりました。
Discussion
こんにちは、貴重な記事ありがとうございます。
fstabの編集についてですが、arch-install-scriptsをインストールして、
とすれば、転記の手間が省けると思います。
コメントありがとうございます!私もクリーンインストール時は
genfstab
を使うのですが、今回は修正だけだったので 直接編集していました。追記しておきます!