]> xenbits.xensource.com Git - libvirt.git/commitdiff
libvirt-guests: systemd host shutdown does not work
authorGerd v. Egidy <lists@egidy.de>
Fri, 27 Jul 2012 15:01:04 +0000 (17:01 +0200)
committerEric Blake <eblake@redhat.com>
Fri, 27 Jul 2012 15:31:52 +0000 (09:31 -0600)
I originally postet this into the Fedora bugzilla
https://bugzilla.redhat.com/show_bug.cgi?id=843836

Currently gracefully shutting down guest vms on host shutdown does not work on
Fedora 17, the guests are killed hard on system shutdown.

The reason is systemd considers libvirt-guests.service to be stopped when the
system is running:

$ systemctl status libvirt-guests.service
libvirt-guests.service - Suspend Active Libvirt Guests
          Loaded: loaded (/usr/lib/systemd/system/libvirt-guests.service;
enabled)
          Active: deactivating (stop) since Fri, 27 Jul 2012 15:47:31 +0200;
2min 48s ago
         Process: 1085 ExecStart=/etc/init.d/libvirt-guests start
(code=exited, status=0/SUCCESS)
         Control: 1150 (libvirt-guests)
          CGroup: name=systemd:/system/libvirt-guests.service
                  └ control
                    ├ 1150 /bin/sh /etc/init.d/libvirt-guests stop
                    └ 2257 sleep 1

libvirt-guests.service is defined as type "simple" in systemd (the default).
That means systemd will shut down the service when the start executable is
terminated after starting is done. Systemd will not call stop again on system
shutdown because it thinks it is already stopped.

The solution is to define it as type "oneshot" and set the flag
"RemainAfterExit". Then systemd will consider the service as active after
startup and will call the stop function on host shutdown.

tools/libvirt-guests.service.in

index bc63e917a6470e7a783398f2c381da7d6141a995..db28f3ff6a5f9a49dc9e55ee32df7d8898367899 100644 (file)
@@ -8,6 +8,8 @@ EnvironmentFile=-/etc/sysconfig/libvirt-guests
 # out the code
 ExecStart=/etc/init.d/libvirt-guests start
 ExecStop=/etc/init.d/libvirt-guests stop
+Type=oneshot
+RemainAfterExit=yes
 
 [Install]
 WantedBy=multi-user.target