diff mbox series

[v3] genericarm64 core-image-initramfs-boot: remove some kernel drivers

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

Commit Message

Mikko Rapeli April 13, 2026, 7:27 a.m. UTC
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

Comments

Richard Purdie April 17, 2026, 9:10 a.m. UTC | #1
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
Mikko Rapeli April 17, 2026, 9:25 a.m. UTC | #2
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
Richard Purdie April 17, 2026, 12:06 p.m. UTC | #3
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 mbox series

Patch

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
+}
+