bersama catatan peribadi & teknikalnya.

VM Arch Linux (UEFI); (LVM2 + XFS) dalam LUKS2 & Btrfs dalam LUKS2

QEMU/KVM (Manual)


geeky stuff
#archlinux | #luks | #lvm | #xfs | #btrfs | #qemu | #kvm
  • Saya sediakan tulisan ini sebagai nota untuk rujukan saya sendiri.
  • I used the command provided in my previous post under Linux (UEFI) to load the Live CD.
  • Walaupun tiada keperluan kerana saya memang sudah menggunakan sistem ini sebagai sistem operasi utama saya, tetapi apa yang saya catatkan ini berguna untuk saya aplikasikan bagi tujuan pemasangan di komputer riba sebagai hos di lain-lain masa. Pun begitu, sekiranya tuan / puan membaca dan menggunakan nota saya ini sebagai rujukan, perlu saya ingatkan bahawa akan ada beberapa perkara yang perlu dilaras mengikut keadaan misalnya sambungan WiFi tidak terpakai dalam VM tetapi ia perlu dikonfigurasi bagi sistem hos.

Sila pastikan sistem hos sudah bersambung dengan rangkaian Internet.


  • Setelah Live CD berjaya boot dan dilog masuk sebagai root, set tulisan yang lebih besar di konsol dengan font Terminus:
setfont ter-d22b

Boleh ubah 22 kepada 24 / 28 / 32 jika mahukan tulisan konsol yang lebih besar daripada itu. Lokasi tulisan-tulisan konsol adalah di dalam direktori /usr/share/kbd/consolefonts.


  • Dapatkan senarai blok pemacu:
alias lsblk="lsblk -o NAME,FSTYPE,SIZE,UUID,LABEL,MOUNTPOINTS"
lsblk

1. Layout untuk (LVM2 + XFS) dalam LUKS2:

  • /dev/mapper/myvg-root = /dev/myvg/root
  • /dev/mapper/myvg-home = /dev/myvg/home

2. Layout untuk Btrfs dalam LUKS2:

Layouts di atas menggambarkan Mountpoints di dalam arch-chroot / selepas boot sistem yang telah dipasang. Sekiranya berada di luar arch-chroot yakni masih dalam suasana Live CD, saya lebih gemar mount partitions ke dalam direktori baru i.e. /mnt/arch (instead of /mnt).


  • Setup partitions. (Kondisinya adalah sama untuk kedua-dua jenis format):
gdisk /dev/nvme0n1
Command (? for help): n
Partition number (1-128, default 1):
First sector (34-62914526, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-62914526, default = 62912511) or {+-}size{KMGTP}: +260M
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): ef00
Changed type of partition to 'EFI system partition'

Command (? for help): n Partition number (2-128, default 2): First sector (34-62914526, default = 534528) or {+-}size{KMGTP}: Last sector (534528-62914526, default = 62912511) or {+-}size{KMGTP}: +512M Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to ‘Linux filesystem’

Command (? for help): n Partition number (3-128, default 3): First sector (34-62914526, default = 1583104) or {+-}size{KMGTP}: Last sector (1583104-62914526, default = 62912511) or {+-}size{KMGTP}: 62914526  Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): 8309 Changed type of partition to ‘Linux LUKS’

Command (? for help): p Disk /dev/nvme0n1: 62914560 sectors, 30.0 GiB Model: QEMU NVMe Ctrl Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): 9B38641F-9465-43B0-8F1D-3F28D94A670B Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 62914526 Partitions will be aligned on 2048-sector boundaries Total free space is 2014 sectors (1007.0 KiB)

Number Start (sector) End (sector) Size Code Name    1 2048 534527 260.0 MiB EF00 EFI system partition    2 534528 1583103 512.0 MiB 8300 Linux filesystem    3 1583104 62914526 29.2 GiB 8309 Linux LUKS

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!!

Do you want to proceed? (Y/N): Y OK; writing new GUID partition table (GPT) to /dev/nvme0n1. The operation has completed succesfully.

Dah kenapa partition ketiga tu letak nombor panjang-panjang macam tu? Oh, sebab dia dah kata dekat situ, sektor terakhir adalah 62914526, tetapi tetapan lalai yang dia bagi berakhir lebih awal iaitu di sektor 62912511. Jadi kita isilah sektor yang betul-betul akhir itu demi mengelakkan pembaziran ruang lebihan yang tidak digunakan. Sesungguhnya membazir itu amalan syaitan.


  • Format partition untuk ESP yang akan menempatkan bootloader EFI (saya guna GRUB2):
mkfs.fat -F 32 -n ESP /dev/nvme0n1p1

  • Format partition BOOT (mengikut format masing-masing).

(LVM2 + XFS)

mkfs.xfs -L BOOT /dev/nvme0n1p2

(Btrfs)

mkfs.btrfs -L BOOT -n 32k /dev/nvme0n1p2

Kenapa tidak partition /boot itu disimpan di dalam partition / (root) sahaja?

  • Jawapannya adalah kerana sokongan bootloader GRUB2 terhadap partition /boot yang disulitkan dengan LUKS2 adalah terhad. LUKS1 tidak mempunyai limitasi ini namun saya tidak memilihnya kerana LUKS2 ini adalah format terkini yang dibangunkan dengan ciri-ciri yang lebih baik.
  • Ada kaedahnya jika mahu juga setup /boot ini di dalam partition root dengan penyulitan berformatkan LUKS2, tetapi perlu rajin untuk mengaplikasikan kaedah tambahan yang telah diubahsuai supaya grub dapat mengesan dan membaca kernel. Rujuk ArchWiki | GRUB#LUKS2 untuk keterangan lanjut.

  • Encrypt partition ketiga.
cryptsetup luksFormat /dev/nvme0n1p3
WARNING!
========
This will overwrite data on /dev/nvme0n1p3 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/nvme0n1p3: _ Verify passphrase: _ cryptsetup luksFormat /dev/nvme0n1p3 19.78s user 0.71s system 5% cpu 6:49.45 total

  • Dan buka di peranti cryptarchvm. Hendak bagi nama apa pun kepada peranti itu, terpulanglah pada keputusan masing-masing.
cryptsetup open /dev/nvme0n1p3 cryptarchvm
Enter passphrase for /dev/nvme0n1p3: _
cryptsetup open /dev/nvme0n1p3 cryptarchvm  6.54s user 0.33s system 10% cpu 3.327 total

(LVM2 + XFS)

  • Buat ① Physical Volume, ② Volume Group berserta ③ Logical Volumes pada partition LUKS ini.
  • Format kesemua logical volumes yang dicipta dan mount ke direktori-direktori berkaitan.
  • Jangan lupa untuk mount BOOT & ESP partition juga.
pvcreate /dev/mapper/cryptarchvm
vgcreate myvg /dev/mapper/cryptarchvm
lvcreate -L 10G myvg -n root
lvcreate -l +100%FREE myvg -n home
mkfs.xfs -L ROOT /dev/myvg/root
mkfs.xfs -L HOME /dev/myvg/home
mount -m /dev/myvg/root /mnt/arch
mount -m /dev/myvg/home /mnt/arch/home
mount -m /dev/nvme0n1p2 /mnt/arch/boot
mount -m /dev/nvme0n1p1 /mnt/arch/boot/efi

(Btrfs)

  • ① Format partition LUKS itu dan jalankan langkah-langkah berikutnya; ② mount root partition, ③ tambah subvolumes btrfs, ④ unmount root partitition tersebut sebelum kemudiannya, ⓹ mount kesemua subvolumes berkenaan.
  • Jangan dilupakan juga untuk mount BOOT & ESP partition.
mkfs.btrfs -L ARCH -n 32k /dev/mapper/cryptarchvm
mount -m -o defaults,compress=zstd /dev/mapper/cryptarchvm /mnt/arch
btrfs subvolume create /mnt/arch/@
btrfs subvolume create /mnt/arch/@home
btrfs subvolume create /mnt/arch/@snapshots
umount /mnt/arch
mount -o defaults,compress=zstd,ssd,subvol=@ /dev/mapper/cryptarchvm /mnt/arch
mount -m -o defaults,compress=zstd,ssd,subvol=@home /dev/mapper/cryptarchvm /mnt/arch/home
mount -m -o defaults,compress=zstd,ssd,subvol=@snapshots /dev/mapper/cryptarchvm /mnt/arch/.snapshots
mount -m -o defaults,compress=zstd,ssd /dev/nvme0n1p2 /mnt/arch/boot
mount -m /dev/nvme0n1p1 /mnt/arch/boot/efi

Seterusnya:

  • Nyahkomen ParallelDownloads dalam /etc/pacman.conf. Muat turun selari ini tidak ditetapkan secara lalai maka perlu di-enabled terlebih dahulu.
  • Pasang pakej yang berikut ke dalam mounted root partition sebelum menjalankan arch-chroot:

(LVM2 + XFS)

pacstrap -K /mnt/arch base base-devel linux lvm2 xfsprogs vim terminus-font efibootmgr grub amd-ucode gptfdisk openssh

(Btrfs)

pacstrap -K /mnt/arch base base-devel linux btrfs-progs vim terminus-font efibootmgr grub amd-ucode gptfdisk openssh
  • Suka juga untuk saya pasang pakej openssh terus sebab memudahkan saya untuk menyalin fail di antara kedua-dua sistem hos dan tetamu dengan perintah scp melalui sambungan SSH.
  • linux-firmware tidak diperlukan dalam VM kerana perkongsian peranti di antara hos dan tetamu.
  • Saya pasang kodmikro amd kerana inilah processor komputer riba saya. Sila gantikan dengan intel-ucode jika PC / laptop tuan puan didatangkan dengan processor ini.

  • Jana fstab, arch-chroot ke dalam root partition dan tetapkan zon masa.
genfstab -U /mnt/arch >> /mnt/arch/etc/fstab
arch-chroot /mnt/arch
ln -sf /usr/share/zoneinfo/Asia/Kuala_Lumpur /etc/localtime
hwclock --systohc

  • Enable servis penyelarasan masa dan tambah tetapan berikutnya seperti rujukan ArchWiki.
systemctl enable systemd-timesyncd.service
vim /etc/locale.gen #nyahkomen 'locale' yang dikehendaki sebelum jana
locale-gen
echo 'LANG=en_US.UTF-8' >> /etc/locale.conf
echo 'FONT=ter-d22b' >> /etc/vconsole.conf
echo 'archlinuxvm' >> /etc/hostname

  • Sunting fail konfig mkinitcpio.
vim /etc/mkinitcpio.conf
(untuk LVM2 + XFS)
HOOKS=(base udev autodetect modconf kms keyboard sd-vconsole block encrypt lvm2 filesystems fsck)

(untuk Btrfs) BINARIES=(btrfs) HOOKS=(base udev autodetect modconf kms keyboard sd-vconsole block encrypt filesystems fsck)


  • Jana imej kernel dan initrd serta tetapkan kata laluan untuk root sebelum terus kepada memasang bootloader GRUB di dalam partition ESP.
mkinitcpio -P
passwd

  • Sebelum pasang grub, masukkan arahan tambahan untuk kernel dan nyahkomen baris kedua seperti yang berikutnya.
vim /etc/default/grub
GRUB_CMDLINE_LINUX="cryptdevice=UUID=UUID-peranti-LUKS:cryptarchvm"
GRUB_ENABLE_CRYPTODISK=y
**Penerangan: Opsyen <GRUB_CMDLINE_LINUX="cryptdevice=UUID=d166095a-9b06-4e4a-b4c7-62e6504c3cb9:cryptarchvm"> (sebagai contoh) akan membantu menambahkan arahan pada baris kernel linux di entri menu secara automatik. Dapatkan UUID partition ketiga yakni /dev/nvme0n1p3 yang telah disulitkan awalnya melalui senarai blok dengan perintah lsblk ataupun dengan perintah blkid.

  • Pasang grub.
grub-install --target=x86_64-efi --efi-directory=/boot/efi --boot-directory=/boot/efi --bootloader-id=GRUB --recheck
Installing for x86_64-efi platform.
Installation finished. No error reported.

  • Akan ada dua direktori dalam /boot/efi: ① EFI dan juga ② grub. Jana fail konfig grub dengan perintah berikut. Saya abaikan amaran berkenaan os-prober kerana memang tidak ada menggunakan sistem selainnya.
grub-mkconfig -o /boot/efi/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/amd-ucode.img /boot/initramfs-linux.img
Found fallback initrd image(s) in /boot:  amd-ucode.img initramfs-linux-fallback.img
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done

  • Contoh output entri menu GRUB:-
 1menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-d696445d-15d5-4591-bd60-b7b1d707232e' {
 2	load_video
 3	set gfxpayload=keep
 4	insmod gzio
 5	insmod part_gpt
 6	insmod btrfs
 7	search --no-floppy --fs-uuid --set=root fb49ee31-3c1a-4fee-ac37-6f6b30a4100f
 8	echo	'Loading Linux linux ...'
 9	linux	/vmlinuz-linux root=UUID=d696445d-15d5-4591-bd60-b7b1d707232e rw rootflags=subvol=@ cryptdevice=UUID=d166095a-9b06-4e4a-b4c7-62e6504c3cb9:cryptarchvm loglevel=3 quiet
10	echo	'Loading initial ramdisk ...'
11	initrd	/amd-ucode.img /initramfs-linux.img
12}
  • Terdapat tiga bahagian partitions di dalam entri menu GRUB ini iaitu:-
    1. UUID partition root </> pada baris pertama;
    2. UUID partition boot </boot> yang mengandungi imej kernel serta initrd pada baris ketujuh;
    3. UUID partition LUKS <crypto_LUKS> yakni peranti yang telah disulitkan dengan LUKS2 pada baris kesembilan selepas diarahkan ke partition root.


Sambungan Rangkaian (Network Connection) di dalam Tetamu Arch Linux:-

Untuk menyambung jaringan di dalam sistem tetamu ini, terdapat dua medium yang menyediakan Resolusi Domain Name (DNS):-

  1. Dengan systemd-networkd dan systemd-resolved yang menurut ArchWiki ialah cara yang paling ringkas untuk VM. Terasa seperti telah ditipu pula sebab berdasarkan pembelajaran sendiri, kaedahnya tak adalah ringkas mana.
systemctl enable systemd-networkd.service
systemctl enable systemd-resolved.service
  • Selepas beberapa kali menggaru kepala yang tidak gatal mengkaji apa yang tidak cukupnya dengan hanya enabling servis kedua-duanya seperti di atas, saya dapati kena buat langkah-langkah yang dibincangkan di bawah ini dahulu iaitu menyalin beberapa direktori. Perlu keluar daripada arch-chroot dahulu untuk menyalin dan menampal direktori-direktori ini daripada Live CD ke sistem tetamu Arch.
exit
cp -r /etc/systemd/system/systemd-networkd-wait-online.service.d /mnt/arch/etc/systemd/system
cp -r /etc/systemd/network /mnt/arch/etc/systemd
ATAU
  1. (Masih di dalam arch-chroot): Saya rasa, kaedah kedua ini lebih ringkas iaitu dengan menggunakan klien dhcpcd. Pasang pakej ini dan enable sahaja servisnya. Dulu-dulu pun memang cara inilah yang saya aplikasikan. Tetapi sekarang saya cuba untuk membuka hati kepada kebanyakan servis systemd yang ada memandangkan inilah sistem init yang dijadikan sebagai tetapan lalai oleh pengurusan sistem utama saya ini.
pacman -S dhcpcd
systemctl enable dhcpcd.service
exit

  • Sekarang, bolehlah unmount (--recursive) dan cuba reboot untuk melihat sama ada sistem berjaya boot atau tidak:
umount -R /mnt/arch
reboot

  • Setelah berjaya boot, symlink-kan fail stub-resolv.conf ke /etc/resolv.conf (hanya seandainya menggunakan servis systemd-resolved untuk memperoleh Resolusi Domain Name sebagaimana yang telah saya terangkan di atas. Sekiranya menggunakan klien dhcpcd, langkau perkara ini);
ln -rsf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

  • Serta semak status timedatectl bagi memastikan bahawa masa dan tarikh telah diselaraskan mengikut zon masa dan lokaliti kita. Contoh output:-
timedatectl
               Local time: Tue 2022-06-28 18:05:45 +08
           Universal time: Tue 2022-06-28 10:05:45 UTC
                 RTC time: Tue 2022-06-28 10:05:45
                Time zone: Asia/Kuala_Lumpur (+08, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

  • Jangan lupa ping mana-mana url untuk memastikan sambungan jaringan berjaya diperolehi.

  • Katakanlah kita sudah menggunakan opsyen pertama tetapi mahu beralih kepada dhcpcd, buat langkah-langkah di bawah sebagai root (pastikan pakej dhcpcd sudah dipasang terlebih dahulu sebelum menjalankan ini).

unlink /etc/resolv.conf
systemctl stop systemd-resolved.service
systemctl stop systemd-networkd.service
systemctl disable systemd-resolved.service
systemctl disable systemd-networkd.service
systemctl enable --now dhcpcd.service

Oh, ya! Jika terdapat sebarang masalah dan perlu "arch-chroot" ke dalam sistem tetamu melalui Live CD, ketik F2 semasa mula boot untuk ke paparan UEFI Firmware Settings dan pergi ke bahagian berikut seperti yang ditunjukkan melalui imej-imej di bawah:-


Xorg dalam VM Arch Linux:

  • Sudah pastinya akan ada sedikit kelainan dalam settings untuk paparan Xorg di antara sistem VM dengan sistem sebenar. Begitu juga terdapat beberapa pakej / perkara yang boleh dilangkau apabila di dalam VM dek perkongsian peranti di antara keduanya.
  • Antara pakej-pakej / benda yang TIDAK memerlukan konfigurasi ialah:
    1. Pakej pengurus untuk sambungan jaringan tanpa wayar (WiFi) seperti iwd, NetworkManager dan lain-lain.
    2. xf86-video-driver untuk grafik kerana VM menggunakan GPU virtio yang dikesan secara automatik.

Contoh grafik dengan Desktop Environment XFCE4

(Sebagai root):

  • Pakej-pakej di bawah melibatkan penggunaan touchpad, sebahagian pakej daripada grup xorg, ejen spice bagi kemudahan copy paste antara kedua-dua sistem dan pakej xsel untuk clipboard (pakej alternatif ialah xclip) serta xcompmgr sebagai pengurus komposit.
pacman -Syu xf86-input-libinput xorg-server xorg-apps xorg-xinit xfce4 spice-vdagent qemu-guest-agent xsel xcompmgr
  • Buat konfigurasi Xorg untuk disalin fail konfignya ke direktori /etc/X11.
Xorg -configure
cp xorg.conf.new /etc/X11/xorg.conf

(Sebagai pengguna) ~Tambah user dengan arahan useradd dan masukkan namanya ke dalam fail sudoers (visudo):

  • Salin fail xinitrc ke direktori rumah pengguna dan jadikan fail berkenaan boleh dilaksanakan (executable).
cp /etc/X11/xinit/xinitrc .xinitrc
chmod +rx .xinitrc

  • Sunting fail .xinitrc itu di bahagian paling bawah sekali dan komen baris-baris yang tidak berkenaan:
vim .xinitrc
xcompmgr -c &
exec startxfce4

  • Dan mulakan Xorg.
startx

Tip:

  • spice-vdagent dijalankan secara automatik di dalam Desktop Environments. Seandainya hanya menggunakan Window Manager, spice-vdagent ini perlu dilaksanakan. Boleh tambah “spice-vdagent &” sebelum baris “exec window-manager” di dalam fail .xinitrc untuk mengaktifkan kemudahan copy paste di antara sistem hos dan tetamu.


Kali terakhir dikemaskini:
Top