System preparation
These notes expand from the Boot the live environment to the Reboot section in the install guide. Due to hardware specifics and different environmental conditions, such as the Internet connection, you may need to adapt and troubleshoot on your own.
Booting the target machine
I connect the target machine using wired ethernet and insert an installation medium (USB flash) prepared earlier to boot the installation system. This way I can avoid troubleshooting of missing drivers and unsupported wireless NIC1 hardware.
Changing crucial UEFI settings
Disable Secure Boot
For most computers it is necessary to disable Secure Boot2 in order to boot the installation system from an installation medium, such as an USB flash drive. On my hardware this has already been turned off.
Switch RAID mode off
Some computers provide a RAID3 mode for storage devices, which is mostly not detected by Linux due to proprietary drivers. I use the UEFI settings to switch the storage settings to AHCI (or SATA) mode instead of any RAID mode.
Live environment setup
In the live environment, I set a German console keymap using the command:
loadkeys de-latin1I list the UEFI variables to verify the UEFI boot mode by issueing:
ls /sys/firmware/efi/efivarsI ensure networking by querying the link status and verify the connection with a
ping to the archlinux.org site:
ip link
ping archlinux.orgI synchronize the system clock via NTP4:
timedatectl set-ntp trueDisk partition layout
I partition the disk and
encrypt the partitions to protect data at rest. The first partition is used as
EFI system partition mounted at /boot. Partition 2 will become a LUKS25
encrypted partition carrying a Logical Volume Group (LVG) managed by LVM6.
The LVG consists of three logical volumes for Swap7 space, /home and /
(root). This layout is known as LVM on LUKS and illustrated below:
+----------------+ +-----------------------------------------------------------+
| Boot partition | | Logical volume 1 | Logical volume 2 | Logical volume 3 |
| | | | | |
| /boot | | [Swap] | / | /home |
| | | | | |
| | | /dev/lvg/swap | /dev/lvg/root | /dev/lvg/home |
| | |_ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _|
| | | |
| | | LUKS2 encrypted partition |
| /dev/nvme0n1p1 | | /dev/nvme0n1p2 |
+----------------+ +-----------------------------------------------------------+Partitioning
I identify the block device (e.g. /dev/nvme0n1) using lsblk and modify the
partitions as follows:
fdisk /dev/nvme0n1I create two partitions:
- EFI system partition, 940 MB, type ID: 1
- Linux filesystem partition, remaining space, type ID: 20 (default)
The fdisk command sequence for an unpartitioned disk is:
- g (use GPT)
- n
- 1 (default, you can also use
Return) Return(as it typically defaults to disk sector 2048)- +940M
- t
- 1 (default, you can also use
Return) - 1
- n
- 2 (default, you can also use
Return) Return(as it defaults to first disk sector)Return(as it defaults to last disk sector)- w
Encryption and LVM
I encrypt the second partition as a LUKS container by using a strong passphrase:
cryptsetup luksFormat /dev/nvme0n1p2Next, I open this container using lvg as the device mapper name:
cryptsetup open /dev/nvme0n1p2 lvgI create a Physical Volume (PV) on top of the container at /dev/mapper/lvg:
pvcreate /dev/mapper/lvgI create a Volume Group (VG) lvg and add the previously created PV to it:
vgcreate lvg /dev/mapper/lvgI create a Logical Volume (LV) for each filesystem (/, /home, and Swap):
lvcreate -L 16G lvg -n swap
lvcreate -L 40G lvg -n root
lvcreate -l 100%FREE lvg -n homeFormatting and mounting
I format the LVs with ext4 and a swap filesystem (FS), respectively:
mkfs.ext4 /dev/lvg/root
mkfs.ext4 /dev/lvg/home
mkswap /dev/lvg/swapThe boot partition uses a FAT32 FS:
mkfs.fat -F32 /dev/nvme0n1p1I mount the filesystems at /mnt:
mount /dev/lvg/root /mnt
mount /dev/lvg/home /mnt/home
mount --mkdir /dev/nvme0n1p1 /mnt/bootAnd I activate the Swap partition:
swapon /dev/lvg/swapAt this time I can check the layout of my storage device using lsblk.

The layout of the NVMe storage after partitioning and formatting
System initialization
Now I can install the essential packages into the previously mounted location:
pacstrap /mnt base linux linux-firmware lvm2 neovimI generate a fstab file by using UUIDs:
genfstab -U /mnt >> /mnt/etc/fstabIf you are using a SSD, you may want to adjust /etc/fstab to use noatime
for the filesystems instead of discard) for security reasons. See this
section in the ArchWiki article on Dm-crypt Specialties.
I use nvim /etc/fstab to open and edit the file accordingly.
I change root into the new system:
arch-chroot /mntNext, I first change the root password using the command:
passwdLocalization
I set the timezone for Germany (CET8) and sync the hardware clock:
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
hwclock --systohcFor the locale, I uncomment the line
de_DE.UTF-8 UTF-8 and en_US.UTF-8 UTF-8 in the /etc/locale.gen file and
run:
locale-genI create the file /etc/locale.conf to set the system locale accordingly and
make the console keyboard layout persistent via a /etc/vconsole.conf file:
echo "LANG=de_DE.UTF-8" > /etc/locale.conf
echo "KEYMAP=de-latin1" > /etc/vconsole.confInitramfs configuration
I edit /etc/mkinitcpio.conf inserting encrypt, lvm2, and resume (for
suspend and hibernate) into the HOOKS variable to match the following order:
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont modconf block encrypt lvm2 resume filesystems fsck)Afterwards a manual generatation of the image is necessary:
mkinitcpio -PSystemd-boot installation
I use bootctl with the /boot partition to install the UEFI boot manager
Systemd-boot:
bootctl --path=/boot installI create a loader configuration at /boot/loader/loader.conf containing:
default linux
timeout 0
editor noI create the loader file /boot/loader/entries/linux.conf containing:
title Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=UUID=MyUuid:lvg resume=/dev/lvg/swap root=/dev/lvg/root quiet rwresume parameter is used for suspend and hibernate.Next, I identify the UUID of the LUKS partition (TYPE=“crypto_LUKS”) created in
the Encryption and LVM step by using blkid. The
following command conveniently saves it to the $MyUuid variable:
MyUuid=$(blkid | grep crypto_LUKS \
| cut --delimiter=' ' --field=2 | sed 's/[^a-z0-9\\-]//g')I edit /boot/loader/entries/linux.conf and replace MyUuid with the $MyUUID
value in the string cryptdevice=UUID=MyUUID:lvg using the following command:
sed -i "s/MyUuid/$MyUuid/" /boot/loader/entries/linux.confI check the boot loader entry to contain the correct UUID. Otherwise the system is unable to boot from the correct device and fall back to an emergency shell. If this happens to you, refer to Boot problems.
Networking
I set the hostname in a /etc/hostname file to arch-studio24, for example:
echo "arch-studio24" > /etc/hostnameAnd I complete the network configuration using Systemd-networkd and Systemd-resolvd.
For this, I retrieve and note the udev assigned names of the network interfaces using the utility:
ip linkI configure a wired adapter using DHCP by creating a new file at the location
/etc/systemd/network/20-wired.network and providing the udev name
(enp0s13f0u1 is used in the following example):
[Match]
Name=enp0s13f0u1
[Network]
DHCP=yesI enable the systemd-networkd.service to activate it at system startup:
systemctl enable systemd-networkd.serviceI create the Systemd-resolved configuration directory:
mkdir /etc/systemd/resolved.conf.dI manually set a
censorship-free DNS9 server such as dnsforge.de by
creating /etc/systemd/resolved.conf.d/dns_servers.conf with the content:
[Resolve]
DNS=176.9.93.198
Domains=~.Additionally, I setup fdns2.dismail.de via
/etc/systemd/resolved.conf.d/fallback_dns.conf as fallback DNS containing:
[Resolve]
FallbackDNS=159.69.114.157I enable systemd-resolved.service to activate it at system startup:
systemctl enable systemd-resolved.serviceI backup the Glibc resolver file and use Systemd-resolved in stub mode:
cp /etc/resolv.conf /etc/resolv.conf.bkpNext, I exit the arch-chroot (using exit or the key combination
<Ctrl+d>) to create the resolv.conf symlink:
ln -sf /run/systemd/resolve/stub-resolv.conf /mnt/etc/resolv.confReboot
Finally, I can unmount all partitions to ensure none of them is busy, and reboot into the installed system:
umount -R /mnt
rebootAfter the reboot I can login into the new system as root user and proceed with the basic configuration of the installed system.
-
Network interface controller in the Wikipedia ↩︎
-
Disabling Secure Boot in the ArchWiki ↩︎
-
Swap in the ArchWiki atime option explanation for SSDs in the ArchWiki ↩︎
-
Domain Name System in the Wikipedia ↩︎