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:
- minimalism
- support of the old 32-bit hardware
- runit init system. That's not a masterpiece, but that's better than the mainstream crap. You know which one exactly.
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=4096and 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/sda1Then, mount the file system:
mkdir /mnt/hdd
mount /dev/sda1 /mnt/hddThen, 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 -lIt 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/0Oops, 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.imgSo now we can do:
mount /dev/loop2 /mnt/0You see? /mnt/0 contains the only directory LiveOS with the only file ext3fs.img.
Thus, the chain of perversions looks like this::
/dev/sdb2: ISO9660 file system/dev/loop0: SquashFS/dev/loop1: Ext3 file system
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
passwdAs 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.confAnd reloaded the configuration:
wpa_cli reconfigureThat'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 -SuXBPS says that xbps must be updated first. Okay then:
xbps-install -u xbpsand run again:
xbps-install -SuPet will install missing parts after reboot, but now it needs only nano:
xbps-install nanoPet 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.shAt last, pet is able to write host name to /etc/hostname, and a few more:
/etc/issue: pet just made it empty (oh, void in terms of this distro)/etc/passwd: pet changedshtobashfor the root- pet ran
wpa_passphrase pet-SSID pet-password >>/etc/wpa_supplicant/wpa_supplicant.confin the chrooted system to connect to the network automatically after reboot.
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 0Pet 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 syslinuxThere'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/sdaPet 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.imgThat'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 \
fbvbind-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 7Run the following for changes to take the effect:
sysctl -pPet deleted unnecessary packages:
xbps-remove -oUnlike apt autoremove in Debian, cleaning in Void Linux does not delete old kernels.
There's a vkpurge command for that.
Remaining niceties:
.bashrcin/rootand in/etc/skel: pet copied one from the other system; also it needed.profilefor invocation, pet copied it from/etc/skel/.- Case-insensitive search in
lessand use of color:echo 'export LESS="-i --use-color"' >/etc/profile.d/less.sh - Syntax highlighting in
nano: pet copied/etc/nanorcfrom Devuan
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.gzSame 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.