grub rescue > error: symbol 'grub_calloc' not found

Gentooを入れているサーバーがかなり古く、AMD Athlon 5350で、emergeに時間がかかりすぎるようになってきました。
ただ時間がかかるだけなら良いのですが、エラーのたびにやり直す必要が出てきて、'emerge -uDN @world'を完了するのに、何日もかかるように。(ほとんどがいつの間にかエラーで止まっていたのを知らずにほっといている時間なのですが・・・。)
買い換えようと思いましたが、今、自作で省電力CPUとかマザーって少ないんですね。
なので、ノート用CPUを積んだ小型ベアボーンに買い替えました。

移行作業は面倒なので、旧サーバーのSATA SSDの中身を、新サーバーのNVME SSDパーティション毎に、'e2image -ra -p /dev/sda4 /dev/nvme0n1p4'のように、e2imageコマンドを使ってコピーしました。
FAT32EFIパーティションにはe2imageコマンドは使えないので、rsyncでコピー。

この状態でSATA SSDを外し、NVME SSDからブートしてみると、grub rescueモードに突入。grubコンソールモードでもないので、とても使いにくいです。

grub rescue >

解決方法をググると、bootディレクトリをprefixにセットして、insmod normal.modでモジュールを読み込んでから、normalコマンドで通常のgrubに戻るということでした。
(normal.modではなく、linux.modと解説しているサイトもありました。)

grub rescue > set prefix=(hd0,gpt1)/boot
grub rescue > insmod normal.mod
symbol 'grub_calloc' not found
grub rescue > 

ちなみに、lsコマンドが使えるので、パーティションのリストやディレクトリ内のファイルリストを表示できます。
lsでパーティションの一覧から、/bootに該当するであろうパーティションを探します。
上記の例ではgrubが認識したhd0の第1パーティションです。
しかし、モジュールが読み込めず、symbol 'grub_calloc' not foundが出ます。このエラーでググると、grub rescueモードでの解決策はなく、リムーバブルメディアからブートして、grub-installを実行するしかありません。

早速、Gentoo LiveCDをUSBにw32diskimagerで書き込み、起動。
GentooGRUBガイドやGentoo quick install guideを元にgrub-installを実施します。

wiki.gentoo.org

$ > sudo su
root #mkdir -p /mnt/gentoo
root #mount /dev/nvme0n1p4 /mnt/gentoo
root #mount /dev/nvme0n1p1 /mnt/gentoo/boot
root #mount /dev/nvme0n1p2 /mnt/gentoo/boot/efi
root #cd /mnt/gentoo
root #mount --types proc /proc /mnt/gentoo/proc
root #mount --rbind /sys /mnt/gentoo/sys
root #mount --make-rslave /mnt/gentoo/sys
root #mount --rbind /dev /mnt/gentoo/dev
root #mount --make-rslave /mnt/gentoo/dev
root #mount --bind /run /mnt/gentoo/run
root #mount --make-slave /mnt/gentoo/run
root #chroot . /bin/bash
root #source /etc/profile 
root #grub-install --target=x86_64-efi

明示的に--target=x86_64-efiをつけないと、i386-pcディレクトリがない!って怒られます。
しかし、これでもgrub rescueモードに入ってしまいます。
いくつか試みましたが、grubが通常起動したのは、/boot内にあるgrubディレクトリと、/boot/efiディレクトリ内にあるEFIディレクトリの2つを削除してから(いきなり削除は怖いのでリネームしてから)、上記のgrub-installをデバイスマップを再作成する--recheckオプションをつけて実行したときでした。

$ > sudo su
root #mkdir -p /mnt/gentoo
root #mount /dev/nvme0n1p4 /mnt/gentoo
root #mount /dev/nvme0n1p1 /mnt/gentoo/boot
root #mount /dev/nvme0n1p2 /mnt/gentoo/boot/efi
root #cd /mnt/gentoo
root #mount --types proc /proc /mnt/gentoo/proc
root #mount --rbind /sys /mnt/gentoo/sys
root #mount --make-rslave /mnt/gentoo/sys
root #mount --rbind /dev /mnt/gentoo/dev
root #mount --make-rslave /mnt/gentoo/dev
root #mount --bind /run /mnt/gentoo/run
root #mount --make-slave /mnt/gentoo/run
root #chroot . /bin/bash
root #source /etc/profile
root #mv /boot/grub /boot/grub.old
root #mv /boot/efi/EFI  /boot/efi/EFI.old
root #grub-install --target=x86_64-efi --boot-directory=/boot --efi-directory=/boot/efi --recheck

chroot環境なので、--boot-directory=/bootと--efi-directory=/boot/efiオプションは必要ないかもしれません。
chroot環境ではない場合は、それぞれ指示しないと、リムーバブルメディアでブートした環境にgrubをインストールしてしまいます。
最後に、新たに作られた/boot/grubフォルダにはgrub.cfgがありませんから、これを作成します。

root #grub-mkconfig -o /boot/grub/grub.cfg

これで、めでたくgrubが起動しました。
次はkernelだ!