我尝试过在网上找到的其他解决方案(包括这里),但都没有用,而且看起来没有人能回答这个看似简单的事情。
如果您有答案,请用具体的命令完整地指导我,因为我无法独自完成,我的 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/sdb
的EFI 系统分区 (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(我没有显示gdisk
NVMe 设备上的输出,但它有一个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-160F
UUID 代码相同的代码。(从技术上讲,它不是 UUID,但那是另一回事……)就您而言,我希望 UUID与您 上显示的相匹配。使用ESP 上的命令输出来查找该分区的 UUID。例如,假设新 ESP 的 UUID 是。您需要编辑 中的行以读取:sudo blkid /dev/nvme0n1p1
blkid
/dev/sda1
blkid
/dev/sdb
66F7-FD24
/etc/fstab
UUID=66F7-FD24 /boot/efi vfat umask=0077 0 1
保存更改,输入sudo umount /boot/efi
,然后sudo mount -a
。您的/dev/sdb
ESP 现在应该已安装在/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
您可以-v
在efibootmgr
命令中添加以查看更多详细信息,如下所示:
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 安装。