原生 Linux 可启动拇指驱动器,第一个分区为 fat32

原生 Linux 可启动拇指驱动器,第一个分区为 fat32

我已经尝试这样做了很长时间,感觉我已经用尽了所有办法。我想对闪存驱动器进行类似这样的分区:

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         2930687   1.4 GiB     0700  Microsoft basic data
   2         2930688        31709183   13.7 GiB    8300  Linux filesystem

第一个分区是 fat32(可通过 windows 读取),第二个分区有本地安装的 linux(不关心哪个发行版/fs)。问题是我试图在 HP 服务器上启动这个拇指驱动器,而 HP 服务器显然无法启动任何拇指驱动器。我认为它必须基于 DOS。我尝试使用 grub 启动到 linux 分区,它在不同的机器上运行良好,但在 HP 机器上,它会发出这样的抱怨:

Attempting to Boot from USB DriveKey (C:)
GRUB loading.
Welcome to GRUB!

error: out of disk
Entering rescue mode...
grub rescue>

不幸的是,这台机器的 BIOS 中没有拇指驱动器/硬盘驱动器/启动选项。因为 grub 似乎“不行”,所以我想尝试使用 syslinux,但 syslinux 似乎不支持启动到不同的分区。我发现使用 syslinux 和 memdisk 在 fat32 分区上启动 ISO 在 HP 上工作正常(就像 LIVE iso)但我需要能够在 linux 安装中自定义某些内容 - 比如挂载 fat32 分区并在启动完成时执行脚本。

答案1

这是一个老话题,但我理解你的痛苦。我经历过很多,负载尝试使用 GRUB 执行此操作时遇到的问题,并且遇到过与您类似的情况,各种机器的行为有所不同,这取决于如何枚举存储并将其传递给 grub。

您可能遇到的问题(如果与我遇到的问题相同!)是第 2 阶段与 /boot 中的内核一起安装在第二个 Linux 分区上,而第 1 阶段加载时找不到第 2 阶段。

我最终设法通过在 chroot 中捣鼓来击败 GRUB,这很可恶,主要是因为从 BIOS 传入的磁盘设备枚举(大量手动 grub.cfg 编辑)。一个更简单的解决方案是使用 extlinux。以下是流程:

  1. 使用 MBR 对闪存驱动器进行分区,第一个分区约为 1GB,第二个分区为其余部分...
  2. 确保在第一个分区上设置了启动标志
  3. 使用 FAT32 和其他格式格式化分区(我使用 BTRFS)
  4. 在引导扇区上安装 extlinux,dd if=/usr/share/extlinux/mbr.bin of=/dev/sdb bs=440 count=1 conv=sync(如果我没记错的话,debian 使用/usr/lib/syslinus/mbr/mbr.bin
  5. 挂载 FAT32 分区(例如 /media/disk)并执行extlinux --install /media/disk
  6. 跨 extlinux 库进行复制,cp /usr/share/extlinux/{libcom32.c32,libutil.c32,menu.c32} /media/disk
  7. 将合适的内核 / initramfs 复制到 /media/disk
  8. 将您首选的 Linux 根文件系统提取到另一个分区(如果使用 BTRFS,则提取到子卷),然后编辑/etc/fstab以将您的 FAT32 分区挂载到 /boot
  9. 创建/media/disk/extlinux.conf,我的看起来像这样配置文件

然后尝试启动 - 你应该已经离开了!以下是我遇到的一些困难的笔记:

  • BTRFS 需要在引导加载程序中使用 PARTUUID,你似乎无法使用分区的基本 UUID;不知道为什么
  • 因为我们使用的是 MBR,所以这个过程不能与 UEFI 一起使用;需要 UEFI CSM
  • 我从来不需要用,altmbr.bin但 YMMV
  • 我使用 ext4 作为第一个分区,但它应该与 FAT32 配合使用

在第一个分区上拥有整个引导程序、内核和 initramfs 使这一切变得轻而易举,而且我还没有看到它因任何原因失败。我围绕它构建了嵌入式 x86 系统,它似乎是完全无懈可击的。

相关内容