diff --git a/content/posts/arch-setup.md b/content/posts/arch-setup.md new file mode 100644 index 0000000..e4a2501 --- /dev/null +++ b/content/posts/arch-setup.md @@ -0,0 +1,153 @@ +--- +title: "Notes from a first ever Arch Linux installation" +date: 2020-06-29T16:12:37+02:00 +draft: false +tags: ["linux"] +--- + +After four years of using Ubuntu full-time on my laptop, I felt like dropping out of the Canonical feature churn and testing out a more lightweight Linux distribution. I probably spend 90% of my computer time in either a web browser or a terminal session, and I definitely don't need [Gnome](https://arstechnica.com/information-technology/2018/05/ubuntu-18-04-the-return-of-a-familiar-interface-marks-the-best-ubuntu-in-years/), [snapd](https://techtudor.blogspot.com/2020/06/four-reasons-why-snaps-are-anti-pattern.html), or any of the other Ubuntu bells or whistles to make this a comfortable experience. + +So I decided to dive in and give [Arch Linux](https://www.archlinux.org/) running [XFCE](https://xfce.org/) a try. So far I'm really liking the minimal approach and the opportunity to get a bit closer to the underlying operating system, although I can confirm that Arch features some of the annoyances of Ubuntu (spoiler: Bluetooth sucks in particular :confused:). + +![XFCE4 running on Arch](/desktop.png) + +Here are some notes. + +## Installation of Arch + +I start by flashing the [Arch ISO image](https://www.archlinux.org/download/) onto a USB drive, which then booted into Arch's live setup environment on my new box just fine. + +Arch comes without a graphical installer, so a command-line installation is unavoidable. [This gist](https://gist.github.com/rfwatson/f89fdf793f996e276878dec6f2cebc0b) contains the basic instructions to set up an encrypted Arch installation using LVM on an NVME machine. + +The [original Gist](https://gist.github.com/kylemanna/cde147d777d243b82a85e9ac16b85458) is updated frequently and worth checking too but at the time of writing is missing several essential packages from the `pacstrap` command, including `mkinitcpio`, `lvm2`, `dhcpcd` (seemingly essential to connect to the internet when booting from the newly-installed OS, see below) and `linux` (the Linux kernel, doh). + +## Rebooting and enabling networking + +Then I rebooted. Unfortunately it was immediately clear that no internet connection was available, despite it having worked fine in the live installation environment, and ethernet being physically connected. + +The problem was that `dhcpcd` hadn't been installed during the `pacstrap` phase, and starting the installation from scratch seemed the easiest option. After reinstalling with `dhcpcd` included, it was necessary to: + +```bash +sudo systemctl enable dhcpcd +sudo systemctl start dhcpcd +sudo dhcpcd eno1 # check `ip a` for interface name +``` + +After this, the ethernet connection immediately became available. + +## Installing XFCE + +XFCE is a lightweight desktop environment for Unix-y machines. Installing is trivial: + +```bash +sudo pacman -S xfce4 xfce4-goodies xorg +``` + +Making XFCE start automatically on boot required two config files ([source](https://www.reddit.com/r/archlinux/comments/atyzd4/trying_to_start_xfce4_on_boot/)). + +Firstly `$HOME/.xinitrc`: + +```bash +#!/bin/bash +exec startxfce4 +``` + +and at the end of `.zshrc` (or `.bashrc`): + +```bash +if [ $(tty) == "/dev/tty1" ]; then + startx +fi +``` + +Note: there's probably a better way to do this using systemd but I haven't figured it out yet. + +## Getting Bluetooth to work + +Firstly + +```bash +sudo pacman -S bluez bluez-utils +sudo systemctl enable bluetooth.service +sudo systemctl start bluetooth.service +``` + +Then run `bluetoothctl` and use the following approximate sequence of steps: + +``` +power on +agent on +scan on +pair +``` + +Despite the underlying bluez implementation being identical, my first impressions of Bluetooth support on Arch were much better than Ubuntu and everything seemed to work just nicely. But unfortunately after a few days my Bluetooth mouse mysteriously decided to stop being detected as an input device despite seemingly being successfully paired. :scream: + +For now I'm falling back to a wired mouse and I'll update this blog if I figure out what's going wrong. + +## Install a web browser + +:shrug: + +```bash +# and/or firefox-developer-edition +sudo pacman -S firefox +``` + +## Getting hibernate to work + +Getting hibernation to work properly on Linux has been a source of much fun in the past and this time around was no exception. + +At first I experienced consistent instantaneous wakeup from hibernation. After checking `journalctl` this turned out to be caused by a PCI USB extension board that I'd damaged slightly while removing the internal packaging from the computer post-transit. After physically detaching this useless board completely from the machine, the instantaneous wakeup was fixed! + +However, the box still failed to resume from hibernation, sticking on a black screen shortly after the disk encryption password phase. This required a bit more tracking down, but further careful examination of `journalctl` revealed that the open source Nouveau drivers for NVIDIA graphics cards were spewing some suspicious logs during the hibernate phase. For example: + + +``` +Jun 29 08:16:24 rob-arch kernel: ------------[ cut here ]------------ +Jun 29 08:16:24 rob-arch kernel: nouveau 0000:01:00.0: timeout +Jun 29 08:16:24 rob-arch kernel: WARNING: CPU: 1 PID: 140 at drivers/gpu/drm/nouveau/nvkm/engine/disp/cursgv100.c:31 gv100_disp_curs_idle.isra.0+0xd7/0xf0 [nouveau] +Jun 29 08:16:24 rob-arch kernel: Modules linked in: mousedev uhid rfcomm cfg80211 cmac algif_hash intel_rapl_msr algif_skcipher 8021q snd_sof_pci af_alg garp snd_sof_intel_byt mrp snd_sof_intel_ipc intel_rapl_common stp bnep llc snd_sof_intel_hda_common snd_soc_hdac_hda sn> +Jun 29 08:16:24 rob-arch kernel: rfkill ecc cec apple_mfi_fastcharge snd_timer rc_core snd mei_me syscopyarea mei sysfillrect soundcore sysimgblt fb_sys_fops intel_pch_thermal ie31200_edac wmi evdev mac_hid drm crypto_user agpgart ip_tables x_tables hid_apple hid_generic > + +Jun 29 08:16:24 rob-arch kernel: Call Trace: +Jun 29 08:16:24 rob-arch kernel: nvkm_object_init+0x3e/0x100 [nouveau] +Jun 29 08:16:24 rob-arch kernel: nvkm_object_init+0x6f/0x100 [nouveau] +Jun 29 08:16:24 rob-arch kernel: nvkm_object_init+0x6f/0x100 [nouveau] +Jun 29 08:16:24 rob-arch kernel: nvkm_object_init+0x6f/0x100 [nouveau] +Jun 29 08:16:24 rob-arch kernel: nvkm_object_init+0x6f/0x100 [nouveau] +Jun 29 08:16:24 rob-arch kernel: nouveau_do_resume+0x29/0xd0 [nouveau] +Jun 29 08:16:24 rob-arch kernel: nouveau_pmops_resume+0x60/0x90 [nouveau] +Jun 29 08:16:24 rob-arch kernel: ? pci_legacy_resume+0x80/0x80 +``` + +As with all software I would much prefer to choose the FOSS option for NVIDIA drivers if possible, but the convenience of working hibernation is too much of a pull so I did quick `sudo pacman -S nvidia` (see [here](https://wiki.archlinux.org/index.php/NVIDIA) for more details) and rebooted. This time, the box both hibernated and resumed successfully :tada: + +However, be warned that hibernation and Bluetooth also didn't play well together out of the box, and Bluetooth needed restarting manually after most resumptions. I suspect the right approach would be to add systemd hooks to either `bluetoothctl power off/on` or even unload the bluetooth module during the hibernate/resume cycle. However, I didn't bother to try this yet. + +### Slow mirrors + +It might be random but the Pacman mirrors chosen by my system were very slow (averaging 250k/s download speed for all packages). + +As per the [Arch Wiki](https://wiki.archlinux.org/index.php/Mirrors#List_by_speed), this can be fixed by installing the `pacman-contrib` package and then using the contained `rankmirrors` script: + +```bash +# change country=ES to something appropriate: +curl -s "https://www.archlinux.org/mirrorlist/?country=ES&protocol=https&use_mirror_status=on" | sed -e 's/^#Server/Server/' -e '/^#/d' | rankmirrors -n 5 - +``` + +The output of this command can be used to replace `/etc/pacman.d/mirrorlist` (backing it up first naturally). After doing this, package download speeds average several MB/s. + +### Pacman + +I was slightly intimidated by Pacman after becoming so comfortable with `apt-get` over the years, but I can confirm that it quickly becomes a friend. Better still, the package support is excellent and PPAs don't exist! For example `pacman -S docker-compose` works perfectly out of the box, with no need to install or manage PPA keys Ubuntu-style. + +### Other bits + +A handful of other softwares that I've installed so far: + +- vim +- zsh +- Docker and Docker Compose +- [alacritty](https://github.com/alacritty/alacritty) (terminal emulator written in Rust with a strong community and lots of activity - so far fast and stable) +- [asdf](https://asdf-vm.com/) diff --git a/static/desktop.png b/static/desktop.png new file mode 100644 index 0000000..f65d7a9 Binary files /dev/null and b/static/desktop.png differ