Arch Linux Installation

From Wiki³
IconUNDER CONSTRUCTION: The document is currently being modified!

Originally a collection of notes geared towards installing Arch Linux on dedicated servers and embedded machines to ease the transition from BSD back to Linux, this tutorial has evolved in ways I could have never imagined.

In 2012 it was transformed into a YouTube video called How to Install Arch Linux. This video was then remade in late 2012, due to major changes in the installation process, renamed as Arch Linux: System Installation.

I am now set to perfect this process once again and as always I will be adhering to the Arch principles.

For the creation of this tutorial, the following environment was used:

Icon VirtualBox 5.1.22 r115126
Icon archlinux-2017.07.01-x86_64.iso

Booting the Installation Media

Place the copy of the Arch Linux installation media in your machine (CD/DVD or USB) and reboot. Enter BIOS if necessary to modify the boot device order in order to boot from the media.

The system will start at an EFI boot menu, which should auto boot the Arch Linux ISO in a few seconds (provided the keyboard is not touched).

When the system has finished the boot up process, it should automatically login to the terminal with the root account.

Pre-Installation

Begin the installation by syncing the system clock.

root ~ # timedatectl set-ntp true
root ~ # timedatectl status

Verify Boot Mode

Verify that the motherboard has UEFI enabled. If this outputs a list of variables, the computer has successfully booted into EFI mode.

root ~ # efivar -l

Keyboard Keymap

If using a non-US keymap, specify which keymap to load.

root ~ # ls /usr/share/kbd/keymaps/

Organization is laid out in directories as Machine Type / Keyboard Type, take the filename without the extension and plug it into the command loadkeys.

root ~ # loadkeys de-latin1

Networking

Make sure the network is connected and internet access is working (for wired network connections, dhcp was already loaded on boot).

root ~ # ping archlinux.org

Skip to the next section if wireless networking is not needed.

Performing the installation over wireless requires manual setup. To do so, get the name of the interface, usually wlan0, and then check to see if the wireless interface is activated.

root ~ # iw dev
root ~ # ip link show wlan0

If the interface is in state DOWN, bring it up first.

root ~ # ip link set wlan0 up

With the interface activated, get a list of all available access points (AP) nearby.

root ~ # iw dev wlan0 scan | less

Depending on what type of encryption the AP is using for the network, connect with one of the following methods:

  • No Encryption
root ~ # iw dev wlan0 connect "YOUR_SSID"
  • WEP
root ~ # iw dev wlan0 connect "YOUR_SSID" key :YOUR_KEY
  • WPA/WPA2
root ~ # wpa_supplicant -i wlan0 -c <(wpa_passphrase "YOUR_SSID" "YOUR_KEY") &

Verify that the wireless network was brought up properly.

root ~ # iw dev wlan0 link

Once connected an IP address can be obtained from dhcp.

root ~ # dhcpcd wlan0

Installation via SSH

Installing remotely from another computer using SSH can be a lot faster, but requires the use of another machine. Remember, copy and paste work over SSH.

To start ssh in the installation environment, start the openssh service with systemd and then set the root password.

root ~ # systemctl start sshd
root ~ # passwd

Use the ip addr command to find the IP address assigned to the machine. Logging in remotely as the root account with the password setup previously should now be possible.

Partitioning

Filesystem Mountpoint Size Description
Linux / * root partition
EFI System /boot 200M boot partition

Before installation the system disk must be partitioned and formatted. For this the GPT partition scheme is used. GPT (or GUID Partition Table) came about due to the inherit 32-bit limitation in MBR limiting the maximum addressable storage space to 2TB. The operating systems (OS) that cannot boot from GPT are most notably Windows XP and all prior versions. Given that GPT forms part of the UEFI standard it will be the defacto choice if UEFI is enabled.[1]

IconIf you are installing Arch in conjunction with Mac OS X and/or Windows, partitions will be Apple Core storage and/or HPFS/NTFS/exFAT respectively.
When dual booting with Windows, only the Arch Linux partition needs to be partitioned/formatted as the current Windows EFI System partition will be used as is mounted to /boot.

Pull up a list of all of the disks in the system.

root ~ # lsblk

The ones mounted from /run/archiso can safely be ignored as these are from the live disc image.

Having located the disk that is going to be used for the Arch system disk, make note of the device node the disk uses.

Before partitioning it is always good practice to zero the disk out.

root ~ # dd if=/dev/zero of=/dev/sdX bs=1k count=2048
IconWARNING: This will wipe the entire disk!
Skip this step if the disk is not being exclusively used for Arch Linux.

With that taken care of, write a new GPT partition table with protected MBR.

root ~ # sgdisk -Z -o /dev/sdX

Create the Arch Linux partition (use everything but the last 200MB) and then the EFI System partition with the final 200MB; might as well setup the partition types in the same command.

root ~ # sgdisk -n 1:0:-200M -n 2:-200M:-0 -t 1:8300 -t 2:ef00 /dev/sdX

For ease-of-use set some names to help identify the partitions.

root ~ # sgdisk -c 1:"Arch Linux" -c 2:"EFI Boot" /dev/sdX

If sgdisk has been complaining that the linux kernel is caching partition information, reboot before continuing.

A keen observer might notice that there is no swap partition. This will be covered in a later section.

Formatting

With the partitions setup, they now need to be formatted.

For the root filesystem, using metadata_csum will enable metadata checksums for added protection against disk corruption.

root ~ # mkfs.ext4 -O metadata_csum /dev/sdX1
IconIf this is being installed onto a portable USB, add -O "^has_journal" to the mkfs.ext4 command.

Format the EFI System partition with FAT32.

root ~ # mkfs.fat -F32 /dev/sdX2

Installation

Now that the disk(s) are setup, mount the partitions and begin the Arch Linux bootstrap process.

root ~ # mount /dev/sdX1 /mnt
root ~ # mkdir /mnt/boot
root ~ # mount /dev/sdX2 /mnt/boot
IconIf the system is dual booting with Windows, mount the current EFI System Partition as /mnt/boot and the one dedicated to Arch Linux as /.

Base Packages

Install the base and base-devel package groups, the rEFInd Boot Manager and the sudo and vim packages. When not using WiFi, the wpa_supplicant package can safely be removed from the list.
If the system has an Intel-based CPU the intel-ucode package is required.

root ~ # pacstrap /mnt base base-devel efibootmgr intel-ucode refind-efi sudo vim wpa_supplicant

Fstab

Generate an fstab file so that Arch knows what to mount on boot. Using the -U option will use UUIDs for the source partitions, this has the advantage of not changing if the disk is plugged into another computer.

root ~ # genfstab -U -p /mnt >> /mnt/etc/fstab

Be sure to confirm it was generated correctly (UUIDs line up).

root ~ # blkid /dev/sdX1 && blkid /dev/sdX2 && cat /mnt/etc/fstab

In order for ext4 journal data structures to also gain checksums add ,journal_checksum to the mounting options on boot.
Skip this step if installing onto a portable USB drive.

root ~ # sed -i 's/data=ordered/data=ordered,journal_checksum/' /mnt/etc/fstab

Again confirming this change is not a bad idea.

IconIf installing onto an SSD add ,discard to the mount options as well.

Chroot

Change root into the new system.

root ~ # arch-chroot /mnt

Begin configuration by setting a root password.

# passwd

Modify the mkinitcpio.conf in order to load the required kernel module for ext4 checksums on boot and then create the initramfs (initial RAM disk filesystem) image.

# sed -i 's/^MODULES=""/MODULES="crc32_generic crc32c-intel"/' /etc/mkinitcpio.conf
# mkinitcpio -p linux
IconIf installing onto a portable USB drive, move block beforeautodetect in the mkinitcpio.conf.
# sed -i -r 's/^(HOOKS="[a-z ]+)(block )/\1/' /etc/mkinitcpio.conf
# sed -i -r 's/^(HOOKS="[a-z ]+)(autodetect )/\1block \2/' /etc/mkinitcpio.conf

Finally add a new user account and give the wheel group sudo access.

# useradd -m -g users -g wheel -s /bin/bash kyau
# passwd kyau
# sed -i 's/^# %wheel ALL=(ALL) ALL$/%wheel ALL=(ALL) ALL/' /etc/sudoers

Boot Loader

Use the refind-install script that comes pre-packaged with rEFInd to simplify the process of setting up rEFInd. We will be installing rEFInd onto the default/fallback boot path /EFI/BOOT/BOOT*.EFI. This is extremely useful for certain systems, ones that require /EFI/*/*.EFI to be signed in BIOS, and/or booting from USB flash drives.

# refind-install --usedefault /dev/sdX2 --alldrivers

Take the PARTUUID for sdX1 and sdX2 and edit refind.conf (look for the Arch Linux section) so that volume contains the PARTUUID for sdX2 and the options line contains the PARTUUID for sdX1 and Intel's microcode if applicable. Be sure to also update all the paths correctly and remove the disabled setting.

# vim /boot/EFI/BOOT/refind.conf

Once inside vim you can use the following vim console commands to insert the PARTUUID of each partition into the file.

:r !blkid -s PARTUUID -o value /dev/sdX1
:r !blkid -s PARTUUID -o value /dev/sdX2

In addition uncomment the line for scan_driver_dirs and point it to the proper directory.
When finished it should look something like this:

scan_driver_dirs EFI/BOOT/drivers
menuentry "Arch Linux"
icon /EFI/BOOT/icons/os_arch.png
volume "71fc0d33-ede7-4453-8d05-a18ea099b7bc"
loader /vmlinuz-linux
initrd /initramfs-linux.img
options "root=PARTUUID=ec71be76-c4a6-467a-aa88-683d58e3a4fd rw add_efi_memmap initrd=\intel-ucode.img"
submenuentry "Boot using fallback initramfs" {
initrd /initramfs-linux-fallback.img
}
submenuentry "Boot to terminal"
add_options "systemd.unit=multi-user.target"
}
}

The first PARTUUID is sdX2 and the second is sdX1. Save the file and exit.

Networking

For networking, using systemd-networkd is best practice. Choose one of the following three options to continue.

  • Wired Network with DHCP:
# echo -e "[Match]\nName=eth0\n\n[Network]\nDHCP=ipv4" > /etc/systemd/network/50-wired.network
  • Wired Network with Static IP:
# echo -e "[Match]\nName=eth0\n\n[Network]\nAddress=192.168.1.10/24\nGateway=192.168.1.1" > /etc/systemd/network/50-wired.network
  • Wireless:
    Run one of the commands above (depending on DHCP or Static IP, changing eth0 to wlan0) and then generate a WPA supplicant configuration file and enable the service.
# wpa_passphrase MYSSID passphrase > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
# systemctl enable wpa_supplicant@wlan0.service

Regardless which option was chosen, two services need to be started to enable networking on boot.

# systemctl enable systemd-networkd
# systemctl enable systemd-resolved

System Settings

Choose a unique hostname for the system.

# echo "arch" > /etc/hostname
# echo -e "127.0.0.1\tarch.localdomain\tarch" >> /etc/hosts

Set the proper timezone and generate /etc/adjtime. Check the /usr/share/zoneinfo directory for a list of existing zones.

# ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
# hwclock --systohc
IconIf dual-booting with Windows, add --localtime to the hwclock command to have the clocks sync correctly between OSs.

Choose the proper localization and uncomment it from /etc/locale.gen, the defacto English (US) standard is en_US.UTF-8 UTF-8, and then generate the needed localization.
Also add the localization to /etc/locale.conf.

# sed -i 's/^#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
# locale-gen
# echo "LANG=en_US.UTF-8" > /etc/locale.conf

If a keyboard layout was setup at the beginning of installation, make it permanent.

# echo "KEYMAP=de_latin1" > /etc/vconsole.conf

Swap File

Create a swap file on the root partition, set the proper permissions and format it to swap.

# fallocate -l 8G /swap
# chmod 600 /swap
# mkswap /swap

Create an fstab entry for the swap file so it is loaded on boot.

# echo -e "/swap\tnone\tswap\tdefaults\t0\t0" >> /etc/fstab

Provided the swap file was created on an SSD (which it should have been), adjust sysctl accordingly.

# echo "vm.swappiness=1" >> /etc/sysctl.d/99-sysctl.conf

Reboot

Exit out of the chroot environment.

# exit

Unmount all partitions and reboot the system.

root ~ # umount -R /mnt && reboot

Configuration

Upon first boot, login with the user account created previously.

DNS Resolution

Create a symbolic link from the systemd-resolved resolv.conf to the system version.

# sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

Packages

Enable colored output in pacman.

# sudo sed -i 's/#Color/Color/' /etc/pacman.conf

Install yaourt for AUR management.

# git clone https://aur.archlinux.org/package-query.git
# cd package-query && makepkg -si && cd .. && rm -rf package-query
# git clone https://aur.archlinux.org/yaourt.git
# cd yaourt && makepkg -si && cd .. && rm -rf yaourt

Perform a full system update.

# yaourt -Syu --devel --aur

To find the fastest recently updated mirrors for pacman, install the reflector package.

# yaourt -S reflector

Reflector will search through the last 100 updated mirrors that use HTTPS and sort them by download speed and then output the list to /etc/pacman.d/mirrorlist overwriting the current list.

# sudo reflector --latest 100 --protocol https --sort rate --save /etc/pacman.d/mirrorlist

This command might take a few minutes depending on internet connection speed and latency.

References