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 |
|
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
resumeafterfilesystemsif 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
- 10-19 LIFE/13 TECH SETUP/13.13 OS SETUP/Hyprland Setup — graphical environment
- 10-19 LIFE/13 TECH SETUP/13.13 OS SETUP/Network — advanced networking
- Snapper for BTRFS snapshots
- Swap/hibernation setup