Review
Default State
True to Void's minimal architecture, the default state of the AgarimOS respin of Void is also minimal in terms of
applications. The only applications installed out-of-the-box are the WezTerm
terminal written in Rust and configured in the Lua
scripting language, Firefox Web Broser, the OctoXBPS GUI package manager, and a terminal system monitor application, bottom.
The bottom Terminal System Monitor
The installation is so minimal --whether intentional or by oversight, even standard Plasma applications such as
System Monitor and Info Center are not installed
by default. Components required by System Monitor to provide GPU information are
also not installed, something which is not usually an issue in other distributions.
Many Plasma Packages Are Not Installed by Default and Some Components Are Missing
Image 1: Plasma related packages in OctoXBPS. Some are not
installed.
Image 2: System Monitor is not able to display GPU related
information. This is not an issue in other distributions.
The other important aspect of the default installation of note regards graphics. There is no option to install
proprietary graphics drivers in the installer, so only the FOSS Nouveau is
installed and available, by default. In the Plasma version of the distribution both X11 and Wayland sessions are
available, and the X11 session is enabled by default.
Initial Issues
The numerous minor problems and one major problem I encountered during my previous use of Void in 2018 were not
present in the current installation. However, there were several other minor problems and one other major problem in
the current installation. The major problem required resolution before I could use the OS reliably, and the minor
ones before I could use it comfortably. The minor problems were:
There major problem was insidious. It was one that I suspect was not due to any Void process, but possibly due to an
oversight in the AgarimOS developer's process in using the Void ISO and live system creation tools. It is also possible I caused this problem after
creating subvolumes and moving the contents of these directories to the new subvolumes, however, I don't think so
since I've used the process successfully on Fedora and other distributions successfully.
The problem was that the /etc/ and /usr/ directory
ownership was set to the regular user specified during installation. I didn't notice this in my initial use of
AgarimOS/Void on the Dell G5, but suddenly, the system became unstable and commands would not execute successfully.
I changed the ownership on these directories, using chown with the -R option. This was not the appropriate method for correcting the problem as the setuid permission was removed on the sudo and su commands. I gave up on fixing this issue on the Dell, but used a script from a
chroot to correct the permissions of each file in these directories
individually and treating the files with setuid and setgid permissions separately on the Lenovo Legion.
AgarimOS Customizations
Agarim's customizations of Void are focused on the appearance of the desktop environment and the interactive
terminal experience.
Plasma Theme
AgarimOS's appearance is largely governed by its consistent use of the Cattpuchin theme. It provides a Plasma global
theme called Catppuccin Mocha Mauve and associated theme components of the same name: color scheme, Plasma
(Plasmashell) theme, window decoration theme, ponter theme, splash screen, as well as a Catppuccin Mocha
SDDM theme. The theme configuration also uses Kvantum as the application style engine, with a theme consistent with the other
elements named -- Catppuccin Mocha Mauve. A wallpaper called ChessCatppuccin is also included. The
theme even extends to the preboot environment with a Catppucin styled GRUB
theme.
Although Catppuccin is not my favorite of all available Plasma themes, it is a good choice because it has the
benefit of being adapted to many applications and appearance elements of many user interfaces and experiences,
presumably for 362 applications, interfaces, and experiences, based on the number of repositories in the Catppuccin GitHub portal. For example, it has been
adapted to provide many variants of Neovim colorschemes. As a desktop environment
theme, it has been applied to more elements of a DE. For example, there is a Yakuake skin available for this theme -- in contrast to other themes which neglect
this terminal.
The themeing is complete -- at least in availability of all elements by default on the installation, however there
are a few issues in how it is applied in AgarimOS:
-
Although available in System Settings, the theme wallpaper is not applied on the
desktop and or the SDDM greeter, which seems to expect it based on the
setting's preview. The actual wallpaper applied to the desktop and the greeter seems to be one created by theme
designer L4K1.
-
The colorscheme applied to Dolphin is hardcoded into the application's
configuration file at ~/.config/dolphinrc. This is unnecessary as applying the
systemwide theme elements, including Kvantum to Catppuccin Mocha Mauve
appropriately sets the Dolphin theme. The choice by AgarimOS to hard-code the
style prevents the normal Plasma behavior where changing the system theme also changes the Dolphin theme. I found this to be annoying, as it first required me to troubleshoot
the issue, then remove the
colors section from ~/.config/dolphinrc
The AgarimOS developer has created a complete and consistent theme based on a popular style that will be appreciated
by many users, but I eventually created a theme that suits my preferences and my habit of choosing colorshemes that
match a distribution identity (I used the AgarimOS installer to expose myself to a new experience, but I really
wanted a Void system) based on Everforest and Leaf If interested you can see it here.
AgarimOS Appearance
The Plasma edition uses Catppuccin styling for the DE as well as the GRUB.
Terminal Experience
This aspect of AgarimOS's customization is achieved through an alternative terminal emulator, additional
terminal-centric applications which alter the appearance and functionality of the terminal in interactive use, and
an alternative login shell to what is typically used by Linux distribtutions.
Terminal Experience
The interactive experience is enhanced by additional utilities installed by default. These are aliased to
provide alternative execution of some common commands and can also be used standalone.
zsh
The login shell and the interactive shell is zsh. Although not the typical
choice, especially for a login shell, it is in my opinion, the best choice. In offers the same advanced completion,
syntax highlighting, and convenience features of fish but with better
compatiblility and similar behavior and syntax to Bourne type shells like Bash, as
well as incorporation of POSIX features.
The choice of zsh, and the extensive configuration for interactive use through
.zshrc, is the largest added value to the Void Linux base. The configuration uses the
applications listed in the following table to alter the appearance and behavior of commands and to improve the user
experience.
Applications
The utilities, incorporated through aliases for common commands, or shell functions with the same command as those
that they replace, are listed below, and their functionality is shown in the above set of images. The most
impressive and useful, simply form a convenience perspective, is the alias of cd
to z, which executes zoxide instead of cd. This command allows changing directories by using a part of the target path.
For example one can change to the directory /home/brook/DataEXT4-16ITH6/ordinatechnic.com/content/distribution-reviews from home by typing:
The configuration is not without pproblems, however. For example, the function named cat defined in .zshrc, to replace the normal
command with bat causes a nicely formatted, syntax-highlighted output with
bat but also -- presumably with the intention of providing a fail-safe --
causes a redundant output produced by cat.
z revie
The other most notable addition is the use of fzf, a utility that fuzzily filters
through lists, where lists can be file paths in a directory tree, possible command completions in zsh. For example, starting to type a command produces a nice looking list of possible
completions (this is shown in the first slide in the above set of images).
Utilities to Enhance Terminal Experience
| Utility/Command |
Purpose |
In Agarim |
| bat |
alternative to the catcommand with syntax highlighting |
alias for cat |
| duf |
alternative to the df command to view disk usage/free space |
alias for df |
| dust |
alternative to the du command for viewing disk usage |
alias for du |
| fastfetch |
system information utility |
runs on terminal open |
| fd |
alternative to find |
aliased with options to act as a default argument to fzf fzf
|
| fzf |
fuzzy finder in lists produced by multiple sources |
used as finder in lists produced by aliases that pipe output to it |
| lsd |
alternative to ls for producing directory listing |
aliased to ls |
| procs |
alternative to ps for viewong processes statuses; writtine in in
Rust |
aliased to ps aux |
| starship |
customizable and informative shell command prompt |
provides the Pastel Powerline preset Starship prompt on all
terminal emulators |
| vivid |
used to generate theme colors for LC_COLORS environment variable;
used by various tools, e.g. tree |
|
| topgrade |
provides single command to update system with all configured package managers, i.e., the native package
manager, flatpack, npm, etc, depending on topgrade's own
configuration |
available as an alias to update system, remove orphan packages, and xlocate |
| zoxide |
alternative to cd |
aliased to cd with z |
Unfortunately, the AgarimOS configutation is missing two pieces of convenience functionality that is possible with
some of the available configuration snippets provided on the Arch Wiki page for zsh. One is the list of possible options displayed with a brief description when
typing a command followed by -. The command can be completed by selecting it
with the down arrow key. Another convenience shows values of environment variables when typing part of the
environement variable name or even typing echo $ gives a shadow suggestion on the commadn line and also
displays a list of completions for the environemnt variable names and and their values. The top left window in the
following image shows this missing functionality, available through simple configuration, in Artix with the Arch
Wiki snippets included in its .zshrc.
Some of the
zsh Configured to Show Environment Value Name and value Completions
While extensively configured AgarimOS's zsh configuration is missing this
functionality as well as the convenience of listing possible options for a command and their descriptions.
WezTerm
Another unusual choice, this one probably not so useful for most users, is installing WezTerm as the only terminal emulator. This is a so-called modern emulator that is
capable of directly using the GPU to render the text objects in the emulator. It uses the Kitty Terminal Protocls which improve the graphics and input capabilities of terminals
which support it. It also written in Rust.
WezTerm and Its Configuration File
WezTerm is not configured nearly enough to make its usage comfortable. Also,
escape sequences produced when pressing special keys are not rendered properly.
The drawback of this terminal is it is configured solely through through a Lua
confiuration file, which is empty in noromal installations. AgarimOS does some configuration, but it is not nearly
enough, in my opinion, for comfortable use. Users will need to go through the extensive WezTerm documentation to cutomize it to their liking. In addition, the Xterm-style
formatted escape sequences are not processed properly by the terminal, so even typing special characters, for
example, END, HOME, Up-Arrow, produces:
;1F;1H;1A
Because of this, instead of tinkering with WezTerm -- which is really only
beneficial when interacting with AI agents which produce vast amounts of output -- configuration, I installed Konsole, KDE's own terminal, The experience is much better, and because the login
shell is zsh, it becomes the interactive shell in Konsole, without any adjustment to its settings, and uses the customizations in ~/.config/zsh/.zshrc.
runit Init Program and Service Manager
The single feature that differentiates Void Linux from other distributions, and by extension AgarimOS, is the use of
runit as the init program and service manager, or as Void documentation calls
it upervision suite. (See the end of this article for useful definitions.) As used in Void, runit supplies the init program that runs as PID 1, instead of systemd, and starts services in theree stages, and continues to supervise services
until shutdown. (For a good introduction to runit as an init program, see the
section Runit as the init system on Gentoo's
Wiki page on the subject.
runit is an extremely simple program and makes administering a Void system
transparent.
As an example of its simplicity and transparency, consider its operation in booting and shutting down the system.
These operations are simply an execution of a series of shell scripts in two stages during startup, and an execution
of a series of shell scripts in a single stage during shutdown. These stages -- Stage 1, Stage 2, and Stage 3 -- are
runlevels, and roughly correspond to some of systemd's targets.
- Stage 1
-
When runit or its helper, runit-init
start, themselves started probably by a kernel command line parameter included in the dracut settings. runitexecuts the shell script
/etc/runit/1. This script sources /etc/runit/functions and /etc/rc.conf then executes the
scripts in /etc/runit/core-services in shell expansion order.
brook …/ordinatechnic_content_20250311 exp ✘!? 00:53 ls -la /etc/runit/core-services
drwxr-xr-x 398 B root root 15 Aug 26 01:23:44 PM -- .
drwxr-xr-x 148 B root root 15 Aug 26 01:25:26 PM -- ..
.rw-r--r-- 2.5 KB root root 15 Aug 26 01:07:28 PM -- 00-pseudofs.sh
.rw-r--r-- 229 B root root 15 Aug 26 01:07:28 PM -- 01-static-devnodes.sh
.rw-r--r-- 276 B root root 15 Aug 26 01:07:28 PM -- 02-kmods.sh
.rw-r--r-- 491 B root root 15 Aug 26 01:07:28 PM -- 02-udev.sh
.rw-r--r-- 687 B root root 15 Aug 26 01:07:28 PM -- 03-console-setup.sh
.rw-r--r-- 2.1 KB root root 15 Aug 26 01:07:28 PM -- 03-filesystems.sh
.rw-r--r-- 118 B root root 15 Aug 26 01:07:28 PM -- 04-swap.sh
.rw-r--r-- 640 B root root 15 Aug 26 01:07:28 PM -- 05-misc.sh
.rw-r--r-- 557 B root root 15 Aug 26 01:07:28 PM -- 08-sysctl.sh
.rw-r--r-- 167 B root root 15 Aug 26 01:07:28 PM -- 10-runit-control.sh
.rw-r--r-- 188 B root root 15 Aug 26 01:07:28 PM -- 97-dmesg.sh
.rw-r--r-- 317 B root root 15 Aug 26 01:07:28 PM -- 98-sbin-merge.sh
.rw-r--r-- 408 B root root 15 Aug 26 01:07:28 PM -- 99-cleanup.sh
.rw-r--r-- 167 B root root 09 Jul 23 03:02:51 PM -- 99-live-audio.sh
- Stage 2
-
When /etc/runit/1 completes, the init program runs /etc/runit/2, which sets the runlevel mode (single-user or default multi-user), creates
the directory /run/runit/runsvdir, and links /etc/runit/runsvdir/current to /run/runit/runsvdir/current, which starts the enabled services and sets up monitoring
of the enabled services for the runlevel mode with the command:
runsvdir -P /run/runit/runsvdir/current
- Stage 3
- This stage is the shutdown process. /etc/runit/3 sources /etc/runit/functions and /etc/rc.conf and then executes
the scripts in /etc/runit/shutdown.d, shown in the following listing.
brook …/ordinatechnic_content_20250311 exp ✘!? 01:03 ls -la /etc/runit/shutdown.d
drwxr-xr-x 230 B root root 15 Aug 26 01:23:44 PM -- .
drwxr-xr-x 148 B root root 15 Aug 26 01:25:26 PM -- ..
.rw-r--r-- 90 B root root 15 Aug 26 01:07:28 PM -- 10-sv-stop.sh
.rw-r--r-- 44 B root root 15 Aug 26 01:07:28 PM -- 20-rc-shutdown.sh
.rw-r--r-- 96 B root root 15 Aug 26 01:07:28 PM -- 30-seedrng.sh
.rw-r--r-- 139 B root root 15 Aug 26 01:07:28 PM -- 40-hwclock.sh
.rw-r--r-- 8 B root root 15 Aug 26 01:07:28 PM -- 50-wtmp.sh
.rw-r--r-- 89 B root root 15 Aug 26 01:07:28 PM -- 60-udev.sh
.rw-r--r-- 148 B root root 15 Aug 26 01:07:28 PM -- 70-pkill.sh
.rw-r--r-- 334 B root root 15 Aug 26 01:07:28 PM -- 80-filesystems.sh
.rw-r--r-- 347 B root root 15 Aug 26 01:07:28 PM -- 90-kexec.sh
runit Scripts and the Filesystem Hierarchy
runit is also simple in day to day managment by the user, which typically
involves enabling, starting, stopping, restarting, and querying the status of a service. Available services are
stored in /etc/sv (Image 4 in the above set) in a subdirectory for each service. Each
subdirectory contains, most importantly, a shell script called run which is the
actual service file, somewhat equivalent to a systemd service unit file. Some
service directories also contain a finish script that runs when a service is
stoppped, and a log directory which itself contains a log directory containing its
own run script to set up logging for the service. These are shown in the following
image and in Image 2 of the above set of images.
Representative Contents of the /etc/sv/
These directories and the files they contain are the essence of service management with runit. A service is enabled by linking a service directory in /etc/sv/ to a target inside /var/service. This is shown in
the Konsole window in Image 2 of the above set where the power-profies-daemon is enabled with the command:
sudo ln -s /etc/sv/power-profiles-daemon /var/service/
The image also shows checking the status of the command with:
sudo sv status power-profiles-daemon
Most discussions about Void mention its exceptional performance, due to its minimalism, and the lack of systemd bloat. I found this to be the case also; in fact one of the reasons I
installed Void (through the AgarimOS respin) on my primary laptop was due to the impressive performance I
experienced on my secondary laptop. The boot times are the fastest I have seen on any distribution. The impressive
boot times were in the default state with the open source Nouveau driver. After installing the proprietary Nvidia
driver, there was an in increase in boot times. This can be imporved by forcing early loading of Nvidia drivers as
described below in the section Fixes and Enhancements -> Force Early Loading of Nvidia Drivers.
Laptop Power Management
Power management was another aspect of Void that pleasantly surprised me. On the Lenovo Legion, only the Arch based
installations and Siduction seem to reliable for the most part in this regard, while openSUSE Tumbleweed and
Ultramarine (Fedora) have more problems. Hibernation works reliably on Void Linux, which I believe is due to the
lack of systed-sleep components which handle suspend and hibernate in a systemd based system.
tlp tlp and tuned are installed by default for
battery power optimization. Unfortunately, tlp is incompatible with the Plasma
desktop's Battery and Power widget which allows controlling the power-profiles-daemon state. So, I replaced tlp with power-profiles-daemon which
required the removal of tuned.
Package Management and Infrastructure
Void Linux has a comprehensive package management system called XBPS (X Binary Package System) a Void custom developed system, that includes a ports like
build system as in BSD called xbps-src that allows easy package building and
customization of packages , as well as simple management of local and third-party repositories.
XBPS
XBPS is very similar to Arch's pacman,
at least in the characteristics that are readily visible to the user, with succinct command options and outputs that
are barely distinguishable from pacman -- especially in the command to update
the system:
xbps-install -Su
Unlike Arch, but like Debian, it splits its capability among different commands, shown in the following table.
The Suite of XBPS Package Management Programs
| Command |
Purpose |
| xbps-alternaties |
list or set alternatives provided by packages; provided alternatives are registered in the package
database |
| xbps-checkvers |
lists outdated packages by comparing repository versions with source package tree |
| xbps-create |
creates binary packages without using xbps-source and a and a
template file; parameter values in the template recipe are specified as options to the command |
| xbps-dgrpah |
generates a dependency graph of a package |
| xbps-fbulk |
generates packages in bulk by reading through srcpkg hierarchy or specified packages provided as
arguments, also building all required dependencies for a package |
| xbps-fetch |
downloads files from a URL or URLS using a specified protocol (ftp, http, https, socks5) |
| xbps-install |
install packages or update system |
| xbps-pkgdb |
used to check for and fix issues in the package database |
| xbps-query |
query package and repository information |
| xbps-reconfigure |
configure or reconfigure installed packages by executing the package template's post_install actions
|
| xbps-remove |
unisnstall packages |
| xbps-rindex |
manages local package repositories by creating, updating, or removing packages that are stored in the
local repository |
| xbps-uchroot |
a chroot helper that creates bind mounts and initiates a chroot
environment; (this is not a package management command, but is included here for information and it uses
the xbps in its name) |
| xbps-uhelper |
XBPS helper utility |
| xbps-uunshare |
a less advanced -- compared to xbps-uchroot |
The most commonly used of these will be xbps-install for updates and
installations, xbps-remove for uninstalling, and xbps-query for querying the repositories and the installed system, and even an
xbps-alternatives for listing and setting alternatives for packages.
I found this binary package manager to be very good, especially considering that it provides features that pacman doesn't provide without add-on helper scripts, such as the ability to
search for a package in a remote repository that provides a particular file. This can be done with the command
xbps-query -Ro '*/filename'
The use of this combination of options is discouraged because it causes excessive use of repository resources as it
causes -- according to Void documentation -- xbps-query "to download parts of
every package to find the file". A suggested alternative, from the xtools set
of XBPS helper programs, is the xlocate
command:
xbps-locate '*/filename'
which searches the locally available package cache.
However, like pacman, XBPS still requires users to be adept at various UNIX
utilities for some advanced tasks, such as uninstalling all packages that match a certain string, which are provided
out of the box by some command line package managers. For example, when I wanted to uninstall Xfce, I had to pipe
one xbps command output as an input to a UNIX utility program and use this result as the input to another XBPS
command as in:
$ sudo xbps-remove -F $(xbps-query -s xfce | cut -d ' ' -f 2)
Other features and usage examples of XBPS are given below in Package Management.
xbps-src
The most impressive component of XBPS is xbps-src, the package build system and source package manager. This is the
standout feature of Void that prompted me to try Void. Void users may use it to build and install packages from
Void's source package GitHub repository as it is the only way Void distributes some proprietary packages. The
unofficial third-party repository VUP is also available (see below).
Where xbps-src shines however is not in managing Void's own source packages,
but in building packages distributed by third parties as source archives. In my current installation of
AgarimOS/Void, I used xbps-src to package an AI generated fork of envycontrol as shown in the following image.
This required:
-
cloning the Void Linux void-packages GitHub repository.
git clone https://github.com/void-linux/void-packages
-
creating a directory for my custom package in the void-packages, as in:
brook …/ordinatechnic_content_20250311 exp ✘!? 20:07 tree -L 3
~/void-packages/srcpkgs/envycontrol-void
/home/brook/void-packages/srcpkgs/envycontrol-void
├── files
│ ├── envycontrol-void
│ └── envycontrol-void.1
└── template
2 directories, 3 files
-
from within the -void-packagesdirectory, building the package with
.xbps-src pkg envycontrol-void
Building a Custom Package Using xbps-src
The program requires placing a
For a complete discussion on the use of xbps-src for building packages, see Void
Linux: Creating Binary Packages Using xbps-src, prepared during my previous use of Void Linux in 2028.
Void User Packages (VUP)
For software not packaged by Void, an alternative to building packages locally is the VUP (Void User
Packages). This is an unofficial repository, similar to the AUR, but unlike the AUR, it does not simply provide
package recipes, known as templates in Void or PKGBUILD's in Arch. The build
is actually performed by the repository build system. For more control users can build the package locally.
runit Scripts and the Filesystem Hierarchy
Nvidia and Optimus
The default AgarimOS/Void installation only includes the Nouveau driver by default. However, the Nvidia proprietary
driver is available from Void's void-repo-nonfree repository, enabled by
installing a package of the same name, as earlier in this article. After enabling this repo, the nvidia package can be installed as shown below.
Installing the Proprietary Nvidia Driver
This package is available after enabling the void-repo-nonfree
repository.
Unfortunately, Void does not include any Optimus management utilities. I was able to generate a Void compatible fork
of EnvyControl and create a package locally
for Void, as described above, in order to flexibly take advantage of the Nvidia card as described in The Continuing Usefulness of X11 and Optimus Management Programs in the Age of Wayland and
Switcheroo-Control. I also prefer X for some functionality that will never be available with Wayland, such as
support for GTK application's menus to be available for display in Plasma's Global Menu widget. For
information on the original EnvyControl utility, see EnvyControl: A Distribution Agnostic Nvidia Optimus Management Utility for Linux
runit Scripts and the Filesystem Hierarchy
Issues
- Backlight Level Persistence
-
Backlight control with keyboard shortcuts and Plasma's Brightness and Color widget work as expected.
However, the backlight level does not persist accross reboots and upon resuming from suspend and hibernate.
-
Touchpad Issues
-
On both Dell and Lenovo the touchpad had problems. In Plasma System Settings touchpad settings could not be
modified because the Apply button was grayed out. Solviing this problem required uninstalling xf86-input-synaptics, adding my user to the input
group, creating /etc/X11/xorg.conf.d/30-touchpad.conf and adding:
Section "InputClass"
Identifier "touchpad"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
Option "Tapping" "on"
EndSection
- Plasma Keyboard Shortcuts
-
Default keyboard shortcuts for the Plasma desktop are not set other than the Super key to activate the
launcher. Shortcuts for snapping windows to screen edges, which I use frequently were not set as they usually are
in other distribution's Plasma implementations. This had to be fixed in the System Settings -> Keyboard ->
Shortcuts.
-
Permissions and Ownership Issue
In both the Dell and the Lenovo, the /etc/ /usr/
directories had user and group ownership of the created user at installation instead of the root user. This may have
been due to my conversion of the original installation on the top level Btrfs
subvolume to a hierarchical subvolume layoyt where it was necessary to copy the contents of these directories to
newly created root subvolume. Or, it could have been due to a problem with the live ISO creation process, a problem
equally as severe as the most serious in my previous use of Void in which the user specified in the installer was
not actually created in the installed system.
Solving the current problem required generating a script to individually change permissions of each file and
directory without setuid and setguid bits
inside the /etc/ /usr/, then separately correct
permissions for the files with setuid setguid
permissions.