Initramfs/Development

This article explains how to modify the postmarketOS initramfs scripts, for which the source can be found in the postmarketos-mkinitfs pmaport. There's another page about adding a device specific initramfs hook.
=== We can have two initramfs files ===
Normally, there is only one initramfs file, but after the installation, you may have two initramfs files in your device's /boot folder.
% ls ~/.local/var/pmbootstrap/chroot_rootfs_samsung-i9100/boot
initramfs initramfs-extra vmlinuz
Regular Linux distributions only have one initramfs file. We use to split it in two, historically this was to work around the size limitations that some devices have (see ). However for most devices this is not needed and -extra was made redundant . If there are two initramfs files: the regular initramfs loads the contents of the initramfs-extra from the pmOS boot partition during the boot process.
The pmOS boot partition is a subpartition of the system partition (SD cards: simply a real partition on the SD card), so we can make it almost as big as we want.
To enable the split initramfs, add deviceinfo_create_initfs_extra=true to your deviceinfo file.
=== Recommended development workflow ===
* Only do one small change at a time
* Rebuild and test on device (pmbootstrap initfs, pmbootstrap flasher flash_kernel)
* When it works, version your change with git
* Repeat
When you change too much, it will simply not work and you most likely will have no idea why it does not work. Go back to the last working version and do smaller changes at a time.
=== Regenerating the two initramfs from the phone ===
You can regenerate both initramfs, even if the first is in a boot.img by running as root
 sudo mkinitfs
=== Tips and tricks ===
* pmbootstrap initfs can do more than rebuilding the initramfs:
% pmbootstrap initfs --help
usage: pmbootstrap initfs [-h]
 {hook_ls,hook_add,hook_del,ls,build,extract} ...
positional arguments:
 {hook_ls,hook_add,hook_del,ls,build,extract}
 hook_ls list available and installed hook packages
 hook_add add a hook package
 hook_del uninstall a hook package
 ls list initramfs contents
 build (re)build the initramfs
 extract extract the initramfs to a temporary folder
optional arguments:
 -h, --help show this help message and exit
* Arbitrary files can be included from an APKBUILD by installing them to /usr/share/mkinitfs/files{-extra}:
APKBUILD:
package() {
 # ...
 install -Dm644 "$srcdir/30-my-custom-files.files" "$pkgdir/usr/share/mkinitfs/files/30-my-custom-files.files"
}
30-my-custom-files.files:
/lib/firmware/postmarketos/necessary-firmware.fw
/lib/libnecessaryfirmware.so
=== Manual unpacking and repacking the initramfs file ===
$ zcat initfs.gz | sudo cpio -iv --make-directories # unpacks
$ find . | sudo cpio -ov --format=newc | gzip -c -1 > initfs-new.gz # packs
=== Troubleshooting ===
==== My device reboots with my customized init script ====
This is probably caused by a syntax error. Use shellcheck to check your scripts for syntax errors. You could also loop forever or spawn a shell (if you have a hardware keyboard or serial cable connected) at some point for debugging (while true; do sleep 1; done) and use the telnet shell to test the commands, that are failing, interactively.
==== No log output on serial! ====
By default, all output from the initramfs is logged to the kernel ringbuffer, ensure you have console= set correctly on the kernel cmdline and that loglevel is >= INFO (level 6), if in doubt add ignore_loglevel to the cmdline. If you want the output through the debug cable, make sure quiet is NOT on the kernel command line.
==== How do i show logs on the screen at boot? ====
In order to disable the postmarketOS splash add PMOS_NOSPLASH to your kernel command line, in addition if you want the kernel logs to print to the screen make sure that console=tty0 is set in the kernel command line.
Category:Technical Reference