وبلاگ

نصب آرچ با روت و سواپ رمزنگاری‌شده و UKI

۱۲ آذر ۱۴۰۴
سروش علی‌نیا
نصب آرچ با روت و سواپ رمزنگاری‌شده و UKI

دنبال نصبی بودم که هم روت و هم سواپ رمزنگاری بمانند، هایبرنیت کار کند و systemd-boot یک یونیفاید کرنل ایمیج (UKI) بار کند. این همان مسیری است که روی یک NVMe خالی رفتم.

طرح پارتیشنی که استفاده کردم: /dev/nvme0n1p1 (EFI، 512 مگ)، /dev/nvme0n1p2 (LUKS سواپ)، /dev/nvme0n1p3 (LUKS روت با Btrfs). سواپ روی یک LUKS جداست تا هایبرنیت از فضای رمزنگاری‌شده برگردد.1

پارتیشن، رمزنگاری و مونت

با cfdisk یا parted سه پارتیشن GPT بسازید. برای EFI نوع پارتیشن را EFI System بگذارید (GUID برابر EF00) و فلگ‌های esp/boot را فعال کنید؛ فقط فرمت‌کردن کافی نیست.2 بعد فرمت کنید:

mkfs.fat -F32 -n EFI /dev/nvme0n1p1

سواپ و روت را LUKS کنید و بازشان کنید:3

cryptsetup luksFormat /dev/nvme0n1p2           # swap
cryptsetup luksFormat /dev/nvme0n1p3           # root
cryptsetup open /dev/nvme0n1p2 cryptswap
cryptsetup open /dev/nvme0n1p3 cryptroot

پسورد سواپ و روت باید یکی باشد، مخصوصاً اگر می‌خواهید هایبرنیت داشته باشید.

فرمت و مونت:

mkswap /dev/mapper/cryptswap
swapon /dev/mapper/cryptswap

mkfs.btrfs /dev/mapper/cryptroot
mount /dev/mapper/cryptroot /mnt
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
umount /mnt

mount -o noatime,ssd,compress=zstd,space_cache=v2,discard=async,subvol=@ /dev/mapper/cryptroot /mnt
mkdir -p /mnt/{home,boot,efi}
mount -o noatime,ssd,compress=zstd,space_cache=v2,discard=async,subvol=@home /dev/mapper/cryptroot /mnt/home
mount /dev/nvme0n1p1 /mnt/efi

سیستم پایه

pacstrap -K /mnt base base-devel linux linux-firmware btrfs-progs sudo vim networkmanager plymouth  
genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt

اگر اسپلش نمی‌خواهید plymouth را حذف کنید

داخل chroot زمان، لوکال، hostname و کاربرها را تنظیم کنید:

ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
hwclock --systohc
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
echo "nexus" > /etc/hostname
passwd
useradd -m -G wheel xero && passwd xero
EDITOR=vim visudo   # فعال‌کردن sudo برای wheel
systemctl enable NetworkManager

systemd-boot و UKI

بوت‌لودر را روی EFI که در /efi مونت کرده‌ایم نصب کنید:

bootctl install --esp-path=/efi

برای mkinitcpio از هوک‌های سبک systemd استفاده کنید تا initramfs با UKI هماهنگ شود:

sed -i 's/^HOOKS=.*/HOOKS=(base systemd plymouth autodetect microcode modconf kms keyboard keymap sd-vconsole block sd-encrypt filesystems fsck)/' /etc/mkinitcpio.conf 

دوباره اگر اسپلش نمی‌خواهید plymouth را حذف کنید

پریست را طوری بگذارید که UKI بسازد (ویرایش /etc/mkinitcpio.d/linux.preset):

# /etc/mkinitcpio.d/linux.preset
ALL_kver="/boot/vmlinuz-linux"

PRESETS=('default')

default_image="/boot/initramfs-linux.img"
default_uki="/efi/EFI/Linux/arch-linux.efi"

خط فرمان کرنل را با UUIDهای خودتان از blkid در /etc/kernel/cmdline بنویسید:4

rd.luks.name=root-uuid=cryptroot root=/dev/mapper/cryptroot rd.luks.name=swap-uuid=cryptswap rootflags=subvol=@ rw resume=/dev/mapper/cryptswap

اسپلش Plymouth (اختیاری و سازگار با UKI)

داخل chroot عبارت quiet splash را کنار آرگومان‌های LUKS/resume در /etc/kernel/cmdline اضافه کنید. ترتیب هوک‌ها در بالا plymouth را پیش از sd-encrypt گذاشته؛ هر وقت cmdline را عوض کردید initramfs را دوباره بسازید:

mkinitcpio -P
bootctl update

Zswap (اختیاری)

اگر رم کم است یا سواپ فشرده می‌خواهید، این‌ها را هم در همان خط /etc/kernel/cmdline کنار آرگومان‌های LUKS/resume بگذارید (بین هر مورد فاصله بگذارید):

zswap.enabled=1 zswap.shrinker_enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=30 zswap.zpool=zsmalloc rd.luks.name=swap-uuid=cryptswap

بسازید و همیشه تازه نگه دارید:

mkinitcpio -P
bootctl update
systemctl enable systemd-boot-update.service

بررسی و ریبوت

  • bootctl list باید ورودی UKI (و نسخه کرنل) مورد انتظار را نشان بدهد.
  • فایل /efi/EFI/Linux/arch-linux.efi با زمان به‌روزرسانی تازه وجود دارد.
  • ریبوت کنید: پسورد LUKS را بزنید، اگر فعال است Plymouth را می‌بینید، روت با زیرحجم @ بالا می‌آید و با دستور زیر مطمئن شوید هایبرنیت/رزوم از سواپ رمزنگاری‌شده کار می‌کند:
sudo systemctl hibernate

Footnotes

  1. ویکی آرچ: Swap

  2. ویکی آرچ: EFI system partition

  3. ویکی آرچ: Dm-crypt/Encrypting an entire system

  4. ویکی آرچ: Power management/Suspend and hibernate