Grub:使用 USB 盘启动,然后继续从 SD 卡启动?

Grub:使用 USB 盘启动,然后继续从 SD 卡启动?

我有一台旧笔记本电脑,有内置 SD 读卡器,但启动时不可用。

然而,我可以从一个小的 8GB USB 闪存盘 (USB 2.0) grub 启动 linux (Debian),但速度非常慢。 SD 卡速度要快得多,并且必须位于不同的接口上。

我无法从 grub 访问 SD 卡,但想知道是否可以从 USB 闪存盘加载 Debian 内核和/或 vmlinuz,然后在将 SD 卡的驱动程序加载到内核中后继续从 SD 卡启动或者initramfs?

我很犹豫是否要弄乱 grub 配置文件,因为它明确表示不要编辑,但似乎您可以为 kernel/vmlinuz 和 initramfs 指定不同的磁盘;我只是不确定如何执行此操作,以及从 USB 闪存盘加载其中任何一个是否会启动 SD 卡?

以下是 U 盘上 /boot/grub.cfg 中的相关代码:

要启动到 USB 记忆棒:

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
    set gfxpayload="${1}"
}
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-aaaa-aaaa-a’ {
    load_video
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd2,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd2,msdos1 --hint-efi=hd2,msdos1 --hint-baremetal=ahci2,msdos1  aaaa-aaaa-a
    else
      search --no-floppy --fs-uuid --set=root aaaa-aaaa-a
    fi
    echo    'Loading Linux 4.19.0-6-amd64 ...'
    linux   /boot/vmlinuz-4.19.0-6-amd64 root=UUID=aaaa-aaaa-a ro  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/initrd.img-4.19.0-6-amd64
}

启动至 SD/MMC 卡:

### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Debian GNU/Linux 10 (buster) (on /dev/mmcblk0p1)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-XXXX-XXXX-X’ {
    insmod part_msdos
    insmod ext2
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root  XXXX-XXXX-X
    else
      search --no-floppy --fs-uuid --set=root XXXX-XXXX-X
    fi
    linux /vmlinuz root=/dev/mmcblk0p1
    initrd /initrd.img
}

认为一定有办法将它们结合起来吗?

我用它来启动SD卡。

我已经使用 LVM 分区设置了 SD 卡,因此必须将 lvm2 安装到 USB 闪存盘上,因为它仅设置为基本 MBR 分区。

我补充道:

insmod lvm
insmod ext2

到:

### BEGIN /etc/grub.d/05_debian_theme ###

和:

root=/dev/mapper/debian--vg-root

到适当的菜单项。

但是,由于 USB 和 SD 上的 initramfs 文件不同,因此并非所有内容都会在 SD 上启动时正确加载。

USB 安装是一个非常小的 shell 仅启动,而 SD 是带有桌面管理器等的完整安装。

我想做的是将两者分开,并且仍然能够使用各自的 initramfs 文件启动它们。我可以对 USB 卡执行此操作,并为 SD 卡启动一个单独的条目,但它使用最小的 USB initramfs 文件。

SD 卡将 /dev/mmcblk0p1 视为其引导分区。

这又产生了两个问题:

  1. 如何告诉 grub 配置 SD 卡的启动文件夹在哪里?可以在grub.cfg中指定吗?我已将 /dev/mmcblk0p1 分区中的所有文件复制到 USB 闪存盘上的 /boot/bootsd 中。

  2. 如何将 USB 文件夹 /boot/bootsd 设置为 SD 卡的 /boot?使用 fstab 和符号链接?

编辑3:

我想我已经弄清楚了——我只是改变了:

initrd /initrd.img

到:

initrd /bootsd/initrd.img

然后,我使用 UUID 在 SD 卡上为 USB sdc1 创建了一个 fstab 条目。然后在 SD 系统上创建从 /media/usbboot/boot/bootsd 到 /boot 的 ln 别名。

我还没有配置非免费 wifi,所以还没有完成 apt-get 更新,但假设它会工作。

答案1

GRUB 使用系统固件例程(即您的情况下的 BIOS)进行所有磁盘 I/O 操作,因此如果 BIOS 无法读取 SD 卡,GRUB 也将无法执行此操作。

GRUB的工作是将Linux内核和initramfs文件加载到RAM中,然后将控制权转移给Linux内核。到那时,GRUB 的工作就完成了,它不会参与任何进一步的操作。此后的所有事情都由 Linux 内核以及 initramfs 文件中包含的任何驱动程序和工具完成。

因此,如果 USB 记忆棒上的 initramfs 包含 SD 卡驱动程序,您所需要做的就是编辑root=此行的启动参数:

linux   /boot/vmlinuz-4.19.0-6-amd64 root=UUID=aaaa-aaaa-a ro  quiet

对此:

linux   /boot/vmlinuz-4.19.0-6-amd64 root=/dev/mmcblk0p1 ro  quiet

但这只是第一步。

为了让您的系统也更新当需要时,您的内核和/或引导加载程序,您应该安排/bootUSB 记忆棒的目录自动安装/boot在您主要基于 SD 卡的系统上。由于 USB 记忆棒上已经有一个 /boot 目录,您可能需要配置/etc/fstab将 USB 记忆棒安装到其他位置,并创建/boot一个指向 的符号链接/wherever_the_USB_is_mounted/boot

然后运行grub-mkconfig -o /tmp/test-grub.cfg在 /tmp/ 中自动生成一个虚拟测试 grub.cfg 文件,将其与 USB 记忆棒上的活动文件进行比较,并验证结果对于 USB 记忆棒而言是否有意义。要进行测试,您可以将grub.cfgUSB 记忆棒上的文件移到一边并用生成的文件替换它。如果它有效,您的系统现在应该能够在使用“从 USB 启动,SD 上的根文件系统”方案时进行内核更新。这应该是进行必要改变的最保守(风险最小)的方法。

或者,一旦使用 SD 作为根文件系统引导系统,您只需将内核和 initramfs 文件从当前/boot目录复制到 USB 记忆棒的根目录,将其挂载为/boot,然后使用以下命令在 USB 记忆棒上重新安装 GRUB grub-install。它应该在新的 grub.cfg 文件(现在位于 USB 记忆棒文件系统的根目录中)中自动生成各种路径以匹配新情况。您可能还想用来update-initramfs -u更新 initramfs 文件,以确保它与新配置匹配。测试完成后,您可以删除/boot/bootUSB 安装的其他剩余子目录。与最保守的方法相比,此方法会产生更干净的配置,但如果将 GRUB 重新安装到 USB 不成功,则存在引导失败的风险。

关于你的编辑2:

  1. 如何告诉 grub 配置 SD 卡的启动文件夹在哪里?可以在grub.cfg中指定吗?我已将 /dev/mmcblk0p1 分区中的所有文件复制到 USB 闪存盘上的 /boot/bootsd 中。

只是grub-mkconfig希望找到包含内核和 initramfs 文件的目录/boot。您的工作是安排事情以使正确的文件系统/目录存在。如果这样做,任何内核和 initramfs 更新都应该自动正确处理。

另一种解决方案是在/etc/grub.d/40_custom.然后您可以使用您想要的任何路径名 - 但您还必须自己更新它们,因为标准内核包将简单地将文件安装vmlinuz-<version>/boot,在同一目录中为其创建一个配套的 initramfs 文件,然后运行grub-mkconfig以刷新配置文件位于标准位置。

  1. 如何将 USB 文件夹 /boot/bootsd 设置为 SD 卡的 /boot?使用 fstab 和符号链接?

确切地。那里有额外的bootsd文件夹会使事情变得有些复杂,但它应该是可行的。一个fstab条目可能是这样的:

UUID=aaaa-aaaa-a /usbkey <filesystem type> defaults 0 2

这会将文件夹的非符号链接路径放置在/usbkey/boot/bootsd.

/boot然后你可以将SD 文件系统上的当前目录移到一边并用符号链接替换它:

mv /boot /boot.old
ln -s /usbkey/boot/bootsd /boot

set root=<something>请记住,当 GRUB 出于 GRUB 自身目的(或)谈论根文件系统时search ... --set=root ...,它仅表示 GRUB 将从中加载文件的任何文件系统的根目录。在启动时,GRUB 不会看到 Linux 的单个统一目录树:它基本上一次只查看一个文件系统。

对于 GRUB,该行root=的选项linux <somewhere>/vmlinuz-<version> root=...只是 Linux 内核的又一个引导选项 - 但对于内核和/或 initramfs 文件中的启动脚本,该选项指定 Linux 使用哪个文件系统作为根文件系统。

答案2

我的情况

上周,我在一台带有新的快速 nvme 卡的计算机中安装了 Xubuntu,但该计算机在启动时无法识别该卡。

Xubuntu 使用安装程序 Ubiquity,在安装过程中,在分区窗口中,我选择了“其他”,这意味着手动分区。

  • 我把根分区,/,到nvme卡上
  • 我把引导分区,/启动,到 SSD 上,启动时即可识别。

你的情况

我认为您可以使用当前的 Debian 安装程序执行非常类似的操作。我已经使用旧的文本模式 Debian 安装程序使用单独的启动分区和主分区进行了手动分区,如果新的安装程序无法做到这一点,您可能可以退回到旧的文本模式安装程序。

  • 放置根分区,/,到存储卡上(如果通过 PCI 连接,则视为mmcblk0其第一个分区mmcblk0p1)。
  • 放置启动分区,/启动,到 USB 闪存盘上。

然后继续并让安装程序完成工作。

相关内容