Raspberry Pi/Minimal musl+busybox cross building

Raspberry Pi 1 (A/B/A+/B+/zero/zero w) musl/busybox environment.
Build your own minimal system using libressl, musl-libc and busybox.

This entire process was done within an official gentoo-hardened stage3 chroot with USE="libressl", updated to ACCEPT_KEYWORDS="~amd64" (if you don't want to do this, set ~amd64 keyword individually where needed to obtain the same results from instructions below). Follow the Gentoo Handbook if you haven't already. Please read everything twice before trying - that's recommended when first installing Gentoo because it really helps! If you find mistakes below, ask for help in the #gentoo-arm or #gentoo-hardened channels on Libera.Chat irc.

Re-run the crossdev command until it completes successfully...
When done, re-edit /etc/portage/make.conf and revert temporary changes.

Add -vtv and -sanitize to cross-gcc portage configuration; now that crossdev is finished, a world update should not overwrite the portage configuration files.

Set the correct cross-environment make.profile
Replace the cross-environment's make.profile with the directory right before the hardened/musl armv7a profile.

Time for the package salad buffet, but remember: this system is on a diet!
Check what the system would usually install if running emerge world, put it in a text file and remove the packages you don't want/need/are replacing with busybox, leaving only a very minimal, but functional list comprising of the customized stage3 install.

Here is an example of a slimmed down list of packages that were kept. It was formatted for an upcoming emerge command which causes 33 packages to install.

Now, set use flags for packages you are going to be installing. Remember, it is meant to be tiny, and it'll all be running in the Raspberry Pi's RAM, so USE="-static make-symlinks savedconfig syslog" for busybox.

Configure busybox and choose the tools wanted/needed in order to have a fully bootable/usable system. Provided at the end of this document will be known working busybox configuration examples to base oneself on.

Save the busybox .config and place it in target portage configuration.

Start by rebuilding musl-libc first, then build the base system.
Now, emerge the packages from the minimal list. If you find errors, please make bug reports and/or see if you can find patches for your issues and submit them in your bug reports.

Now wait. musl-libc is built twice for ease of use, once with crossdev and once with cross-emerge, as usually one would not be built, but once compiling has completed the binary package that this generates will be useful, along with all of the other binary packages.

Start building your squashfs root tree
Now that most of the system is built, time to emerge the extra sotware that your Raspberry Pi project will require. For the sake of simplifying these instructions, no extra packages will be installed and the instructions will skip to the next step: creating a slimmed down version of your cross-built environment using the binary packages that cross-emerge generated.

Set/unset services manually in /etc/runlevels/*
Here is a runlevel example.

Check what services/init scripts are available.

Backup the new sysctl init script just in case your change is overwritten during updates.

Configure everything relevant as you would a normal Gentoo system.
You can leave /etc/fstab empty though, for now. Read the gentoo handbook and see what configuration is needed before first boot if necessary. The other Gentoo Wiki Raspberry Pi pages are useful too.

At least set a root password so you can login.
Replace the first root line with the bottom root line.

Configure and build the kernel.
You probably already know what to enable/disable, and you can probably mostly leave everything as-is, but make sure that you enable tmpfs, squashfs with xz support and overlayfs for this guide, and set the default initramfs location to /usr/armv6j-hardfloat-linux-musleabi/usr/src/initramfs

We have a dependency loop here. The kernel needs an initramfs, and the initramfs needs to contain kernel modules. So, first we build the kernel and install its modules into our new slimmed down/configured gentoo root.

Build the initramfs
Take a break from the kernel to create the initramfs with a newly compiled ultra-minimal static busybox binary, the /init script that uses busybox, rudimentary device nodes and a compressed squashfs image of the /usr/armv6j-hardfloat-linux-musleabi/usr/src/squashfs directory.

Create a squashfs image of your minimal root for inclusion in initramfs.
Your squashfs image should be somewhere around 5 to 10 megabytes if you didn't install anything other than the list of packages ealier in these instructions.

Complete the installation.
Your cross-gentoo build is complete, all in only one small file! One last thing that needs doing is putting it on a FAT32 SD card partition along with the Raspberry Pi firmware.

Once you see that the system is booting, it is safe to remove the SD card from the Raspberry Pi. This setup allows for SD card swapping, because you already loaded the entire operating system into the Raspberry Pi's RAM.

Troubleshooting
System busybox config: https://gist.github.com/anonymous/d9a10a8d380a313e54f4435be15c21c1

Minimal busybox config: https://gist.github.com/anonymous/749fd5f60d0c837cb42bfd921048ac71

Example init script: https://gist.github.com/anonymous/8787dd24b6fc7e061b6637d9f61c2f8f