如何在新驱动器上安装 GRUB?

如何在新驱动器上安装 GRUB?

我有一个运行 CentOS 的虚拟机。

我已将一个新的虚拟磁盘附加到现有的 CentOS VM,现在尝试在这个新附加的磁盘上安装 GRUB。

稍后,我将启动第二个虚拟机,其中包含新准备的可启动硬盘以及自定义根文件系统和内核。

我尝试了以下步骤:

  • 将新的虚拟磁盘附加到现有的工作 CentOS 计算机。
  • 创建了一个新分区fdisk /dev/sdb。分区时,我选择了选项主分区、分区号1等默认选项。
  • 用 格式化磁盘mkfs.ext3 /dev/sdb1
  • 将磁盘安装到/media/new_drive.
  • 安装了 GRUB grub-install /dev/sdb1 --root-directory=/media/new_drive/

此后,带有新准备的硬盘的第二个虚拟机无法启动;我收到错误:could not read from the boot medium。看起来 MBR 没有更新grub-install,但我可以看到 GRUB 安装/boot/grub在新驱动器上。

但最糟糕的是,它损坏了我现有的 CentOS GRUB:CentOS VM 挂起,显示黑屏,唯一的文本是GRUB.

为什么grub-install /dev/sdb1不修改sdb1的MBR?这不是在新驱动器上安装 GRUB 的正确方法吗?

答案1

我不是 grub2 专家(抱歉),但尝试添加--skip-fs-probe到您的 grub-install 行,我发现这会阻止创建/boot/grub/device.map可能导致引导到 grub 提示符的文件。我认为如果没有这个参数,grub-install 不会按照你告诉它的去做,而是认为它比你聪明,并且可能会做一些不同的事情。

另一件事是确保您使用正确的 grub 安装(即用于 grub2 而不是原始 grub)。如果您在 Centos 内部,这不是问题,但使用 SystemRecoveryCD 两个版本都可用,因此您必须使用grub2-install.我通过艰难的方式学会了...

正如 @wurtel 指出的(值得称赞),您应该指定驱动器而不是分区。 Grub2 安装在整个磁盘驱动器的第 0 扇区,这个“存根”是在引导时运行的,但它需要知道磁盘上的位置,以便为下一阶段的引导安装文件 - 这就是参数的--root-directory内容为了。 (我认为。)

通过阅读man grub-install和谷歌搜索,我发现它--root-directory并不真正适合用于 grub2 版本 1.99++,尽管根据我的经验它确实有效。您应该使用--boot-directory并引用实际的引导目录,因此这将为您提供:

grub-install /dev/sdb --skip-fs-probe --boot-directory=/media/new_drive/boot

答案2

这就是我将由启动分区/boot和根分区组成的 Debian 安装移动/到新驱动器并使其可启动的方法GNU GRUB:

克隆分区

  • 使用GParted 现场 CD,在新驱动器上创建引导分区和根分区。
  • 使用 GParted 中的根控制台,挂载旧的启动分区(假设是/dev/sda1)和新分区(/dev/sdb1):mount /dev/sda1 /mnt/oldBoot && mount /dev/sdb1 /mnt/newBoot
  • 将数据从旧启动分区复制到新启动分区:cp -afv /mnt/oldBoot /mnt/newBoot.的解释cp -afv
    • a代表“存档”,意思是:
      • 不要取消引用链接
      • 递归复制(如-R
      • 保留所有属性(时间戳、所有者、权限)
    • f:强制,如果无法打开现有目标文件,请将其删除并重试
    • v:详细,解释正在做什么
  • 这将在控制台上生成一些输出,显示当前复制了哪个文件以及是否cp取得进展
  • 将文件从旧根分区装载并复制到新根分区:
    • 为了安全:umount /mnt/oldBoot && umount /mnt/newBoot
    • 挂载旧的和新的根分区(假设是/dev/sda2/dev/sdb2):mount /dev/sda2 /mnt/oldRoot && mount /dev/sdb2 /mnt/newRoot
    • 将旧根分区的数据复制到新根分区:cp -afv /mnt/oldRoot /mnt/newRoot
  • 编辑文件系统表定义启动时挂载哪些分区(我将使用 Vim 来实现):
    • vi /etc/fstab

    • 您会注意到此处引用了您的旧分区。使用新分区的 UUID

    • 您可以临时将所有 UUID 插入 fstab 中,以便于复制和粘贴:r !blkid

    • 使用新分区的 UUID 更改 fstab 中的条目。它们应该看起来像这样:

       # <file system> <mount point> <type> <options> <dump> <pass>
       # Root partition
       UUID=76fd1ffd-fb96-4ab4-be1a-42f8e9223983 / ext4 errors=remount-ro 0 1
       # Boot partition
       UUID=e560e29e-8752-4b83-b1ee-4b86c0009f0b /boot ext2 defaults 0 2
      
    • blkid删除之前插入的 fstab的输出:r !blkid

安装GRUB

  • 挂载 GParted live CD 的虚拟文件系统:
    mount --bind /dev /mnt/newRoot/dev
    mount --bind /proc /mnt/newRoot/proc
    mount --bind /sys /mnt/newRoot/sys
  • 使 GParted live CD 的 GRUB 实用程序可用于根分区:mount --bind /usr/ /mnt/newRoot/usr
  • 将引导分区挂载到根分区,因为 GRUB 将其配置存储在/bootmount /dev/sdb1 /mnt/newRoot/boot
  • 用于chroot /mnt/newRoot使新的根分区临时成为文件系统的根
  • /boot/grub/grub.cfg使用以下命令创建 GRUB 配置文件update-grub2
  • 在新驱动器上安装 GRUB:grub-install /dev/sdb。您不能在此处指定分区号
  • 返回 GParted live CD 的文件系统:exit
  • 卸载分区:umount /mnt/newRoot/*
  • 停机机
  • 如果您连接了多个驱动器,请确保较新的驱动器在引导顺序中排在第一位
  • 启动机器

这些说明的灵感来自Oaktreepeak.com 的那些

或者,你可以给克隆属尝试实现同样的目标。

相关内容