根据上述代码修订的解决方案
上面的解决方案不会完全正常工作,因为它将引导分区安装到文件系统的/(根)中。当然,这使grub抱怨/ boot不存在。这将解决该问题:
mkdir /mnt/chrootdir
mkdir /mnt/chrootdir/boot
mount /dev/sda1 /mnt/chrootdir/boot
for dir in proc dev sys etc bin sbin var usr lib lib64 tmp; do mkdir /mnt/chrootdir/$dir && mount --bind /$dir /mnt/chrootdir/$dir ; done
chroot /mnt/chrootdir
update-grub2 # inside chroot
如您所见,我还删除了换行符,以便每个人都更容易执行。
另一个(更简单)的解决方案
如果仍然无法正常工作,则应将/ boot分区复制到/(根)分区。为此,请使用Ubuntu live boot dvd启动系统并打开终端。在其中键入:
sudo su
fdisk -l
找出您拥有的分区。在我的情况下,sda1是我的/ boot分区,它的大小约为250MB,而sda5约为500GB。我在以下命令中使用这些值:
mkdir /mnt/boot/
mount /dev/sda1 /mnt/boot/
mkdir /mnt/root/
mount /dev/sda5 /mnt/root/
cp -R /mnt/boot/ /mnt/root/boot/
设置数据分区的可引导标志,并为引导分区删除它:
fdisk /dev/sda
b -> 1 (unset the bootable flag for the first partition)
b -> 5 (set the bootable flag for the fifth partition)
w -> write changes to the MBR
您的计算机现在将在sda5内部查找启动文件。是时候再次进行chroot了,这一次已经有了一些grub所需的文件夹,这些文件夹已经由您的Ubuntu live光盘生成了:
mkdir /mnt/chrootdir/
mkdir /mnt/chrootdir/dev/
mkdir /mnt/chrootdir/proc/
mkdir /mnt/chrootdir/sys/
mount /dev/sda5 /mnt/chrootdir/
mount --bind /dev/ /mnt/chrootdir/dev/
mount --bind /proc/ /mnt/chrootdir/proc/
mount --bind /sys/ /mnt/chrootdir/sys/
chroot /mnt/chrootdir/
grub-install /dev/sda
安装完成。没有错误报告。
如果您没有看到生成grub.cnf文件的消息,请同时运行update命令:
update-grub2 /dev/sda
现在,您可以安全地重新启动,并再次看到众所周知的启动菜单。
从物理服务器迁移到虚拟机后,该解决方案是唯一对我有用的解决方案。我希望有人觉得这有用!