Alpine Linux Checklist

2026-02-10T09:18:38-0500 | 1198 words

Four years into daily driving Linux and I don't really distrohop anymore. My trajectory was occasional Ubuntu usage when I was a kid, then I jumped right into Arch => Alpine => EndeavourOS => Debian. To me, hitting the six-month mark on my current Debian installations is a committed relationship. So committed that I switched my Void Linux ThinkPad over to Debian for... a week. I thought I would get along with Void because of how much I like Alpine, but they really aren't that similar besides not having systemd.

While I've successfully installed Alpine Linux 3.17+ as a desktop environment before, it was always from scratch. I only started using a separate / and /home recently. I have hubris from installing Arch the hard way a few times that I know my way around an ISO terminal.

However, this ThinkPad has made me nervous through all its distrohops because the Lenovo UEFI boot menu can't seem to shake the Void entry. Which spelled my doom. This is all a bootloader debacle that had a very easy, destructive fix I circled for about three hours before figuring my shit out. This is not what I did just now, but what hindsight would have me do.

My partition table is completely manual (despite people's attempts to sell me btrfs) and looks like

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    1     0B  0 disk 
nvme0n1     259:0    0 465.8G  0 disk 
├─nvme0n1p1 259:1    0     2G  0 part /boot/efi
├─nvme0n1p2 259:2    0    48G  0 part /
├─nvme0n1p3 259:3    0     4G  0 part [SWAP]
└─nvme0n1p4 259:4    0 411.8G  0 part /home

Part 1: Destruction

A lot of issues I ran into are because of the very thing I love: Alpine's minimalism. There was all sorts of debris from previous Linux installations in /boot and elsewhere, so I did this:

This is only necessary because we're trying to preserve the contents of /home.

I spent between two and three hours rebooting my laptop and being flashed by Debian's like, electric blue Grub window before startup would hang on "Loading Linux Lts...", sometimes with a happy "GNU/Linux" above it letting me know my bootloader knew absolutely nothing of Alpine on its system. I kept jumping in and out of chroot, reinstalling grub and regenerating its config and at one point hand-transcribed my disks' UUIDs into /etc/fstab and /etc/default/grub before I finally decided to just reformat the damn root partition, or rather rm -rf. What finally tipped me over the edge was I ran mkinitfs and the output said it was creating Linux 6.12, which is current to Debian Trixie while Alpine 3.23 has 6.18. So Debian was just stubborn to the end.

Theoretically, I could have mounted /boot/efi and wiped it, too, but we're trying to minimize destruction, so I have lingering directories renamed /boot/efi/EFI/{debian.bak,void.bak,void_grub.bak}.

Part 2: Installation

Part 3: Configuration

I've been iterating through distribution-specific installation scripts and am on like, v3 for my Debian one first written about here, but I think my Alpine script is half-assed in that it has about 20 packages I actually thought of for the "base," e.g. what would make it usable as a headless machine, and then it just runs setup-wayland-base and essentially setup-desktop sway with a few additions on my part, just multimedia playback and my browsers of choice (qutebrowser, Librewolf). I like launching sway with the sway command instead of using a display manager or adding it to my .profile. Sometimes I just use the framebuffer.

The base packages are shell(s) because I still script in bash and sometimes use it interactively. I was delighted to find in Alpine 3.23 that the default /etc/zsh/zshenv has a sophisticated conditional for the common zsh move of setting ZDOTDIR to $XDG_CONFIG_HOME/zsh/zshenv. I also install Tailscale and uv through curl more out of habit than anything. Alpine releases happen roughly twice a year, so packages aren't really far behind and you can always enable the edge repository.

Some additional setup, almost all to do with services, or OpenRC's lack of systemd-style user services:

If you ever feel homicidal over pipewire after doing all this, just reboot.

Conclusion

The meat of this was really all about scrubbing Debian and Void from my partition and working in the constraints of an ISO environment. Looking at my hard-coded partition table vs Alpine's small footprint, it feels a bit silly, but we'll see how I manage to fill / up with shit.

I really do like Alpine's setup-* scripts and learned in quite a hard way they can be used modularly, but it does make me read setup-disk slowly. The maintainers really seem to trust that any user particular enough to have interesting partitions or esoteric filesystem formats to take care of themselves, because the default setup_root() creates only a / and /boot/efi.

What makes me nervous going forward is my Debian desktop uses LVM, so if I wanted to repeat this, I'd have to find a way to activate the volume group first, likely with VG-related packages not included in the ISO.

Beware of running anything you get off the Internet: alpine.sh.