我已经尝试这样做了很长时间,感觉我已经用尽了所有办法。我想对闪存驱动器进行类似这样的分区:
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。以下是流程:
- 使用 MBR 对闪存驱动器进行分区,第一个分区约为 1GB,第二个分区为其余部分...
- 确保在第一个分区上设置了启动标志
- 使用 FAT32 和其他格式格式化分区(我使用 BTRFS)
- 在引导扇区上安装 extlinux,
dd if=/usr/share/extlinux/mbr.bin of=/dev/sdb bs=440 count=1 conv=sync
(如果我没记错的话,debian 使用/usr/lib/syslinus/mbr/mbr.bin
) - 挂载 FAT32 分区(例如 /media/disk)并执行
extlinux --install /media/disk
- 跨 extlinux 库进行复制,
cp /usr/share/extlinux/{libcom32.c32,libutil.c32,menu.c32} /media/disk
- 将合适的内核 / initramfs 复制到 /media/disk
- 将您首选的 Linux 根文件系统提取到另一个分区(如果使用 BTRFS,则提取到子卷),然后编辑
/etc/fstab
以将您的 FAT32 分区挂载到 /boot - 创建
/media/disk/extlinux.conf
,我的看起来像这样配置文件
然后尝试启动 - 你应该已经离开了!以下是我遇到的一些困难的笔记:
- BTRFS 需要在引导加载程序中使用 PARTUUID,你似乎无法使用分区的基本 UUID;不知道为什么
- 因为我们使用的是 MBR,所以这个过程不能与 UEFI 一起使用;需要 UEFI CSM
- 我从来不需要用,
altmbr.bin
但 YMMV - 我使用 ext4 作为第一个分区,但它应该与 FAT32 配合使用
在第一个分区上拥有整个引导程序、内核和 initramfs 使这一切变得轻而易举,而且我还没有看到它因任何原因失败。我围绕它构建了嵌入式 x86 系统,它似乎是完全无懈可击的。