web-dev-qa-db-ja.com

GRUB(Archインストールから)を使用したマルチブートシステムへのNixOSのインストール

_/dev/sda_(Archで使用およびセットアップされる_/dev/sda1_ブータブルGRUB2パーティション)と_/boot_に分割された1つの物理ディスク(_/dev/sda2_)があり、それはcryptrootです。ロックが解除されると、パーティションのフルサイズが_/dev/sda2_の単一の大きなlvmpoolになります。下の画像に示すように、Archを3lvsにインストールしました。このセットアップは、Dm-cryptのArch Wikiで説明されているように、基本的にLUKS上のLVMです。

partition layout and lvs

NixOSについて多くのすばらしいことを読んだので、現在のArchインストールの隣にNixOSをインストールしようとしています。そこで、上記の_Arch-_ lvsと同様のlvsをさらに3つ作成し、NixOSインストールガイドに従いました。 _boot.loader.grub.device = "nodev"_にあるArchから既存のGRUB2を再利用したいので、NixOSがGRUB他の場所にインストールしないように_/dev/sda1_を指定しました。ただし、NixOSの_grub.cfg_ファイルを_/boot/grub/grub.cfg_に書き込みます。この場合はNixOS _nix-root_ lv(_/_、NixOSのファイルシステムルート)にあり、したがって実際の(起動可能な)GRUB2パーティション_/dev/sda1_。

ただし、それを実現するために、_grub.cfg_にメニューエントリを追加し、NixOSインストーラーが_nix-root_ configfile(_/_)に作成したlvをポイントします。 NixOSのファイルシステムルート)、ほとんど説明されていること ここ 。ただし、GRUBはset root='(hd0,X)'のような構文を必要としているように見えるため、_nix-root_ lvを指すエントリを作成する方法がわかりませんが、どのようにこの_set root_のようなものに、物理ディスクとパーティション番号の代わりに指すlvを認識させることはできますか?オプションconfigfilechainloaderはどちらも、GRUBで十分に説明されておらず、_set root_私が見つけることができる限り。

誰かが私を正しい方向に向け、私が間違っていること、またはなぜ/どのようにこれを自分で難しくしているのかを教えて、異なるLVMlvsにある複数のLinuxディストリビューションに1つの起動可能なGRUB2パーティションを使用することを願っていますLUKS。

EDIT:_set root=_、_(lv/nix-root)_、_(lvmpool/nix-root)_などの_(/dev/mapper/lvmpool-nix--root)_のさまざまなオプションを試しました。ただし、問題は、LVMlvsがGRUBにまだ表示されていないように見えることです。これは、GRUBがロードされた時点で、_/dev/sda2/_がまだ暗号化されているためです。 LUKScryptroot

5
djvdorp

上記のAlexanderBatischevの助けと、Redditの cookie_enthusiast ページのRedditユーザー/r/linuxquestionsからの 非常に有用な情報 のおかげで、私はこれをうまく機能させることができました。

GRUB2はUUIDでうまく機能し、デバイス名ではうまく機能しないことがわかりました。この知識を念頭に置いて、NixOS grub.cfgconfigfileへの追加のGRUB menuentryを(手動で)作成する前に、次の4つのUUIDが手元にある必要があります。

  1. LUKSデバイスのUUID。
  2. LVMボリュームグループのUUID。
  3. LVM論理ボリュームのUUID。
  4. GRUB2のconfigfileディレクティブを介してロードするgrub.cfgファイルを含むファイルシステムのUUID。

これらの4つのUUIDを取得する方法をここにリストします。

  1. cryptsetup luksUUID /dev/sda2を実行してIDからすべてのダッシュ(-)を削除、私の場合、a0cb535a-8468-485f-a220-a5f49e85c9f4a0cb535a8468485fa220a5f49e85c9f4になります。
  2. vgdisplayを実行し、私の場合はUUIDVG UUID5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOTlvmpoolを探します。
  3. lvdisplayを実行し、LV UUIDファイル、grub.cfg、またはnix-rootとUUID/dev/lvmpool/nix-rootを含むLV名またはLVパスのC9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtjを探します。
  4. lsblk -p -o +UUIDを実行し、grub.cfgファイルを含むデバイスパスのUUIDを探します。私の場合は、/dev/mapper/lvmpool-nix--rootとUUIDcc6a06bb-336f-4e9f-a5f0-fdd43e7f548fを使用します。

これにより、次の追加のGRUB menuentryを作成してNixOSgrub.cfgconfigfileを参照できます。これは、私のnix-rootlvにあり、boot.loader.grub.device = "nodev";/etc/nixos/configuration.nixがあるため、GRUB NixOSインストール用にインストールされています(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などのリテラル値が含まれています。これはnot LVMの名前またはIDに置き換えられることになっています。これはどこにも適切に文書化されていないようです。 LUKSデバイスのUUIDをcryptomount -u行に入力した場合にも同じ問題が当てはまりますダッシュ付きその中にGRUBはPress any key to continueを通知します。これは(明らかに)あまり役に立ちません。

したがって、手動GRUB menuentry to boot from crypt -> LVM -> root with LVM on LUKS setupのベアテンプレートは次のようになります。

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; } ];
4
djvdorp