Void Linux: first impression

2026-04-20

Actually, this is not exactly the first impression. Pet recalls it stumbled across Void Linux in some past life. But that time it was too void, and Debian was so good that no one had a thought to fork it.

And now... Now Debian rolled down to corporate shit whereas Void became something.

Pet loves Void Linux for:

Pet recently found in a dumpster an old Pentium-M laptop and though: "That's an ideal beast for a clean machine where only SSH and network diagnostic tools are needed".

There are three options on the download page: XFCE desktop, Base, and RootFS. Pet isn't interested in desktop, RootFS - that's for chroot install, so the only option is the Base.

Pet flashed it

dd if=void-live-*-base.iso of=/dev/sdx bs=4096

and booted.

In comparison to Devuan it looks like a real void. The shell is a bare /bin/sh. bash is installed too, so it's better to use it for autocompletion, at least.

The manual https://docs.voidlinux.org/installation/live-images/guide.html recommends void-installer but pet got used to making everything by paws.

First, run fdisk and create a partition. Pet made it only eight gigibytes, planning to use all the rest space later.

Then pet created a file system. Pet did not know that syslinux does not support 64-bit extensions so it had to convert the filesystem in the end of the installation process. For you, the reader, pet recommends to turn off 64-bit extensions in the very beginning, using -O '^64bit':

mkfs -t ext4 -O '^64bit' /dev/sda1

Then, mount the file system:

mkdir /mnt/hdd
mount /dev/sda1 /mnt/hdd

Then, pet needed to copy system partition from the live system. But that partition should be in its basic form, without mounted /dev, /proc и /sys.

If in past pet's lives boot images were pretty simple and the system partition was the only partition on the media. With the emerge of EFI another one, a boot partition was added. Nothing has changed in this regard, if we run blkid we'd see two partitions: EFI, and the second one containing ISO9660 file system. That file system was used for CD and DVD and is still being used for compatibility, probably.

But the system partition has morphed to a thing. Now it contains only two directories: /boot и /LiveOS. The latter directory contains a single file squashfs.img.

If we look closer at blkid output we can see two loop devices: loop0 is using squashfs.img, as for loop1 we should run

losetup -l

It says loop1 uses /LiveOS/ext3fs.img. Which is on squashfs. We can prove that if we mount loop0:

mkdir /mnt/0
mount /dev/loop0 /mnt/0

Oops, mount says that loop0 is already used elsewhere. Do not try to understand (at the moment) where exactly, it may be overlapped by pivot_root syscall during the boot. The --bind option does not help too, so we just create another loop on that file:

losetup -f /run/initramfs/live/LiveOS/squashfs.img

So now we can do:

mount /dev/loop2 /mnt/0

You see? /mnt/0 contains the only directory LiveOS with the only file ext3fs.img.

Thus, the chain of perversions looks like this::

Don't ask pet why. Go ask humans.

Surely, SquashFS is used for its built-in compression. But why Ext3 on top of it? This increases compression ratio and the live system fits 1GB stick? Are there such media still left somewhere? Hm, what a strange question of a Penium-M user. Okay then, but why didn't they add at least rsync to the base system? Didn't fit?

And finally, the root file system is an overlayfs, that's what findmnt tell us. We see the lowerdir points to /run/rootfsbase which is a mount point for loop1. That's what pet needs to copy:

cp -a /run/rootfsbase/* /mnt/hdd/

Configuration can be started from this point: https://docs.voidlinux.org/installation/guides/chroot.html#entering-the-chroot For now, pet needs only to change hostname and the root password:

xchroot /mnt/hdd /bin/bash
passwd

As for hostname, the only option is vi. Pet is not such a pervert as humans, so it connected to the internet and downloaded nano.

Pet could plug a cable to the ethernet port, but WiFi is not much complicated from the command line. Pet switched back to the live system on the other console (e.g. Alt-F2) and did the following:

wpa_passphrase pet-SSID pet-password >>/etc/wpa_supplicant/wpa_supplicant.conf

And reloaded the configuration:

wpa_cli reconfigure

That's all. The internet connection came up.

Pet switched back to the chroot session (Alt-F1) and updated the system as described here https://docs.voidlinux.org/xbps/index.html#updating

xbps-install -Su

XBPS says that xbps must be updated first. Okay then:

xbps-install -u xbps

and run again:

xbps-install -Su

Pet will install missing parts after reboot, but now it needs only nano:

xbps-install nano

Pet was unable to drop vi because XBPS says the base system depends on it. The only precaution against stepping into vi (pet would have to ask the internet how to exit vi, that question is probably among the top 10 queries of each search engine). So, the only precaution is setting EDITOR environment variable:

echo "export EDITOR=/usr/bin/nano" >/etc/profile.d/editor.sh

At last, pet is able to write host name to /etc/hostname, and a few more:

And finally, /etc/fstab:

UUID=c4bebf0d-3d3a-11f1-a9d9-326317f7e74c  /  ext4  nodiratime,relatime,errors=remount-ro  0  0

tmpfs  /mnt      tmpfs  size=64K                               0       0
tmpfs  /tmp      tmpfs  nosuid,nodev,mode=1777,size=32M        0       0
tmpfs  /var/log  tmpfs  nosuid,nodev,noexec,mode=755,size=8M   0       0

Pet uses tmpfs and does not use swap just to avoid leaking sensitive data. Just in case.

Installing bootloader

There's grub in Void Linux, but pet is kinda tired of it. Pet does not use all its features anyway so let it be syslinux this time.

Pet installs the package:

xbps-install syslinux

There's no single word about installing syslinux in the Void Linux documentation. Arch Linux comes to rescue: https://wiki.archlinux.org/title/Syslinux In the section 3.1.2 they describe manual installation process. Pet repeats that instruction down here because paths are slightly different:

mkdir /boot/syslinux
cp /usr/lib/syslinux/*.c32 /boot/syslinux/
extlinux --install /boot/syslinux
dd bs=440 count=1 conv=notrunc if=/usr/lib/syslinux/mbr.bin of=/dev/sda

Pet creates /boot/syslinux/syslinux.cfg:

* BIOS: /boot/syslinux/syslinux.cfg

PROMPT 0
TIMEOUT 0
DEFAULT void

LABEL void
    KERNEL ../vmlinuz-6.12.82_1
    APPEND root=UUID=c4bebf0d-3d3a-11f1-a9d9-326317f7e74c rw initrd=/boot/initramfs-6.12.82_1.img

That's all. Okay to reboot now.

Basic configuration

Pet installs all necessary packages. Their names can be found in https://github.com/void-linux/void-packages/tree/master/srcpkgs

xbps-install bc lsof psmisc psutils parted rsync \
             tcpdump bind-utils openbsd-netcat \
             gpm screen smartmontools \
             rsyslog cronie logrotate \
             nfs-utils \
             fbv

bind-utils is solely for dig, and fbv is a console image viewer.

Pet makes changes to /etc/logrotate.conf and starts services:

ln -s /etc/sv/rsyslogd /var/service/
ln -s /etc/sv/crond /var/service/
ln -s /etc/sv/gpm /var/service/

Console messages need filtering. By default kernel pukes out debug messages and that's extremely annoying. Pet followed this advice https://superuser.com/questions/351387/how-to-stop-kernel-messages-from-flooding-my-console#793692 and added to the /etc/sysctl.conf:

kernel.printk = 2 4 1 7

Run the following for changes to take the effect:

sysctl -p

Pet deleted unnecessary packages:

xbps-remove -o

Unlike apt autoremove in Debian, cleaning in Void Linux does not delete old kernels. There's a vkpurge command for that.

Remaining niceties:

Console configuration

Pet had to get console fonts from Debian package console-setup-linux. There's console-setup in Void Linux too, but that's not what is needed and should not be installed. It's actually based on a Debian's console-setup, but that package does not include all fonts. Pet needs exactly console-setup-linux.

Pet just copied missing fonts from a Devuan system.

Basically, the font is set with setfont command, for example:

setfont /usr/share/kbd/consolefonts/Vietnamese-TerminusBold18x10.psf.gz`

But there's /etc/rc.conf for that purpose. Just need to set FONT variable with the full file name exactly as in the command above.

Keyboard layout is set with loadkeys command. There's a few predefined layouts in Void Linux, for example

loadkeys /usr/share/kbd/keymaps/i386/qwerty/ttwin_ct_sh-UTF-8.map.gz

Same way, set KEYMAP variable with the full file name of the layout in the same /etc/rc.conf.

For advanced layouts, with more than two speaks pet has to lean how to complie them. Pet needs three humanspeaks and one meowspeak. There must be some clues in Debian's console-setup or kbd. Pet does not know that that at the moment.

Network configuration

Pet followed the manual https://docs.voidlinux.org/config/network/index.html Pet uses a static IP address and the use of ip command in the /etc/rc.local is one of right ways for simple setups. Unlike sysvinit, runit executes /etc/rc.local before starting services, so all interfaces get configured.

That's all. For a minimal system there's no need for more.

Void Linux rocks. Everything is done right. Well, the most of.