Files
quartz/content/10-19 LIFE/13 TECH SETUP/13.13 OS SETUP/Base Install.md
Quartz Syncer fe0581e423
All checks were successful
Build and Deploy Quartz / build (push) Successful in 27s
Published multiple files
2026-02-05 12:24:25 -07:00

8.6 KiB

publish, permalink, title, created, modified, tags, cssclasses
publish permalink title created modified tags cssclasses
true /os/base-install Base Install 2026-01-29T14:10:28.844-07:00 2026-02-05T12:17:52.905-07:00
arch
installation
luks
btrfs

My Arch Linux installation guide for Framework Laptop 13 (AMD Ryzen 7040). LUKS2 encrypted BTRFS with Limine bootloader.

Based on guides by yovko and mgajewskik, adapted for Framework AMD hardware.


Overview

  • Encryption: LUKS2 on system partition
  • Filesystem: BTRFS with subvolumes (snapshots, compression)
  • Bootloader: Limine (lightweight, Snapper-friendly)
  • Hardware: Framework Laptop 13 AMD (Ryzen 7040 series)

Preparation

Boot from the official Arch ISO.

Connect to WiFi

iwctl station wlan0 connect <SSID>

Set keymap and font

loadkeys us
setfont ter-132b

Verify UEFI mode

cat /sys/firmware/efi/fw_platform_size
# Should return 64

(Optional) SSH in from another machine

passwd  # set root password
ip addr show  # get IP
# From other machine: ssh root@<ip>

Disk Partitioning

Assuming single-boot Arch on /dev/nvme0n1.

Wipe existing partitions

sgdisk --zap-all /dev/nvme0n1

Create partitions

  • ESP: 2GB FAT32 for /boot
  • System: Rest of disk, LUKS2 encrypted BTRFS
parted --script /dev/nvme0n1 \
  mklabel gpt \
  mkpart ESP fat32 1MiB 2049MiB \
  set 1 esp on \
  mkpart Linux btrfs 2050MiB 100%

Format ESP

mkfs.fat -F 32 /dev/nvme0n1p1

Encryption Setup

Create LUKS container

cryptsetup luksFormat /dev/nvme0n1p2

Save the UUID — you'll need it for the bootloader:

cryptsetup luksUUID /dev/nvme0n1p2

Open the container

cryptsetup open /dev/nvme0n1p2 root

BTRFS Setup

Format and mount

mkfs.btrfs /dev/mapper/root
mount /dev/mapper/root /mnt

Create subvolumes

btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@var_log
btrfs subvolume create /mnt/@var_cache
btrfs subvolume create /mnt/@snapshots

Remount with subvolumes

umount /mnt

mount -o compress=zstd:1,noatime,subvol=@ /dev/mapper/root /mnt
mount --mkdir -o compress=zstd:1,noatime,subvol=@home /dev/mapper/root /mnt/home
mount --mkdir -o compress=zstd:1,noatime,subvol=@var_log /dev/mapper/root /mnt/var/log
mount --mkdir -o compress=zstd:1,noatime,subvol=@var_cache /dev/mapper/root /mnt/var/cache
mount --mkdir -o compress=zstd:1,noatime,subvol=@snapshots /dev/mapper/root /mnt/.snapshots
mount --mkdir /dev/nvme0n1p1 /mnt/boot

Install Base System

pacman -Syy

pacstrap -K /mnt \
  base base-devel linux linux-firmware linux-headers \
  git vim neovim \
  btrfs-progs efibootmgr limine cryptsetup \
  networkmanager iwd wireless-regdb \
  reflector bash-completion zsh \
  pipewire pipewire-alsa pipewire-pulse pipewire-jack wireplumber sof-firmware \
  bluez bluez-utils \
  acpi acpid power-profiles-daemon \
  firewalld cups avahi nss-mdns \
  util-linux terminus-font openssh man sudo rsync \
  amd-ucode mesa vulkan-radeon libva-mesa-driver

Generate fstab

genfstab -U /mnt >> /mnt/etc/fstab

System Configuration

Chroot in

arch-chroot /mnt

Timezone and locale

ln -sf /usr/share/zoneinfo/America/Denver /etc/localtime
hwclock --systohc

# Edit /etc/locale.gen, uncomment en_US.UTF-8 UTF-8
vim /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf

Console font and keymap

cat > /etc/vconsole.conf << EOF
KEYMAP=us
FONT=ter-132b
EOF

Hostname

echo "framework" > /etc/hostname

Root password

passwd

Create user

useradd -mG wheel phil
passwd phil
EDITOR=vim visudo  # uncomment %wheel ALL=(ALL:ALL) ALL

Configure mkinitcpio

Edit /etc/mkinitcpio.conf:

MODULES=(btrfs)
BINARIES=(/usr/bin/btrfs)
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt filesystems fsck)

Note: Add resume after filesystems if you want hibernation support.

Regenerate:

mkinitcpio -P

Limine Bootloader

Install Limine

mkdir -p /boot/EFI/limine
cp /usr/share/limine/BOOTX64.EFI /boot/EFI/limine/

Create NVRAM entry

efibootmgr --create --disk /dev/nvme0n1 --part 1 \
  --label "Arch Linux" \
  --loader '\EFI\limine\BOOTX64.EFI' \
  --unicode

Configure Limine

Create /boot/EFI/limine/limine.conf:

timeout: 3

/Arch Linux
  protocol: linux
  path: boot():/vmlinuz-linux
  cmdline: quiet cryptdevice=UUID=<YOUR-LUKS-UUID>:root root=/dev/mapper/root rw rootflags=subvol=@ rootfstype=btrfs cfg80211.ieee80211_regdom=US
  module_path: boot():/initramfs-linux.img

/Arch Linux (fallback)
  protocol: linux
  path: boot():/vmlinuz-linux
  cmdline: quiet cryptdevice=UUID=<YOUR-LUKS-UUID>:root root=/dev/mapper/root rw rootflags=subvol=@ rootfstype=btrfs cfg80211.ieee80211_regdom=US
  module_path: boot():/initramfs-linux-fallback.img

Replace <YOUR-LUKS-UUID> with the UUID from earlier.


Enable Services

systemctl enable NetworkManager
systemctl enable iwd
systemctl enable bluetooth
systemctl enable cups
systemctl enable avahi-daemon
systemctl enable firewalld
systemctl enable acpid
systemctl enable power-profiles-daemon
systemctl enable reflector.timer
systemctl enable fstrim.timer

Framework AMD Tweaks

Disable PC speaker

Create /etc/modprobe.d/nobeep.conf:

blacklist pcspkr
blacklist snd_pcsp

Lid behavior

Edit /etc/systemd/logind.conf:

HandlePowerKey=ignore
HandlePowerKeyLongPress=poweroff
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=suspend
HandleLidSwitchDocked=ignore

WiFi performance (MediaTek RZ616)

The AMD Framework uses MediaTek WiFi which needs some tuning.

Set regulatory domain — without this you're stuck on 2.4GHz:

# Add to Limine cmdline:
cfg80211.ieee80211_regdom=US

Use iwd as NetworkManager backend for better stability:

Create /etc/NetworkManager/conf.d/wifi-backend.conf:

[device]
wifi.backend=iwd

Disable WiFi power saving to prevent disconnects:

Create /etc/modprobe.d/mt7921.conf:

options mt7921e power_save=0

Headphone jack buzz fix

The AMD board has a slight buzz when audio is idle. Disable power saving:

Create /etc/modprobe.d/audio-powersave.conf:

options snd_hda_intel power_save=0

USB-A expansion card power drain

Avoid placing USB-A cards in the two rear slots — they cause higher idle power drain. Front slots are fine.

HDMI/DisplayPort expansion cards

Don't use the front-left slot for HDMI/DP cards — may not work on AMD.


Reboot

exit
umount -R /mnt
cryptsetup close root
reboot

Remove the USB drive.


Post-Install

Connect to WiFi

nmcli device wifi connect <SSID> password <password>

Install paru (AUR helper)

sudo pacman -S --needed git base-devel
git clone https://aur.archlinux.org/paru.git
cd paru && makepkg -si
cd .. && rm -rf paru

Enable pacman colors

Uncomment Color in /etc/pacman.conf.

Time sync

timedatectl set-ntp true

Pacman hook for Limine updates

Create /etc/pacman.d/hooks/99-limine.hook:

[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = limine

[Action]
Description = Deploying Limine after upgrade...
When = PostTransaction
Exec = /usr/bin/cp /usr/share/limine/BOOTX64.EFI /boot/EFI/limine/

BIOS updates

Framework AMD is well supported on LVFS. Check for updates:

sudo pacman -S fwupd
fwupdmgr refresh
fwupdmgr get-updates
fwupdmgr update

Note: If you have a batch 1 or 2 device, make sure BIOS is at least 3.03 before updating further.


Next Steps


References