In the past few months, I had to install ArchLinux several times. While it’s now my Linux distribution of choice for an everyday use, a clean install of Arch is rather bland. So in this post, I’ll try to resume the different step I took to spice a default Arch install a bit more to my taste. Most of the choices here are purely personals.
New user
By default, no user is created, so you have to create one along with its home directory. Also ensure that your home is in 750 instead of 755.
useradd -m youruser
chmod 750 /home/youruser
Fstab and tmpfs
By default, on a new install, /etc/fstab comes up mostly empty as most of it is hidden away by systemd. But I usually change some options and add tmpfs. Here’s an example:
/dev/vda2 / ext4 rw,noatime,nodiscard,stripe=4 0 1
/dev/vda1 /boot vfat rw,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
/dev/vdb1 none swap sw 0 0
/dev/vdb2 /mnt/data ext4 rw,noatime,nodiscard 0 0
tmpfs /tmp tmpfs noatime,mode=1777 0 0
tmpfs /run tmpfs noatime,nosuid,noexec,mode=755 0 0
tmpfs /run/shm tmpfs noatime,nosuid,nodev,mode=1777 0 0
pacman cache
If you have a separate data partition/hdd, it may be a good idea to move the pacman cache there. However you cannot do so using symlinks, pacman won’t like that at all. Instead you have to edit the CacheDir
entry in /etc/pacman.conf.
yay
Arch comes with its binary package manager (pacman) and also the community maintained Arch User Repository (AUR) providing access to more packages that are generally built from source. Yay is a AUR package manager so you don’t have to clone and install AUR repos manually.
Note that the commands below need to be run as your normal user, otherwise makepkg
will complain about possible catastrophic happenstances.
sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
legacy network interface name
Back in the days, network interfaces on Linux had simple names like eth0, wlan0, and so on. This changed multiple times because the order in which the interface drivers are loaded make these names not 100% predictable. However, if you know that your boot order is pretty static and never change, you might want to get the legacy naming scheme. To do so, either add net.ifnames=0
to the kernel parameters or override the appropriate udev rule. In this case I use the latter option.
ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
netctl
I prefer to use netctl instead of systemd-networkd to manage the network. Since I constantly use other Unix and Unix-likes systems that are not Linux, and since I’ve been doing so for decades, I also prefer to use ifconfig instead of ip. When asked I also choose openresolv instead of systemd-resolved, the latter tries to do too many things in your back.
pacman -S net-tools inetutils netctl dhcpcd dhclient
systemctl enable netctl
Then you have to create a default profile, for instance in /etc/netctl/network. Here is a default config that configures the interface with DHCP for IPv4 and SLAAC for IPv6:
Description="Basic DHCP ethernet connection"
Interface=eth0
Connection=ethernet
IP=dhcp
IP6=stateless
You still have to enable the profile:
netctl enable network
Some packages
Here is the bare minimum I would install on a new install, whether headless or xorg powered.
- uptimed
- ntp/chrony
- ncdu
- zsh
- htop
- starship
- neovim
- wget/curl/lynx
- tcpdump/nmap
- fzf
- tree
- bzip2/xz/gzip/zstd
- the_silver_searcher
- git
- cpio
- rsync
- dialog
- ipv6calc
- dos2unix
- exa/bat
Some extra packages
- openssh: remote access/sync stuff and so on
- bindfs: useful if you need to rebind user/permission on mount points, for instance on a shared mount
- tldr: recall any command usage (I recommend the tealdeer client, written in Rust)
- doggo: DNS queries
- vulkan-virtio/mesa-vdpau: useful for graphical acceleration in a Qemu VM