Ubuntu 20.04 の /boot に使っているパーティションでext4拡張を有効にすると grub でブートできなくなる
Ubuntu 20.04 の /boot に使っているパーティションでext4拡張を有効にすると grub でブートできなくなる
辛いけどこれが現実なのよね。
今回は grub rescue: unknown file system
になってしまったのでご報告と復旧方法の共有です。
ソース
Debian Bug report logs - #866603 grub-common: enabling metadata_csum_seed feature on ext4 renders system unbootable
grub2 doesn't recognize ext4 with metadata_csum_seed enabled
補足
上記のページでは metadata_csum_seed
に触れられていますが、launchpad ではもう少し詳しく以下のオプションを有効にすると grub が boot パーティションを認識しなくなるとあります。
- metadata_csum_seed
- ea_inode
- large_dir
- casefold
先日この問題にハマり、再起動後に grub rescue が起動して unknown file system
となり、
ブートできずに焦ったので同じ状態になった人向けにまとめます
元に戻す方法はない
あなたが tune2fs を使って上記のオプションを有効にした場合、なんと元に戻す方法はありません。
EXT4-fs warning (device nvme1n1): ext4_dx_add_entry:XXX: Large directory feature is not enabled on this filesystem EXT4-fs warning (device nvme1n1): ext4_dx_add_entry:XXX: Directory (ino: XXX) index full, reach max htree level :2
このようなログが出た場合に安易に large_dir
を有効にするのは絶対にやめましょう。
large_dir Increase the limit on the number of files per directory. Tune2fs currently only supports setting this file system feature.
large_dir
は設定すると元に戻せません。
ワークアラウンド
あなたがディスクに詳しいのであれば、別のディスクに /boot
を確保し、そちらからブートするのが手っ取り早い解決法です。
拡張ext4をgrubが認識できないため、vmlinuz
や initrd
に切り替えられないためにブートできないので、
別のパーティションに /boot
を新たに用意すれば起動できるようになります。(今の /boot は捨てる)
もし既存のディスクに空きがあるのであれば、gparted LiveCDなどでパーティションを後ろに新たに切ります。
/boot
が入れば十分ですので、サイズは小さくて構いません。200MB程度もあれば十分でしょう。
拡張パーティションは利用できないので、プライマリパーティションで確保する必要があります。
gparted LiveCDを使えるのであれば、そのまま /boot
を新たな /boot
パーティションにコピーして、
ブートローダーも一緒にインストールすると良いでしょう。
別パーティションへのブートローダーのインストールは chroot を使うと簡単に実現できます。
例えば以下のページのようにするとよいでしょう。
chroot環境下でホスト側のデバイス/devなどを使う。
終わりに
よく知らずにコマンドを打つと思わぬ罠に時間差で引っ掛かることがあるので要注意ですね。
large_dir を有効にする場合は、データディスク用に切ったパーティションに限定するのがよいでしょう。
そもそも、large_dir などの拡張オプションを使うのではなく、xfsなどのファイルシステムを使うか、 large_dir が必要なケース = 1ディレクトリに大量のファイルを置かないようにする、というのがそもそもよいでしょう。
幸いにも起きた問題に対して短時間で解決できましたが、ブートについてある程度の知識がないと普通は壊れたと思って諦めるでしょう。
おまけ
この半年で最も衝撃を受けた映画「劇場版 少女☆歌劇 レヴュースタァライト」をまだみていない方がいたらぜひみてください。
12月にBDが発売されるので何卒よろしくお願いします。