GRUB2が複数のパーティション方式のLVM物理ボリュームを持つLVM論理ボリュームを認識できない問題の対策について記載します。
Table of Contents
1 GRUB2がGPTとMBRが混在したLVM論理ボリュームを認識できない
例えば、パーティション方式GPTのLVM物理ボリュームを使うLVM論理ボリュームがある場合に、新たにパーティション方式MBRのLVM物理ボリュームをLVM 論理ボリュームに追加すると、GRUB2がLVM論理ボリュームを起動時に認識できなくなります。
error: disk 'lvmid/<snip>' not found. Entering rescue mode... grub rescue>
2 原因
これはGRUB2にGPT用のモジュールが組み込まれているが、MBR用のモジュールが組み込まれていないことが原因です。 MBR用のモジュールが組み込まれているが、GPT用のモジュールが組み込まれていないケースもあります。
LVM論理ボリュームがある場合、grub-installはLV PVのパーティション方式を調べて必要なモジュールを割り出し、grub-mkimageとgrub-bios-setupを実行します。
$ sudo grub2-install -v /dev/vda <snip> grub2-install: info: grub-mkimage <snip> --compression 'auto' 'ext2' 'part_gpt' 'lvm' 'biosdisk' . <snip> grub2-install: info: grub-bios-setup <snip> '/dev/vda'. <snip>
grub-installが実行されるのはLinuxインストール時とGRUB2パッケージのアップグレード時です。
- Linuxインストール時にはLVM論理ボリュームはGPTのみだったので、 grub-installはpart_gptだけをGRB2に組み込みこまれる。
- インストール後にMBRのLVM物理ボリュームをLVM論理ボリュームを追加する。
- 再起動後にpart_msdosが組み込まれていないGRUB2がLVM論理ボリュームを認識できなくなる。
3 対策
GRUB2の更新時に強制的に組み込むモジュールを選択できれば良いのですが、少なくともDebian系は指定することができません。
対策は3つあります。(3)が簡単だと思います。
- (1) 最初のLVM物理ボリュームのパーティション方式に追加するLVM物理ボリュームで合わせる。ただし、最初のLVM物理ボリュームのパーティション方式は環境依存である。
- (2) GPTのLVM物理ボリュームしかない状態で手動でgrub-mkimageと grub-bios-setupを実行して、part_gptとpart_msdosを組み込むようにする。ただし、GRUB2パッケージの更新によるgrub-installで上書きされるので、その都度、手動でgrub-mkimageとgrub-bios-setupを実行する必要がある。また、LVMのUUIDは環境依存である。
- (3) LVM物理ボリュームが追加される度にgrub-installを実行する。