Linux

應該如何配置帶有 grub 的雙引導?

  • November 7, 2021

我看過一些說明,但我真的很想了解整個啟動過程。我在一個驅動器上安裝了 debian,該驅動器有一個作業系統分區和另一個使用者分區。它還自動創建引導和交換分區。然後,使用 gparted,我創建了一個複製原始 debian 分區的新分區。我給了它一個新的 UUID。我更新了 grup 選項。

當我啟動時,我進入 grub 選項,我看到兩個版本的 os. 我專門選擇了新分區上的作業系統。但是當它啟動並且我檢查終端時,我看到 / 是從而/dev/nvme0n1p2不是安裝的/dev/nvme0n1p5

這就是我感到困惑的地方: /dev/nvme0n1p1掛載到/boot/efi/boot/efi/EFI/debian/grub.cfg有一個配置文件:

search.fs_uuid FIRST-DRIVE-UUID root 
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg

這對我來說基本上意味著它將安裝第一次安裝,然後從第一次安裝中載入 grub.cfg。現在它已經將第一個安裝安裝為 root,但是要執行第二個安裝,它顯然需要將第二個驅動器安裝為 root。所以看起來它是從第一次安裝中載入grub,而不是在安裝第一次安裝之前載入grub?

有一個 grub 配置文件引用了兩個安裝/boot/grub/grub.cfg,但這是第一個安裝分區的一部分。似乎一旦讀取了這個文件,第一次安裝就已經載入了,現在選擇從哪個分區啟動已經太晚了。該文件以

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub

這個配置是否需要以某種方式移動到引導分區?

當我執行 update-grub 或 grub-mkconfig (v2.04-20) 我得到這個輸出:

$ sudo grub-mkconfig -o grub.cfg 
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-5.10.0-9-amd64
Found initrd image: /boot/initrd.img-5.10.0-9-amd64
Found linux image: /boot/vmlinuz-5.10.0-8-amd64
Found initrd image: /boot/initrd.img-5.10.0-8-amd64
Found Debian GNU/Linux 11 (bullseye) on /dev/nvme0n1p5
Adding boot menu entry for EFI firmware configuration
done

這似乎在第一次安裝時引用了 initrd 和 vmlinuz。第二次安裝剛剛得到found

“掛載文件系統”是一個 Linux/Unix 概念:它在 GRUB 中並不存在。

為 GRUB指定$prefixor$root並不像在 Linux/Unix 中掛載文件系統。它們分別只是相對或絕對路徑名的前綴。

$prefix``/boot/grub當 GRUB 載入任何 GRUB 模組時使用它,它也可以用作一個方便的變數,以通過絕對 GRUB 路徑名引用目錄中的任何文件(最終將在作業系統啟動後) 。使用 GRUBinsmod命令時,它採用 的值$prefix,並添加特定於體系結構的目錄名稱和要載入的模組的名稱(.mod添加後綴)。

GRUB 有自己的(只讀)文件系統驅動程序,它們接受形式(分區)/目錄…/文件名的絕對路徑名,其中分區組件可以是hd0,gpt1.

$root可以在單個 GRUB 配置文件中多次分配和重新分配;在現代配置中,該search命令通常用於它而不是顯式分配,以允許通過其 UUID 指定文件系統。

在 Debian 9 系統上(使用 BIOS 樣式引導)我曾經看到一個 GRUB 配置,它最初設置$root$prefix載入一些 GRUB 模組,然後指向$root一個單獨的/usr分區以便從 GRUB 主題目錄載入背景圖像和字型檔某處/usr/share/...。對於實際的引導選項,它然後指向$root文件/boot系統以載入實際核心,或指向 Windows 分區以鍊式載入其分區引導記錄。

GRUB$root與 Linux 根文件系統無關。一旦 GRUB 將 Linux 核心和 initramfs 文件載入到 RAM 中,它將把控制權交給核心。那時,GRUB 中只有三樣東西會被保留:

  • RAM 中的核心
  • 核心後 RAM 中的 initramfs
  • 在核心命令行上指定的引導選項。

所有的 GRUB 變數,包括$root$prefix,此時都被完全遺忘,不再具有任何意義。當核心啟動時,它會啟動自己的儲存設備驅動程序,將作為 Linux 根文件系統掛載的文件系統由以下因素決定:

  • root=核心引導選項,如果指定了,或者
  • initramfs 文件的內容(它可能包括/etc/fstab指定根文件系統的副本,或確定要以其他方式使用的文件系統的腳本),或
  • 預設根文件系統可以由核心映像中內置的參數指定(尤其是在使用沒有 initramfs 的自定義核心時)。

UEFI 版本的 GRUB 通常grub.cfg grubx64.efi. 該Debian 實例的grub.cfg´ you found in 三行 /boot/efi/EFI/debian/grub.cfg effectively tells GRUB where the actual GRUB configuration file (and the/boot/grub directory) is, by filesystem UUID. If you wanted, you could replace the UUID with the UUID of the/dev/nvme0n1p5 filesystem, to make GRUB use the/boot` 而不是第一次安裝。


如果您os-prober在 Debian 中安裝了該軟體包,它會在您執行時自動執行update-grub,並會嘗試自動檢測其他作業系統,包括 Debian 的並行安裝,並將它們的主要引導選項添加到 GRUB 配置文件中。

您還可以將這樣的菜單項添加到您的/etc/grub.d/40_customon nvme0n1p2

menuentry 'Switch to GRUB configuration of /dev/nvme0n1p5' {
       search --no-floppy --fs-uuid --set=root UUID-OF-nvme0n1p5-FS-HERE
       configfile /boot/grub/grub.cfg
}

並類似地/etc/grub.d/40_custom切換nvme0n1p5nvme0n1p2. 請記住執行update-grub以使更改生效。

然後您可以根據您希望 GRUB 預設使用的配置來設置search.fs_uuid行 in /boot/efi/EFI/debian/grub.cfg(即 in )。nvme0n1p1只要 Debian 的兩個實例繼續使用足夠相似的 GRUB 版本來接受相同的配置文件,您就可以輕鬆地在兩個作業系統實例之間切換,並且它們都可以獨立維護自己的 GRUB 配置文件彼此。

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