Configuração do Arch Linux com criptografia (LVM em LUKS)

Sep 26 2020

Eu gostaria de configurar o Arch Linux com criptografia. Eu encontrei o tutorial no wiki do Arch , e acho que a segunda opção (LVM no LUKS) é a melhor opção para mim. Aqui está o particionamento que eu gostaria de usar (Thinkpad X1 Carbon, ~ 500 GB SSD, 16 GB de RAM):

  1. [lacuna de alinhamento] 1 MB
  2. /boot 256 MB (FAT 32)
  3. trocar 16 GB (tamanho da memória)
  4. / (root) 64 GB (ext4)
  5. /var 8 GB (ext4)
  6. /tmp 4 GB (ext4)
  7. /home ~ 400 GB (ext4, restante)

O disco tem o nome nvme0n1. Depois de inicializar o instalador (versão de setembro de 2020) e conectar ao WiFi, sobrescrevo o disco com dados aleatórios:

# shred --random-source=/dev/urandom --iterations=3 /dev/nvme0n1

Em seguida, configuro um novo esquema de partição GPT:

# parted -s /dev/nvme0n1 mklabel gpt

Em seguida, crio e formato uma partição de boot com uma lacuna de alinhamento de 1 MB na frente dela.

# parted -s /dev/nvme0n1 mkpart boot fat32 1MiB 257MiB
# parted -s /dev/nvme0n1 set 1 esp on
# mkfs.fat -F 32 /dev/nvme0n1p1

Agora vem a parte em que o wiki não está claro. (Ele apenas menciona que é possível ter /bootem um dispositivo diferente, o que eu não faço.) Decidi fazer outra partição, em cima da qual meu volume criptografado estará localizado:

# parted -s /dev/nvme0n1 mkpart cryptlvm 257MiB '100%'

Isso cria uma segunda partição /dev/nvme0n1p2com o tamanho do disco restante. (Talvez esta etapa cause o problema.) Continuo configurando a criptografia:

# cryptsetup luksFormat /dev/nvme0n1p2     # YES, entering passphrase  twice
# cryptsetup open /dev/nvme0n1p2 cryptlvm  # entering passphrase
# pvcreate /dev/mapper/cryptlvm
# vgcreate VolumeGroup /dev/mapper/cryptlvm

Em seguida, crio as partições conforme descrito acima:

# lvcreate -L 16G VolumeGroup -n swap
# lvcreate -L 64G VolumeGroup -n root
# lvcreate -L 8G VolumeGroup -n var
# lvcreate -L 4G VolumeGroup -n tmp
# lvcreate -l '100%FREE' VolumeGroup -n home

As partições agora estão sendo formatadas:

# mkswap /dev/VolumeGroup/swap
# mkfs.ext4 -F /dev/VolumeGroup/root
# mkfs.ext4 -F /dev/VolumeGroup/var
# mkfs.ext4 -F /dev/VolumeGroup/tmp
# mkfs.ext4 -F /dev/VolumeGroup/home

E montado:

# mount /dev/VolumeGroup/root /mnt

# mkdir /mnt/boot
# mount /dev/nvme0n1p1 /mnt/boot

# mkdir /mnt/var
mount /dev/VolumeGroup/var /mnt/var

# mkdir /mnt/tmp
mount /dev/VolumeGroup/tmp /mnt/tmp

# mkdir /mnt/home
mount /dev/VolumeGroup/home /mnt/home

O sistema agora pode ser inicializado junto com lvm2:

# pacstrap /mnt base liux linux-firmware lvm2

Eu também crio e armazeno fstab:

# genfstab -U /mnt >> /mnt/etc/fstab

I chrootno sistema inicializado:

# arch-chroot /mnt

Conforme mencionado no wiki, adiciono os ganchos encrypte lvm2em /etc/mkinitcpio.conf:

HOOKS=(base udev autodetect keyboard keymap consolefont modconf block filesystems fsck encrypt lvm2)

Eu continuo com as tarefas de configuração normais (configuração de senha raiz, instalação de pacotes básicos, configuração de fuso horário, localidade, idioma, nome do host)

# passwd
# pacman -S iw wpa_supplicant dialog intel-ucode netctl dhcpcd
# ln -sf /usr/share/zoneinfo/Europe/Zurich /etc/localtime
# timedatectl set-ntp true
# hwclock --systohc
# echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen
# locale-gen
# echo 'LANG=en_US.UTF-8' > /etc/locale.conf
# echo -n 'x1' > /etc/hostname

Agora vem o bootloader. Aqui, eu tradicionalmente uso o bootloader systemd em vez do grub. Veja como eu configurei:

# systemd-machine-id-setup
# bootctl --path=/boot install

Eu descobri o UUID (não PARTUUID) da partição raiz da seguinte maneira:

# blkid | grep /dev/VolumeGroup/root | egrep -o 'UUID="[^"]!"'
UUID="6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf"

Então eu crio a entrada de inicialização em /boot/loader/entries/arch.conf:

title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options cryptdevice=UUID=6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf:cryptlvm root/dev/VolumeGroup/root

E um acordo /boot/loader/loader.conf:

default arch
timeout 0
editor  0

Por último, mas não menos importante, corro mkinitcpio, antes de partir para uma nova inicialização:

# mkinitcpio -P
# exit
# umount -R /mnt
# shutdown -h now

Então esse foi o meu procedimento de configuração. Eu removo o dongle USB e inicializo o sistema. O bootloader aparece, mas então eu obtenho a seguinte tela:

:: running early hook [udev]
Starting version 246.6-1-arch
:: running early hook [lvm2]
:: running hook [udev]
:: Triggering uevents...
:: running hook [encrypt]
Waiting 10 seconds for device /dev/disk/by-uuid/6d5b4777-2621-4bec-8bbc-ebd4b5ba9faf ...
Waiting 10 seconds for device /dev/VolumeGroup/root ...
ERROR: device '/dev/VolumeGroup/root' not found. Skippng fsck.
:: mounting '/dev/VolumeGroup/root' on real root
mount: /new_root: no filesystem type specified.
You are now being dropped into an emergency shell.

Agora não tenho idéia do que fiz de errado. Uma suspeita é a segunda partição ( /dev/nvme0n1p2) que precisei criar. Outra suspeita é que fiz algo errado com o bootloader. Em configurações regulares, sempre uso o PARTUUID em vez do UUID. (No entanto, não há PARTUUID na saída de blikd, então provavelmente esse não é o problema.)

Respostas

1 PatrickBucher Sep 26 2020 at 18:34

Como @frostschutz ainda não escreveu sua solução correta para o problema como resposta, vou resumir o problema aqui rapidamente: Escolhi o UUID da partição errada. A partição raiz em /dev/VolumeGroup/rootnão é aquela a ser escolhida, mas a partição real /dev/nvme0n1p2. Veja como extrair esse UUID:

# uuid=$(blkid --match-tag UUID -o value /dev/nvme0n1p2)

Que então pode ser usado na configuração da entrada do carregador de boot:

# cat <<EOF >/boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options cryptdevice=UUID=${uuid}:cryptlvm root=/dev/volgrp/root
EOF

Resumi todo o procedimento no meu site privado . Obrigado também a @Cbhihe pelos conselhos sobre o tamanho das partições.