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

Ren*_*ith 5 linux virtualbox grub-legacy

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

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

稍后,我将使用新准备的可引导硬盘启动第二个 VM,该硬盘带有自定义根文件系统和内核。

我尝试了以下步骤:

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

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

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

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

gog*_*oud 6

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

另一件事是确保您使用正确的 grub-install(即用于 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
Run Code Online (Sandbox Code Playgroud)


Mat*_*aun 6

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

克隆分区

  • 使用GParted live 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
      
      Run Code Online (Sandbox Code Playgroud)
    • 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
Run Code Online (Sandbox Code Playgroud)
  • 使 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 的说明。

或者,您可以尝试Clonezilla来实现相同的目的。