Instalação do NixOS no sistema multi-boot com o GRUB (da instalação do Arch)

4

Eu tenho um disco físico ( /dev/sda ) que é dividido em /dev/sda1 (que é /boot partição GRUB2 inicializável usada e configuração com o Arch) e /dev/sda2 que é meu cryptroot que, quando desbloqueado, é um único grande lvmpool com o tamanho total da partição /dev/sda2 . Eu instalei o Arch em 3 lvs , como visto na imagem abaixo. Esta configuração é basicamente LVM no LUKS, conforme descrito no Arch Wiki em Dm-crypt.

ComolimuitascoisasboassobreoNixOS,estoutentandoinstalaroNixOSaoladodaminhainstalaçãoatualdoArch,entãocrieimais3lvssemelhanteaoarch-lvsacimaeseguioNixOSGuiadeinstalação.Euespecifiqueiboot.loader.grub.device="nodev" para que o NixOS não instale o GRUB em nenhum outro lugar, porque eu quero reutilizar meu GRUB2 existente do Arch que reside em /dev/sda1 . No entanto, ele gravará um arquivo grub.cfg para NixOS em /boot/grub/grub.cfg que, nesse caso, está no NixOS nix-root lv ( / , a raiz do sistema de arquivos no NixOS) e, portanto, não no real (inicializável ) Partição GRUB2 /dev/sda1 .

No entanto, para isso, desejo adicionar uma entrada de menu extra ao meu grub.cfg e apontar para o configfile que o instalador do NixOS criou no meu nix-root lv ( / , a raiz do sistema de arquivos no NixOS), basicamente o que é descrito aqui . No entanto, não tenho certeza de como criar uma entrada que aponte para nix-root lv , pois parece que o GRUB quer alguma sintaxe como set root='(hd0,X)' , mas como posso fazer algo assim set root ciente de minha lv para apontar para em vez de um disco físico e um número de partição? Ambas as opções configfile e chainloader não são muito bem descritas no GRUB, e nem o set root , até onde eu pude encontrar.

Espero que alguém me aponte na direção certa, me diga o que estou fazendo errado ou por que / como estou tornando isso muito difícil para mim mesmo, apenas usar uma partição GRUB2 inicializável para várias distribuições Linux que residem em diferentes LVM lvs no LUKS.

EDITAR: Eu tentei várias opções para set root= , como (lv/nix-root) , (lvmpool/nix-root) e (/dev/mapper/lvmpool-nix--root) , mas o problema é que o LVM lvs não parece visível para o GRUB ainda, já que no ponto que o GRUB carrega, /dev/sda2/ ainda é um LUKS cryptroot criptografado.

    
por djvdorp 28.04.2016 / 23:28

1 resposta

3

Com a ajuda acima de Alexander Batischev, e algumas informações muito úteis do Reddit usuário cookie_enthusiast na página /r/linuxquestions no Reddit, eu consegui fazer isso funcionar.

Acontece que o GRUB2 funciona bem com UUIDs e não tão bem com nomes de dispositivos. Com esse conhecimento em mente, precisamos dos seguintes 4 UUIDs disponíveis, antes de podermos (manualmente) criar uma entrada de menu extra do GRUB para nosso NixOS grub.cfg configfile :

  1. O UUID do dispositivo LUKS.
  2. O UUID do grupo de volume LVM.
  3. O UUID do Volume Lógico do LVM.
  4. O UUID do sistema de arquivos que contém o arquivo grub.cfg que queremos carregar por meio da diretiva configfile no GRUB2.

Vou listar aqui como obter esses quatro UUIDs:

  1. Execute cryptsetup luksUUID /dev/sda2 e remova todos os traços ( - ) do UUID , a0cb535a-8468-485f-a220-a5f49e85c9f4 se tornaria a0cb535a8468485fa220a5f49e85c9f4 no meu caso.
  2. Execute vgdisplay e procure o VG UUID , lvmpool com UUID 5atKN9-PQBi-T9wb-Iyz8-qP4y-HN2E-c5uLOT no meu caso.
  3. Execute lvdisplay e procure o LV UUID do nome do LV ou do caminho LV que contém o arquivo grub.cfg , nix-root ou /dev/lvmpool/nix-root com UUID C9zkjF-IHu0-qQkP-KgLf-8rAy-TVPu-HQ7gtj no meu caso.
  4. Execute lsblk -p -o +UUID e procure o UUID do caminho do dispositivo que contém seu arquivo grub.cfg , /dev/mapper/lvmpool-nix--root com UUID cc6a06bb-336f-4e9f-a5f0-fdd43e7f548f no meu caso.

Isso permitirá que você crie a seguinte entrada de menu extra do GRUB para fazer referência a nosso NixOS grub.cfg configfile , que está no meu nix-root lv e por causa do boot.loader.grub.device = "nodev"; no meu /etc/nixos/configuration.nix não há GRUB instalado para minha instalação do NixOS (no Arch, isso entraria em /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'
}

Para esclarecer isso ainda mais, isso contém alguns valores literais, como lvmid , que não devem ser substituídos pelo nome ou ID do seu LVM. Isso não está devidamente documentado em nenhum lugar, parece. O mesmo problema se aplica quando você coloca o UUID do seu dispositivo LUKS na linha cryptomount -u com traços , o GRUB apenas informará Press any key to continue , o que (obviamente) não é muito útil.

O modelo simples para um menu do GRUB manual para inicializar a partir de crypt -> LVM -> root com um LVM no LUKS configuração seria assim:

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'
}

Para aqueles que também estão interessados na outra metade, modifiquei meu arquivo /etc/nixos/configuration.nix para ficar assim:

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; } ];
    
por 30.04.2016 / 17:40