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