summary refs log tree commit diff
path: root/nixos/modules/virtualisation/libvirtd.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules/virtualisation/libvirtd.nix')
-rw-r--r--nixos/modules/virtualisation/libvirtd.nix54
1 files changed, 25 insertions, 29 deletions
diff --git a/nixos/modules/virtualisation/libvirtd.nix b/nixos/modules/virtualisation/libvirtd.nix
index 16aedbbb185d..67fbb8263b05 100644
--- a/nixos/modules/virtualisation/libvirtd.nix
+++ b/nixos/modules/virtualisation/libvirtd.nix
@@ -122,18 +122,14 @@ in
             chmod 755 /var/lib/libvirt
             chmod 755 /var/lib/libvirt/dnsmasq
 
-            # Libvirt unfortunately writes mutable state (such as
-            # runtime changes to VM, network or filter configurations)
-            # to /etc.  So we can't use environment.etc to make the
-            # default network and filter definitions available, since
-            # libvirt will then modify the originals in the Nix store.
-            # So here we copy them instead.  Ugly.
-            for i in $(cd ${pkgs.libvirt}/etc && echo \
+            # Copy default libvirt network config .xml files to /var/lib
+            # Files modified by the user will not be overwritten
+            for i in $(cd ${pkgs.libvirt}/var/lib && echo \
                 libvirt/qemu/networks/*.xml libvirt/qemu/networks/autostart/*.xml \
                 libvirt/nwfilter/*.xml );
             do
-                mkdir -p /etc/$(dirname $i) -m 755
-                cp -fpd ${pkgs.libvirt}/etc/$i /etc/$i
+                mkdir -p /var/lib/$(dirname $i) -m 755
+                cp -npd ${pkgs.libvirt}/var/lib/$i /var/lib/$i
             done
 
             # libvirtd puts the full path of the emulator binary in the machine
@@ -166,33 +162,33 @@ in
           '';
       };
 
-    jobs."libvirt-guests" =
-      { description = "Libvirt Virtual Machines";
+    systemd.services."libvirt-guests" = {
+      description = "Libvirt Virtual Machines";
 
-        wantedBy = [ "multi-user.target" ];
-        wants = [ "libvirtd.service" ];
-        after = [ "libvirtd.service" ];
+      wantedBy = [ "multi-user.target" ];
+      wants = [ "libvirtd.service" ];
+      after = [ "libvirtd.service" ];
 
-        restartIfChanged = false;
+      restartIfChanged = false;
 
-        path = [ pkgs.gettext pkgs.libvirt pkgs.gawk ];
+      path = with pkgs; [ gettext libvirt gawk ];
 
-        preStart =
-          ''
-            mkdir -p /var/lock/subsys -m 755
-            ${pkgs.libvirt}/etc/rc.d/init.d/libvirt-guests start || true
-          '';
+      preStart = ''
+        mkdir -p /var/lock/subsys -m 755
+        ${pkgs.libvirt}/etc/rc.d/init.d/libvirt-guests start || true
+      '';
 
-        postStop = 
-            ''
-            export PATH=${pkgs.gettext}/bin:$PATH
-            export ON_SHUTDOWN=${cfg.onShutdown}
-            ${pkgs.libvirt}/etc/rc.d/init.d/libvirt-guests stop
-            '';
+      postStop = ''
+        export PATH=${pkgs.gettext}/bin:$PATH
+        export ON_SHUTDOWN=${cfg.onShutdown}
+        ${pkgs.libvirt}/etc/rc.d/init.d/libvirt-guests stop
+      '';
 
-        serviceConfig.Type = "oneshot";
-        serviceConfig.RemainAfterExit = true;
+      serviceConfig = {
+        Type = "oneshot";
+        RemainAfterExit = true;
       };
+    };
 
     users.extraGroups.libvirtd.gid = config.ids.gids.libvirtd;