Artix + OpenRC Installation Guide
Good morning, good afternoon or good evening, wherever you are reading this from. These installation instructions form the foundation of the Artix system that I use on my own Librebooted T480.
This guide uses the following stack:
- OpenRC: A dependency-based init system (Artix is systemd-free).
- btrfs: A feature-rich, copy-on-write filesystem for Linux.
- LUKS: Full disk encryption based on the dm-crypt kernel module.
- zswap: A compressed write-back cache for swap pages, built into the Linux kernel.
- Qtile: A full-featured, hackable tiling window manager built/configured with Python.
- ly: A lightweight TUI display manager.
This guide includes instructions for both BIOS/SeaBIOS and UEFI systems. Steps that differ between the two are clearly marked with [BIOS] and [UEFI] labels.
Let's get started!
Step 1: Creating a Bootable Artix Media Device
Here we will follow the Artix documentation:
i. Acquire an installation image here - select the OpenRC variant;
ii. Verify the signature on the downloaded ISO image;
iii. Write your ISO to a USB (check out this guide); and,
iv. Insert the USB into your target device and boot into it. Log in as root.
Step 2: Setting Up Our System with the Artix ISO
- Set a password for the ISO root user with
passwd; - Start the ssh service with
rc-service openssh start; and, - Obtain your IP address with
ip addr show(you can now ssh in from another machine).
i. Set the console keyboard layout (US by default):
- list available keymaps with
ls -R /usr/share/kbd/keymaps; and, - load your keymap with
loadkeys <your-keymap>.
ii. Verify your boot mode: the following returns nothing or an error on BIOS, and a list of variables on UEFI:
iii. Connect to the internet:
- the Artix ISO ships with
connmanalready running (wired connections are automatic); and, - confirm your connection with
ping -c 2 artixlinux.org.
iv. Update the system clock:
v. Partition your disk:
- list your disks with
lsblk; and, - open your target disk with
cfdisk /dev/nvme0n1.
The official Artix docs use partition labels (ROOT, HOME, SWAP) for unencrypted setups. Since this guide uses LUKS, the encrypted container is opaque from the outside and labels are not meaningful. The boot process relies on the LUKS UUID in the GRUB cmdline instead.
[BIOS] Select dos label type and create the following partitions:
| Partition | Size | Type |
|---|---|---|
/dev/nvme0n1p1 | 2MB | BIOS Boot |
/dev/nvme0n1p2 | Match your RAM | Linux swap |
/dev/nvme0n1p3 | Remaining space | Linux filesystem |
[UEFI] Select gpt label type and create the following partitions:
| Partition | Size | Type |
|---|---|---|
/dev/nvme0n1p1 | 1GB | EFI System |
/dev/nvme0n1p2 | Match your RAM | Linux swap |
/dev/nvme0n1p3 | Remaining space | Linux filesystem |
Then Write and Quit.
vi. Format your partitions:
# swap
[UEFI only] Format the EFI System Partition (ESP):
# set up LUKS encryption
/boot) you need to ensure it is of type luks2 and use argon2id (libreboot documentation here).
# format as btrfs inside the LUKS container
This guide creates the following subvolumes:
| Subvolume | Mount point | Purpose |
|---|---|---|
@ | / | root |
@home | /home | user files survive a root rollback |
@snapshots | /.snapshots | required by snapper as its own subvolume |
@log | /var/log | logs persist across rollbacks |
@cache | /var/cache | package cache, excluded from snapshots |
vii. Create btrfs subvolumes:
viii. Mount subvolumes:
# create mount points
# root
# home
# snapshots
# log
# cache
ix. [UEFI only] Mount the EFI partition:
x. Install the base system:
xi. Generate the filesystem table:
- Verify with
cat /mnt/etc/fstabthat all subvolumes, swap, and boot entries are present and correct before continuing.
xii. Change root into the new system:
You are now working within your new Artix base system (i.e. not from the ISO) and you will now see that your prompt starts with #. Great work so far!
Step 3: Working Within Our New Base System
We are now working within our new Artix system, chrooted in from the ISO. Let's continue with a few steps that we need to repeat (such as setting our root password, timezone, keymaps and language).
sudo).i. Configure the timezone (replace Asia/Bangkok with your city/timezone):
ii. Configure the hardware clock:
iii. Configure locales - in nvim /etc/locale.gen uncomment your locale (e.g. en_US.UTF-8), write and exit, then run:
iv. Configure the hostname:
# T480 will be my hostname, swap in yours
Then add it to /etc/conf.d/hostname:
hostname="T480"
And add matching entries to /etc/hosts:
v. Set the root password:
vi. Create a user (replace rad with your preferred username):
vii. Set the mirrorlist (substitute Singapore with your best location/country):
viii. Enable the Arch Linux repositories:
Artix does not mirror every Arch package. Adding the Arch repos gives access to packages like qtile that are not yet in the Artix repos.
Append the following to /etc/pacman.conf after your existing Artix repos (at the bottom):
Then update:
On Artix, many packages require a separate -openrc package to include the OpenRC service file. The base package alone will not register a service.
ix. Install core packages:
[UEFI only] Also install:
x. Install CPU microcode:
- Intel:
pacman -S intel-ucode - AMD:
pacman -S amd-ucode
xi. Install audio:
xii. Install Bluetooth:
xiii. Install Qtile, ly, and Wayland dependencies:
qtile is not found, ensure the Arch repos were added correctly in Step 3 (viii) and run pacman -Syu before retrying.find /usr -name "lxqt-policykit-agent" and update your Qtile autostart accordingly.xiv. Install a file manager and supporting utilities:
xv. Install fonts, terminal, window switcher (rofi) and browser:
xvi. Configure the firewall:
xvii. Configure mkinitcpio for LUKS + btrfs:
Edit /etc/mkinitcpio.conf and set your MODULES and HOOKS lines to:
usbhid and atkbd to MODULES:MODULES=(btrfs usbhid atkbd)
MODULES=(btrfs)
HOOKS=(base udev autodetect modconf kms keyboard keymap block encrypt filesystems)
fsck is removed from HOOKS (it is not required for btrfs). consolefont is removed as it requires terminus-font and serves no purpose at the LUKS prompt. This guide uses a udev-based initramfs. If you are using a systemd-based initramfs, replace encrypt with sd-encrypt.Regenerate the initramfs:
xviii. Configure GRUB:
[BIOS] Install GRUB to the EFI partition:
[UEFI] Install GRUB to the EFI partition:
Get the UUID of your LUKS partition and append it to the grub defaults file for reference:
Edit /etc/default/grub and set the following - replacing <uuid> with the value appended at the bottom of the file, then delete that line:
GRUB_ENABLE_CRYPTODISK=y
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet zswap.enabled=1 cryptdevice=UUID=<uuid>:main root=/dev/mapper/main"
GRUB_ENABLE_CRYPTODISK=y is required because /boot resides inside the LUKS-encrypted partition. Without it, GRUB cannot read the kernel and initramfs at boot. This means you will be prompted for your LUKS password twice on boot (once by GRUB to load the kernel, and once by the initramfs to mount root).zswap.enabled=1 enables zswap explicitly. zswap is a kernel-level compressed cache that sits in front of your swap partition, compressing pages in RAM before they are written to disk. It requires no additional packages. zswap and zram are not compatible - do not enable both.
Generate the GRUB config:
xix. Enable services:
xx. Set up cron jobs for periodic maintenance:
# weekly SSD trim
# weekly mirrorlist update - substitute Singapore with your location
xxi. Reboot:
Step 4: Tweaking Our New Artix System
Upon successful decryption, ly will start. Log in with the user you created earlier and select the Qtile Wayland session.
i. Connect to WiFi if needed:
ii. Set up standard home directories for your user:
iii. Install paru:
iv. Configure Qtile:
Qtile's config lives at ~/.config/qtile/config.py. Create the directory if it does not exist:
On first login Qtile will use its built-in default config if none is present, which is functional but minimal. Check out my config here.
Recovery
If you cannot boot into your system, boot from your Artix USB, open the encrypted partition and chroot back in:
From here you can fix your GRUB config, reinstall packages, or regenerate the initramfs as needed.
Optional Further Steps
i. Install brave-browser:
ii. Add snapper for btrfs snapshots (when ready):
/.snapshots itself. If it complains that /.snapshots already exists, run the following to let snapper create and own the subvolume itself:
Then install the GRUB integration and pacman hook:
Enable the pacman hook by ensuring HookDir is set in /etc/pacman.conf:
Then create the hooks directory and hook file:
Paste the following:
Run once manually to populate the GRUB menu immediately:
snap-pac creates a snapshot automatically before and after every pacman operation (i.e. installs, upgrades and removals). The pacman hook updates the GRUB menu after every transaction, so your snapshots will always be available as a boot option without any manual steps. Arch snapper docs here.That's all folks!