Arch-Linux

使 Linux 可從筆記型電腦 SD 卡啟動,在 BIOS/UEFI 啟動選項菜單中不可見

  • June 13, 2021

我有一台 Acer Aspire R15 筆記型電腦,我需要從內部 SD 卡插槽執行 Linux。Boot Options 菜單中沒有可用的 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卡可達,並在 SD 卡上鍊式載入全功能核心、initram 等?或者有沒有更好的其他方法?最好通過 GRUB/efibootmgr/other_bootloader 執行此操作(而不是執行容易出錯且需要手動支持系統更新的低級操作)。重新分區主 SSD,或使用 USB SD 適配器,或任何類似的,不是一個選項。

更新:

**解決方案:**根據@alex-stragies 的建議,我通過在 Windows 分區上設置*引導文件夾來使其工作。*整個順序如下:

  1. 將 EFI 分區掛載到*/efi*文件夾;
  2. 安裝ntfs-3g包以獲得ntfs支持,將 Windows 分區掛載到*/mnt/Windows/* :mount /dev/sdxY /mnt/Windows並在其上創建引導目錄: mkdir /mnt/Windows/boot;
  3. 將創建的文件夾綁定到啟動mount --bind /mnt/Windows/boot /boot
  4. (可選,但推薦;僅系統/核心更新需要)將以上內容添加到*/etc/fstab以保持持久性,應該至少有 4 個掛載記錄://efi*,/mnt/Windows/boot(後者綁定到先前掛載的*/mnt/Windows上的**引導文件夾,將綁定*添加到其掛載選項);
  5. 編輯*/etc/mkinitcpio.conf的“HOOKS”部分,在**udev之後和文件系統之前有掛鉤(上面提到的核心模組被證明是不必要的,SD/MMC 卡支持是由塊*掛鉤添加的),然後 make initrd 更新:;mkinitcpio -p linux
  6. 向 UEFI 製作 GRUB 記錄:grub-install --target=x86_64-efi --efi-directory /efi --boot-directory /boot --bootloader-id=LINUX-SD
  7. 更新 GRUB 配置:grub-mkconfig -o /boot/grub/grub.cfg;
  8. 重新啟動並選擇添加的 LINUX-SD 啟動選項(通常是 F8 或 F12,或通過 BIOS/UEFI;可能需要明確的啟動記錄確認)。

應該是這樣的。引導鏈如下: UEFI shell 在 EFI 分區上執行 grubx64.efi 二進製文件,它通過引導文件夾指向 Windows 分區的連結,GRUB 載入帶有核心的initrd環境(此時啟用 SD 卡支持),SD 卡上的 /(根)分區被掛載,之後通常的引導過程繼續進行。

將 RootFS 放在不可啟動儲存上的標準解決方法是將/boot文件夾放在 SSD 上的某個位置。那不是“直接從 SD 卡啟動”,而是“從 SSD 載入核心+InitRD,然後從 SD 卡安裝 Root 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 分區中的剩餘空間。

引用自:https://unix.stackexchange.com/questions/653170