首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在新驱动器上安装GRUB?

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

Unix & Linux用户
提问于 2015-03-19 13:43:11
回答 2查看 42.3K关注 0票数 9

我有一个用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 VM挂起显示一个黑色屏幕,唯一的文本是GRUB

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2015-03-19 13:48:20

我不是grub2专家(对不起),但是尝试将--skip-fs-probe添加到grub安装行中,我发现这会阻止创建/boot/grub/device.map,这会导致启动grub提示符。我认为,如果没有这个参数grub-install,而不是按您说的做,它会认为它比您更聪明,并且可能会做一些不同的事情。

另一件事是确保您使用的是正确的grub-安装(即grub2而不是原始grub)。如果您在Centos中,这不是一个问题,但是对于SystemRecoveryCD,这两个版本都是可用的,所以您必须使用grub2-install。我学到了艰难的方法..。

正如@wurtel所指出的(kudos),您应该指定一个驱动器,而不是一个分区。Grub2安装在整个磁盘驱动器的扇区0中,这个“存根”是在引导时运行的,但是它需要知道磁盘上的位置,它应该在下一阶段启动时安装文件--这就是--root-directory参数的作用。(我想)

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

代码语言:javascript
复制
grub-install /dev/sdb --skip-fs-probe --boot-directory=/media/new_drive/boot
票数 9
EN

Unix & Linux用户

发布于 2018-01-12 12:59:40

这就是我如何将由引导分区/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)
      • 保存所有属性(时间戳、所有者、权限)

代码语言:javascript
复制
- `f`: force, if an existing destination file cannot be opened, remove it and try again
- `v`: verbose, explain what is being done
  • 这将在您的控制台上生成一些输出,显示当前正在复制的文件以及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
    • 您可以暂时将所有UUIDs插入fstab中,以便更容易地使用:r !blkid复制和粘贴。
    • 使用新分区的UUID来更改fstab中的条目。它们应该如下所示:# < point> # Root分区UUID=76fd1ffd-fb96-4ab4-be1a-42f8e9223983 / ext4错误=re装入-ro 0 1# Boot分区UUID=e560e29e-8752-4b83-b1ee-4b86c0009f0b /boot ext2默认值0 2
    • 从前面用blkid插入的fstab中删除:r !blkid的输出

安装GRUB

  • 挂载GParted live的虚拟文件系统:
代码语言:javascript
复制
    mount --bind /dev /mnt/newRoot/dev
    mount --bind /proc /mnt/newRoot/proc
    mount --bind /sys /mnt/newRoot/sys
  • 将GParted live的GRUB实用程序提供给根分区:mount --bind /usr/ /mnt/newRoot/usr
  • 将引导分区挂载到根分区,因为GRUB将将其配置存储在/bootmount /dev/sdb1 /mnt/newRoot/boot
  • 使用chroot /mnt/newRoot使新的根分区临时成为文件系统的根
  • /boot/grub/grub.cfg上使用update-grub2创建GRUB配置文件
  • 在新驱动器上安装GRUB:grub-install /dev/sdb。您不能在这里指定分区号
  • 返回到GParted live的文件系统:exit
  • 卸载分区:umount /mnt/newRoot/*
  • 停机机
  • 如果附加了多个驱动器,请确保较新的驱动器按引导顺序放在第一位。
  • 起动机

这些指令是受oaktreepeak.com的启发的。

或者,您可以尝试让克隆齐拉实现同样的目标。

票数 6
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/191218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档