Installing Arch on Frame.work

Motivation

As I mentioned in frame.work: First Impressions, my intention with the frame.work laptop was to multiboot - not with multiple OSes on a single drive, but with swappable drives.

To that end, the internal NVME is being used to store my work directory (git repos, etc) - which TBH, is where the speed needs to be since that is where all the builds are.

The individual OS drives are on swappable (in this case) 250gb modules.

I am also using Ventoy on a USB-A stick for OS installation.

I had installed Ubuntu 21.04 on the first 250gb module. I’ve been using that for about a month, and it has been working out really well.

Now, for the second module. I have decided to install Arch. For this I was using archlinux-2021.08.01-x86_64.iso. I know it’s a month out of date, but I forgot to download a newer iso.

Like last time, I would normally use ZFS for my filesystem; however, for a single external USB drive I decided not to do that.

Hardware Setup

This was the easy part.

  1. Unplug the power. Is that necessary? No clue, but it seemed like a good idea.
  2. Remove the 250gb Ubuntu module.
  3. Insert a new blank 250gb module.
  4. Insert the Ventoy USB.
  5. Re-attach power. This step wasn’t strickly necessary as I was at 100% power but I prefer to do OS installs while plugged in.
  6. Turn on the power.

During the initial bootup, the Ventoy USB was detected. I selected the archlinux iso and away we went.

Installation

In theory, I was following the official installation guide, however I did not have a secondary computer in front of me at the time. As such, I just took a few notes before doing the above steps and took a go of it.

Verify EFI

First, I wanted to make sure I was booted into EFI mode.

ls /sys/firmware/efi/efivars

I saw a directory of files, so… we’re good.

Setup Wifi

ip link

This reported that my wifi device was wlan0.

rfkill list

This reported that nothing was soft or hard blocked.

iwctl

This puts you into the iwd interactive configuration.

  • device list returned wlan0
  • station wlan0 scan doesn’t appear to do anything but…
  • station wlan0 get-networks then lists the available wifi networks
  • station wlan0 connect MyWifiNetworkName (obviously not my real wifi name) then asks you for the Wifi password
  • device wlan0 show confirms everything looks ok
  • station wlan0 show confirms you are connected. If it says connecting, wait a moment.
  • exit

Confirm you have wifi by running ping archlinux.org.

Setup NTP

timedatectl set-ntp true
timedatectl status

While you are here, it’s a good time to figure out the correct terminology for your timezone. It might seem obvious, but You aren’t going to be selecting “Los Angeles”, for example, like you would in Ubuntu. You can run timedatactl list-timezones to find the right one. For me it was “US/Pacific”.

Find the Drive

Running lsblk will show you a list of drives. In my case, it showed a 64gb, 250gb and a 500gb.

  • The 64gb was the Ventoy USB
  • THe 500gb was the NVME
  • The 250gb was the new drive and already contained a FAT partition

In my case, the 250gb drive was sda (with sda1 already defined).

Partition the Drive

Run fdisk /dev/sda. (in my case).

  • use m if you need help
  • use p to print the current partitions and confirm you are on the correct partitions
  • use d to delete the only partition currently on the drive
  • use n to create a new partition and specify the size of at least 260mb. I did +512M.
  • use t to change the partition type to EFI
  • use n to create another partition. Size should be roughly (memory + 2GB). I have 64gb so I did +70GB. I has debated not doing a swap partition, but if I wanted to hibernate down the road, I didn’t want to have to re-format my drive.
  • use t to change the partition type to Linux swap
  • use n to create another partition. Let it take the remaining space.
  • use t to change the partition type. The installation guide said to make it Linux root however the labels were all cut off on the frame.work display due to the screen size. I ended up using the linux alias from the bottom of the screen, though I am pretty sure that was not the correct one. Seems to have worked though.
  • use v to verify that everything is ok; and p if you want to review it.
  • use w to write the changes to disk

Our partitions are:

  • EFI : /dev/sda1
  • swap : /dev/sda2
  • root : /dev/sda3

Format the Drive

First the EFI partition:

mkfs.fat -F32 /dev/sda1

Then the swap partition:

mkswap /dev/sda2

And finally the root partition:

mkfs.ext4 /dev/sda3

Mount the Drive

First, we mount the root partition

mount /dev/sda3 /mnt

Then we need to create a place to mount the EFI and mount it.

mkdir /mnt/boot
mount /dev/sda1 /mnt/boot

Finally, enable the swap

swapon /dev/sda2

Initializing the System

Review /etc/pacman.d/mirrorlist and make sure it looks reasonable.

pacstrap /mnt base linux linux-firmware nano man-db man-pages texinfo grub efibootmgr intel-ucode iwd

In my case, I forgot iwd which prevented the new system from being able to connect to the network. See Troubleshooting and Recovery.

Generate the fstab:

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

Review /mnt/etc/fstab and make sure it looks reasonable.

Chroot

arch-chroot /mnt

Set your locale

Based on our earlier timedatectl query.

ln -sf /usr/share/zoneinfo/US/Pacific /etc/location

Set the hardware clock to UTC

hwclock --systohc
  • nano /etc/locale.gen and uncomment en_US.UTF-8 UTF8
  • nano /etc/locale.conf and add LANG=en_US.UTF-8

Setup your hostname

  • nano /etc/hostname and add a single line that is your new hostname myhostname or whatever

Then add entries to /etc/hosts:

127.0.0.1 localhost
::1       localhost
127.0.1.1 myhostname.localdomain myhostname

Init ramdisk

mkinitcpio -P

Set a root password

passwd

Install grub

grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --removable

Note that /boot is technically /mnt/boot from earlier. You are inside the chroot.

The bootloader id of grub will create (at later steps):

  • /boot/EFI/grub
  • boot/grub/x86_64-efi/
  • /boot/grub/grub.cfg

I didn’t originally include --removable but the drive would not show up in the UEFI bootloader after switching OSes.

Modify /etc/default/grub if needed.

grub-mkconfig -o /boot/grub/grub.cfg

Microcode

There was a note on the Arch wiki about making some changes to the kernel configuration to support the microcode. As I didn’t have the wiki in front of me during this process, I’ll probably need to go back and revisit that.

Exiting chroot

exit
umount -R /mnt
reboot

At this stage, remove install media and login as root.

You’ll want to continue with General recommendation. I still need to do that myself.

Troubleshooting and Recovery

The first time through, I did not include the iwd package. I could not access dhcp, nmcli, iwctl, anything.

I also couldn’t install any packages.

So what do you do?

  • Reboot onto the live iso. On this step, I had to go into the BIOS as the frame.work didn’t seem to allow me to default to the removable USB or reorder the boot entries – just check or uncheck them. To reorder them, you need to use the +/- buttons while highlighting the item in non-Auto mode. Thanks to lbkNhubert for the solution.
  • Run the Mount the Drive steps
  • Run arch-chroot /mnt
  • pacman -S iwd
  • Run the Exiting chroot steps
  • If you unchecked the boot entry in the BIOS, make sure to re-enable it.

Once I was back into the system, I was able to run iwctl using the same Setup Wifi steps I did during the installer process.

One caveat was that systemd-resolve.service was not running.
I needed to uncomment the DNS entry in /etc/systemd/resolved.conf and add some values to it. I just copied the fallback.

Then restart the services:

  • systemctl restart systemd-resolved.service
  • systemctl restart iwd.service

It’s still not always working on bootup - which I’ll need to look into. Running those two systemctl lines after startup does get wifi working though.

Next up

Install, customize, configure.

Switching between Ubuntu and Arch

When I went to swap the Arch drive with the Ubuntu one, the BIOS didn’t see any drives. I tried rebooting multiple times.

The --removable on grub-install should help with that, however I am not sure that is a long term solution. Maybe I need to modify the grub configuration. Also, maybe I need to do a similar fix for Ubuntu.


© 2019. All rights reserved.