PkgBlog: aaa_base

Creates initial Slackware file structure
Package series/name: a/aaa_base-14.2-x86_64-2
Official release: source and package
Blog entry created: 2018-07-09
Tagged: series_a core-system

Here’s the official description of aaa_base:

Sets up the empty directory tree for Slackware and adds an email to root’s mailbox welcoming them to Linux. :) This package should be installed first, and never uninstalled.

To understand the contents and installation of the aaa_base package is to understand the simplicity of Slackware packages in general.

So let’s waste no time cracking into this thing by manually performing the simple steps of a Slackware package installation.

First, we’ll create a directory for our experiment

$ mkdir /tmp/aaa
$ cd /tmp/aaa

and then download the package

$ wget https://mirrors.slackware.com/slackware/slackware64-14.2/slackware64/a/aaa_base-14.2-x86_64-2.txz

We can use tar to create a list of the contents of the package:

$ tar -tf aaa_base-14.2-x86_64-2.txz | less

Browsing the listing, we see that it’s a mere 127 directories and files:

./
bin/
run/
media/
media/memory1/
media/hd0/
media/cdrecorder0/
media/zip0/
media/cdrom0/
media/zip1/
...
usr/local/etc/
usr/doc/
usr/src/
root/
proc/
etc/
etc/X11/
etc/os-release
etc/slackware-version
dev/

This is a package? What’s going on here?

When packages are installed, they are decompressed and unarchived. The tool which typically does this work is Slackware’s standard installpkg utility, which is a dense little 500 line shell script. It detects the compression type and uses tar to extract the archive.

The destination is the root directory (/). Any directories which don’t exist will be created by tar as needed.

So in a very real sense, this package contains the entire initial Slackware filesystem!

Performing a faux install

Since I’m in a safe place for this experiment (/tmp/aaa, as mentioned above), I can "install" the package right here:

$ tar -xf aaa_base-14.2-x86_64-2.txz

Let’s see what we’ve got:

$ ls
bin   dev  home     lib    media  opt   root  sbin  sys  usr
boot  etc  install  lib64  mnt    proc  run   srv   tmp  var

Ha! Now there’s a whole Slackware root directory structure in /tmp/aaa!

The package description also mentioned some mail, so there must be some other stuff in here.

We can use find to list the non-directory files:

$ find -type f
./media/README
./install/doinst.sh
./install/slack-desc
./mnt/README
./var/spool/mail/root.new
./etc/os-release
./etc/slackware-version

That’s just 7 files. Of these, there are two READMEs, two information files (in /etc) and the email from Patrick Volkerding (/var/spool/mail/root.new) welcoming us to Slackware.

That leaves two files of interest in the /install directory. Wait, /install isn’t part of the Slackware root directory structure is it? No, it’s not.

The /install directory is indeed created when a package is unarchived, but it is cleaned up after the installation is complete. Its purpose is to contain install-specific files for this package. At the very least, it should contain a slack-desc (package description) text file.

Optionally, it may also have an installation script called doinst.sh.

The package install script

If a package needs to do any work after its files have been spread around the target filesystem, then this work will be performed by doinst.sh.

In the case of aaa_base, we do have a /install/doinst.sh script.

Why does a listing of directories and files need a script? It turns out that much of the script is used to set up symbolic links. Many (most?) of these exist to make the structure compatible with various standards and/or other Unix systems.

Here’s a typical passage from the script:

# "/var/adm" is where I used to keep the Slackware package database until
# the FHS people "standardized" making it a symlink to /var/log...
( cd var ; rm -rf adm )
( cd var ; ln -sf log adm )

I like reading these sorts of comments in Slackware’s various packages and scripts. They give me a sense of the humans behind the distro.

Also, they often tell a history of Slackware and Linux itself. For example, this script mentions a change to glibc header links starting with Slackware version 8.1, which was released in 2002.

To be continued…​

I am very excited to have finally written this first entry of the pkgblog. I know better than to promise any particular kind of schedule, but I hope to be "regular" about it. Whether that ends up being daily, weekly, or monthly is anybody’s guess.

There are 1,332 packages in Slackware 14.2 by my count. Even on an almost daily schedule, that’s just under four years of entries. Keeping up with new releases of Slackware will be interesting - I’ll have to figure out what to do about that when it happens.

Until next time (which will be package aaa_elflibs), happy hacking!