如何将 grub 从 sda 移动到 sdb?

如何将 grub 从 sda 移动到 sdb?

我尝试过在网上找到的其他解决方案(包括这里),但都没有用,而且看起来没有人能回答这个看似简单的事情。

如果您有答案,请用具体的命令完整地指导我,因为我无法独自完成,我的 Linux/Ubuntu 水平并不高。

我有 2 个 SSD:

  • 首先是一块 250GB 的 SSD,上面只安装了 Windows 10。
  • 第二个是最初安装 Windows 10 的 500GB SSD。然后我为 Ubuntu(20.04)缩小了 200GB。

我在安装过程中将启动驱动器指定为 sdb,即 500GB,但它仍然在 sda1(/boot/efi)分区内安装了 GRUB,与 sda 的 Windows 启动管理器一起安装。

使用 GPT

我尝试了 grub-install 方法(grub-install /dev/sdb) - 它在终端中显示了一些输出,但重启后,情况是一样的:启动分区仍然在 sda 中,其中有 GRUB。

我如何将 GRUB 移动到 sdb 上的正确分区?要么与 sdb 的 Windows 启动管理器一起(现在与 sda 一起),要么可能在 sdb 上的其他分区上。

我不想物理地拔掉 250GB 的硬盘然后安装 Ubuntu,我想用一种不会让我每次格式化 PC 时都打开 PC 机箱的方式来解决这个问题

答案1

您的问题是由Ubiquity 中长期存在的错误。简而言之,当您在 EFI 模式下安装时,Ubiquity(Ubuntu 桌面安装程序)会忽略 GRUB 应安装到的磁盘的规范。这些信息实际上不会帮助您解决问题,但值得了解。有几种方法可以根据需要更改启动磁盘……

简单的解决方案

启动修复工具应该能够半自动地完成此操作。我已经有一段时间没有使用 Boot Repair 了,所以我无法提供分步说明,但它应该能够在您的 上安装 GRUB 2。不过,/dev/sdb我不能 100% 确定它会改变 Ubuntu 中安装的内容。如果您没有 ESP 或该工具遇到任何其他意外陷阱,/boot/efi它也可能会失败。/dev/sdb

艰难的解决方案

要手动解决问题,您应该首先验证您/dev/sdbEFI 系统分区 (ESP)。使用各种分区工具可以轻松完成此操作;例如,使用gdisk,您可以列出分区并查找类型代码为的分区EF00

$ sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 1.0.9

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdb: 15628053168 sectors, 7.3 TiB
Model: TOSHIBA HDWF180 
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): A29BEED8-295E-48F3-A7E5-2C1C669A0226
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 15628053134
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1128447   550.0 MiB   EF00  Unused ESP
   2         1128448         3225599   1024.0 MiB  8300  Unused /boot
   3         3225600     15628053134   7.3 TiB     8E00  Linux LVM

此示例取自我的一台计算机,它显示了一个/dev/sdb1名为 的ESP Unused ESP。您的计算机可能没有这个名字。如果您看到 ESP,则应使用以下实用程序仔细检查它是否具有 FAT 文件系统blkid

$ sudo blkid /dev/sdb1
/dev/sdb1: PARTLABEL="Unused ESP" PARTUUID="94c47102a617-4224-9f29-5779220d4b7f"

此示例表明该分区没有文件系统——它们通常被明确标识,就像同一台计算机上的这个示例一样:

$ sudo blkid /dev/nvme0n1p1
/dev/nvme0n1p1: LABEL_FATBOOT="NVME_SSD" LABEL="NVME_SSD" UUID="6CB1-160F" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="5f63fbfe-1a11-4ed8-80ff-13f1df6f04c0"

请注意TYPE="vfat"此例中的描述;这个 ESP(我没有显示gdiskNVMe 设备上的输出,但它有一个EF00类型代码)已准备好使用 - 事实上,这就是这台特定计算机的启动方式。

无论如何,如果您/dev/sdb有 ESP 并且它使用 FAT,那么它就可以使用了。如果没有,那么您必须在驱动器上设置 ESP。这是另一个问题,所以我不会在这里讨论它。由于您说计算机最初启动的是 Windows 10,因此很可能它有一个 ESP,但我不能确定,所以您应该检查这个细节。

因为您的 Ubuntu 安装从现在起使用 ESP /dev/sda,所以您需要更改它,而不仅仅是针对 GRUB 安装。您需要编辑/etc/fstab:找到定义并修改它的行/boot/efi,以引用 /dev/sdb 上的 ESP,而不是 /dev/sda 上的 ESP。例如,您当前/etc/fstab可能有如下一行:

# /boot/efi was on /dev/sda1 during installation
UUID=6CB1-160F            /boot/efi            vfat    umask=0077  0  1

请注意,在此示例中,ESP 被标识为具有,这是与之前显示的UUID=6CB1-160FUUID 代码相同的代码。(从技术上讲,它不是 UUID,但那是另一回事……)就您而言,我希望 UUID与您 上显示的相匹配。使用ESP 上的命令输出来查找该分区的 UUID。例如,假设新 ESP 的 UUID 是。您需要编辑 中的行以读取:sudo blkid /dev/nvme0n1p1blkid/dev/sda1blkid/dev/sdb66F7-FD24/etc/fstab

UUID=66F7-FD24            /boot/efi            vfat    umask=0077  0  1

保存更改,输入sudo umount /boot/efi,然后sudo mount -a。您的/dev/sdbESP 现在应该已安装在/boot/efi,您可以使用 进行验证df /boot/efi

$ df /boot/efi
Filesystem     1K-blocks  Used Available Use% Mounted on
/dev/sdb1         562080 14124    547956   3% /boot/efi

/dev/sdb您的 Linux 安装现已从上安装 ESP /boot/efi;但是,GRUB 仍未安装在那里。幸运的是,这部分很简单:

$ sudo grub-install

在 EFI 下,我的理解是grub-install忽略设备规格;相反,它会安装 GRUB/boot/efi并设置一个 EFI BootOrder 变量来匹配。(注意:我使用自己的重新索引在我的大多数计算机上,没有 GRUB 2,所以我不太熟悉细节grub-install,我可能会遗漏一些东西。文档对这个细节并不十分清楚。)

您可能需要使用efibootmgr来验证更改。输入sudo efibootmgr并检查中的第一个项目BootOrder是否为不是与行相同BootCurrent;但它们都应该是ubuntu项目。例如,以下是一些输出:

$ sudo efibootmgr
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0004,0000,0006,0007,0008,0001,0002,0003
Boot0000* ubuntu
Boot0001* UEFI:CD/DVD Drive
Boot0002* UEFI:Removable Device
Boot0003* UEFI:Network Device
Boot0004* ubuntu
Boot0006* UEFI OS
Boot0007* Hard Drive
Boot0008* CD/DVD Drive

在此示例中,计算机当前通过 启动Boot0000,但下次将通过 启动Boot0004。 两者都是ubuntu项,分别指向/dev/sda和上的 ESP 上的 GRUB 2。/dev/sdb您可以-vefibootmgr命令中添加以查看更多详细信息,如下所示:

Boot0000* ubuntu    HD(1,GPT,5f63fbfe-1a11-4ed8-80ff-13f1df6f04c0,0x800,0x114000)/File(\EFI\UBUNTU\SHIMX64.EFI)

长串的十六进制数字(5f63fbfe-1a11-4ed8-80ff-13f1df6f04c0)是一个 GUID,它应该与 报告的 PARTUUID 相匹配blkid,正如这个对我的计算机的 一样/dev/nvme0n1p1,如前所示。

重新启动以确保其正常工作后,如果您想彻底检查,可以将 ESP 挂载到您/dev/sda方便的地方(例如/mnt)并删除EFI/ubuntu该分区上的目录。这将消除重复的 GRUB 2 安装。

相关内容