Installed firmware descriptor files contain (invalid) relative paths
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
QEMU |
Fix Released
|
Undecided
|
Unassigned |
Bug Description
After building and installing QEMU, the resulting installed firmware descriptor files contain relative paths for their `mapping.filename` properties. These relative paths are causing errors when using tools based on `libvirt` like `virt-install`, resulting in the inability to configure new VMs which reference these firmware descriptors.
# QEMU version
$ qemu-system-x86_64 -version
QEMU emulator version 5.2.0
(I've also reproduced the issue with QEMU built from Git master @ v5.2.0-
# OS version
Void Linux x86_64 (glibc)
Steps to reproduce (with results on my system):
# Verify the symptom
$ virt-install --boot firmware=efi --disk none --memory 2048
Using default --name vm4
WARNING No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.
Starting install...
ERROR Failed to open file 'share/
Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
virsh --connect qemu:///session start vm4
otherwise, please restart your installation.
# Verify that the file does exist on the system and is accessible
$ ls -l /usr/share/
-rw-r--r-- 1 root root 540672 12 dec 18:47 /usr/share/
# Verify most likely cause
$ grep filename /usr/share/
/usr/share/
/usr/share/
/usr/share/
/usr/share/
Note that all the paths are relative and are missing <prefix>, i.e. `/usr`.
# Workaround
Manually editing the firmware descriptor files in `/usr/share/
$ sudo sed -i.bak -e 's,"share/
$ virt-install --boot firmware=efi --disk none --memory 2048
[...VM boots normally...]
description: | updated |
description: | updated |
description: | updated |
description: | updated |
There is an issue on Void Linux packages issue tracker about this bug[1]
# Steps to verify the issue on a fresh Git clone of QEMU source
$ git clone https:/ /github. com/qemu/ qemu test-misc@ alpine
$ cd qemu
$ make DEBUG=1 docker-
[...]
COPY RUNNER
RUN test-misc in qemu/alpine
* Prepared to run command:
./test-misc
* Hit Ctrl-D to continue, or type 'exit 1' to abort
bash-5.1$ . common-rc /tmp/qemu- test/install --disable-system --disable-user test/src/ tests/docker descriptors/ * descriptors/ 50-edk2- i386-secure. json: "filename": "share/ qemu/edk2- i386-secure- code.fd" , descriptors/ 50-edk2- i386-secure. json: "filename": "share/ qemu/edk2- i386-vars. fd",
[...]
bash-5.1$ configure_qemu --disable-system --disable-user
Configure options:
--enable-werror --prefix=
cross containers no
The Meson build system
Version: 0.56.2
Source dir: /tmp/qemu-test/src
Build dir: /tmp/qemu-
Build type: native build
Project name: qemu
Project version: 5.2.50
[...]
bash-5.1$ grep filename pc-bios/
pc-bios/
pc-bios/
[...all other matches have relative paths...]
bash-5.1$ exit 1
[...]
# Research
The filename path substitution appears to be done in the file `pc-bios/ descriptors/ meson.build` .
In particular, occurrences of `@DATADIR@` in the template files get substituted using the value of `qemu_datadir`:
configure_ file(input: files(f),
output: f,
configuratio n: {'DATADIR': qemu_datadir},
install: get_option( 'install_ blobs') ,
install_ dir: qemu_datadir / 'firmware')
The variable `qemu_datadir` gets initialized from toplevel `meson.build` file using:
qemu_datadir = get_option( 'datadir' ) / get_option( 'qemu_suffix' )
From the Meson documentation on built-in (build) options[2], `datadir` option gets initialized to `"share"` (note: a relative path!) by default, unless `datadir` build option is configured explicitly, so the value of `qemu_datadir`, as well as the substitution made ends up being a relative path as well.
I found a commit which I think is relevant to why this choice was made[3].
# Test a workaround, try #1: specify `datadir` manually
$ make DEBUG=1 docker- test-misc@ alpine /usr/share --disable-system --disable-user /tmp/qemu- test/install --datadir= /usr/share --disable-system --disable-user test/src/ tests/docker
[...]
bash-5.1$ configure_qemu --datadir=
Configure options:
--enable-werror --prefix=
cross containers no
The Meson build system
Version: 0.56.2
Source dir: /tmp/qemu-test/src
Build dir: /tmp/qemu-
Build type: native build
../../meson. build:1: 0: ERROR: The value of the 'datadir' option is '/usr/share' which must be a subdir of the prefix '/tmp/qemu- test/install' .
Note that if you pass a relative path, it is assumed to be a subdir of prefix.
A full log can be found at /tmp/qemu- test/src/ tests/docker/ meson-logs/ meson-log. txt
ERROR: meson setup failed
Ah! So perhaps `datadir` can be an absolute path, but then it must be a subdir of the (already specified) `prefix`.
Let's try again.
# Test a workaround, try #2: s...