我有一台旧笔记本电脑,有内置 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 视为其引导分区。
这又产生了两个问题:
如何告诉 grub 配置 SD 卡的启动文件夹在哪里?可以在grub.cfg中指定吗?我已将 /dev/mmcblk0p1 分区中的所有文件复制到 USB 闪存盘上的 /boot/bootsd 中。
如何将 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
但这只是第一步。
为了让您的系统也更新当需要时,您的内核和/或引导加载程序,您应该安排/boot
USB 记忆棒的目录自动安装/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.cfg
USB 记忆棒上的文件移到一边并用生成的文件替换它。如果它有效,您的系统现在应该能够在使用“从 USB 启动,SD 上的根文件系统”方案时进行内核更新。这应该是进行必要改变的最保守(风险最小)的方法。
或者,一旦使用 SD 作为根文件系统引导系统,您只需将内核和 initramfs 文件从当前/boot
目录复制到 USB 记忆棒的根目录,将其挂载为/boot
,然后使用以下命令在 USB 记忆棒上重新安装 GRUB grub-install
。它应该在新的 grub.cfg 文件(现在位于 USB 记忆棒文件系统的根目录中)中自动生成各种路径以匹配新情况。您可能还想用来update-initramfs -u
更新 initramfs 文件,以确保它与新配置匹配。测试完成后,您可以删除/boot/boot
USB 安装的其他剩余子目录。与最保守的方法相比,此方法会产生更干净的配置,但如果将 GRUB 重新安装到 USB 不成功,则存在引导失败的风险。
关于你的编辑2:
- 如何告诉 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
以刷新配置文件位于标准位置。
- 如何将 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 闪存盘上。
然后继续并让安装程序完成工作。