Assumes a UEFI system, single-disk setup, no encryption (LUKS), no LVM.
If you have different requirements, you can still read on and look up the relevant commands.
If you want an automated script, see the simple install script:
- Arch Linux Installation Guide
https://wiki.archlinux.org/title/Installation_guide - LearnLinuxTV – Arch Install Walkthrough
https://www.learnlinux.tv/how-to-install-arch-linux-a-comprehensive-step-by-step-guide/
- Download ISO
https://archlinux.org/download/ - Create bootable USB (Ventoy)
- Disable Secure Boot
required for unsigned bootloaders; Ventoy + GRUB commonly fail otherwise
https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot - Boot: Arch Linux install medium (x86_64, UEFI)
- Ventoy mounts ISO
- rootfs extracted to RAM
- Land in live TTY
If using Ethernet, NetworkManager usually auto-connects — Wi-Fi steps can be skipped.
Check if any interface already has an IP
ip addr show
Wi-Fi using iwd
iwctl
station <iface> get-networks
exitiwctl --passphrase "<password>" station <iface> connect <SSID>
ping google.comiwd reference
https://wiki.archlinux.org/title/Iwd
Set correct system time (important for pacman keyring and TLS)
timedatectl list-timezones # see available timezones
timedatectl set-timezone <timezone>
timedatectlDetect firmware type
ls /sys/firmware/efi/efivars
Presence means UEFI boot mode — later steps (EFI partition, GRUB target) depend on this
https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface
Identify target disk (remember this value)
lsblk
fdisk -lChoose a disk and use it completely (e.g. /dev/nvme0n1), not individual partitions
Partitioning assumptions
- No LUKS
- No LVM
- Single root filesystem
- Separate EFI + swap
- GPT partition table (required for UEFI)
https://wiki.archlinux.org/title/Partitioning#GUID_Partition_Table
Why these sizes
- EFI (1G): enough for multiple kernels and bootloaders
https://wiki.archlinux.org/title/EFI_system_partition - Swap (4G): safe baseline for systems with 8–16G RAM; supports hibernation if RAM ≤ swap
https://wiki.archlinux.org/title/Swap - Root: remaining space
fdisk /dev/nvme0n1
Create partitions
- EFI System Partition – 1G
- Swap – 4G
- Linux filesystem – rest (type 20)
- EXT4 root partition (for BTRFS/ZFS etc., only the
mkfscommand changes)
mkfs.vfat -F32 /dev/nvme0n1p1 # partition 1: EFI
mkfs.ext4 /dev/nvme0n1p3 # partition 3: root
mkswap /dev/nvme0n1p2 # partition 2: swap
swapon /dev/nvme0n1p2
lsblkMount root first, EFI at standard UEFI path
mount /dev/nvme0n1p3 /mnt
mount --mkdir /dev/nvme0n1p1 /mnt/boot/efiUEFI systems require EFI mounted before bootloader install
BIOS systems differ and are not discussed here — see the link below
https://wiki.archlinux.org/title/GRUB#BIOS_systems
Initialize trust database (required before pacstrap)
pacman-key --init
pacman-key --populatehttps://wiki.archlinux.org/title/Pacman/Package_signing
- Install
intel-ucodefor Intel CPUs,amd-ucodefor AMD CPUs (based on your system)
pacstrap -i /mnt \
base linux linux-firmware \
linux-lts linux-lts-firmware \
vim grub efibootmgr sudo \
networkmanager dhclient wpa_supplicant dialog \
intel-ucode man man-db pacmanNotes
- LTS kernel provides fallback stability
intel-ucode/amd-ucodeapplied automatically by GRUB on boot
https://wiki.archlinux.org/title/Microcode- Install
linux-headerslater if building DKMS/kernel modules
https://wiki.archlinux.org/title/Fstab
Generate filesystem table (fstab): defines what gets mounted at boot and where
Uses UUIDs to avoid disk name changes
genfstab -U /mnt
genfstab -U /mnt >> /mnt/etc/fstabVerify UUID-based mounts before proceeding
arch-chroot /mntpasswd
enter root password
useradd -m -G wheel <user>
passwd <user>create primary user
echo "<hostname>" > /etc/hostnameremember this hostname value
ln -sf /usr/share/zoneinfo/Asia/Kolkata /etc/localtime
hwclock --systohcvim /etc/locale.genuncomment en_US.UTF-8 UTF-8 (or your locale)
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.confhttps://wiki.archlinux.org/title/Locale
grub-install \
--target=x86_64-efi \
--efi-directory=/boot/efi \
--bootloader-id=GRUBUEFI-only — do not use on BIOS systems
cp /usr/share/locale/en@quot/LC_MESSAGES/grub.mo \
/boot/grub/locale/en.moGRUB localized messages
grub-mkconfig -o /boot/grub/grub.cfgFinalize GRUB configuration — regenerates menu using installed kernels and initramfs
https://wiki.archlinux.org/title/GRUB
For AMD or NVIDIA GPUs, see:
pacman -S mesa intel-media-driverMesa = OpenGL, intel-media-driver = VAAPI decode
lspci | grep -i vgahttps://wiki.archlinux.org/title/Intel_graphics
exitumount -R /mnt
rebootnmcli radio wifi on
nmcli device wifi list
nmcli device wifi connect <SSID> password "<password>"If connection fails, check interface names with:
nmcli device status
https://wiki.archlinux.org/title/NetworkManager
su
pacman -S sudo
visudoUncomment this line
%wheel ALL=(ALL:ALL) ALL
usermod -aG wheel <user>
logout # group changes apply only after new login
groups
sudo whoami # verify sudoThis guide continues with Sway.
If you want another desktop (GNOME, KDE, Hyprland), consult the relevant Arch Wiki pages below.
- Sway: https://wiki.archlinux.org/title/Sway
- KDE: https://wiki.archlinux.org/title/KDE
- GNOME: https://wiki.archlinux.org/title/GNOME
pacman -S sway swayidle swaybg waybar rofi \
xorg-xwayland xorg-xlsclients \
qt5-wayland glfw-wayland \
brightnessctlhttps://wiki.archlinux.org/title/Arch_User_Repository
pacman -S base-devel git
git clone https://aur.archlinux.org/yay.git
cd yay && makepkg -siyay -S swaylock-effectshttps://wiki.archlinux.org/title/SDDM
A display manager handles graphical login and session startup
sudo pacman -S sddm
systemctl enable sddm# edit file /etc/sddm.conf
[Autologin]
User=<user>
Session=sway
[General]
Numlock=on# edit file /usr/share/xsessions/sway.desktop
[Desktop Entry]
Name=Sway
Exec=sway
Type=ApplicationPipeWire replaces PulseAudio and integrates ALSA under one stack.
- ALSA: kernel-level audio drivers
- PulseAudio: legacy user-space sound server
- PipeWire: modern low-latency replacement for both
https://wiki.archlinux.org/title/PipeWire
pacman -S pipewire pipewire-pulse pavucontrol
systemctl --user enable --now pipewire pipewire-pulsepacman -S rtkit alsa-utils sof-firmware
systemctl enable --now rtkit-daemonIf no audio, check:
pactl infopavucontrol
https://wiki.archlinux.org/title/Bluetooth
pacman -S bluez bluez-utils blueman
modprobe btusb # loads Bluetooth USB kernel module (no output means success)
systemctl enable --now bluetoothpacman -S base-devel curl rsync wget zip unzip tar \
vlc libreoffice-fresh btop stow exa \
nomacs okular cliphist ssh neofetch nemo \
calibre dmidecode gvfs jmtpfs usbutils \
man-pages inetutils speech-dispatcherExample dev setup — install tools based on your workflow and usage
yay -S tmux fzf gdb fd ripgrep \
python python-pip python-neovim \
jq cmake bear xremapsh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"- Edit
/etc/pacman.conf - Under
[options], uncomment:Color
cd ~
git clone https://github.com/guptaanurag2106/dotfiles.git
cd dotfiles
# use stow or just ln -s
git config core.fileMode falsesystemctl enable --now fstrim.timerhttps://wiki.archlinux.org/title/Solid_state_drive
pacman -S udisks2
udisksctl power-off -b /dev/sdX- PowerTOP
https://wiki.archlinux.org/title/PowerTOP - TLP (laptops)
https://wiki.archlinux.org/title/TLP - thermald (Intel laptops, preferred for thermal control)
https://wiki.archlinux.org/title/thermald - auto-cpufreq
https://github.com/AdnanHodzic/auto-cpufreq