grub_calloc not foundによる起動不能からの回復
Live With Linux::trouble shooting
- TOP
- Articles
- Live With Linux
- grub_calloc not foundによる起動不能からの回復
序
割とあるトラブルのようだが、適当な解説が見当たらないので、 初心者にもわかりやすいように触れておく。
なお、私が遭遇したタイミングは
- ディスクを別の(同じ構成で起動可能な)システムに移植
- BIOSをアップデート
であった。
そもそもgrub_callocとはなにか
Grubのメモリ確保用関数で、mm.c
で定義されている。
なぜこいつがよくnot foundになるのかはよくわからない。
/*
* Allocate NMEMB instances of SIZE bytes and return the pointer, or error on
* integer overflow.
*/
void *
(grub_size_t nmemb, grub_size_t size)
grub_calloc {
void *ret;
= 0;
grub_size_t sz
if (grub_mul (nmemb, size, &sz))
{
(GRUB_ERR_OUT_OF_RANGE, N_("overflow is detected"));
grub_error return NULL;
}
= grub_memalign (0, sz);
ret if (!ret)
return NULL;
(ret, 0, sz);
grub_memset return ret;
}
対応を簡単に言うと
Grubを再インストールする。
実手順
x86_64なEFIシステムを前提として解説する。
まず、ターゲットシステム上で他のLinuxシステムを起動する。 これは、インストールに使ったライブディスクでもいいし、USBディスクにインストールされたLinuxシステムでも良い。
起動したらまずルートファイルシステムをマウントする。 まずはシステム上でルートを獲得する。
$ sudo bash -l
#
ルートファイルシステムがLUKSで暗号化されている場合、これを解除する必要がある。 まずはディスクを確認しよう。
# parted -l
ルートファイルシステムを含むパーティションを確認したら、それをマップする。
nvme0n1p2
は適宜読み替えること。
# cryptsetup luksOpen /dev/nvme0n1p2 rescueroot
マップできたらこれをマウントする。
/dev/mapper/rescueroot
はLUKSを使っていないのであれば、/dev/nvme0n1p2
のようになるだろう。
# mount /dev/mapper/rescueroot /mnt
続いてEFI bootディレクトリをマウントする。
通常、ルートファイルシステムを持つディスクの第一パーティションである。
これもparted -l
を用いて確認すること。
また、私のシステムだとEFIディレクトリは/boot/efi
になっている。
これはManjaroの仕様だが、そうでないかもしれない。/boot
の下にはあるはずなので、ターゲットシステムと同じ環境であるならばmount | grep boot
して確認すると良い。これで/boot/efi
であればターゲットシステムも/boot/efi
である(つまりレスキューシステムから見ると/mnt/boot/efi
である)はずだ。
そうでない場合、ls /mnt/boot
して内容を確認する。
もし/mnt/boot
自体がEFIディレクトリなのであれば、現時点で/mnt/boot
は空であるはずだ。そうでない場合、/mnt/boot/efi
のような空ディレクトリが存在するだろう。そこにマウントする。
# mount /dev/nvme0n1p1 /mnt/boot/efi
/dev
, /sys
,
/proc
を再帰的にバインドマウントする。
面倒を避けるためすべてバインドするが、/dev
及び/sys/firmware/efi
が必須である。
# mount --rbind /dev /mnt/dev
# mount --rbind /proc /mnt/proc
# monut --rbind /sys /mnt/sys
レスキューするシステムにログイン(chroot)する。
# chroot /mnt
普段rootでもZshを使っているならば、Zshログインすることもできる。 (もちろん、しなくても良い)
# zsh -l
Grubを再インストールする。基本は次のコマンドである。
/dev/nmve0n1
はターゲットシステムのルートファイルシステム及びEFIファイルシステム(ESP)があるディスク全体を指定するものであり、読み替えること。
# grub-install /dev/nvme0n1 --recheck --verbose
EFIファイルシステムがデフォルト(/boot/efi
)でない場合、指定する必要がある。
# grub-install /dev/nvme0n1 --efi-directory=/boot/EFI --recheck --verbose
なお、EFIファイルシステムにはEFI
ディレクトリがあるが、そのEFI
ディレクトリではなくEFIファイルシステムのルートを指定する。