| Message ID | 20260220115339.1188052-1-wzh@ilbers.de |
|---|---|
| State | Superseded |
| Headers | show |
| Series | qemuarm-trixie: Workaround with missing drivers in qemuarm-trixie initrd | expand |
On 20.02.26 12:53, Zhihang Wei wrote: > This is a workaround to fix the current qemuarm-trixie image unbootable > issue. > > Starting with Debian Trixie, update-initramfs invokes "dracut-install" > to collect and install required drivers into the generated initrd. > "dracut-install" relies on fts_open() / fts_read() from glibc to > traverse directories and locate drivers. > > Due to a long-standing bug [1] between qemu and glibc, the fts_* > functions may fail to find files on certain 32-bit architectures. As a > result, required modules such as virtio_blk are not detected and not > added to the initrd. The produced image then fails to boot under qemu > because the block device driver is missing. > > A similiar dracut bug report was filed in 2024 [2], pointing to this > upstream glibc issue reported in 2018 [1]. No upstream fix has been > applied, and the issue appears to affect only qemu builds for specific > 32-bit targets. > > As a temporary workaround, introduce INITRAMFS_EXTRA_DRIVERS and use it > to append the neccessary drivers that are currently missed from the > initrd. > > For a complete fix, we either need to push for an upstream glibc/qemu > fix, or convince dracut to avoid using these non-POSIX fts_* functions > and use opendir() / readdir() instead. > > [1] https://sourceware.org/bugzilla/show_bug.cgi?id=23960 > [2] https://bugs-devel.debian.org/cgi-bin/bugreport.cgi?bug=1079443 > > Signed-off-by: Zhihang Wei <wzh@ilbers.de> > --- > meta-isar/conf/multiconfig/qemuarm-trixie.conf | 2 ++ > meta/classes-recipe/rootfs.bbclass | 9 ++++++++- > 2 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/meta-isar/conf/multiconfig/qemuarm-trixie.conf b/meta-isar/conf/multiconfig/qemuarm-trixie.conf > index 5600ab23..dcf0b839 100644 > --- a/meta-isar/conf/multiconfig/qemuarm-trixie.conf > +++ b/meta-isar/conf/multiconfig/qemuarm-trixie.conf > @@ -5,3 +5,5 @@ > > MACHINE ?= "qemuarm" > DISTRO ?= "debian-trixie" > + > +INITRAMFS_EXTRA_DRIVERS += "virtio_blk" > diff --git a/meta/classes-recipe/rootfs.bbclass b/meta/classes-recipe/rootfs.bbclass > index 8485b32f..65843f61 100644 > --- a/meta/classes-recipe/rootfs.bbclass > +++ b/meta/classes-recipe/rootfs.bbclass > @@ -12,12 +12,19 @@ ROOTFS_DISTRO ?= "${DISTRO}" > # the default initramfs generator and it is not > # possible to derive the value in another way > ROOTFS_USE_DRACUT ??= "" > +INITRAMFS_EXTRA_DRIVERS ?= "" > > def initramfs_generator_cmdline(d): > rootfs_packages = d.getVar('ROOTFS_PACKAGES') or '' > + extra_drivers = d.getVar('INITRAMFS_EXTRA_DRIVERS') or '' > if 'dracut' in rootfs_packages or bb.utils.to_boolean(d.getVar('ROOTFS_USE_DRACUT')): > return "dracut --force --kver \"$kernel_version\"" > - return "update-initramfs -u -v -k \"$kernel_version\"" > + cmds = [] > + if extra_drivers: > + for drv in extra_drivers.split(): > + cmds.append(f'echo {drv} | tee -a /etc/initramfs-tools/modules') > + cmds.append('update-initramfs -u -v -k "$kernel_version"') > + return " && ".join(cmds) > This is not a nice way to work around the issue. The variable introduced here is bypassing how initramfs are configured via their generators in isar (recipes for hooks or modules). Use that, please. Jan
diff --git a/meta-isar/conf/multiconfig/qemuarm-trixie.conf b/meta-isar/conf/multiconfig/qemuarm-trixie.conf index 5600ab23..dcf0b839 100644 --- a/meta-isar/conf/multiconfig/qemuarm-trixie.conf +++ b/meta-isar/conf/multiconfig/qemuarm-trixie.conf @@ -5,3 +5,5 @@ MACHINE ?= "qemuarm" DISTRO ?= "debian-trixie" + +INITRAMFS_EXTRA_DRIVERS += "virtio_blk" diff --git a/meta/classes-recipe/rootfs.bbclass b/meta/classes-recipe/rootfs.bbclass index 8485b32f..65843f61 100644 --- a/meta/classes-recipe/rootfs.bbclass +++ b/meta/classes-recipe/rootfs.bbclass @@ -12,12 +12,19 @@ ROOTFS_DISTRO ?= "${DISTRO}" # the default initramfs generator and it is not # possible to derive the value in another way ROOTFS_USE_DRACUT ??= "" +INITRAMFS_EXTRA_DRIVERS ?= "" def initramfs_generator_cmdline(d): rootfs_packages = d.getVar('ROOTFS_PACKAGES') or '' + extra_drivers = d.getVar('INITRAMFS_EXTRA_DRIVERS') or '' if 'dracut' in rootfs_packages or bb.utils.to_boolean(d.getVar('ROOTFS_USE_DRACUT')): return "dracut --force --kver \"$kernel_version\"" - return "update-initramfs -u -v -k \"$kernel_version\"" + cmds = [] + if extra_drivers: + for drv in extra_drivers.split(): + cmds.append(f'echo {drv} | tee -a /etc/initramfs-tools/modules') + cmds.append('update-initramfs -u -v -k "$kernel_version"') + return " && ".join(cmds) ROOTFS_PACKAGES ?= "" ROOTFS_VARDEPS ?= ""
This is a workaround to fix the current qemuarm-trixie image unbootable issue. Starting with Debian Trixie, update-initramfs invokes "dracut-install" to collect and install required drivers into the generated initrd. "dracut-install" relies on fts_open() / fts_read() from glibc to traverse directories and locate drivers. Due to a long-standing bug [1] between qemu and glibc, the fts_* functions may fail to find files on certain 32-bit architectures. As a result, required modules such as virtio_blk are not detected and not added to the initrd. The produced image then fails to boot under qemu because the block device driver is missing. A similiar dracut bug report was filed in 2024 [2], pointing to this upstream glibc issue reported in 2018 [1]. No upstream fix has been applied, and the issue appears to affect only qemu builds for specific 32-bit targets. As a temporary workaround, introduce INITRAMFS_EXTRA_DRIVERS and use it to append the neccessary drivers that are currently missed from the initrd. For a complete fix, we either need to push for an upstream glibc/qemu fix, or convince dracut to avoid using these non-POSIX fts_* functions and use opendir() / readdir() instead. [1] https://sourceware.org/bugzilla/show_bug.cgi?id=23960 [2] https://bugs-devel.debian.org/cgi-bin/bugreport.cgi?bug=1079443 Signed-off-by: Zhihang Wei <wzh@ilbers.de> --- meta-isar/conf/multiconfig/qemuarm-trixie.conf | 2 ++ meta/classes-recipe/rootfs.bbclass | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-)