Arch Linux + DWM Suckless

Arch Linux + DWM Suckless

Pre-install steps

Download and verify Arch Linux media

Download the current version of Arch Linux to a location on your filesystem. See the Acquire an installation image and Verify Signature sections of the Arch Linux installation guide for instructions on how to retrieve and verify the current version of Arch Linux.s

I used archlinux-2020.08.01-x86_64.iso with kernel 5.7.12-arch1-1 for this gist.

Create Virtual Machine

I’m going to trust that you have a good understanding of your hypervisor of choice for this bit =)

There are a handful of VM settings that really matter for this gist:

  • Guest operating system:
    • VMware Workstation: Other Linux 5.x or later kernel 64-bit (other5xlinux-64)
    • Oracle VirtualBox: Arch Linux x64
  • Optical drive for mounting install media
  • 20GB virtual disk (commands in this gist are geared toward this size)
  • SCSI or SATA disk controller (VMware Paravirtual and LSI Logic were tested, as well as VirtualBox SATA)
  • UEFI boot mode:
    • VMware Workstation: VM > Settings > Options > Advanced > UEFI
    • Oracle VirtualBox: VM > Settings > System > Motherboard > Enable EFI (special OSes only)
  • Network adapter connected to a network that provides DHCP (NAT, or usually Bridged)

Aside from the above, configure the virtual machine to your liking.

Boot system to Arch Linux live distro

Mount the ISO image in the optical drive, start the virtual machine, and boot into the live Arch Linux installation distro.

Install steps

Check system capabilities

Verify boot mode

List contents of the efivars directory to verify boot mode is UEFI:

ls /sys/firmware/efi/efivars

If you get an error indicating that the directory does not exist, the system did not boot using UEFI, and you need to enable UEFI boot in VM settings

Verify network availability

Use the following commands to check interface status and IP addressing:

ip link
ip addr

Example output:

root@archiso ~ # ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:98:d8:51 brd ff:ff:ff:ff:ff:ff
    altname enp2s1

root@archiso ~ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:98:d8:51 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.5.141/24 brd 192.168.5.255 scope global dynamic ens33
       valid_lft 1630sec preferred_lft 1630sec
    inet6 fe80::20c:29ff:fe98:d851/64 scope link
       valid_lft forever preferred_lft forever

Your interface name will vary depending on factors, but lo is not the one you’re looking for - if that’s the only interface you see, you’ll need to troubleshoot. Some common primary interface names are eth0ens33ens160, and enp0s3. The default in VMware Workstation 15 is ens33.

Internet connection

To make sure you have an internet connection, you have to ask Mr. Google:

   # ping 8.8.8.8

Add best Arch mirrors

To install arch you have to download packages. It’s a good idea to download them from the best connection mirror.

   # pacman -Sy
   # pacman -S reflector
   # reflector --latest 5 --sort rate --save /etc/pacman.d/mirrorlist

Sync network time

Ensure the system clock is synced (this is important for encrypted connections to succeed):

timedatectl set-ntp true

Configure storage

Write partition table

Partition disk

Your primary disk will be known from now on as sda. You can check if this is really your primary disk:

   # lsblk

Feel free to adapt the rest of the guide to sdb or any other if you want to install Arch on a secondary hard drive.

This guide will use a 250GB hard disk and will have only Arch Linux installed. You’ll create 5 partitions of the disk (feel free to suit this to your needs).

  • /dev/sda1 boot partition (1G).
  • /dev/sda2 swap partition (4G).
  • /dev/sda3 root partition (50G).
  • /dev/sda4 home partition (100G).
  • /dev/sda5 data partition (remaining disk space).

You’re going to start by removing all the previous partitions and creating the new ones.

   # gdisk /dev/sda

This interactive CLI program allows you to enter commands for managing your HD. I’m going to show you only the commands you need to enter.

Clear partitions table

   Command: O
   Y

EFI partition (boot)

   Command: N
   ENTER
   ENTER
   +1G
   EF00

SWAP partition

   Command: N
   ENTER
   ENTER
   +4G
   8200

Root partition (/)

   Command: N
   ENTER
   ENTER
   +50G
   8304

Home partition

   Command: N
   ENTER
   ENTER
   +100G
   8302

Data partition

   Command: N
   ENTER
   ENTER
   ENTER
   ENTER

Save changes and exit

   Command: W
   Y

Format partitions

   # mkfs.fat -F32 /dev/sda1
   # mkswap /dev/sda2
   # mkfs.ext4 /dev/sda3
   # mkfs.ext4 /dev/sda4
   # mkfs.ext4 /dev/sda5

Mount partitions

   # swapon /dev/sda2
   # mount /dev/sda3 /mnt
   # mkdir /mnt/{boot,home}
   # mount /dev/sda1 /mnt/boot
   # mount /dev/sda4 /mnt/home

If you run the lsblk command you should see something like this:

   NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
   sda      8:0    0 232.9G  0 disk
   ├─sda1   8:1    0     1G  0 part /mnt/boot
   ├─sda2   8:2    0     4G  0 part [SWAP]
   ├─sda3   8:3    0    50G  0 part /mnt
   ├─sda4   8:4    0   100G  0 part /mnt/home
   └─sda5   8:5    0  77.9G  0 part

Install packages and chroot into system

Install essential packages

Run the following commands to install essential packages into the mounted partitions:

pacstrap /mnt linux linux-firmware grub efibootmgr vim base base-devel openssh

Don’t worry about any localization related errors you may receive - these will be resolved by future steps.

While the installation guide only includes the baselinux and linux-firmware packages in this command, these packages are the minimum required to progress with installation. The extra packages specified in this guide are:

  • grub: The boot loader we’ll be using
  • efibootmgr: A utility used to modify the EFI boot manager
  • lvm2: Utilities for logical volume management (LVM)
  • vim: A text editor

These are the same packages that would install using pacman -S packagename. You may want to install additional packages - go for it!

Update system’s filesystem table

Use the following command to generate fstab format mount entries and append those entries to the new system’s /etc/fstab file:

genfstab -U /mnt >> /mnt/etc/fstab

Add basic configuration

Enter the new system

   # arch-chroot /mnt
   # vim /etc/locale.gen

Now you have to uncomment the language of your choice, for example en_US.UTF-8 UTF-8.

   # locale-gen
   # vim /etc/locale.conf

Add this content to the file:

   LANG=en_US.UTF-8
   LANGUAGE=en_US
   LC_ALL=Cd
   # nvim /etc/vconsole.conf

Add this content to the file:

   KEYMAP=us

Configure timezone

For this example I’ll use “Europe/Madrid”, but adapt it to your zone.

   # ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime
   # hwclock —-systohc

Enable SSH, NetworkManager and DHCP

These services will be started automatically when the system boots up.

   # pacman -S dhcpcd networkmanager network-manager-applet
   # systemctl enable sshd
   # systemctl enable dhcpcd
   # systemctl enable NetworkManager

Set root password

Change the root user’s password so login is possible on first boot into the new system:

passwd

Configure networking

Run ip link to identify your interface name (ens33 in this case):

[root@archiso /]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:98:d8:51 brd ff:ff:ff:ff:ff:ff
    altname enp2s1

Edit /etc/systemd/network/20-wired.network to configure DHCP for your interface:

[Match]
Name=ens33 enp0s1n- ens160 

[Network]
DHCP=yes

Enable systemd-networkd and sytemd-resolved systemd services to start at boot:sas

systemctl enable systemd-networkd systemd-resolved

If you would prefer to set static addressing, or have multiple network interfaces, I recommend reviewing the systemd-networkd documentation in the Arch Wiki.

Set hostname and hosts aliases

Edit /etc/hostname and save the following line (or your preferred hostname) to it:

arch.localdomain

Edit /etc/hosts and save the following lines to it (modifying hostname as needed):

127.0.0.1   localhost
::1         localhost
127.0.1.1   arch.localdomain arch

Generate boot image and configure boot loader (GRUB)

Update initial ramdisk

In order for the /etc/mkinitcpio.conf change to apply on system boot, we need to update our initial ramdisk (initramfs).

Run the following command to generate a new initramfs image:

mkinitcpio -P

Install GRUB

-Run the following command to install the GRUB with an EFI target system/directory:

p# grub-install --target=x86_64-efi --efi-directory=/efi

</> or </>
grub-install --efi-directory=/boot --bootloader-id=GRUB

Configure GRUB

Generate GRUB configurations under the /boot and /efi partitions:

grub-mkconfig -o /boot/grub/grub.cfg
#grub-mkconfig -o /efi/EFI/arch/grub.cfg

Install other useful packages

   # pacman -S iw wpa_supplicant dialog intel-ucode git reflector lshw unzip
   # pacman -S wget pulseaudio alsa-utils alsa-plugins pavucontrol xdg-user-dirs
	 # pacman -S libx11 libxft libxinerama freetype2 fontconfig ttf-jetbrains-mono ttf-joypixels

Final steps

   # exit
   # umount -R /mnt
   # swapoff /dev/sda2
   # reboot

Post-install configuration

Now your computer has restarted and in the login window on the tty1 console you can log in with the root user and the password chosen in the previous step.

Add your user

Assuming your chosen user is “0x”:

   # useradd -m -g users -G wheel,storage,power,audio 0x
   # passwd 0x

Grant root access to our user

   # EDITOR=vim visudo

If you prefer not to be prompted for a password every time you run a command with “sudo” privileges you need to uncomment this linet

   %wheel ALL=(ALL) NOPASSWD: ALL

Or if you prefer the standard behavior of most Linux distros you need to uncomment this line:

   %wheel ALL=(ALL) ALL

Login into newly created user

   # su - 0x
   $ xdg-user-dirs-update

Install AUR package manager

In this guide we’ll install yay as the AUR package manager. More about AUR.

TL;DR AUR is a Community-driven package repository.

   $ mkdir Sources
   $ cd Sources
   $ git clone https://aur.archlinux.org/yay.git
   $ cd yay
   $ makepkg -si

The coolest Pacman

If you want to make Pacman look cooler you can edit the configuration file and uncomment the Color option and add just below the ILoveCandy option.

   $ sudo vim /etc/pacman.conf

PulseAudio applet

If you want to manage your computer’s volume from a small icon in the systray:

   $ yay -S pa-applet-git

Manage Bluetooth

   $ sudo pacman -S bluez bluez-utils blueman
   $ sudo systemctl enable bluetooth

Improve laptop battery consumption

   $ sudo pacman -S tlp tlp-rdw powertop acpi
   $ sudo systemctl enable tlp
   $ sudo systemctl enable tlp-sleep
   $ sudo systemctl mask systemd-rfkill.service
   $ sudo systemctl mask systemd-rfkill.socket

Enable SSD TRIM

   $ sudo systemctl enable fstrim.timer

Install some basic fonts

   $ sudo pacman -S noto-fonts ttf-ubuntu-font-family ttf-dejavu ttf-freefont
   $ sudo pacman -S ttf-liberation ttf-droid ttf-roboto terminus-font