Arch-Linux

使用 GRUB 在多引導系統上安裝 NixOS(來自 Arch 安裝)

  • May 18, 2016

我有一個物理磁碟(/dev/sda),它被分成/dev/sda1(這是使用的/boot可引導 GRUB2 分區並使用 Arch 設置),/dev/sda2這是我的,當解鎖時,它是一個具有完整大小的分區cryptroot的單個大磁碟。我已經在 3 上安裝了 Arch ,如下圖所示。此設置基本上是 LUKS 上的 LVM,如 Dm-crypt 上的 Arch Wiki 中所述。lvmpool``/dev/sda2``lvs

分區佈局和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,在這種情況下,該文件位於 NixOS nix-root lv( NixOS/中的文件系統根目錄)上,因此不在實際(可引導)GRUB2 分區/dev/sda1上。

但是,為了實現這一點,我想在 my 中添加一個額外的菜單項,grub.cfg並指向configfileNixOS 安裝程序在我的nix-root lv/NixOS 中的文件系統根目錄)上創建的菜單項,幾乎就是這裡描述的內容。但是,我不確定如何創建一個指向 的條目nix-root lv,因為 GRUB 似乎需要一些類似的語法set root='(hd0,X)',但是我怎樣才能讓這樣set root的東西知道我lv指向而不是指向物理磁碟和分區號?這兩個選項在 GRUBconfigfilechainloader都沒有得到很好的描述,而且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/它仍然是加密的 LUKS cryptroot

借助 Alexander Batischev 的上述幫助,以及Reddit 使用者在Reddit 頁面上提供的一些非常有用的資訊,我設法完成了這項工作。cookie_enthusiast/r/linuxquestions

事實證明,GRUB2 與 UUID 配合得很好,而與設備名稱配合得不太好。考慮到這些知識,我們需要以下 4 個 UUID,然後才能(手動)為我們的 NixOS 創建一個額外的 GRUB 菜單項grub.cfg configfile

  1. LUKS 設備的 UUID。
  2. LVM 卷組的 UUID。
  3. LVM 邏輯卷的 UUID。
  4. grub.cfg包含我們要通過configfileGRUB2 中的指令載入的文件的文件系統的 UUID 。

我將在這裡列出如何獲取這四個 UUID:

  1. 在我的情況下,執行cryptsetup luksUUID /dev/sda2並刪除UUID 中的****所有破折號 (- ) 。a0cb535a-8468-485f-a220-a5f49e85c9f4``a0cb535a8468485fa220a5f49e85c9f4
  2. 在我的情況下,執行vgdisplay並查找帶有 UUID的 ,。VG UUID``lvmpool``5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT
  3. 執行lvdisplay並查找LV UUID包含您的grub.cfg文件的 LV 名稱或 LV 路徑,nix-root或者在我的情況下/dev/lvmpool/nix-root使用 UUID 。C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj
  4. 執行lsblk -p -o +UUID並查找包含您的grub.cfg文件的設備路徑的/dev/mapper/lvmpool-nix--rootUUID cc6a06bb-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; } ];

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