From f52f9bf7cd922b54c874e5500a2c64277e57d417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Forsman?= Date: Wed, 27 Nov 2013 21:31:15 +0100 Subject: [PATCH] nixos/libvirtd-service: fix for garbage collected emulator paths libvirtd puts the full path of the emulator binary in the machine config file. But this path can unfortunately be garbage collected while still being used by the virtual machine. Then this happens: Error starting domain: Cannot check QEMU binary /nix/store/z5c2xzk9x0pj6x511w0w4gy9xl5wljxy-qemu-1.5.2-x86-only/bin/qemu-kvm: No such file or directory Fix by updating the emulator path on each service startup to something valid (re-scan $PATH). --- nixos/modules/virtualisation/libvirtd.nix | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/nixos/modules/virtualisation/libvirtd.nix b/nixos/modules/virtualisation/libvirtd.nix index 552441f6a62d..d8668eb16072 100644 --- a/nixos/modules/virtualisation/libvirtd.nix +++ b/nixos/modules/virtualisation/libvirtd.nix @@ -101,6 +101,19 @@ in mkdir -p /etc/$(dirname $i) -m 755 cp -fpd ${pkgs.libvirt}/etc/$i /etc/$i done + + # libvirtd puts the full path of the emulator binary in the machine + # config file. But this path can unfortunately be garbage collected + # while still being used by the virtual machine. So update the + # emulator path on each startup to something valid (re-scan $PATH). + for file in /etc/libvirt/qemu/*.xml; do + # get (old) emulator path from config file + emulator=$(grep "^[[:space:]]*" "$file" | sed 's,^[[:space:]]*\(.*\).*,\1,') + # get a (definitely) working emulator path by re-scanning $PATH + new_emulator=$(command -v $(basename "$emulator")) + # write back + sed -i "s,^[[:space:]]*.*, $new_emulator ," "$file" + done ''; # */ serviceConfig.ExecStart = ''@${pkgs.libvirt}/sbin/libvirtd libvirtd --config "${configFile}" --daemon --verbose'';