我有一台 Acer Aspire R15 笔记本电脑,我需要从内部 SD 卡插槽运行 Linux。启动选项菜单中没有可用的 SD 卡选项。
我在主 SSD 上安装了 Windows 10,具有约 100MB EFI 分区(49MB 可用空间)。我已经在 SD 卡上安装了 Arch Linux,chroot 到其中,将 EFI 分区挂载为 /efi (将 /boot 留在 SD 卡上),添加了 UEFI 记录grub-install --target=x86_64-efi --efi-directory /efi --boot-directory /boot --bootloader-id=ARCH-SD
,但问题是早期启动时无法访问 SD 卡插槽阶段,因此 GRUB 无法到达 /boot 来加载内核和 initram。我知道我需要安装带有“mmc_core mmc_block sdhci sdhci-pci”模块的内核(通过编辑 /etc/mkinitcpio.conf 并MODULES="mmc_core mmc_block sdhci sdhci-pci"
运行mkinitcpio -p linux
),并且我可以将 EFI 分区安装到 /boot 以便在早期可以访问它阶段,EFI 分区可用空间不会那么稀疏吗?
所以,问题是:有没有办法在 EFI 分区上设置 .efi 二进制文件,使其嵌入安装了 SD 卡模块的最小内核(磁盘空间使用情况是关键),其唯一目的是使 SD卡可访问,并将全功能内核、initram 等链接加载到 SD 卡上?或者还有其他更好的办法吗?首选通过 GRUB/efibootmgr/other_bootloader 来执行此操作(而不是执行容易出错且需要手动支持系统更新的较低级别的操作)。无法对主 SSD 重新分区,或者使用 USB SD 适配器,或者任何类似的东西。
更新:
解决方案:根据 @alex-stragies 的建议,我通过设置启动Windows 分区上的文件夹。整个顺序如下:
- 将EFI分区挂载到/efi文件夹;
- 安装NTFS-3G包用于ntfs支持,挂载Windows分区到/mnt/Windows/:
mount /dev/sdxY /mnt/Windows
和做启动其目录:mkdir /mnt/Windows/boot
; - 将创建的文件夹绑定到启动:
mount --bind /mnt/Windows/boot /boot
; - (可选,但推荐;仅系统/内核更新需要)将以上内容添加到/etc/fstab为了持久化,至少应该有4条挂载记录:/,/efi,/mnt/Windows,/启动(后者绑定到启动之前安装的文件夹/mnt/Windows, 添加绑定其安装选项);
- 编辑/etc/mkinitcpio.conf,“HOOKS”部分,有堵塞钩子紧随其后乌德夫和之前文件系统(上面提到的内核模块是不必要的,SD/MMC 卡支持是由堵塞hook),然后进行 initrd 更新:
mkinitcpio -p linux
; - 将 GRUB 记录写入 UEFI
grub-install --target=x86_64-efi --efi-directory /efi --boot-directory /boot --bootloader-id=LINUX-SD
:; - 更新 GRUB 配置:
grub-mkconfig -o /boot/grub/grub.cfg
; - 重新启动并选择添加的 LINUX-SD 启动选项(通常为 F8 或 F12,或通过 BIOS/UEFI;可能需要明确的启动记录确认)。
应该是这样。引导链如下:UEFI shell 在 EFI 分区上执行 grubx64.efi 二进制文件,它通过以下链接跟踪到 Windows 分区启动文件夹,GRUB 加载初始化程序环境与内核(此时启用 SD 卡支持),安装 SD 卡上的 /(根)分区,然后继续通常的引导过程。
答案1
将 RootFS 放在不可启动存储上的标准解决方法是将/boot
文件夹放置在 SSD 上的某个位置。这不会“直接从 SD 卡启动”,而是“从 SSD 加载内核+InitRD,然后从 SD 卡挂载根 FS”。
您可以将该/boot/
文件夹放置在 Windows 分区中(“原始”分区)或 200MiB 环回安装的文件系统映像中。
不能代表 Arch,但在 Debian 上,这些步骤应该可以做到:
- 添加 FSTAB 条目以自动挂载 Windows 分区
mv /boot /mnt/windows/MyLinuxBoot
ln -s /mnt/windows/MyLinuxBoot /boot
update-grub
类似的步骤应该适用于 Arch。
这应该从 SSD 加载 kernel+initrd,然后 initrd 具有 SD 卡的驱动程序以从 SD 卡加载根 FS。
或者您可以尝试将其全部放入 EFI 分区中:
- 将 /boot/grub 文件夹移动到 /boot/efi/grub
- 符号链接 /boot/grub 回到 /boot/efi/grub
- 将内核和 initrd 从 /boot 移至 /boot/efi/
- 将它们都符号链接回其原始位置和名称
- 跑步
update-grub
您可能需要调整 initrd 创建的参数,以免包含所有模块,这样您就可以将所有内容放入 EFI 分区的剩余空间中。
答案2
我添加第二个答案,这是对你的问题的更直接的答案,而不是只是像我的其他答案一样的解决方法。不过,这个细节很少,更多的是一个“粗略的旅行计划”而不是“如何做”:
您还可以使用中间引导加载程序:
- 下载/编译引导加载程序支持 sdhci-pci
- 在 EFI 分区中安装此引导加载程序
- 配置此中间引导加载程序以链式加载 grub 或直接从 SD 卡加载内核。
答案3
如果可以在 SDCARD 上安装 Linux。然后在存储选择步骤中,只需在 SSD 上选择一个小的 Fat32/ext4 分区作为 /boot。就这样。不要让事情看起来更复杂。