Installing Arch Linux

Table of Contents
- Official Arch Linux installation guide: https://wiki.archlinux.org/title/Installation_guide
- Official Arch Linux website: https://archlinux.org/
Youtube Guides #
Jay is explaining how to install Arch Linux on a potato… π₯Beginner friendly ARCH LINUX Installation Guide and Walkthrough by a fantastic host, Bread on Penguins
Pre-requisites #
- Download Arch Linux:
- Prepare bootable installation media
- Disable secure boot (for installation only)
More info: Boot the live environment
- Boot to Arch Linux installation media
Installation #

Ensure network connectivity #
ip addr show
If your machine is connected to the network, you should see an IP address. If it isn’t, here is how to set up a wi-fi:
iwctl
# Check available wifi networks
[iwd]# station wlan0 get-networks
[iwd]# exit
# Setup wifi
iwctl --passphrase "WIFI_PASSWORD" station wlan0 connect WIFI_NETWORK
ip addr show
Enable SSH #
Only for the installer at this stage!
# Ensure sshd is running
systemctl status sshd
# Set the root password (Below password is only for the installer. Actual root password will be set later.)
passwd
# Connect to the installer via SSH
ssh -l root INSTALLER_IP # ip addr show

Find out details about your HDD and identify your device #
root@archiso ~ # lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 971.9M 1 loop /run/archiso/airootfs
sda 8:0 0 100G 0 disk
sr0 11:0 1 1.4G 0 rom /run/archiso/bootmnt
In my case, it will be sda.
Setup partitions #
root@archiso ~ # fdisk /dev/sda
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help):
# Check partition layout
Command (m for help): p
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
# Create a new empty GPT partition table
Command (m for help): g
Created a new GPT disklabel (GUID: 91B05E54-080D-42B4-B6CE-7BBF7BB7DE27).
Command (m for help): p
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
- Create
Bootpartition
# Create Boot partition
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-209715166, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-209715166, default 209713151): +1G
- Create
EFIpartition
# Create EFI partition
Command (m for help): n
Partition number (2-128, default 2):
First sector (2099200-209715166, default 2099200):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-209715166, default 209713151): +1G
- Create
LVMpartition
# Create LVM partition (use all available space left)
Command (m for help): n
Partition number (3-128, default 3):
First sector (4196352-209715166, default 4196352):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4196352-209715166, default 209713151):
Created a new partition 3 of type 'Linux filesystem' and of size 98 GiB.
# Setup type (Linux LVM) for /home partition (Type 44)
Command (m for help): t
Partition number (1-3, default 3): 3
Partition type or alias (type L to list all): 44
Changed type of partition 'Linux filesystem' to 'Linux LVM'.
- Check current partition layout before saving to disk
# Check current parition layout
Command (m for help): p
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F752CE96-DCE7-48E5-9256-82F162692E71
Device Start End Sectors Size Type
/dev/sda1 2048 2099199 2097152 1G Linux filesystem
/dev/sda2 2099200 4196351 2097152 1G Linux filesystem
/dev/sda3 4196352 209713151 205516800 98G Linux LVM
- Write to disk (DESTRUCTIVE!)
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Format partitions #
- Check your partitions first
root@archiso ~ # lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 971.9M 1 loop /run/archiso/airootfs
sda 8:0 0 100G 0 disk
ββsda1 8:1 0 1G 0 part
ββsda2 8:2 0 1G 0 part
ββsda3 8:3 0 98G 0 part
sr0 11:0 1 1.4G 0 rom /run/archiso/bootmnt
- Format
Bootpartition (FAT32)
root@archiso ~ # mkfs.fat -F32 /dev/sda1
mkfs.fat 4.2 (2021-01-31)
- Format
EFIpartition (EXT4)
root@archiso ~ # mkfs.ext4 /dev/sda2
mke2fs 1.47.3 (8-Jul-2025)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: b253b84c-9e45-4213-a3c8-ea5fdeead589
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
Encrypt LVM partition #
root@archiso ~ # cryptsetup luksFormat /dev/sda3
WARNING!
========
This will overwrite data on /dev/sda3 irrevocably.
Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/sda3:
Verify passphrase:
cryptsetup luksFormat /dev/sda3 6.82s user 0.26s system 39% cpu 18.132 total
Setup LVM #
- Open an Encrypted Volume
root@archiso ~ # cryptsetup open --type luks /dev/sda3 lvm
Enter passphrase for /dev/sda3:
lvm is just an arbitrary name at this stage and this is not the final name for the encrypted volume. It is however referenced in the next step by that name when creating physical volume with /dev/mapper.- Create “physical” volumes for
LVM
root@archiso ~ # pvcreate /dev/mapper/lvm
Physical volume "/dev/mapper/lvm" successfully created.
- Create
Volume Group
root@archiso ~ # vgcreate volgroup0 /dev/mapper/lvm
Volume group "volgroup0" successfully created
- Create
Logical Volume
Logical Volume as of an actual partition that you would use.# Create Logical Volume for / partition
root@archiso ~ # lvcreate -L 30GB volgroup0 -n lv_root
Logical volume "lv_root" created.
# Create Logical Volume for /home partition (use remaining space)
root@archiso ~ # lvcreate -l 100%FREE volgroup0 -n lv_home
Logical volume "lv_home" created.
More about LVM: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)
Verify partitions #
- Check
Volume Groups
root@archiso ~ # vgdisplay
--- Volume group ---
VG Name volgroup0
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 97.98 GiB
PE Size 4.00 MiB
Total PE 25083
Alloc PE / Size 25083 / 97.98 GiB
Free PE / Size 0 / 0
VG UUID uL93dl-6Gr4-IXsX-wAsB-GtWH-T8VR-Og6G5l
- Check
Logical Volumesinside ofLVM
root@archiso ~ # lvdisplay
--- Logical volume ---
LV Path /dev/volgroup0/lv_root
LV Name lv_root
VG Name volgroup0
LV UUID bli8Lr-3fwu-QLpL-ghQU-VNd9-4GMV-k9SaB7
LV Write Access read/write
LV Creation host, time archiso, 2026-01-05 23:01:05 +0000
LV Status available
# open 0
LV Size 30.00 GiB
Current LE 7680
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 16384
Block device 253:1
--- Logical volume ---
LV Path /dev/volgroup0/lv_home
LV Name lv_home
VG Name volgroup0
LV UUID 1xqy4g-AHAk-H1fM-EXp6-dGux-QVII-0yKj63
LV Write Access read/write
LV Creation host, time archiso, 2026-01-05 23:03:49 +0000
LV Status available
# open 0
LV Size 67.98 GiB
Current LE 17403
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 16384
Block device 253:2
lv_root and lv_homehave now been created successfully.Format and mount logical volumes #
Your logical volumes should now be located in /dev/volgroup0/. If you cannot find them, use the next commands to bring up the module for creating device nodes and to make volume groups available.
- Insert
dm_modkernel module
modprobe dm_mod is used to load the device-mapper module in Linux, which is necessary for certain functionalities like Logical Volume Management (LVM).# Insert dm_mod kernel module
root@archiso ~ # modprobe dm_mod
- Scan for available
Volume Groups
# Scan for available Volume Groups
root@archiso ~ # vgscan
Found volume group "volgroup0" using metadata type lvm2
- Activate all scanned
Volume Groups
# Activate Volume Groups
root@archiso ~ # vgchange -ay
2 logical volume(s) in volume group "volgroup0" now active
More info about this section: https://wiki.archlinux.org/title/Install_Arch_Linux_on_LVM
- Format
Volume Groups
# Format lv_root
root@archiso ~ # mkfs.ext4 /dev/volgroup0/lv_root
mke2fs 1.47.3 (8-Jul-2025)
Creating filesystem with 7864320 4k blocks and 1966080 inodes
Filesystem UUID: 97a9da1d-a976-490a-80c3-148fc3961276
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
# Format lv_home
root@archiso ~ # mkfs.ext4 /dev/volgroup0/lv_home
mke2fs 1.47.3 (8-Jul-2025)
Creating filesystem with 17820672 4k blocks and 4456448 inodes
Filesystem UUID: f1130f8f-9ee9-46d4-b6a8-cd279ec07048
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
Mount partitions #
# Mount lv_root to /mnt
root@archiso ~ # mount /dev/volgroup0/lv_root /mnt
# Create /mnt/boot and mount boot partition (/dev/sda2) there
root@archiso ~ # mkdir /mnt/boot
root@archiso ~ # mount /dev/sda2 /mnt/boot
# Create /mnt/home and mount home partition (/dev/volgroup0/lv_home) there
root@archiso ~ # mkdir /mnt/home
root@archiso ~ # mount /dev/volgroup0/lv_home /mnt/home
Install required packages #
- Install Arch Linux base packages on /mnt (lv_root)
root@archiso ~ # pacstrap -i /mnt base

Generate fstab #
Generate fstab in order to be able to boot partitions at boot time.
# Generate fstab
root@archiso ~ # genfstab -U -p /mnt >> /mnt/etc/fstab
# Check what's in generated file.
root@archiso ~ # cat /mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/mapper/volgroup0-lv_root
UUID=97a9da1d-a976-490a-80c3-148fc3961276 / ext4 rw,relatime 0 1
# /dev/sda2
UUID=b253b84c-9e45-4213-a3c8-ea5fdeead589 /boot ext4 rw,relatime 0 2
# /dev/mapper/volgroup0-lv_home
UUID=f1130f8f-9ee9-46d4-b6a8-cd279ec07048 /home ext4 rw,relatime 0 2
Access Arch chroot environment #
Bear in mind we are now logged in into an in-progress installation. We left the installer and we are now inside of Arch chroot environment that will soon become our live system.
Any commands issued after this point are being issued against soon-to-be-ready Arch Linux system!

root@archiso ~ # arch-chroot /mnt
[root@archiso /]#
- Setup
root passwordfor the actualrootuser
[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully
- Create new
sudouser
[root@archiso /]# useradd -m -g users -G wheel robk
[root@archiso /]# passwd robk
New password:
Retype new password:
passwd: password updated successfully
Install additional packages #
[root@archiso /]# pacman -S base-devel dosfstools grub efibootmgr gnome gnome-tweaks lvm2 mtools vim networkmanager openssh os-prober sudo
base-develdosfstoolsgrub- boot managerefibootmgr- EFI boot manager packagegnome- GUIgnome-tweaks- gnome tweakslvm2- so Arch knows how to access ourLVMmtoolsvim- text editornetworkmanager- network manageropenssh- Open SSHos-prober- optional (Dual Boot)sudo- ;)
Enable Open SSH
systemctl enable sshd
Install the Linux Kernel #
[root@archiso /]# pacman -S linux linux-headers linux-lts linux-lts-headers
In this scenario, we are installing 2 kernels. Normal one and LTS. If one fails, we could fail over to the next one…
If you are experiencing ERROR: file not found: '/etc/vconsole.conf' during Kernel installation process:
| |
Follow this guide:
https://wiki.archlinux.org/title/Linux_console/Keyboard_configuration
The error message “ERROR: file not found: ‘/etc/vconsole.conf’” indicates that your system is unable to locate the vconsole.conf file, which is essential for configuring the virtual console settings, such as keyboard mapping and console font.
The vconsole.conf file is used during the boot process to set up the virtual console environment. If this file is missing, you may encounter issues with character display and keyboard functionality in the console.
Creating vconsole.conf
If the file does not exist, you can create it manually. Hereβs how:
- Use a text editor to create the file:
vim /etc/vconsole.conf
- Add the necessary configurations. For example:
KEYMAP=uk
FONT=161
Check available keymaps and fonts for your locale:
localectl list-keymaps
ls -l /usr/share/kbd/consolefonts/
Console Fonts screenshots: https://adeverteuil.github.io/linux-console-fonts-screenshots
- Save the file and exit the editor.
After Creating the File
Re-run the command and ensure no errors:
[root@archiso /]# pacman -S linux linux-headers linux-lts linux-lts-headers
Ensure image generation successful
| |
Below is next required step for this to work but in our case, we still have to reconfigure the HOOKS so this will be completed at a later stage. FYI only.
Once you have created and configured vconsole.conf, you may need to rebuild your initramfs to apply the changes. You can do this with the following command:
sudo mkinitcpio -P
- Install the Linux Firmware packages (drivers)
[root@archiso /]# pacman -S linux-firmware

Install VGA drivers #
Find out what hardware you have…
[root@archiso /]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation 82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Device 1234:1111 (rev 02)
00:03.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
00:05.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge
00:08.0 Communication controller: Red Hat, Inc. Virtio console
00:12.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:1e.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge
00:1f.0 PCI bridge: Red Hat, Inc. QEMU PCI-PCI bridge
01:01.0 SCSI storage controller: Red Hat, Inc. Virtio SCSI
For intel, install mesa package
[root@archiso /]# pacman -S mesa
For NVidia GPU’s
[root@archiso /]# pacman -S nvidia nvidia-utils nvidia-lts
βΉοΈ Note: Remember including nvidia-lts package if you installed linux-lts kernel.

Install hardware decoding #
- For Intel Chipsets
[root@archiso /]# pacman -S intel-media-driver
- For NVidia Chipsets
[root@archiso /]# pacman -S libva-mesa-driver
Modify Special Config File #
[root@archiso /]# vim /etc/mkinitcpio.conf
- Modify HOOKS to ensure they include encrypted
LVMinfo
# EDIT
HOOKS=(base systemd autodetect microcode modconf kms keyboard keymap sd-vconsole block filesystems fsck)
Ensure you add encrypt and lvm2
# Add encrypt and lvm2 between block and filesystems
HOOKS=(base systemd autodetect microcode modconf kms keyboard keymap sd-vconsole block encrypt lvm2 filesystems fsck)
This is to ensure Kernel knows how to deal with encrypted LVM volumes.
Update Linux Kernel with init details #
[root@archiso /]# mkinitcpio -p linux
Make sure you can see the encrypt and lvm2 are “hooked”…
| |
Run the same command against linux-lts kernel.
[root@archiso /]# mkinitcpio -p linux-lts
Again, make sure you can see the encrypt and lvm2 are “hooked”…
| |
Set Locale #
[root@archiso /]# vim /etc/locale.gen
- Uncomment your Locale
#en_DK ISO-8859-1
en_GB.UTF-8 UTF-8
#en_GB ISO-8859-1
- Generate locale
[root@archiso /]# locale-gen
Generating locales...
en_GB.UTF-8... done
Generation complete.
Edit GRUB #
[root@archiso /]# vim /etc/default/grub
Edit:
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"
add crypt information so GRUB can load encrypted volume:
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 cryptdevice=/dev/sda3:volgroup0 quiet"
ensure cryptodisk is enabled:
GRUB_ENABLE_CRYPTODISK=y
Setup EFI partition #
[root@archiso /]# mkdir /boot/EFI
[root@archiso /]# mount /dev/sda1 /boot/EFI
mount: (hint) your fstab has been modified, but systemd still uses
the old version; use 'systemctl daemon-reload' to reload.
Install GRUB boot loader #
[root@archiso /]# grub-install --target=x86_64-efi --bootloader-id=grub_uefi --recheck
Installing for x86_64-efi platform.
Installation finished. No error reported.
Additional steps #
cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo
- Generate config for the
GRUBbootloader
[root@archiso /]# grub-mkconfig -o /boot/grub/grubcfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux-lts
Found initrd image: /boot/initramfs-linux-lts.img
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
- Enable
GDM(Gnome Display Manager) to allow graphical login
[root@archiso /]# systemctl enable gdm
Created symlink '/etc/systemd/system/display-manager.service' β '/usr/lib/systemd/system/gdm.service'.
- Enable
NetworkManagerto start with a system
[root@archiso /]# systemctl enable NetworkManager
Created symlink '/etc/systemd/system/multi-user.target.wants/NetworkManager.service' β '/usr/lib/systemd/system/NetworkManager.service'.
Created symlink '/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service' β '/usr/lib/systemd/system/NetworkManager-dispatcher.service'.
Created symlink '/etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service' β '/usr/lib/systemd/system/NetworkManager-wait-online.service'.
- Exit
chrootenvironment
[root@archiso /]# exit
exit
umount: /mnt/tmp: not mounted.
umount: /mnt/run: not mounted.
umount: /mnt/dev/shm: not mounted.
umount: /mnt/etc/resolv.conf: not mounted.
arch-chroot /mnt 165.51s user 134.30s system 3% cpu 2:13:36.05 total
umountall drives mounted before (if any)
root@archiso ~ # umount -a
umount: /run/user/0: target is busy.
umount: /etc/pacman.d/gnupg: target is busy.
umount: /sys/fs/cgroup: target is busy.
umount: /run/archiso/bootmnt: target is busy.
umount: /run: target is busy.
umount: /dev: target is busy.
rebootand pray…

» Sources « #
- https://www.learnlinux.tv/how-to-install-arch-linux-a-comprehensive-step-by-step-guide/
- https://wiki.archlinux.org/title/Installation_guide
- https://archlinux.org/
More:
LVM: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) Install Arch Linux on LVM: https://wiki.archlinux.org/title/Install_Arch_Linux_on_LVM
π₯ VIDEO SPECIFIC LINKS
- Official blog post for this video β https://learnlinux.link/arch-guide
- Linux Crash Course β https://linux.video/cc
- Netdata β https://linux.video/netdata
- tmux β https://linux.video/tmux
- vim β https://linux.video/vim
- Bash Scripting β https://linux.video/bash
- Proxmox VE β https://linux.video/pve
- Ansible (Paid) β https://learnlinux.link/ansible
- LPI Linux Essentials (Paid) β https://learnlinux.link/linux-essentials
π More About Learn Linux TV
- Main site β https://www.learnlinux.tv
- Community Forums β https://community.learnlinux.tv
- Github Account β https://github.com/LearnLinuxTV
