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 中的相關程式碼:
引導到 U 盤:
### 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 config 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 更新,但假設它會工作。
GRUB 使用系統韌體常式(即您的情況下的 BIOS)進行所有磁碟 I/O 操作,因此如果 BIOS 無法讀取 SD 卡,GRUB 也無法讀取。
GRUB 的工作是將 Linux 核心和 initramfs 文件載入到 RAM,然後將控制權轉移到 Linux 核心。至此,GRUB 的工作就完成了,它不會參與任何進一步的操作。在那之後的一切都由 Linux 核心完成,並且任何驅動程序和工具都包含在 initramfs 文件中。
因此,如果 U 盤上的 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 卡的系統上一樣。由於 U 盤上已經有一個 /boot 目錄,您可能需要配置/etc/fstab
以將 U 盤掛載到其他位置,並創建/boot
一個指向/wherever_the_USB_is_mounted/boot
.然後執行
grub-mkconfig -o /tmp/test-grub.cfg
以在 /tmp/ 中自動生成一個虛擬測試 grub.cfg 文件,將其與 USB 記憶棒上的活動文件進行比較,並驗證結果對於 USB 記憶棒而言是否有意義。要進行測試,您可以將grub.cfg
U 盤上的文件移到一邊,並用生成的文件替換它。如果它有效,您的系統現在應該能夠在使用“從 USB 啟動,SD 上的根文件系統”方案時進行核心更新。這應該是進行必要更改的最保守(最小風險)的方式。或者,一旦您使用 SD 作為根文件系統啟動系統,您可以將核心和 initramfs 文件從目前
/boot
目錄複製到 U 盤的根目錄,將其掛載為/boot
,然後在 U 盤上重新安裝 GRUB 使用grub-install
. 它應該在新的 grub.cfg 文件(現在位於 U 盤文件系統的根目錄中)中自動生成各種路徑以匹配新情況。您可能還想使用update-initramfs -u
更新您的 initramfs 文件,以確保它與新配置匹配。測試後,您可以刪除/boot/boot
以及基於 USB 的安裝的其他剩餘子目錄。這種方法比最保守的方法配置更簡潔,但如果將 GRUB 重新安裝到 USB 不成功,則存在啟動失敗的風險。關於您的編輯 2:
- 如何告訴 grub config 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
.然後,您可以將 SD 文件系統上的目前
/boot
目錄移到一邊,並用符號連結替換它: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 將哪個文件系統用作根文件系統。