我有一个运行 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 将其配置存储在
/boot
:mount /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 的那些。
或者,你可以给克隆属尝试实现同样的目标。