KBArch LinuxArch Linux Install Guide
Public · no sign-in needed
Arch Linux

Arch Linux Install Guide

Arch Linux Install Guide

[!info] This guide was edited using Claude based off of my original Arch Install Guide from a few years ago to include any updates and heads up.

[!warning] This guide installs Arch single-boot using systemd-boot (far less headache than GRUB). If you ever dual-boot, you’d use GRUB and reuse the existing Windows EFI partition instead.

[!note] BIOS prep for a new machine (OptiPlex 5060) Before booting the ISO, in the Dell BIOS:

  • Secure Boot: OFF — the Arch ISO / systemd-boot / stock kernel aren’t signed against Microsoft keys.
  • TPM 2.0: leave ON (or ignore it). TPM does not need to be disabled — nothing in this install touches it unless you later enroll it (e.g. systemd-cryptenroll for LUKS auto-unlock). The Windows-11 “requires TPM” thing is unrelated.
  • Boot mode: UEFI (disable Legacy/CSM).

This machine’s SSD that we’ll be using as an example is M.2 SATA, so it shows up as /dev/sda, not /dev/nvme0n1. nvme list will show nothing. Device names below use /dev/sda — always confirm with lsblk first.

  1. Set Font
ls /usr/share/kbd/consolefonts/    # Hit <Tab> twice
setfont ter-132b
  1. Verify Boot Mode:
cat /sys/firmware/efi/fw_platform_size
# "64" = 64-bit UEFI. If the file doesn't exist, you're in BIOS/Legacy mode
  1. Verify Network
ping archlinux.org    # Skip to 3 if this works (desktop on Ethernet: should just work)

# If on Wi-Fi:
iwctl
device list    # Assume output was "wlan0"
station wlan0 scan
station wlan0 get-networks
station wlan0 connect <SSID>
exit
ping archlinux.org
  1. Set Clock (optional in live env)
timedatectl set-timezone America/New_York
  1. Verify Drive and RAM
lsblk        # Lists all drives. Your M.2 SATA SSD is almost certainly /dev/sda.
# nvme list  # Use this if you have NVME drives.

free -h      # Lists available/total RAM which swap size. We have 8GB.
  1. Partition Drive
fdisk /dev/sda

# Partition 1: EFI  at +1GiB          (type: EFI System)
# Partition 2: SWAP at +16GiB         (see note below)
# Partition 3: root at Everything Else (Linux filesystem)

# "+1GiB" tells fdisk to cut the partition off after 1GiB, leaving the rest free.
# "-1GiB" would instead leave 1GiB free at the end. We never need '-' since root is last.
#
# Swap sizing: the old "2x RAM" rule is dead. Real reason to size swap here is HIBERNATION:
# you need swap >= RAM (>=8GiB) to suspend-to-disk. 16GiB is fine and leaves headroom.
# If you don't care about hibernation, 4-8GiB is plenty. zram is a good modern alternative.
#
# Dual-booting only: skip the EFI partition and reuse the Windows ESP (with GRUB).
  1. Format/Mount Partitions
mkfs.fat -F 32 /dev/sda1
mkswap /dev/sda2
mkfs.ext4 /dev/sda3

mount /dev/sda3 /mnt
swapon /dev/sda2
mount --mkdir /dev/sda1 /mnt/boot

# systemd-boot convention: mount the ESP at /boot so kernel + loader live together.
# ('mount --mkdir' creates /mnt/boot for you.)
  1. Install Packages
pacstrap -K /mnt base linux linux-firmware intel-ucode
# intel-ucode = CPU microcode for the i5-8500. Loaded at boot via a loader initrd line (step 11).
# -K initializes a fresh pacman keyring.
  1. GenFstab, Chroot, Install Prereqs, Set Time Zone
genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt
pacman -S vim
ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime
hwclock --systohc
# NOTE: don't run `timedatectl set-ntp true` in chroot since systemd isn't running (no D-Bus). NTP gets enabled later via systemd-timesyncd (step 15).
  1. Generate Locale
vim /etc/locale.gen
# Uncomment: "en_US.UTF-8 UTF-8"
locale-gen
vim /etc/locale.conf
# Write: "LANG=en_US.UTF-8" (WITHOUT THE QUOTES)
  1. Set Hostname and Root Password
vim /etc/hostname
passwd
  1. Install and Setup Bootloader
bootctl install
bootctl    # Should say "0 entries" at the bottom (we create them manually next)

# Grab JUST the filesystem UUID of the root partition:

# ^ copy this value into the two entries below (root=UUID=...).
# Careful: UUID (filesystem) != PARTUUID (partition). Since we use root=UUID=, use the UUID.

vim /boot/loader/entries/arch.conf
# Write:
title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
# ^ intel-ucode initrd MUST come before the kernel's initramfs.

# Add UUID to Config:
echo "options root=UUID=$(blkid -s UUID -o value /dev/sda3) rw" >> /boot/loader/entries/arch.conf

# exit Vim (lol), then copy the previous command to a new file
cp /boot/loader/entries/arch{.conf,-fallback.conf}

# Note UUID here; when you VIM into fallback, you SHOULD see that UUID.
blkid -s UUID -o value /dev/sda3

# Edit Fallback config
vim /boot/loader/entries/arch-fallback.conf
# ONLY THESE TWO LINES NEED TO BE CHANGED:
title   Arch Linux (fallback initramfs)
initrd  /initramfs-linux-fallback.img

# Edit Bootloader Config
vim /boot/loader/loader.conf
# Write:
default arch.conf
timeout 0            # Hold <Space> during boot to reach the menu
console-mode max
editor  0

# Verify:
bootctl              # Should now list the default entry we created
  1. Setup Network Manager
pacman -S networkmanager
systemctl enable NetworkManager
# The 5060 is a desktop — Ethernet only unless a Wi-Fi card was added, so plain NetworkManager
# is enough. Don't also enable iwd standalone; two daemons fighting over one device causes grief.
#
# If this WERE a Wi-Fi box and you wanted iwd as the backend (better than wpa_supplicant),
# install iwd and add /etc/NetworkManager/conf.d/wifi_backend.conf:
#   [device]
#   wifi.backend=iwd
# ...and enable ONLY NetworkManager (it drives iwd over D-Bus). Do not enable iwd.service too.
  1. Exit Live Environment
exit
umount -R /mnt      # If it complains, lazy unmount: umount -R -l /mnt
reboot
# On login screen, login as root.
  1. Verify Network
ping archlinux.org
# Ethernet should be up automatically via NetworkManager.
  1. Update System
pacman -Syu
# S: Sync   y: Refresh package DB   u: Upgrade installed packages

systemctl enable --now systemd-timesyncd.service
# Enables NTP time sync (the piece we skipped in chroot).

Next Steps:

  1. [[Patch EFI Security Hole]]
  2. Create [[New User]]
  3. Setup [[Sudo]]
  4. Install graphics drivers — not Nvidia on this box. The i5-8500 uses integrated UHD 630: pacman -S mesa intel-media-driver (add vulkan-intel if you want Vulkan)
  5. Install [[i3 Desktop Environment]] or [[Archive/KDE Plasma DE on Arch]]
  6. Customize Arch Linux