将 /boot 移动到新分区会产生:找不到文件 '/boot/grub/i386-pc/normal.mod'

将 /boot 移动到新分区会产生:找不到文件 '/boot/grub/i386-pc/normal.mod'

我正在尝试将/boot文件夹从/分区移动到/dev/sdb.以下脚本:

parted -s /dev/sdb mklabel msdos mkpart primary ext2 1M 100% set 1 boot on
mkfs.ext2 /dev/sdb1
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot
cd /boot
find . -depth -print0 | \
    cpio --null --sparse --make-directories --pass-through --verbose /mnt/boot
cd /
umount /mnt/boot
mv /boot /boot.orig
mkdir /boot
echo "/dev/sdb1 /boot ext2 ro 0 2" >>/etc/fstab
mount /dev/sdb1 /boot
parted /dev/sda set 1 boot off
grub-install /dev/sdb
update-grub
reboot

产生这个错误:

error: file '/boot/grub/i386-pc/normal.mod' not found.
grub rescue>

有任何想法吗?

编辑/boot:如果原始目录位于单独的分区上(例如/dev/sda2),上面的脚本似乎可以正常工作。仅当它与/分区 ( )位于同一分区时,它才会失败/dev/sda1

我在 Ubuntu 13.04 和 Fedora 19 上尝试了上述脚本的许多变体,但尚未避免该file '/boot/grub/i386-pc/normal.mod' not found错误。

还有其他想法吗?

答案1

问题是 grub 正在寻找/boot/grub/i386-pc/normal.mod 在新分区上。由于该分区的根目录现已安装在/boot,因此该文件当前位于/grub/i386-pc/normal.mod新分区上。您需要重新安装grub到该分区,或者作为临时措施,您可以通过调用创建符号链接ln -s . /boot/boot,这将允许在任一名称下找到该文件。

答案2

执行“ls”来查找您的启动分区(即新分区),例如(hdX,Y)。

然后 ls (hdX,Y)/usr/lib/grub/i386-pc

你看到那里的文件了吗?

您可能需要使用救援 CD 或 USB 启动,然后重新安装 grub。有些东西已损坏。

答案3

发生这种情况是因为在图像prefix中硬编码的变量不再与您的分区布局匹配。您可以临时手动覆盖此变量并通过在救援 shell 中运行以下命令来加载 GRUB 一次:core.imggrub-install

set prefix=(hd0,1)/boot/grub
insmod normal
normal

前缀应该是 GRUB 文件(grub.cfg 等)所在的路径,通常类似于(hdX,Y)/boot/grub单个根分区,或者(hdX,Y)/grub如果您有专用/boot分区。如果是 mdadm 管理的 RAID,则hdX,Y可能是md/xxxmduuid/xxxx...

如果一切顺利,GRUB 应该能够加载它的模块并加载它grub.cfg,您应该能够启动您的操作系统。启动后,运行grub-install以新前缀重新生成 a core.img(将嵌入到磁盘的 MBR 中)。

更多信息在他们的(可怕的)文档

相关内容