My Arch 2025 Setup
Install
cfdisk -z /dev/nvme0n1 # choose gpt, make small 512MB boot partition with type EFI System and the rest Linux Filesystem
mkfs.vfat -F 32 /dev/nvme0n1p1
mkfs.ext4 -L rootfs /dev/nvme0n1p2
mount /dev/nvme0n1p2 /mnt
mkdir -p /mnt/boot
mount /dev/nvme0n1p1 /mnt/boot
pacstrap /mnt base linux linux-firmware efibootmgr vim
genfstab /mnt > /mnt/etc/fstab
arch-chroot /mnt
passwd
bootctl install
cp /usr/share/systemd/bootctl/arch.conf /boot/loader/entries/arch.conf # edit with root=LABEL=rootfs
exit
umount -R /mnt
reboot
Locale (language, keyboard layout)
uncomment your desired locale in /etc/locale.gen
locale-gen
localectl set-keymap uk
localectl set-locale en_GB.UTF-8
timedatectl set-timezone Europe/London
Simple DHCP with systemd-networkd and systemd-resolved
/etc/systemd/network/lan.network
[Match]
Name=enp3s0
[Network]
DHCP=yes
systemctl enable systemd-networkd systemd-resolved
ln -sf /lib/systemd/resolv.conf /etc/resolv.conf
systemctl start systemd-networkd systemd-resolved
Create user
groupadd -r nopasswdlogin
useradd -m -G nopasswdlogin,wheel,audio,video,power,network <username>
Enable multilib for steam
/etc/pacman.conf
...
[multilib]
Include = /etc/pacman.d/mirrorlist
Xorg
pacman -S lxterminal rofi emptty i3 xorg
Wayland
pacman -S pcmanfm-gtk3 hyprpolkitagent xdg-desktop-portal-hyprland qt6-wayland uwsm libnewt waybar grim
Packages
pacman -S man-db chromium bash-completion steam discord pipewire wireplumber pipewire-pulse pipewire-alsa pavucontrol openssh thunar ttf-iosevkaterm-nerd papirus-icon-theme qt5ct linux-headers nvidia-open nvidia-open-dkms lib32-nvidia-utils htop git sudo base-devel smbclient bluez bluez-utils dunst xdg-desktop-portal power-profiles-daemon noto-fonts-emoji otf-font-awesome pavucontrol python-gobject flameshot
emptty display manager (Xorg)
/etc/emptty/conf
...
AUTOLOGIN=true
AUTOLOGIN_SESSION=i3
DEFAULT_USER=<user>
LANG=en_GB.UTF-8
~/.config/emptty
#!/bin/sh
Selection=true
xrandr --output DP-4 --mode 2560x1440 --rate 144
. /etc/profile
. ~/.bashrc
export BROWSER=chromium
export EDITOR=nvim
exec dbus-launch $@
systemctl enable emptty.service
fstab for games
mkdir /media/games
chown user:user /media/games
/etc/fstab
...
LABEL=games /media/games ext4 defaults,noatime,nodiratime,nobarrier,data=writeback,commit=60 0 0
sudo
visudo
Tinker with the secure_path and env_keep to preferred setup such as keep $HOME and $EDITOR
bluetooth mouse
pacman -S bluez bluez-utils
systemctl enable --now bluetooth.service
bluetoothctl
scan on
pair <mac>
dotfiles
clone my dotfiles
undervolt nvidia card
Thanks to rexpulli
pip install pynvml
# /etc/systemd/system/nvidia-undervolt.py
#!/usr/bin/env python
from pynvml import *
from ctypes import byref
nvmlInit()
device = nvmlDeviceGetHandleByIndex(0)
nvmlDeviceSetGpuLockedClocks(device,210,1650)
nvmlDeviceSetPowerManagementLimit(device,235000)
info = c_nvmlClockOffset_t()
info.version = nvmlClockOffset_v1
info.type = NVML_CLOCK_GRAPHICS
info.pstate = NVML_PSTATE_0
info.clockOffsetMHz = 275
nvmlDeviceSetClockOffsets(device, byref(info))
nvmlShutdown()
# /etc/systemd/system/nvidia-undervolt.service
[Unit]
Description=Undervolt the first available Nvidia GPU device
[Service]
Type=oneshot
ExecStart=/etc/systemd/system/nvidia-undervolt.py
[Install]
WantedBy=graphical.target