Aboriginal Linux 1.2.0.x

This file is taken out of the 'aboriginal-project-1.2.0.2' tarball

This project is a resuscitation of an old version of the famous Aboriginal Linux created by Rob Landley.

Background

Rob developed Aboriginal up to version 1.4.5, early-2016, then retired from the project. See the history and retirement announcement:

http://landley.net/aboriginal/

Back in the "early days", Rob used uClibc and Busybox as the core of Aboriginal. Later, he gradually replaced Busybox applets with his own creation, Toybox. Then, mid-2015, he moved from uClibc to Musl.

I prefer uClibc over Musl, mostly due to the former's better compatibility with glibc. I also have no motivation to replace Busybox with Toybox. Hence, I have stayed with version 1.2.0, that was released in 2012.

Why use it?

As a Linux developer, I have a need to compile some utilities statically. That is, they do not use any shared libraries.

I use these utilities in the initrd/initramfs, but also in the main Linux filesystem. The single greatest advantage of a static utility is that it is completely self-contained and will work in any Linux, into the future -- there will never be any library compatibility issues.

The downside is that static utilities are big, as, essentially, they have the library functions bullt-in to them. This is where uClibc and Musl come in, as their libraries are "lean and mean" and will produce much smaller binaries than if the utilities are compiled against glibc (Gnu libc, which is what all the Linux distributions use).

To give an idea of the size difference, 'dmsetup' (a utility in the LVM2 package) is 128KB (stripped) when linked against shared libraries, 517KB (stripped) when linked statically against uClibc. A smaller utility, 'hwclock', is 36KB versus 92KB.

Another utility that is interesting to compare is Busybox. Configured fairly full-featured, as I use in Quirky and EasyOS, linked against shared glibc, the 'busybox' binary is 850KB. Compiled in Aboriginal linux and linked statically against uClibc, it is 966KB.  The static utility is not much bigger!

Another place where you might use static utilities, is during early bootup of Linux, in the main filesystem. Even if the system has been "stuffed up", with maybe incompatible libraries installed, if 'init' and the basic bootup utilities are static, then they will still work and get you to a commandline.

Oh, one more thing -- a 32-bit static utility will work in a 64-bit system. No need for 32-bit libraries.

Version 1.2.0

I have been using version 1.2.0 for years. as a chrootable filesystem. That is, I can chroot into it, from whatever host distro I am running (usually Quirky or EasyOS), and then can compile source packages that will be linked against uClibc.

Recently though, I hit a problem, was unable to compile package 'LVM2', as it requires the 'fmemopen()' function, that is not in uClibc.

Or rather, it is, but not enabled. I was using a precompiled x86_64 root-filesystem, downloaded from Rob Landley's site.

Rob uses uClibc version 0.9.33.2, which is the last official release of the uClibc project. That was in 2012. I discovered that there are additional glibc-compatibility options, including fmemopen(), so, I needed to recompile uClibc...

I downloaded 'aboriginal-1.2.0.tar.bz2', which is the source code, which can be used to compile architecture-specific root-filesystems, for example x86_64 or armv6l. For the record, this is where to get it:

http://landley.net/aboriginal/downloads/aboriginal-1.2.0.tar.bz2

I modified the configure option for uClibc, and also bumped the kernel version from 3.5 to 4.3 (got that out of aboriginal 1.4.5), then compiled for a x86_64 target. Then had a new x86_64 chrootable root-filesystem.

And, LVM2 compiled!

Version 1.2.0.x

I thought that others might find this useful, so have forked it as a new project. Version numbering will be "1.2.0.x", where the "x" is my enhancements. At the time of writing, it is "1.2.0.2".

The project is setup as three folders, "binary", "source" and "work". In the latter folder, you will find a HTML file that explains how to use aboriginal-1.2.0.x.

Myself, and anyone else who is interested, can continue to pump steroids into this old "1.2.0". Reconfiguring uClibc and bumping the kernel, were just the first step.

The original official uClibc project was active on the project's git-repository until mid-2015, when work stopped, and a new project, 'uClibc-ng' took over.

I checked-out the latest from the official uClibc git-repo, last commit was 2015-07-05. Put it in aboriginal, but compile failed, with a missing symbol "__builtin_unreachable". This was introduced with gcc 4.5, however, aboriginal 1.2.0 uses gcc 4.2.1. I think that you might guess where this is heading...

I bumped gcc to version 4.5.4, and modified some of the previous patches, but compile failed.

Rather than chase that one, I backed off, kept the uClibc 0.9.33.2 and gcc 4.2.1. After all, there is no pressing need to upgrade, as all the source packages that I want to compile, busybox, etc., do compile.

Anyway, there could be lots of fun for someone, to play with updating the packages.

In 'rootfs-1.2.0.2-amd64', the x86_64 root-filesystem compiled by aboriginal 1.2.0.2, I have put in build scripts for 'ncurses', 'bash', 'busybox', 'coreutils', 'patch' and 'LVM2'.
A project would be to move those into the 'aboriginal-1.2.0.x' source tarball.

Another useful project would be to add a "aarch64" target. Even "armv7l", as currently there is only "armv6l".

Lots of fun! Do read the help-file in the "work" folder.

Links

The original official uClibc site:
https://uclibc.org/
https://git.uclibc.org/uClibc/

uClibc-ng site:
https://uclibc-ng.org/

Regards,
Barry Kauler
March 9, 2018
Blog: http://bkhome.org/news/