qemu: emit warnings when KVM acceleration is not usable

This fixes the qemu-kvm wrapper we add for convenience
silently not using KVM, when the system would support it
by at least leaving an indication in the log that the build ran
slower because it ran without KVM.
This commit is contained in:
Martin Schwaighofer 2021-11-05 19:13:47 +01:00 committed by Alyssa Ross
parent 5d06f6933d
commit 08bbd123d5

View file

@ -1,7 +1,7 @@
{ lib, stdenv, fetchurl, fetchpatch, python, zlib, pkg-config, glib { lib, stdenv, fetchurl, fetchpatch, python, zlib, pkg-config, glib
, perl, pixman, vde2, alsa-lib, texinfo, flex , perl, pixman, vde2, alsa-lib, texinfo, flex
, bison, lzo, snappy, libaio, libtasn1, gnutls, nettle, curl, ninja, meson, sigtool , bison, lzo, snappy, libaio, libtasn1, gnutls, nettle, curl, ninja, meson, sigtool
, makeWrapper, autoPatchelfHook , makeWrapper, autoPatchelfHook, runtimeShell
, attr, libcap, libcap_ng , attr, libcap, libcap_ng
, CoreServices, Cocoa, Hypervisor, rez, setfile , CoreServices, Cocoa, Hypervisor, rez, setfile
, numaSupport ? stdenv.isLinux && !stdenv.isAarch32, numactl , numaSupport ? stdenv.isLinux && !stdenv.isAarch32, numactl
@ -228,9 +228,12 @@ stdenv.mkDerivation rec {
# Add a qemu-kvm wrapper for compatibility/convenience. # Add a qemu-kvm wrapper for compatibility/convenience.
postInstall = '' postInstall = ''
cp -- $emitKvmWarningsPath $out/libexec/emit-kvm-warnings
chmod a+x -- $out/libexec/emit-kvm-warnings
if [ -x $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} ]; then if [ -x $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} ]; then
makeWrapper $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} \ makeWrapper $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} \
$out/bin/qemu-kvm \ $out/bin/qemu-kvm \
--run $out/libexec/emit-kvm-warnings \
--add-flags "\$([ -r /dev/kvm -a -w /dev/kvm ] && echo -enable-kvm)" --add-flags "\$([ -r /dev/kvm -a -w /dev/kvm ] && echo -enable-kvm)"
fi fi
''; '';
@ -242,6 +245,26 @@ stdenv.mkDerivation rec {
# Builds in ~3h with 2 cores, and ~20m with a big-parallel builder. # Builds in ~3h with 2 cores, and ~20m with a big-parallel builder.
requiredSystemFeatures = [ "big-parallel" ]; requiredSystemFeatures = [ "big-parallel" ];
emitKvmWarnings = ''
#!${runtimeShell}
WARNCOL='\033[1;35m'
NEUTRALCOL='\033[0m'
WARNING="''${WARNCOL}warning:''${NEUTRALCOL}"
if [ ! -e /dev/kvm ]; then
echo -e "''${WARNING} KVM is not available - execution will be slow" >&2
echo "Consider installing KVM for hardware-accelerated execution." >&2
echo "If KVM is already installed make sure the kernel module is loaded." >&2
elif [ ! -r /dev/kvm -o ! -w /dev/kvm ]; then
echo -e "''${WARNING} /dev/kvm is not read-/writable - execution will be slow" >&2
echo "/dev/kvm needs to be read-/writable by the user executing QEMU." >&2
echo "" >&2
echo "For hardware-acceleration inside the nix build sandbox /dev/kvm" >&2
echo "must be world-read-/writable (rw-rw-rw-)." >&2
fi
'';
passAsFile = [ "emitKvmWarnings" ];
meta = with lib; { meta = with lib; {
homepage = "http://www.qemu.org/"; homepage = "http://www.qemu.org/";
description = "A generic and open source machine emulator and virtualizer"; description = "A generic and open source machine emulator and virtualizer";