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.