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

  • Hyprland Setup — graphical environment
  • Network — advanced networking
  • Snapper for BTRFS snapshots
  • Swap/hibernation setup

References