Cross Compliation

Dracut supports running against a sysroot directory that is different from the actual root (/) directory of the running system. It is most useful for creating/bootstrapping a new system that may or may not be using the same CPU architecture as the host system, i.e. building a whole Linux system with a cross-compiler framework like Yocto.

The user-visible frontend change is the introduction of a new option called "-r" or "--sysroot". It expects a directory that contains the complete Linux system that has all the files (kernel drivers, firmware, executables, libraries and others) necessary to construct the initramfs.

E.g: dracut --sysroot /path/to/sysroot initramfs.img kernelversion

To support this, a new global variable was introduced inside dracut. This variable is called "dracutsysrootdir" and all the files installed into the initramfs image is searched relative to the sysroot directory. This variable can also be set externally to dracut without using option -r/--sysroot.

There are other details that are necessary to tweak to be able to run on cross-compiled (a.k.a. foreign) binaries.

dracut uses these crucial utilities during its operation:

ldd

It lists dynamic library dependencies for executables or libraries

ldconfig

It creates /etc/ld.so.cache, i.e. the cached information about libraries known to the system.

These utilities the way they exist on the host system only work on the host system.

To support cross-compiled binaries, a different ldd variant is needed that works on those binaries. One such ldd script is found at https://gist.github.com/jerome-pouiller/c403786c1394f53f44a3b61214489e6f

ldconfig in GLIBC as is does support a sysroot with its -r option.

Extra environment variables needed to run dracut on the sysroot are documented in the dracut(8) man page.

For the Plymouth boot splash to be added to the initramfs image, this gitlab PR is needed for Plymouth: https://gitlab.freedesktop.org/plymouth/plymouth/merge_requests/72