| Message ID | 20260413072715.20701-1-mikko.rapeli@linaro.org (mailing list archive) |
|---|---|
| State | New |
| Headers | show |
| Series | [v3] genericarm64 core-image-initramfs-boot: remove some kernel drivers | expand |
On Mon, 2026-04-13 at 10:27 +0300, Mikko Rapeli via lists.yoctoproject.org wrote: > genericarm64 supports a lot of HW and thus large collection of kernel > drivers are enabled and installed to images by default. > Subset of the kernel drivers are needed in initramfs to mount rootfs > from local mass storage devices. This increases initramfs size a lot > and with new kernel config updates even more. Thus remove kernel > drivers from initramfs image which are not needed for mounting > rootfs from local mass storage devices. GPU, Bluetooth, NFC, > sound, networking etc support is not needed in the initramfs. > > According to buildhistory core-image-initramfs-boot size is reduced > from 118 to 83 Mb. > > Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org> > --- > .../images/core-image-initramfs-boot.bbappend | 28 +++++++++++++++++++ > 1 file changed, 28 insertions(+) > create mode 100644 meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > v3: added PATHS_TO_REMOVE variable so that it can be customized > as suggested by Jose Quaresma <quaresma.jose@gmail.com> > > v2: https://lists.yoctoproject.org/g/poky/message/13894 > > diff --git a/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > new file mode 100644 > index 000000000000..2298c2f94740 > --- /dev/null > +++ b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > @@ -0,0 +1,28 @@ > +POSTFUNCS = "" > +POSTFUNCS:genericarm64 = "reduce_initrd_size" > + > +PATHS_TO_REMOVE = "" > +# these kernel modules are not needed for rootfs mount from local mass storage > +# and can be loaded from main rootfs by udev > +PATHS_TO_REMOVE:genericarm64 = "\ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/bluetooth \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/gpu \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/media \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/net \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/nfc \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/usb/gadget \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/fs/fuse \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bluetooth \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bridge \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/netfilter \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/nfc \ > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/sound \ > +" > + > +do_rootfs[postfuncs] += "${POSTFUNCS}" > +reduce_initrd_size () { > + if [ -n "${PATHS_TO_REMOVE}" ]; then > + rm -rf ${PATHS_TO_REMOVE} > + fi > +} > + This is a tough one. There are some simple things like "POSTFUNCS" being a bit generic as a name. I also worry a little this may trip up yocto-check-layer with the added variable POSTFUNCS, even if it is empty. I think if we're creating this as API, listing the directories: drivers/bluetooth \ drivers/gpu \ drivers/media \ drivers/net \ drivers/nfc \ drivers/usb/gadget \ fs/fuse \ net/bluetooth \ net/bridge \ net/netfilter \ net/nfc \ sound \ and then adding the prefix would probably be cleaner too. Those are all easier tweaks. The bigger challenge is "generic" kernel adding all this. Ideally you wouldn't install these things to the initramfs in the first place, then you wouldn't need to delete them. I'm not sure how you could detect/filter and install only the subset of modules you want, or how that list of modules would be maintained/updated. A different package to "kernel-modules" could be one idea, how you construct that, again, I'm less sure. The above filter list could be used to iterate the modules and filter by path I guess? Now we've merged the firmware update, the builds are breaking but some of these kinds of changes are probably too late for the release/LTS. Perhaps we just have to increase the size of the initramfs for now :( Cheers, Richard
Hi, On Fri, Apr 17, 2026 at 10:10:07AM +0100, Richard Purdie wrote: > On Mon, 2026-04-13 at 10:27 +0300, Mikko Rapeli via lists.yoctoproject.org wrote: > > genericarm64 supports a lot of HW and thus large collection of kernel > > drivers are enabled and installed to images by default. > > Subset of the kernel drivers are needed in initramfs to mount rootfs > > from local mass storage devices. This increases initramfs size a lot > > and with new kernel config updates even more. Thus remove kernel > > drivers from initramfs image which are not needed for mounting > > rootfs from local mass storage devices. GPU, Bluetooth, NFC, > > sound, networking etc support is not needed in the initramfs. > > > > According to buildhistory core-image-initramfs-boot size is reduced > > from 118 to 83 Mb. > > > > Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org> > > --- > > �.../images/core-image-initramfs-boot.bbappend | 28 +++++++++++++++++++ > > �1 file changed, 28 insertions(+) > > �create mode 100644 meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > > > v3: added PATHS_TO_REMOVE variable so that it can be customized > > ��� as suggested by Jose Quaresma <quaresma.jose@gmail.com> > > > > v2: https://lists.yoctoproject.org/g/poky/message/13894 > > > > diff --git a/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > new file mode 100644 > > index 000000000000..2298c2f94740 > > --- /dev/null > > +++ b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > @@ -0,0 +1,28 @@ > > +POSTFUNCS = "" > > +POSTFUNCS:genericarm64 = "reduce_initrd_size" > > + > > +PATHS_TO_REMOVE = "" > > +# these kernel modules are not needed for rootfs mount from local mass storage > > +# and can be loaded from main rootfs by udev > > +PATHS_TO_REMOVE:genericarm64 = "\ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/bluetooth \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/gpu \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/media \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/net \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/nfc \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/usb/gadget \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/fs/fuse \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bluetooth \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bridge \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/netfilter \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/nfc \ > > +��� ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/sound \ > > +" > > + > > +do_rootfs[postfuncs] += "${POSTFUNCS}" > > +reduce_initrd_size () { > > +��� if [ -n "${PATHS_TO_REMOVE}" ]; then > > +������� rm -rf ${PATHS_TO_REMOVE} > > +��� fi > > +} > > + > > This is a tough one. There are some simple things like "POSTFUNCS" > being a bit generic as a name. I also worry a little this may trip up > yocto-check-layer with the added variable POSTFUNCS, even if it is > empty. I think if we're creating this as API, listing the directories: > > drivers/bluetooth \ > drivers/gpu \ > drivers/media \ > drivers/net \ > drivers/nfc \ > drivers/usb/gadget \ > fs/fuse \ > net/bluetooth \ > net/bridge \ > net/netfilter \ > net/nfc \ > sound \ > > and then adding the prefix would probably be cleaner too. Those are all > easier tweaks. > > The bigger challenge is "generic" kernel adding all this. Ideally you > wouldn't install these things to the initramfs in the first place, then > you wouldn't need to delete them. I'm not sure how you could > detect/filter and install only the subset of modules you want, or how > that list of modules would be maintained/updated. kernel-modules correctly get installed to all images through MACHINE_EXTRA_RDEPENDS. This is flexible to drivers being built-in or modules. IMO initramfs image should not be explicitly tied to the exact kernel config and thus should not depend on the exact set of kernel module packages. A slightly more abstract interface between kernel and initramfs image is needed, and "kernel-modules" decent at that. This works well for the real rootfs but is not optimal for initramfs. > A different package to "kernel-modules" could be one idea, how you > construct that, again, I'm less sure. The above filter list could be > used to iterate the modules and filter by path I guess? I had a patchset for this but ran into issues with it. https://lists.openembedded.org/g/openembedded-core/topic/112087526#msg214354 I don't see how that can move forward though. > Now we've merged the firmware update, the builds are breaking but some > of these kinds of changes are probably too late for the release/LTS. > > Perhaps we just have to increase the size of the initramfs for now :( Sigh, alright then. Cheers, -Mikko
On Fri, 2026-04-17 at 12:25 +0300, Mikko Rapeli wrote: > Hi, > > On Fri, Apr 17, 2026 at 10:10:07AM +0100, Richard Purdie wrote: > > On Mon, 2026-04-13 at 10:27 +0300, Mikko Rapeli via lists.yoctoproject.org wrote: > > > genericarm64 supports a lot of HW and thus large collection of kernel > > > drivers are enabled and installed to images by default. > > > Subset of the kernel drivers are needed in initramfs to mount rootfs > > > from local mass storage devices. This increases initramfs size a lot > > > and with new kernel config updates even more. Thus remove kernel > > > drivers from initramfs image which are not needed for mounting > > > rootfs from local mass storage devices. GPU, Bluetooth, NFC, > > > sound, networking etc support is not needed in the initramfs. > > > > > > According to buildhistory core-image-initramfs-boot size is reduced > > > from 118 to 83 Mb. > > > > > > Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org> > > > --- > > > .../images/core-image-initramfs-boot.bbappend | 28 +++++++++++++++++++ > > > 1 file changed, 28 insertions(+) > > > create mode 100644 meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > > > > > v3: added PATHS_TO_REMOVE variable so that it can be customized > > > as suggested by Jose Quaresma <quaresma.jose@gmail.com> > > > > > > v2: https://lists.yoctoproject.org/g/poky/message/13894 > > > > > > diff --git a/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > > new file mode 100644 > > > index 000000000000..2298c2f94740 > > > --- /dev/null > > > +++ b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend > > > @@ -0,0 +1,28 @@ > > > +POSTFUNCS = "" > > > +POSTFUNCS:genericarm64 = "reduce_initrd_size" > > > + > > > +PATHS_TO_REMOVE = "" > > > +# these kernel modules are not needed for rootfs mount from local mass storage > > > +# and can be loaded from main rootfs by udev > > > +PATHS_TO_REMOVE:genericarm64 = "\ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/bluetooth \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/gpu \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/media \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/net \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/nfc \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/usb/gadget \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/fs/fuse \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bluetooth \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bridge \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/netfilter \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/nfc \ > > > + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/sound \ > > > +" > > > + > > > +do_rootfs[postfuncs] += "${POSTFUNCS}" > > > +reduce_initrd_size () { > > > + if [ -n "${PATHS_TO_REMOVE}" ]; then > > > + rm -rf ${PATHS_TO_REMOVE} > > > + fi > > > +} > > > + > > > > This is a tough one. There are some simple things like "POSTFUNCS" > > being a bit generic as a name. I also worry a little this may trip up > > yocto-check-layer with the added variable POSTFUNCS, even if it is > > empty. I think if we're creating this as API, listing the directories: > > > > drivers/bluetooth \ > > drivers/gpu \ > > drivers/media \ > > drivers/net \ > > drivers/nfc \ > > drivers/usb/gadget \ > > fs/fuse \ > > net/bluetooth \ > > net/bridge \ > > net/netfilter \ > > net/nfc \ > > sound \ > > > > and then adding the prefix would probably be cleaner too. Those are all > > easier tweaks. > > > > The bigger challenge is "generic" kernel adding all this. Ideally you > > wouldn't install these things to the initramfs in the first place, then > > you wouldn't need to delete them. I'm not sure how you could > > detect/filter and install only the subset of modules you want, or how > > that list of modules would be maintained/updated. > > kernel-modules correctly get installed to all images through MACHINE_EXTRA_RDEPENDS. > This is flexible to drivers being built-in or modules. IMO initramfs > image should not be explicitly tied to the exact kernel config and thus > should not depend on the exact set of kernel module packages. A slightly more abstract > interface between kernel and initramfs image is needed, and "kernel-modules" > decent at that. This works well for the real rootfs but is not optimal for > initramfs. > > > A different package to "kernel-modules" could be one idea, how you > > construct that, again, I'm less sure. The above filter list could be > > used to iterate the modules and filter by path I guess? > > I had a patchset for this but ran into issues with it. > > https://lists.openembedded.org/g/openembedded-core/topic/112087526#msg214354 > > I don't see how that can move forward though. The problems there didn't seem unsolvable but I don't remember the full details. I think we should revisit that in 6.1. > > Now we've merged the firmware update, the builds are breaking but some > > of these kinds of changes are probably too late for the release/LTS. > > > > Perhaps we just have to increase the size of the initramfs for now :( > > Sigh, alright then. We're too close to release to start doing other things unfortunately. Cheers, Richard
diff --git a/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend new file mode 100644 index 000000000000..2298c2f94740 --- /dev/null +++ b/meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend @@ -0,0 +1,28 @@ +POSTFUNCS = "" +POSTFUNCS:genericarm64 = "reduce_initrd_size" + +PATHS_TO_REMOVE = "" +# these kernel modules are not needed for rootfs mount from local mass storage +# and can be loaded from main rootfs by udev +PATHS_TO_REMOVE:genericarm64 = "\ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/bluetooth \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/gpu \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/media \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/net \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/nfc \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/drivers/usb/gadget \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/fs/fuse \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bluetooth \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/bridge \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/netfilter \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/net/nfc \ + ${WORKDIR}/rootfs/${libdir}/modules/*/kernel/sound \ +" + +do_rootfs[postfuncs] += "${POSTFUNCS}" +reduce_initrd_size () { + if [ -n "${PATHS_TO_REMOVE}" ]; then + rm -rf ${PATHS_TO_REMOVE} + fi +} +
genericarm64 supports a lot of HW and thus large collection of kernel drivers are enabled and installed to images by default. Subset of the kernel drivers are needed in initramfs to mount rootfs from local mass storage devices. This increases initramfs size a lot and with new kernel config updates even more. Thus remove kernel drivers from initramfs image which are not needed for mounting rootfs from local mass storage devices. GPU, Bluetooth, NFC, sound, networking etc support is not needed in the initramfs. According to buildhistory core-image-initramfs-boot size is reduced from 118 to 83 Mb. Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org> --- .../images/core-image-initramfs-boot.bbappend | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 meta-yocto-bsp/recipes-core/images/core-image-initramfs-boot.bbappend v3: added PATHS_TO_REMOVE variable so that it can be customized as suggested by Jose Quaresma <quaresma.jose@gmail.com> v2: https://lists.yoctoproject.org/g/poky/message/13894