Skip to content

Instantly share code, notes, and snippets.

@furdarius
Forked from eltonvs/arch_installation.md
Last active February 16, 2024 09:05
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save furdarius/b9e907227f01ba342040246638a718f3 to your computer and use it in GitHub Desktop.
Save furdarius/b9e907227f01ba342040246638a718f3 to your computer and use it in GitHub Desktop.
Arch Linux step to step installation guide

Arch Linux Installation Guide

This guide will show step-by-step how to Install Arch Linux on UEFI mode.

Table of Contents

  • Bootable Flash Drive
  • BIOS
  • Pre installation
    • Set Keyboard Layout
    • Check boot mode
    • Update System Clock
    • Internet Connection
      • DHCP
      • Wi-Fi
      • Wired Connection
    • Partitioning
      • Create Partitions
      • Format Partitions
      • Mount the file system
  • Installation
    • Select Mirror
    • Install Base Packages
    • Generate fstab
    • Chroot
    • Check pacman keys
  • Configure System
    • Locale and Language
      • Keymap
      • Timezone
      • Hardware Clock
    • Network
      • Hostname
      • Nameservers
      • Firewall
    • Blacklists
      • No Beep
      • No Watchdog
    • Initramfs
    • Set-up Wi-Fi
    • Bootloader
    • Root password
    • Xorg
    • Video
    • Audio
    • Users
    • Reboot
  • Post installation
    • Window Manager
    • Network Manager and services
  • Extras
    • Set-up TTF Fonts
    • Bluetooth Headphone

Bootable Flash Drive

First of all, you need the Arch Linux image, that can be downloaded from the Official Website. After that, you should create the bootable flash drive with the Arch Linux image.

If you're on a GNU/linux distribution, you can use the dd command for it. Like:

$ dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress oflag=sync && sync

Note that you need to update the of=/dev/sdx with your USB device location (it can be discovered with the lsblk command).

Otherwise, if you're on Windows, you can follow this tutorial.


BIOS

We'll install Arch on UEFI mode, so you should enable the UEFI mode and disable the secure boot option on your BIOS system. (Also remember to change the boot order to boot through your USB device).

(Dual Boot) Disable Fast Startup in Windows

https://help.uaudio.com/hc/en-us/articles/213195423-How-To-Disable-Fast-Startup-in-Windows-10


Pre installation

I'm presuming that you're already in the Arch Linux zsh shell prompt.

Check boot mode

To check if the UEFI mode is enabled, run:

# ls /sys/firmware/efi/efivars

If the directory does not exists, the system may be booted in BIOS (not UEFI).

Update System Clock

Ensures that the system clock is accurate.

# timedatectl set-ntp true

Internet Connection

First, test if you alredy have internet connection, so run:

# ping -c 2 google.com

If you're not connected, follow one of these steps:

DHCP

This option is automatically started. Run:

# dhcpcd

Wi-Fi

Run the following command and connect to your wi-fi network.

# wifi-menu -o

The -o option is to hide your password by using the "obscure" method

Wired Connection

Warning: Make sure the DHCP is deactivated by running systemctl stop dhcpcd.service

  1. Find the network interface name

    # ip link

    The response will be something like:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: enp2s0f0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
        link/ether 00:11:25:31:69:20 brd ff:ff:ff:ff:ff:ff
    3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT qlen 1000
        link/ether 01:02:03:04:05:06 brd ff:ff:ff:ff:ff:ff
    
  2. Activate Network interface

    Using the enp2s0f0 for example:

    # ip link set enp2s0f0 up
  3. Add IP addresses

    The command to do that is ip addr add [ip_address]/[mask] dev [interface] applying to our example:

    # ip addr add 192.168.1.2/24 dev enp2s0f0
  4. Add the Gateway

    The command is ip route add default via [gateway] then:

    # ip route add default via 192.168.1.1
  5. Change DNS

    Using the Google DNS, open the file /etc/resolv.conf (you can use nano or vi to do that) and write down these lines:

    nameserver 1.1.1.1
    nameserver 8.8.8.8
    nameserver 8.8.4.4

After that, test your internet connection again with the ping command.

Partitioning

First, define your partitions size. There's no rules about this process.

Tip: If you use a SSD drive, it's recommended to leave 25% of his storage free. More info here.

My SSD has 256GB of storage. I want to have Dual-Boot with Windows10. If Windows was installed first, then you could see it's partitions. For that example, I have 4 Windows partitions already created: (in my case, I'll work with /dev/nvme0n1 disk. Use fdisk -l /dev/nvme0n1 to list partitions)

Name Size Type
nvme0n1p1 499M Windows recovery environment
nvme0n1p2 100M EFI System
nvme0n1p3 16M Microsoft Reserved
nvme0n1p3 97.1 Microsoft Basic Data

100GB were allocated for Windows in total

EFI partition was created by Windows, so we don't need to care about it. We need to create additional partitions for Linux installation.

Name Mount Size Type
nvme0n1p5 swap 1G Linux Swap
nvme0n1p6 / 32G Linux Root x86-64 (Ext4)
nvme0n1p7 /home Remaining Space Linux Home (Ext4)

Look at partitioning layout examples: https://wiki.archlinux.org/index.php/partitioning#Example_layouts

Create Partitions

Use fdisk to create partitions.

To create partitions, I'll use gdisk since to work on UEFI mode we need GPT partitions.

First, list partitions (Informational only) with the following command

# fdisk -l /dev/nvme0n1

Here's a table with some handy gdisk commands

Command Description
p Print partitions table
n Add a new partition
d Delete a partition
w Write table to disk and exit
l List known partition types
t Change a partition type
m Help
  1. Enter in the interactive menu

    # fdisk /dev/nvme0n1
  2. Create boot partition (If not Dual-Boot)

    • Type n to create a new partition
    • Partition Number: default (return)
    • First Sector: default
    • Last Sector: +512M
    • Type: 1 - EFI System
  3. Create root partition

    • Type n to create a new partition
    • Partition Number: default
    • First Sector: default
    • Last Sector: +32G
    • Type: 24 - Linux Root (x86-64)
  4. Create swap partition

    • Type n to create a new partition
    • Partition Number: default
    • First Sector: default
    • Last Sector: +1G
    • Type: 19 - Linux Swap
  5. Create home partition

    • Type n to create a new partition
    • Partition Number: default
    • First Sector: default
    • Last Sector: default
    • Type: 28 - Linux Home
  6. Save changes with w

Format partitions

Once the partitions have been created, each (except swap) should be formatted with an appropriated file system. So run:

# mkfs.ext4 /dev/nvme0n1p6              #-- root partition
# mkfs.ext4 /dev/nvme0n1p7              #-- home partition

If not Dual Boot format partition for EFI boot

# mkfs.fat -F32 -n BOOT /dev/nvme0n1p2  #-- boot partition

The process for swap partition is slight different:

# mkswap -L swap /dev/nvme0n1p5
# swapon /dev/nvme0n1p5

To check if the swap partition is working, run swapon -s or free -h.

Mount file system

  1. Mount root partition:

    # mount /dev/nvme0n1p6 /mnt
  2. Mount home partition:

    # mkdir -p /mnt/home
    # mount /dev/nvme0n1p6 /mnt/home
  3. Mount boot partition: (to use grub-install later)

    # mkdir -p /mnt/boot
    # mount /dev/nvme0n1p2 /mnt/boot

Installation

Now we'll install arch on disk

Select Mirror

Before installation, is recommended to select the best mirror servers. So open the file /etc/pacman.d/mirrorlist (again, you can use nano or vi to do that) and move the best mirror to the top of the file.

Tip: That link generates a mirror list based on your location, you can use them as reference.

Install Base Packages

Now that the mirrors are already set, use pacstrap to install the base package group:

# pacstrap /mnt base base-devel linux linux-firmware

Generate fstab

Now you should generate the fstab with the genfstab script:

# genfstab -p /mnt >> /mnt/etc/fstab

Optional: You can add noatime,commit=60,barrier=0 to the generated fstab file (on root and home partitions) to increase IO performance. https://wiki.archlinux.org/index.php/ext4#Improving_performance

Chroot

Now, we'll change root into the new system

# arch-chroot /mnt

Check pacman keys

# pacman-key --init
# pacman-key --populate archlinux

Configure System

Install basic packages

pacman -S neovim man-db man-pages texinfo elinks

Now, if you want to install some additional package, do it with pacman -S <package_name>

Timezone

Follow: https://wiki.archlinux.org/index.php/Installation_guide#Time_zone

Locale and Language

Follow: https://wiki.archlinux.org/index.php/Installation_guide#Localization

Network

# echo myhostname > /etc/hostname

Change myhostname to your hostname (Computer Name)

After that, open the file /etc/hosts and write (remember to change the myhostname to your own)

# IPv4 Hosts
127.0.0.1	localhost myhostname

# Machine FQDN
127.0.1.1	myhostname.localdomain	myhostname

# IPv6 Hosts
::1		localhost	ip6-localhost	ip6-loopback
ff02::1 	ip6-allnodes
ff02::2 	ip6-allrouters

IPTables

Write to file /etc/modules-load.d/firewall.conf:

# iptables modules to run on boot
ip_tables
#Enable conntrack only if NAT used
#nf_conntrack_netbios_ns
#nf_conntrack

Blacklists

Warning: this part is optional.

No Beep

To avoid the beep on boot, Write to file /etc/modprobe.d/nobeep.conf:

# Dont run pcpkr module on boot
blacklist pcspkr

No watchdog

If you don't want a watchdog service running, write to file /etc/modprobe.d/nowatchdog.conf

blacklist iTCO_wdt

Initramfs

https://wiki.archlinux.org/index.php/Installation_guide#Initramfs

Creating a new initramfs is usually not required, because mkinitcpio was run on installation of the kernel package with pacstrap.

# mkinitcpio -p linux

Bootloader

Using systemd-boot to install EFI boot manager:

# bootctl --path=/boot install

Then add following content to /boot/loader/entries/arch.conf

title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options root=UUID=ROOT_PART_UUID rw

ROOT_PART_UUID must be replaced with UUID found using blkid or lsblk -f (More here: https://wiki.archlinux.org/index.php/Persistent_block_device_naming)

and following content to /boot/loader/loader.conf

timeout 5
default arch

Root password

# passwd

Set-up network manager

https://wiki.archlinux.org/index.php/Network_configuration

Select network manager: https://wiki.archlinux.org/index.php/Network_configuration#Network_managers

Using systemd-networkd + systemd-resolved

Install required packages with pacman

# pacman -S wpa_supplicant

See: https://bbs.archlinux.org/viewtopic.php?pid=1393759#p1393759

Setup systemd-resolved

Follow: https://wiki.archlinux.org/index.php/Systemd-resolved

Setup systemd-networkd

This assumes that your NIC is wlp2s0, your SSID is MyNetwork, and the password is SuperSecretPassphrase.

You need to create a wpa_supplicant-wlp2s0.conf. So use wpa_passphrase to generate one:

# set +o history
# wpa_passphrase MyNetwork SuperSecretPassphrase > /etc/wpa_supplicant/wpa_supplicant-wlp2s0.conf
# set -o history

Enable it so that it runs on boot:

# systemctl enable wpa_supplicant@wlp2s0

Now make networkd configuration files.

File /etc/systemd/network/20-wired.network:

[Match]
Name=enp1s0

[Network]
DHCP=yes

[DHCP]
RouteMetric=10

File /etc/systemd/network/25-wireless.network:

[Match]
Name=wlp2s0

[Network]
DHCP=yes

[DHCP]
RouteMetric=20

Now ensure that systemd-networkd.service is enabled.

# systemctl enable systemd-networkd.service

It should be working after reboot.

https://wiki.archlinux.org/index.php/Systemd-networkd#Wired_and_wireless_adapters_on_the_same_machine

https://bbs.archlinux.org/viewtopic.php?pid=1393759#p1393759

Reboot

Exit chroot environment by pressing Ctrl + D or typing exit

Unmount system mount points:

# umount -R /mnt

Reboot system:

# reboot

Remember to remove USB stick on reboot

Window Systems

There are basically three layers that can be included in the Linux desktop:

X Windows – This is the foundation that allows for graphic elements to be drawn on the display. X Windows builds the primitive framework that allows moving of windows, interactions with keyboard and mouse, and draws windows. This is required for any graphical desktop.

Window Manager – The Window Manager is the piece of the puzzle that controls the placement and appearance of windows. Window Managers include: Enlightenment, Afterstep, FVWM, Fluxbox, IceWM, etc. Requires X Windows but not a desktop environment.

Desktop Environment – This is where it begins to get a little fuzzy for some. A Desktop Environment includes a Window Manager but builds upon it. The Desktop Environment typically is a far more fully integrated system than a Window Manager. Requires both X Windows and a Window Manager. Examples of desktop environments are GNOME, KDE, Cinnamon, Xfce among others

See: https://askubuntu.com/questions/18078/what-is-the-difference-between-a-desktop-environment-and-a-window-manager See: https://www.ghacks.net/2008/12/09/get-to-know-linux-desktop-environment-vs-window-manager/

Xorg

Install Xorg Server: (use default options)

# pacman -S xorg-server

Define your keyboard layout on /etc/X11/xorg.conf.d/10-keyboard.conf file:

Section "InputClass"
	Identifier "keyboard default"
	MatchIsKeyboard "yes"
	Option  "XkbLayout" "br"
	Option  "XkbVariant" "abnt2"
EndSection

Video

Install your GPU driver

# pacman -S xf86-video-vesa

Audio

Install audio driver

# pacman -S alsa-utils

Configure and save:

# alsamixer
# alsactl store

Users

Install sudo package

# pacman -S sudo

Configure sudo (uses vim as default editor) by running visudo and uncommenting the line:

## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL) ALL

Now we're going to add a new user by running: (change myuser to your username)

# useradd -m -G wheel -s /bin/zsh myuser

Change the new user passord:

# passwd myuser

Post Installation

Now you're on your successfull Arch Linux installation.

Login with your user and follow the next steps.

Now We're gonna install the Window Manager.

I'll show the steps to install Gnome.

First of all, run the installation command with pacman:

$ sudo pacman -S gnome gnome-extra

When the installation finishes, enable gdm to be started with system on boot:

$ sudo systemctl enable gdm.service

Network Manager and services

Now we'll remove the previously enabled service from netctl and the wifi-menu settings.

First ensures that the NetworkManager package is installed:

$ sudo pacman -S networkmanager

Enable and start NetworkManager service:

$ sudo systemctl enable NetworkManager.service
$ sudo systemctl start NetworkManager.service

Go to /etc/netctl folder and see the connection files (the ones that starts with something like wlp1s0...)

Disable the netctl service that you've been enable previously:

$ sudo netctl diable wlp1s0-MyWiFi

Then, remove all /etc/netctl folder and remove your connection file (the one that starts with something like wlp1s0...)

$ sudo rm wlp1s0...  #-- replace with you wifi connection file

Now you can reboot the system (by running reboot) and everyting should be working fine.


Extras

Set-up TTF Fonts

Follow this tutorial

Bluetooth Headphone

To connect the headphone:

  1. Install required packages:
    $ sudo pacman -S pulseaudio pulseaudio-bluetooth pavucontrol bluez-utils
  2. Edit /etc/pulse/system.pa and add:
    load-module module-bluez5-device
    load-module module-bluez5-discover
  3. For GNOME users:
    $ sudo mkdir -p ~gdm/.config/systemd/user
    $ ln -s /dev/null ~gdm/.config/systemd/user/pulseaudio.socket
  4. Connect to bluetooth device
    $ bluetoothctl
    # power on
    # agent on
    # default-agent
    # scan on
    # pair HEADPHONE_MAC
    # trust HEADPHONE_MAC
    # connect HEADPHONE_MAC
    # quit

To auto switch to A2DP mode:

  1. Edit /etc/pulse/default.pa and add:
    .ifexists module-bluetooth-discover.so
    load-module module-bluetooth-discover
    load-module module-switch-on-connect  # Add this line
    .endif
    
  2. Modify (or create) /etc/bluetooth/audio.conf to auto select AD2P profile:
    [General]
    Disable=Headset
    
  3. Reboot PC to apply changes

References

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment