使用 GRUB 在多引導系統上安裝 NixOS(來自 Arch 安裝)
我有一個物理磁碟(
/dev/sda
),它被分成/dev/sda1
(這是使用的/boot
可引導 GRUB2 分區並使用 Arch 設置),/dev/sda2
這是我的,當解鎖時,它是一個具有完整大小的分區cryptroot
的單個大磁碟。我已經在 3 上安裝了 Arch ,如下圖所示。此設置基本上是 LUKS 上的 LVM,如 Dm-crypt 上的 Arch Wiki 中所述。lvmpool``/dev/sda2``lvs
因為我閱讀了很多關於 NixOS 的好東西,我試圖在我目前的 Arch 安裝旁邊安裝 NixOS,所以我創建了 3 個與上麵
lvs
類似的arch-
lvs
東西,並且我遵循了 NixOS 安裝指南。我已指定boot.loader.grub.device = "nodev"
NixOS 不會在其他任何地方安裝 GRUB,因為我想重新使用 Arch 中現有的 GRUB2,該 GRUB2 位於/dev/sda1
. 但是,它將為 NixOS 寫入一個grub.cfg
文件/boot/grub/grub.cfg
,在這種情況下,該文件位於 NixOSnix-root
lv
( NixOS/
中的文件系統根目錄)上,因此不在實際(可引導)GRUB2 分區/dev/sda1
上。但是,為了實現這一點,我想在 my 中添加一個額外的菜單項,
grub.cfg
並指向configfile
NixOS 安裝程序在我的nix-root
lv
(/
NixOS 中的文件系統根目錄)上創建的菜單項,幾乎就是這裡描述的內容。但是,我不確定如何創建一個指向 的條目nix-root
lv
,因為 GRUB 似乎需要一些類似的語法set root='(hd0,X)'
,但是我怎樣才能讓這樣set root
的東西知道我lv
指向而不是指向物理磁碟和分區號?這兩個選項在 GRUBconfigfile
中chainloader
都沒有得到很好的描述,而且set root
我也沒有找到。我希望有人能指出我正確的方向,告訴我我做錯了什麼或為什麼/如何讓這對自己來說太難了,只需將一個可引導的 GRUB2 分區用於駐留
lvs
在 LUKS 上不同 LVM 上的多個 Linux 發行版.編輯: 我嘗試了各種選項,
set root=
例如(lv/nix-root)
,(lvmpool/nix-root)
和(/dev/mapper/lvmpool-nix--root)
,但是問題是 LVMlvs
似乎對 GRUB 不可見,因為在 GRUB 載入時,/dev/sda2/
它仍然是加密的 LUKScryptroot
。
借助 Alexander Batischev 的上述幫助,以及Reddit 使用者在Reddit 頁面上提供的一些非常有用的資訊,我設法完成了這項工作。
cookie_enthusiast
/r/linuxquestions
事實證明,GRUB2 與 UUID 配合得很好,而與設備名稱配合得不太好。考慮到這些知識,我們需要以下 4 個 UUID,然後才能(手動)為我們的 NixOS 創建一個額外的 GRUB 菜單項
grub.cfg
configfile
:
- LUKS 設備的 UUID。
- LVM 卷組的 UUID。
- LVM 邏輯卷的 UUID。
grub.cfg
包含我們要通過configfile
GRUB2 中的指令載入的文件的文件系統的 UUID 。我將在這裡列出如何獲取這四個 UUID:
- 在我的情況下,執行
cryptsetup luksUUID /dev/sda2
並刪除UUID 中的****所有破折號 (-
) 。a0cb535a-8468-485f-a220-a5f49e85c9f4``a0cb535a8468485fa220a5f49e85c9f4
- 在我的情況下,執行
vgdisplay
並查找帶有 UUID的 ,。VG UUID``lvmpool``5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT
- 執行
lvdisplay
並查找LV UUID
包含您的grub.cfg
文件的 LV 名稱或 LV 路徑,nix-root
或者在我的情況下/dev/lvmpool/nix-root
使用 UUID 。C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj
- 執行
lsblk -p -o +UUID
並查找包含您的grub.cfg
文件的設備路徑的/dev/mapper/lvmpool-nix--root
UUIDcc6a06bb-336f-4e9f-a5f0-fdd43e7f548f
,在我的例子中是 UUID。這將允許您創建以下額外的 GRUB 菜單項來引用我們的 NixOS
grub.cfg
configfile
,它在我的nix-root
lv
並且因為boot.loader.grub.device = "nodev";
在/etc/nixos/configuration.nix
我的 NixOS 安裝中沒有安裝 GRUB(在 Arch 中,這將進入/etc/grub.d/40_custom
):menuentry 'NixOS' { insmod crypto insmod cryptodisk insmod luks insmod lvm cryptomount -u a0cb535a8468485fa220a5f49e85c9f4 set root='lvmid/5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT/C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj' search --fs-uuid --set=root cc6a06bb-336f-4e9f-a5f0-fdd43e7f548f configfile '/boot/grub/grub.cfg' }
為了更清楚地說明這一點,它包含一些文字值,例如不應
lvmid
將其替換為 LVM 的名稱或 ID。這似乎沒有在任何地方正確記錄。當您將 LUKS 設備的 UUID 與破折號放在一起時,同樣的問題也適用,GRUB只會告訴您,這(顯然)不是很有幫助。cryptomount -u``Press any key to continue
因此,使用LUKS 設置上
crypt -> LVM -> root
的LVM啟動的手動 GRUB 菜單項的裸模板將是:menuentry 'NixOS' { insmod crypto insmod cryptodisk insmod luks insmod lvm cryptomount -u <LUKS UUID without dashes> set root='lvmid/<LVM Volume Group UUID>/<LVM Logical Volume UUID>' search --fs-uuid --set=root <Filesystem UUID> configfile '/boot/grub/grub.cfg' }
對於那些也對另一半感興趣的人,我
/etc/nixos/configuration.nix
將文件修改為如下所示:boot.loader.grub.enable = true; boot.loader.grub.version = 2; boot.loader.grub.device = "nodev"; boot.initrd.luks.devices = [ { name = "cryptroot"; device = "/dev/sda2"; preLVM = true; } ];