466 lines
8.6 KiB
Markdown
466 lines
8.6 KiB
Markdown
---
|
|
publish: true
|
|
permalink: /os/base-install
|
|
title: Base Install
|
|
created: 2026-01-29T14:10:28.844-07:00
|
|
modified: 2026-02-05T12:17:52.905-07:00
|
|
tags:
|
|
- arch
|
|
- installation
|
|
- luks
|
|
- btrfs
|
|
cssclasses: ""
|
|
---
|
|
|
|
|
|
My Arch Linux installation guide for Framework Laptop 13 (AMD Ryzen 7040). LUKS2 encrypted BTRFS with Limine bootloader.
|
|
|
|
> Based on guides by [yovko](https://gist.github.com/yovko/512326b904d120f3280c163abfbcb787) and [mgajewskik](https://gist.github.com/mgajewskik/a9331171c31b6e8839c427210ba76730), 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](https://archlinux.org/download/).
|
|
|
|
### Connect to WiFi
|
|
|
|
```bash
|
|
iwctl station wlan0 connect <SSID>
|
|
```
|
|
|
|
### Set keymap and font
|
|
|
|
```bash
|
|
loadkeys us
|
|
setfont ter-132b
|
|
```
|
|
|
|
### Verify UEFI mode
|
|
|
|
```bash
|
|
cat /sys/firmware/efi/fw_platform_size
|
|
# Should return 64
|
|
```
|
|
|
|
### (Optional) SSH in from another machine
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
sgdisk --zap-all /dev/nvme0n1
|
|
```
|
|
|
|
### Create partitions
|
|
|
|
- **ESP:** 2GB FAT32 for `/boot`
|
|
- **System:** Rest of disk, LUKS2 encrypted BTRFS
|
|
|
|
```bash
|
|
parted --script /dev/nvme0n1 \
|
|
mklabel gpt \
|
|
mkpart ESP fat32 1MiB 2049MiB \
|
|
set 1 esp on \
|
|
mkpart Linux btrfs 2050MiB 100%
|
|
```
|
|
|
|
### Format ESP
|
|
|
|
```bash
|
|
mkfs.fat -F 32 /dev/nvme0n1p1
|
|
```
|
|
|
|
---
|
|
|
|
## Encryption Setup
|
|
|
|
### Create LUKS container
|
|
|
|
```bash
|
|
cryptsetup luksFormat /dev/nvme0n1p2
|
|
```
|
|
|
|
**Save the UUID** — you'll need it for the bootloader:
|
|
|
|
```bash
|
|
cryptsetup luksUUID /dev/nvme0n1p2
|
|
```
|
|
|
|
### Open the container
|
|
|
|
```bash
|
|
cryptsetup open /dev/nvme0n1p2 root
|
|
```
|
|
|
|
---
|
|
|
|
## BTRFS Setup
|
|
|
|
### Format and mount
|
|
|
|
```bash
|
|
mkfs.btrfs /dev/mapper/root
|
|
mount /dev/mapper/root /mnt
|
|
```
|
|
|
|
### Create subvolumes
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
genfstab -U /mnt >> /mnt/etc/fstab
|
|
```
|
|
|
|
---
|
|
|
|
## System Configuration
|
|
|
|
### Chroot in
|
|
|
|
```bash
|
|
arch-chroot /mnt
|
|
```
|
|
|
|
### Timezone and locale
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
cat > /etc/vconsole.conf << EOF
|
|
KEYMAP=us
|
|
FONT=ter-132b
|
|
EOF
|
|
```
|
|
|
|
### Hostname
|
|
|
|
```bash
|
|
echo "framework" > /etc/hostname
|
|
```
|
|
|
|
### Root password
|
|
|
|
```bash
|
|
passwd
|
|
```
|
|
|
|
### Create user
|
|
|
|
```bash
|
|
useradd -mG wheel phil
|
|
passwd phil
|
|
EDITOR=vim visudo # uncomment %wheel ALL=(ALL:ALL) ALL
|
|
```
|
|
|
|
### Configure mkinitcpio
|
|
|
|
Edit `/etc/mkinitcpio.conf`:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
mkinitcpio -P
|
|
```
|
|
|
|
---
|
|
|
|
## Limine Bootloader
|
|
|
|
### Install Limine
|
|
|
|
```bash
|
|
mkdir -p /boot/EFI/limine
|
|
cp /usr/share/limine/BOOTX64.EFI /boot/EFI/limine/
|
|
```
|
|
|
|
### Create NVRAM entry
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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`:
|
|
|
|
```ini
|
|
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:
|
|
|
|
```bash
|
|
# Add to Limine cmdline:
|
|
cfg80211.ieee80211_regdom=US
|
|
```
|
|
|
|
**Use iwd as NetworkManager backend** for better stability:
|
|
|
|
Create `/etc/NetworkManager/conf.d/wifi-backend.conf`:
|
|
|
|
```ini
|
|
[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
|
|
|
|
```bash
|
|
exit
|
|
umount -R /mnt
|
|
cryptsetup close root
|
|
reboot
|
|
```
|
|
|
|
Remove the USB drive.
|
|
|
|
---
|
|
|
|
## Post-Install
|
|
|
|
### Connect to WiFi
|
|
|
|
```bash
|
|
nmcli device wifi connect <SSID> password <password>
|
|
```
|
|
|
|
### Install paru (AUR helper)
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
timedatectl set-ntp true
|
|
```
|
|
|
|
### Pacman hook for Limine updates
|
|
|
|
Create `/etc/pacman.d/hooks/99-limine.hook`:
|
|
|
|
```ini
|
|
[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:
|
|
|
|
```bash
|
|
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
|
|
|
|
---
|
|
|
|
## References
|
|
|
|
- [Arch Wiki: Framework Laptop 13](https://wiki.archlinux.org/title/Framework_Laptop_13)
|
|
- [Arch Wiki: Installation Guide](https://wiki.archlinux.org/title/Installation_guide)
|
|
- [Arch Wiki: Limine](https://wiki.archlinux.org/title/Limine)
|
|
- [Arch Wiki: BTRFS](https://wiki.archlinux.org/title/Btrfs)
|
|
- [Arch Wiki: dm-crypt](https://wiki.archlinux.org/title/Dm-crypt)
|