qemuarm-trixie: Workaround with missing drivers in qemuarm-trixie initrd

Message ID 20260220115339.1188052-1-wzh@ilbers.de
State Superseded
Headers show
Series qemuarm-trixie: Workaround with missing drivers in qemuarm-trixie initrd | expand

Commit Message

Zhihang Wei Feb. 20, 2026, 11:53 a.m. UTC
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(-)

Comments

Jan Kiszka Feb. 20, 2026, 11:59 a.m. UTC | #1
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

Patch

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 ?= ""