Arch Linux Setup with Encryption (LVM na LUKS)

Sep 26 2020

Chciałbym skonfigurować Arch Linux z szyfrowaniem. Znalazłem samouczek na wiki Arch i myślę, że druga opcja (LVM na LUKS) jest dla mnie najlepszą opcją. Oto partycjonowanie, którego chciałbym użyć (Thinkpad X1 Carbon, ~ 500 GB SSD, 16 GB RAM):

  1. [luka wyrównania] 1 MB
  2. /boot 256 MB (FAT 32)
  3. swap 16 GB (rozmiar pamięci)
  4. / (root) 64 GB (ext4)
  5. /var 8 GB (ext4)
  6. /tmp 4 GB (ext4)
  7. /home ~ 400 GB (ext4, pozostała część)

Dysk ma nazwę nvme0n1. Po uruchomieniu instalatora (wydanie wrzesień 2020) i połączeniu się z WiFi nadpisuję dysk losowymi danymi:

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

Następnie konfiguruję nowy schemat partycji GPT:

# parted -s /dev/nvme0n1 mklabel gpt

Następnie tworzę i formatuję partycję rozruchową z 1 MB luką wyrównania przed nią.

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

Teraz czas na część, w której wiki jest niejasne. (Wspomina tylko, że można mieć /bootna innym urządzeniu, czego nie robię.) Postanowiłem utworzyć kolejną partycję, na której będzie znajdował się mój zaszyfrowany wolumin:

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

Spowoduje to utworzenie drugiej partycji /dev/nvme0n1p2o pozostałym rozmiarze dysku. (Być może ten krok powoduje problem.) Kontynuuję konfigurację szyfrowania:

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

Następnie tworzę partycje jak opisano powyżej:

# 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

Partycje są teraz formatowane:

# 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

I zamontowane:

# 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

System można teraz załadować razem z lvm2:

# pacstrap /mnt base liux linux-firmware lvm2

Tworzę i przechowuję również fstab:

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

I chrootdo systemu bootstrapped:

# arch-chroot /mnt

Jak wspomniano w wiki, dodaję haczyki encryptoraz lvm2w /etc/mkinitcpio.conf:

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

Kontynuuję zwykłe zadania konfiguracyjne (ustawianie hasła root, instalowanie pakietów podstawowych, ustawianie strefy czasowej, lokalizacji, języka, nazwy hosta):

# 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

Teraz nadchodzi bootloader. Tutaj tradycyjnie używam bootloadera systemd zamiast grub. Oto jak to skonfigurowałem:

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

Identyfikuję UUID (nie PARTUUID) partycji głównej w następujący sposób:

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

Następnie tworzę wpis rozruchowy w /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

I zgoda /boot/loader/loader.conf:

default arch
timeout 0
editor  0

Wreszcie biegam mkinitcpio, zanim wyjdę na nowy but:

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

Więc to była moja procedura konfiguracji. Usuwam klucz USB i uruchamiam system. Pojawia się bootloader, ale pojawia się następujący ekran:

:: 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.

Teraz nie mam pojęcia, co zrobiłem źle. Jedno podejrzenie dotyczy drugiej partycji ( /dev/nvme0n1p2), którą musiałem utworzyć. Innym podejrzeniem jest to, że zrobiłem coś nie tak z bootloaderem. W zwykłych konfiguracjach zawsze używam PARTUUID zamiast UUID. (Jednak w danych wyjściowych nie ma PARTUUID blikd, więc prawdopodobnie nie jest to problem).

Odpowiedzi

1 PatrickBucher Sep 26 2020 at 18:34

Ponieważ @frostschutz nie napisał jeszcze poprawnego rozwiązania problemu jako odpowiedzi, podsumuję tutaj szybko problem: wybrałem UUID niewłaściwej partycji. Partycja główna /dev/VolumeGroup/rootnie jest tą, która ma zostać wybrana, ale właściwą partycją /dev/nvme0n1p2. Oto jak wyodrębnić ten identyfikator UUID:

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

Które następnie można użyć w konfiguracji wpisu programu ładującego:

# 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

Całą procedurę podsumowałem na mojej prywatnej stronie internetowej . Dziękuję również @Cbhihe za porady dotyczące rozmiarów partycji.