如何将引导加载程序从硬盘驱动器移动到 U 盘

如何将引导加载程序从硬盘驱动器移动到 U 盘

我决定将 Debian 引导加载程序/boot从硬盘驱动器移至 U 盘。我正在使用 LUKS 来加密/解密我的硬盘驱动器,引导加载程序是唯一未加密的分区。

我怎样才能轻松做到这一点?我想将其从硬盘驱动器中删除,调整任何分区(//var/tmp)的大小,以在删除后获得可用空间/boot并将新的引导加载程序放在 USB 记忆棒上。使用的引导加载程序是 GRUB /dev/sda1

答案1

拧紧grub。它可能引入了一些复杂性,使您相信这是一个难以解决的问题。如果您的计算机使用时间不到 5 年左右,那么您可能会从 UEFI 固件启动,在这种情况下,您的 Debian 构建的 Linux 内核已经是引导加载程序了。

  1. 对磁盘进行分区:

    printf %c\\n o y n 1 '' '' ef00 w y |
    gdisk /dev/usb-stick/or-whatever-path    
    
    • 这是您想要以交互方式提供给程序的选项的脚本快捷方式。它将创建一个 GUID 分区表和一个类型为EFI系统跨越整个磁盘。

    • 不过,该gdisk程序很容易使用 - 因此您最好以交互方式进行操作。运行时不应安装目标磁盘,并且您可能需要 root 权限才能w写入更改。作为一般规则,您可以在该程序中做几乎任何您想做的事情,在您w编写之前不会产生任何影响 - 所以请确保您执行时。

  2. 将棒格式化为 fat32:

    mkfs.vfat -nLABEL /dev/usb-stick/or-whatever-path
    
    • 标签是你想要的任何东西。你应该标签 全部在我看来,磁盘。
  3. 如果需要,安装启动菜单管理器。我喜欢酶标仪:

    dpkg -i refind_0.8.7-1_amd64.deb
    
    • 这可能不会自动安装到 USB,所以之后您可能想做...

      /path/to/refinds/install/dir/install.sh  --usedefault /dev/usbstick
      
    • 如果您使用 rEFInd,您将需要在之后执行类似的操作:

      mount /dev/usbstick /mnt
      mkdir -p /mnt/EFI/debian /esp
      cp -ar /boot/* /mnt/EFI/debian
      cat <<\TWONEWLINES >>/etc/fstab
          LABEL=LABEL      /esp  vfat  defaults      0 2
          /esp/EFI/debian  /boot none  bind,defaults 0 0
      TWONEWLINES
      cat <<\ONESIMPLECONFIG >/mnt/EFI/debian/refind_linux.conf
          "Debian Menu Entry" root=LABEL=rootlabel other_kernel_params
      ONESIMPLECONFIG
      
    • 但您可以跳过 rEFInd 并仅使用固件的启动菜单:

       efibootmgr -c -d /dev/rootdevice       \
                  -p 1 -L "Debian"            \
                  -l '\EFI\debian\kernelfile' \
                  -u root=/dev/sda3 kparams   \
                  initrd=EFI/debian/initramfs_image_file
      

差不多就是这样了。几乎永远 - 不再大惊小怪。固件从您在 U 盘上格式化的 EFI 系统分区加载内核。内核将其初始根加载到 initramfs 文件中。如果您已经成功启动 LUKS,那么您一定已经安排它以某种方式访问​​其密钥 - 您的密钥可能已经在 initramfs 映像中。如果没有,那么您需要将其放入其中或 USB 上。

启动分区是一个在 UEFI 系统上 - 完全不需要围绕嵌入引导加载程序和 MBR 等所有旧式的肮脏行为。您只需从固件安装启动,加载内核可执行文件,然后继续您的快乐之路。

这些fstab东西只是--bind在您的 USB 记忆棒上安装一个目录/boot- 因此所有内核更新都会像往常一样发生。不过,如果你喜欢自己,你会grub完全卸载。它神秘的更新过程——一堆在邪恶链中读取和/或生成其他脚本的脚本——有点荒谬,而且是你可以轻松避免的噩梦。

不过,如果您接受我的建议,您将使用 rEFInd。它有漂亮的菜单,你永远不必担心它 -install.sh上面脚本的效果可以很容易地重现(并且大部分在上面)只需一个cp命令。它只是/EFI/BOOTEFI 系统分区上调用的静态目录,其中包含一个小的 EFI 可执行文件,告诉固件在哪里可以找到内核。这核心是实际的引导加载程序 - 正如它应该的那样。

通过上面的设置,您可以启动任意数量的 EFI 可执行文件 - 只需将它们放入/boot (或者无论他们的启动分区是什么)USB 记忆棒上/EFI某处的内容,rEFInd 可能会自动找到它们,并将它们作为固件菜单中的选项提供给您 - 包括 Microsoft 系统。永远。

答案2

对于初学者来说,你可以

  • 分区、格式化并挂载 U 盘
  • 将旧文件中的所有文件复制/boot到 USB 记忆棒
  • 更改您的/etc/fstab,使 USB 记忆棒文件系统成为新的/boot
  • umount /bootmount /boot使其正式化
  • 在棒上安装引导加载程序(grub-install /dev/sdx或其他)
  • 重启看看是否有效

至于将旧的空间回收/boot到已经加密的系统中。根据旧启动分区的大小,这可能不值得,因为它可能涉及移动所有其他数据(或额外的 LUKS 容器以及使用其中几个容器带来的所有复杂性)。如果您还没有其中之一,您可以将其用作加密交换分区。

相关内容