Generating a new rootfs from scratch in order to test changes to early
parts of the software stack or just to have a pristine environment is
something I needed several times in the past.
Since I use Archlinux in my desktop something that I like is to have a
similar environment in the target test rootfs. I decided to re-use and
improve a script from Kay Sievers to create an installer that can be
booted as a VM, as a container or in bare metal:
arch-installer.sh.
Originally it was a script to bootstrap a Fedora image and I think that
with some small changes that would still be possible.
$ time sudo arch-installer.sh -l ~/vm/test.img
...
real 0m31.238s
user 0m22.277s
sys 0m2.473s
30 seconds later I have a complete pristine image that can be used as a
VM with qemu, as a container with systemd-nspawn or just copied to a
pendrive/sdcard to boot for example a Minnow Board Max.
Container:
$ sudo systemd-nspawn -b -i ~/vm/test.img
VM:
sudo kvm-that ~/vm/test.img
Note: ‘kvm-that’ is also a script available in the same repository so I
don’t have to type all the options to qemu.
In order to boot another computer or a board like Minnow Board Max just
dd the image to a usb disk or sdcard. You can also generate the image
directly to the final destination:
$ sudo arch-installer.sh -l /dev/mmcblk0
The script has also some nice options to make it easy to customize the
final image. One thing that I’m often doing is giving an overlay
directory with configuration files for wpa_supplicant. This way I can
already access my WiFi networks in the target image.
If you always need certain packages you can use the example
debug-tools
hook that is executed before the image is finalized. By mixing hooks
like that and the overlay directory mentioned above it’s possible to add
your local repository to pacman.conf and install packages not available
in Archlinux. Or packages that you’d like to maintain on your own. In my
use cases with Minnow Board Max I maintain my own kernel with
configurations suited to run ardupilot on it.