因此,我使用 Ubuntu 和 Windows 8 双启动一两个月了,它看起来运行良好,但是由于某种原因它坏了,我不得不恢复整个 PC。由于这次糟糕的经历,我决定在与我的主要 Windows 机器分开的外部硬盘上重新安装 Ubuntu。这个选项似乎对两个操作系统都很好。
但是,在安装 Ubuntu 时,由于某种原因,引导加载程序 Grub 未安装在外部驱动器上,同时,“旧”的 Grub 引导加载程序从未从 PC 内置硬盘驱动器中删除。因此,我处于一种奇怪的情况:当我想运行 Windows 时,我只需打开 PC 即可。当我想运行 Linux 时,我必须插入外部驱动器,进入启动菜单,并将引导加载程序从 Windows 更改为 Grub。外部硬盘驱动器不可启动(例如作为 USB 棒),每次都需要重复这一长串操作。
快速回顾:
- PC 内置硬盘包含来自旧 Linux 安装的 Windows 操作系统、Windows 引导加载程序和 Grub。
- 外部硬盘包含 Ubuntu 15.10,可能还有 Grub,但不能像 USB 那样启动。
- 每次我想要切换操作系统时,我都需要在启动菜单中手动更改引导加载程序,这很繁琐。
- 启动设备的顺序如下:1. USB 2. 外部驱动器 3. 内部驱动器
我的问题:如何使外部驱动器可启动,以便当我想从 Windows 切换到 Linux 时,只需关闭电脑,插入 USB,打开电脑即可?(不会丢失我已经存储在其中的数据和所有首选项)
PS. 由于某种原因,当通过内置驱动器中的 Grub 引导加载程序加载时,Windows 的速度非常慢。此外,如果未插入外部硬盘驱动器,Grub 引导加载程序只会显示 Grub 救援面板。因此,使用已安装的 Grub 作为唯一的引导加载程序不是一个选择。
答案1
这就是我将 grub 安装到安装了 Ubuntu 17.04 的外部硬盘 (GPT) 上的方法。执行此操作后,您可以使用外部 grub 在任何支持 UEFI 的 PC 上启动 Ubuntu,而无需依赖 PC grub。如果 Windows 的 EFI 出现问题,它还可以用作备份 grub。
将 Grub 安装到已安装 Ubuntu 的外部硬盘上
启动 Ubuntu live USB 并连接外部硬盘。
列出所有设备的分区:
lsblk
从 的结果中
lsblk
,识别外部硬盘的 linux 分区和 efi 分区,即/dev/sdXY1
和/dev/sdXY2
。将XY1
和替换XY2
为您自己的分区名称。特殊挂载linux分区:
sudo mount /dev/sdXY1 /mnt
挂载关键虚拟文件系统:
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
chroot
进入您挂载的 Linux 分区:sudo chroot /mnt
您现在位于外部硬盘驱动器的 Linux 文件系统中。
创建 grub 安装其文件的目录:
mkdir -p /boot/efi
如果已经存在,则跳至步骤 8。
挂载步骤 3 中的 efi 分区:
mount /dev/sdXY2 /boot/efi
将 grub 安装到外部硬盘:
grub-install /dev/sdX
更新 grub:
update-grub
找到 efi 分区(又名“vfat”)的 UUID 并记下来:
blkid
或者
ls -l /dev/disk/by-uuid
现在我们需要告诉 fstab 在启动时挂载该 efi 分区:
cp /etc/fstab /etc/fstab.bak sudo nano /etc/fstab
将以下两行添加到 fstab,用步骤 11 中的 UUID 替换 xxxx-xxxx:
#my modified fstab to mount external hard drive's esp UUID=xxxx-xxxx /boot/efi vfat umask=0077 0 1
确保注释掉 Windows esp 的 fstab 条目,以免发生冲突。
退出 chroot:
exit
重新启动电脑:
sudo reboot
此时,当您重新启动并从 EFI 启动管理器中选择外部设备时,它将启动到 grub。
为了使 Ubuntu 在插入外部设备时自动启动,并且使 Windows 在未插入外部设备时自动启动,您必须为 Ubuntu 创建自定义启动项,以指向外部驱动器上的 efi:
为 Ubuntu 创建自定义启动项以指向外部硬盘上的 efi
从 Windows简易UEFI可以添加或删除启动项。
从 Linux启动管理器可以添加或删除启动项。
替代方案 #1– 使用 EasyUEFI
在 Windows 中下载 EasyUEFI,安装并运行。
选择EFI 选项管理器
选择创建“新条目”带有 + 符号
选择Linux 或其他操作系统并在描述框中为其命名
选择包含 grub 引导加载程序的外部驱动器上的 FAT32 EFI 分区
选择浏览
导航/efi/ubuntu/shimx64.efi或者/efi/ubuntu/grubx64
节省
将其移至启动项列表的顶部
重新开始
替代方案 #2- 使用efibootmgr
列出启动菜单项:
efibootmgr
创建启动项:
efibootmgr -c [-L label] [-d /dev/sdX]
例如:
efibootmgr -c -L myubuntu -d /dev/sdX
该启动项将自动成为第一个项。
/dev/sdX
是带有 grub 引导加载程序的外部硬盘驱动器。现在你可以重新启动,无需你的干预,Ubuntu 将在插入外部硬盘时自动启动。当未插入外部硬盘时,PC 将跳过我们的Ubuntu启动项到下一个项,可能是Windows 启动管理器。
答案2
我最终找到了解决问题的方法。我会在这里发布它,以防有人需要它。此外,我并不完全确定什么方法有效,以及我采取的所有步骤是否真的有必要,但这种方法有效。
- 使用 gparted 或类似工具确保外部驱动器上有 EFI 分区。该分区应为 FAT32,具有 boot 和 esp 标志,并安装在 /boot/efi。大小应至少为 200 Mb,尽管我将其设置为 1Gb,因为我的硬盘上有可用空间。如果您没有此分区,请创建它。
- 检查外部硬盘上的 EFI BOOT 分区的 UUID 是否与 fstab 文件中的 UUID 匹配。
要检查分区的 UUID,只需在终端中输入
ls -l /dev/disk/by-uuid
编辑 fstab 文件
sudo nano /etc/fstab
现在安装 Grub。(您也可以尝试将 grub 从内部驱动器复制到外部驱动器分区,但对我来说不起作用)。
sudo grub-install /dev/sdX
用实际驱动器替换 sdX。
- 如果您还没有这样做,请启用从 USB 驱动器启动,并确保从 UEFI 设置菜单中加载外部引导加载程序,然后再加载内部引导加载程序。现在您的机器应该首先从 USB 启动,然后(如果未找到引导加载程序)从内部硬盘驱动器启动。