Arch Install Guide
Author | Keith Patton |
Date | 2019-05-24 |
Revision | 1.3 |
Configuration
These instructions will walk you through the process of installing Arch Linux in the following format:
- UEFI
- x86_64
- (Full partition details below)
- Single LVM Physical Volume
- Single LVM Volume Group
- LVM Logical Volumes for : root, home
- GRUB2 bootloader
- SWAP file rather than partition
- Dual boot Arch and Windows
Disk layout
╔═════════════════════╗╔════════════╗
║ /root (100GB) ║║/home (30GB)║ [LVM Logical Volumes]
╚═════════════════════╝╚════════════╝
|---------------vg-00---------------| [LVM Volume Group]
┌───────────┐┌───────────────────────────────────┐┌──────────────────────┐
│EFI (500MB)││ [LVM] PV (130GB) ││ empty (100GB) │
└───────────┘└───────────────────────────────────┘└──────────────────────┘
┌────────────────────────────────────────────────────────────────────────┐
│ PHYSICAL DISK (256GB) │
└────────────────────────────────────────────────────────────────────────┘
Reasoning
The above disk layout provides a dual-boot environment with Arch Linux being the mainstay OS and Windows being a less important / destructable OS.
Using LVM allows for realtime snapshot and resizing of the Arch Linux install that may be useful for backups / upgrades.
The remaining free disk space can be used to install Windows once Linux is installed.
Instructions
-
Boot up the install media using UEFI.
-
Set the keyboard layout for the installation steps
loadkeys uk
-
Verify we are booting using UEFI
ls /sys/firmware/efi/efivars
Confirm the
efivars
directory exists - if not, you have not booted the machine using UEFI -
Connect to internet for install
Check your network interface is detected and shows as
UP
ip link
Confirm you have an IP on your interface
ip a
Ping a public IP to confirm network activity
ping 1.1.1.1
Ping a public FQDN to confirm DNS routing
ping www.google.co.uk
-
Update system clock
timedatectl set-ntp true
-
Partition the disks
Use
lsblk
to identify your diskslsblk
An example layout:
The following shows a system with 1x 1TB SATA disk, and 1x 240GB SSD (NVMe) - each with a single partition.NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk └─sda1 8:1 0 931.5G 0 part nvme0n1 259:0 0 232.9G 0 disk └─nvme0n1p1 259:1 0 10G 0 part
The following shows 2x unpartitioned disks.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk nvme0n1 259:0 0 232.9G 0 disk
In the above examples, the disk we will choose to work with would be
nvme0n1
as our main OS disk.
Please note : your disk may be different. If you only have sda (SSD) disks and not NVMe (nvme01) then use/dev/sda
as your disk to partition.a. Partition the main OS disk
Connect to the main disk
Create a new partition table
Create a new physical partition for EFI (500MB)
Mark the partition type as EFI
Label the partition EFI
Create a new physical partition for LVM physical volume (100GB)
Mark the partition type as LVM
Label the partition Linux# NOTE : where it asks for confirmation, choose 'y' gdisk /dev/nvme0n1 # (or /dev/sda if you only have SSD disks) o n # (confirm) # (accept default partition start point) +500M ef00 c EFI n # (confirm) # (accept default partition start point) +130G 8e00 c # (choose your partition - likely 2) Linux w
Confirm the partitions have been written to disk.
If successful, you should now have a partition table similar to the example below.lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk nvme0n1 259:0 0 232.9G 0 disk ├─nvme0n1p1 259:1 0 512M 0 part └─nvme0n1p2 259:2 0 130G 0 part
b. Create LVM Volumes
First, load the device mapper.
modprobe dm_mod
Confirm the system is seeing the newly partitioned disk as containing an LVM capable partition on the NVMe drive.
lvmdiskscan
/dev/nvme0n1 [ <232.89 GiB] /dev/nvme0n1p1 [ 512.00 MiB] /dev/nvme0n1p2 [ 130.00 GiB] 0 disks 2 partitions 0 LVM physical volume whole disks 0 LVM physical volume
Create the
LVM physical volume
on the second partition of the main disk.
Do not create an LVM Physical Volume on the first partition as this will be used by your bootloader which may not recognise LVM partitions (GRUB does, but that is outside the scope of this quick guide).pvcreate /dev/nvme0n1p2
Confirm the LVM volume got created
pvdisplay
--- Physical volume --- PV Name /dev/nvme0n1p2 VG Name PV Size 130.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 33279 Free PE 33279 Allocated PE 0 PV UUID <this-will-be-unique>
Create the
LVM volume group
that will hold all of the LVM logical volumes.
LVM can manage multiple groups (from m=numerous physical volumes), each containing multiple logical volumes.
For simplicity we will call this first, main, volume groupvg-00
on the LVM physcial volume.vgcreate vg-00 /dev/nvme0n1p2
Confirm the LVM volume group got created
vgdisplay
--- Volume group --- VG Name vg-00 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size <130.00 GiB PE Size 4.00 MiB Total PE 33279 Alloc PE / Size 0 / <130.00 GiB Free PE / Size 33279 / 0 VG UUID <this-will-be-unique>
Create the
LVM logical volumes
that will hold your filesystems.
As outlined previously we will be creating/root
(100GB) and/home
(30GB).lvcreate -L 100G vg-00 -n arch-lv-root lvcreate -l 100%FREE vg-00 -n arch-lv-home
Confirm the LVM logical volumes got created.
lvdisplay
--- Logical volume --- LV Path /dev/vg-00/arch-lv-home LV Name arch-lv-home VG Name vg-00 LV UUID <unique> LV Write Access read/write LV Creation host, time archiso, <datetime> LV Status available # open 1 LV Size 30.00 GiB Current LE 7680 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:0 --- Logical volume --- LV Path /dev/vg-00/arch-lv-root LV Name arch-lv-root VG Name vg-00 LV UUID <unique> LV Write Access read/write LV Creation host, time archiso, <dateime> LV Status available # open 1 LV Size <100.00 GiB Current LE 25599 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:1
Online the devices.
vgscan vgchange -ay
You should now have LVM configured in the following way:
Physical volume /dev/nvme0n1p2 (130GB) Volume Group vg-00 + Logical Volume /dev/vg-00/arch-lv-root (100GB) + Logical Volume /dev/vg-00/arch-lv-home (30GB)
-
Format the partitions
Format the
EFI
partition using FAT32.mkfs.fat -F32 /dev/nvme0n1p1
Format
/
and/home
to ext4 using the new LVM logical volume mappings.mkfs.ext4 /dev/vg-00/arch-lv-root mkfs.ext4 /dev/vg-00/arch-lv-home
-
Mount the filesystems
Importantly, mount the root
/
filesystem first, then mount every other filesystem to the correct mountpoint on top of/
.Mount Arch root partition to
/
Create the boot directory
Mount EFI partition to/boot
Create the home directory
Mount the Arch home partition to/home
mount /dev/vg-00/arch-lv-root /mnt mkdir /mnt/boot mount /dev/nvme0n1p1 /mnt/boot mkdir /mnt/home mount /dev/vg-00/arch-lv-home /mnt/home
Bug fix
There is a current (2019-05-28) bug in lvm2 / systemd which does not like chroot into LVM volumes.
Correct the issue by mount the LVM runtime details into a mountpoint in chrootmkdir /mnt/hostlvm mount --bind /run/lvm /mnt/hostlvm
-
Install the base packages
Firstly, populate the pacman GPG keyring.
pacman-key --init echo 'keyserver hkp://keys.gnupg.net' >> /etc/pacman.d/gnupg/gpg.conf pacman-key --refresh-keys pacman -Syy archlinux-keyring pacman-key --populate archlinux
Now install the base Arch Linux packages along with any additional packages. Here I have added packages for an additional Linux LTS kernel,
git
andwget
for installingyay
(AUR), and some packages for connecting to wifi from TTY.
NB : recent changes to base group means many 'standard' linux tools are no longer installed (including no text editors, no linux kernel, no filesystem utilitiesetc.). These must all now be explicitly installed - yes even the Linux kernel packagelinux
!
See : https://www.archlinux.org/news/base-group-replaced-by-mandatory-base-package-manual-intervention-re…pacstrap /mnt base base-devel linux linux-lts linux-firmware vim man-db man-pages less which logrotate e2fsprogs git wget sudo iw wpa_supplicant dialog
-
Create the permanent Filesystem Table config
genfstab -U /mnt > /mnt/etc/fstab
-
Change the root environment to the new install
arch-chroot /mnt ln -s /hostlvm /run/lvm
Install the lvm2 package for you LVM partitions.
pacman -S lvm2 modprobe dm_mod vgscan vgchange -ay
-
Set the timezone for you new install
ln -sf /usr/share/zoneinfo/Europe/Dublin /etc/localtime
Create the time offset
hwclock --systohc
-
Set the localization of the new install
Tell the system which locales you wish to use in the system.
Typically English (UK) and English (USA).Uncomment
en_GB.UTF-8 UTF-8
,en_GB ISO-8859-1
anden_US.UTF-8 UTF-8
,en_US ISO-8859-1
as below:vim /etc/locale.gen
... ... en_GB.UTF-8 UTF-8 en_GB ISO-8859-1 ... ... en_US.UTF-8 UTF-8 en_US ISO-8859-1 ... ...
Generate the locales
locale-gen
Create the system-wide LANG variable.
AddLANG=en_GB.UTF-8
to /etc/locale.conf (For International English)vim /etc/locale.conf
LANG=en_GB.UTF-8
Set the terminal keyboard layout.
vim /etc/vconsole.conf
KEYMAP=uk
-
Configure system hosts
Create your system’s hostname.
vim /etc/hostname
<set-your-hostname-to-something>
Add your hostname to the system hosts file
vim /etc/hosts
127.0.0.1 localhost ::1 localhost 127.0.1.1 <your-system-hostname>.localdomain <your-system-hostname>
-
Generate an initial boot disk for the bootloader
Configure the init creator/etc/mkinitcpio.conf
to recognise LVM partitions on boot.vim /etc/mkinitcpio.conf
Add
systemd
andsd-lvm2
hooks to the config as follows :HOOKS=(base systemd autodetect modconf block sd-lvm2 filesystems keyboard fsck)
mkinitcpio -p linux
-
Install the CPU microcode
Install one of the following packages:
- If using Intel :
intel-ucode
- If using AMD :
amd-ucode
Firstly create the pacman-keyring
pacman -Syy pacman-key --populate archlinux pacman-key --refresh-keys
Install the microcode package (Intel)
pacman -S intel-ucode
OR
Install the microcode package (AMD)
pacman -S amd-ucode
- If using Intel :
-
Install the bootloader
Install GRUB2
pacman -S grub efibootmgr os-prober fuse2 dosfstools mtools grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB grub-mkconfig -o /boot/grub/grub.cfg
-
Allow the
wheel
group to usesudo
chmod o+w /etc/sudoers vim /etc/sudoers
## Uncomment to allow members of group wheel to execute any command %wheel ALL=(ALL) ALL
chmod o-w /etc/sudoers
-
Create a new user for yourself
useradd -c "<some-comment-here-about-you>" -mUG wheel <your-username-here>
Set a password for the new user
passwd <your-new-user>
-
Change the root password for security
passwd
-
Leave CHROOT, umount the disks and reboot to your new install
exit umount -R /mnt reboot
Final Steps
At this point, if everything went well, your system should boot up to the newly installed Arch distro with only a terminal session.
You should login as your new user and perform any additional installations / configurations.
For example to install the nVidia drivers and Gnome Desktop
sudo pacman -S nvidia gnome gnome-extra gnome-control-center gdm networkmanager
For a full list of final recommendations see : https://wiki.archlinux.org/index.php/General_recommendations