Reducing initramfs size and speed up the generation

Dimitri John Ledkov dimitri.ledkov at canonical.com
Sat Jul 8 00:25:44 UTC 2023


On Sat, 8 Jul 2023 at 01:19, Benjamin Drung <bdrung at ubuntu.com> wrote:
>
> Hi all,
>
> a year ago we changed the default compression and level for the
> initramfs to zstd -1. This fixed the very slow creation times on
> development boards (see bug #1958148), but that leads to bigger
> initramfs sizes that triggered other bugs (like bug #1842320).
> Big initramfs sizes can also fill up small sized /boot partitions easily
> (grooming the 850 initramfs-tools bugs revealed several such reports).
>
> Using xz -9 would give very good compression, but it takes very long
> (especially on slow development boards) and a lot of memory (good luck
> on Raspberry Pis with small memory like Pi Zeros).
>
> I propose following approach to address the drawback: Create cpio
> archives (compressed with xz -9) for the kernel modules and firmware
> files when building the kernel/firmware Debian package. Then ship those
> cpio archives in the package (or in a separate binary package). Then the
> CPU load it put on the builders. The cpio archives would contain the
> modules for MODULES=most.
>
> mkinitramfs will then look for those cpio archives and uses those in
> case they are present. Such a initramfs would look like this:
>
> * AMD/Intel microcode cpio archive (on amd64)
> * main cpio archive compressed with zstd -1
> * kernel modules from the Debian package compressed with xz -9
> * firmware files from the Debian package compressed with xz -9
>

Majority of our instances boot without initrd, and there too they
don't load most of the modules.
Creating xz -9 compressed archive of all modules, still pays the
penalty to decompress most of them, and then not modprobe them.
I was hoping to achieve a similar in spirit approach, but didn't quite
have the time to implement is:

1) change linux-modules and linux-firmware to ship .ko.zst
firmware.bin.zst compressed with zstd -19 at .deb build time
2) this saves install size of the packages, with only slightly
increased download size
3) modify initramfs-tools to include compressed files into a separate
initrd, which is not compressed (i.e. exclude .zst files from the
default main compressed cpio archive, and append them in the second
main cpio archive that is uncompressed)
4) this should achieve quick initrd creation, which will be smaller in
size that current status, and will boot faster as it will only
decompress modules/firmware it actually needs at boot

For experimentation locally, you can recompress .ko with zstd in place
in /lib/modules/; and rerun depmod. To then test initramfs-tools
changes that skip over .zst compressed files and add them as is in an
uncompressed appended cpio.

> After working on initramfs-tools as part my day job, my fingers were
> itching and I had to create a quick and dirty draft in my free night
> time. You can find the result of the last two hours in [1]. This draft
> has a mkinitramfs-kernel script that creates a cpio archive containing
> the kernel modules and firmware (that needs to be split later on).
>
> The lunar test result on my AMD Ryzen 7 5700G look promising: Building
> 6.2.0-24-generic-modules-most.cpio.xz takes around 90 seconds and is
> 54.9 MiB in size. Creating the initramfs speeds up from around 8.7
> seconds to 3.5 seconds (saves 60 %). The size reduces from 133.1 MiB to
> 80.7 MiB (saves 39.4 %). So the boot needs 52.4 MiB less, but
> /lib/modules need 54.9 MiB for the cpio archive.
>
> The drawback is that building the kernel would take longer, the package
> takes more space on the archive and mirrors, and downloading them could
> take longer on slow connections.
>
> Implementing my proposal would be relative easy for initramfs-tools, but
> would mean some work for the kernel team.
>
> What do you think?
>
> [1] https://code.launchpad.net/~bdrung/ubuntu/+source/initramfs-tools/+git/initramfs-tools/+ref/ubuntu/prebuilt
>
> --
> Benjamin Drung
> Debian & Ubuntu Developer
>
> --
> ubuntu-devel mailing list
> ubuntu-devel at lists.ubuntu.com
> Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/ubuntu-devel



-- 
okurrr,

Dimitri



More information about the ubuntu-devel mailing list