فهرست مطالب
دنبال نصبی بودم که هم روت و هم سواپ رمزنگاری بمانند، هایبرنیت کار کند و 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
-
ویکی آرچ: EFI system partition ↩
-
ویکی آرچ: Dm-crypt/Encrypting an entire system ↩
-
ویکی آرچ: Power management/Suspend and hibernate ↩