如何在外置硬盘中安装Grub?

所以,我在Windows 8的双启动中使用了Ubuntu一两个月,看起来并且运行正常,但由于某种原因它崩溃了,我不得不恢复整个PC。 由于这种糟糕的体验,我决定在与我的主Windows机器分开的外部硬盘驱动器上重新安装Ubuntu。 这个选项似乎对两个操作系统都有好处。

但是,在安装Ubuntu时,由于某种原因,引导程序Grub没有安装在外部驱动器上,而同时,“旧”Grub引导程序从未从PC内部硬盘驱动器中删除。 结果,我处于一个奇怪的境地:当我想运行Windows时,我只需启动电脑就可以了。 当我想运行Linux时,我必须插入外部驱动器,进入启动菜单,然后将引导加载程序从Windows更改为Grub。 外部硬盘驱动器不可引导(例如usb棒),每次都需要重复这一长时间的操作。

快速回顾:

  1. PC内部硬盘驱动器包含旧的Linux安装中的Windows操作系统,Windows引导程序和Grub。
  2. 外部硬盘包含Ubuntu 15.10,可能是Grub,但不能像USB记忆棒那样可启动。
  3. 每次我想切换操作系统时,我都需要在启动菜单中手动更改引导加载程序,这很繁琐。
  4. 引导设备按如下方式排序:1。USB 2.外部驱动器3.内部驱动器

我的问题:如何使外部驱动器可启动,以便当我想从Windows切换到Linux时,我只需关闭电脑,插上USB,打开电脑即可开始使用? (没有丢失我已存储在其上的数据和所有首选项)

PS。 由于某些原因,当通过内部驱动器中提供的Grub引导加载程序加载时,Windows非常慢。 此外,如果未插入外部硬盘驱动器,Grub引导加载程序仅显示Grub救援面板。 因此,使用已安装的Grub作为唯一的引导程序不是一个选项。

这就是我如何安装grub到安装了Ubuntu 17.04的外置硬盘(GPT)。 当你这样做时,它允许你在任何支持UEFI的PC上启动你的Ubuntu,使用外部的grub而不依赖于PC grub。 它还可以作为备份grub,以防Windows的EFI出现问题。

将Grub安装到安装了Ubuntu的外部硬盘驱动器上

  1. 启动到Ubuntu live USB并连接外部硬盘。

  2. 列出所有设备的分区:

    lsblk 
  3. 根据lsblk的结果, lsblk识别linux分区和外部硬盘的efi分区,即/dev/sdXY1/dev/sdXY2 。 用您自己的分区名称替换XY1XY1

  4. 特殊挂载linux分区:

      sudo mount /dev/sdXY1 /mnt 
  5. 挂载关键虚拟文件系统:

     for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done 
  6. chroot到你挂载的Linux分区:

     sudo chroot /mnt 

    您现在位于外部硬盘驱动器的linux文件系统中。

  7. 创建grub将安装其文件的目录:

     mkdir -p /boot/efi 

    如果已存在,则跳到步骤8。

  8. 从步骤3安装efi分区:

     mount /dev/sdXY2 /boot/efi 
  9. 将grub安装到外部硬盘驱动器:

     grub-install /dev/sdX 
  10. 更新grub:

     update-grub 
  11. 找到efi分区的UUID(又名’vfat’)并记下它:

     blkid 

    要么

     ls -l /dev/disk/by-uuid 
  12. 现在我们需要告诉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条目,这样它就不会发生冲突。

  13. 退出chroot:

     exit 
  14. 重启PC:

     sudo reboot 

此时,当您重新启动并从EFI启动管理器中选择外部设备时,它将启动到grub。

要在插入外部设备时使Ubuntu自动启动,而在未插入外部设备时自动启动,则必须为Ubuntu创建一个自定义启动项,以指向外部驱动器上的efi:

为Ubuntu创建自定义引导条目以指向外部HD上的efi

从Windows EasyUEFI可以添加或删除引导条目。

从Linux efibootmgr可以添加或删除引导条目。

备选方案#1 – 使用EasyUEFI

  1. 在Windows下载EasyUEFI,安装并运行。

  2. 选择EFI选项管理器

  3. 选择使用+号创建“新条目”

  4. 选择Linux或其他操作系统,并在描述框中为其命名

  5. 在包含grub引导加载程序的外部驱动器上选择FAT32 EFI分区

  6. 选择浏览

  7. 导航到/efi/ubuntu/shimx64.efi/ efi / ubuntu / grubx64

  8. 保存

  9. 将其移至引导条目列表的顶部

  10. 重新开始

备选方案#2 – 使用efibootmgr

  1. 列出启动菜单条目:

     efibootmgr 
  2. 创建启动条目:

     efibootmgr -c [-L label] [-d /dev/sdX] 

    例如: efibootmgr -c -L myubuntu -d /dev/sdX

    此引导条目将自动成为第一个条目。

    /dev/sdX是带grub引导程序的外部硬盘驱动器。

  3. 您现在可以重新启动而无需干预Ubuntu会在插入外部硬盘时自动启动。当没有插入外部硬盘时,PC会跳过我们的Ubuntu启动项进入下一个可能是Windows启动管理器的条目。

我最终找到了解决问题的方法。 我会在这里发布,万一有人可能需要它。 此外,我不完全确定什么有效,如果我采取的所有步骤都是必要的,但这是有效的。

  1. 确保使用gparted或类似的东西在外部驱动器上有EFI分区。 分区应为FAT32,具有引导和esp标志,并安装在/ boot / efi。 尺寸应该至少为200 Mb,虽然我已经制作了1Gb,因为我的HD上有可用的空间。 如果你没有这个分区,那就去做吧。
  2. 检查外部硬盘驱动器上的EFI BOOT分区的UUID是否与fstab文件中的UUID匹配。

检查分区的UUID只需键入终端

 ls -l /dev/disk/by-uuid 

在编辑fstab文件时

 sudo nano /etc/fstab 
  1. 现在安装Grub。 (您也可以尝试将grub从内部驱动器复制到外部驱动器分区,但它对我不起作用)。

    sudo grub-install / dev / sdX

用实际驱动器替换sdX。

  1. 如果您还没有这样做,请从USB驱动器启用启动,并确保在UEFI设置菜单中的内部启动之前加载外部启动加载程序。 现在,您的计算机应首先从USB启动,然后从内部硬盘启动(如果未找到启动加载程序)。