description "libvirt daemon" author "Dustin Kirkland " start on runlevel [2345] stop on starting rc RUNLEVEL=[016] expect daemon respawn # daemonize env libvirtd_opts="-d -l" # whether libvirtd should run at boot/shutdown env start_libvirtd="yes" # by default wait 30 seconds for vms to shut down env libvirtd_shutdown_timeout=30 # uris for which to shut down vms env libvirt_uris='qemu:///system lxc:///' pre-start script [ -r /etc/default/libvirt-bin ] && . /etc/default/libvirt-bin [ ! "x$start_libvirtd" = "xyes" ] && { stop; exit 0; } mkdir -p /var/run/libvirt # Clean up a pidfile that might be left around rm -f /var/run/libvirtd.pid end script pre-stop script [ -r /etc/default/libvirt-bin ] && . /etc/default/libvirt-bin log_msg() { logf="/var/log/libvirt/shutdownlog.log" logger -p daemon.debug -s -t libvirt -- "$@" >> $logf 2>&1 } run_virsh() { # We parse the output for things like domain state; # make sure the output is in the language we expect. LANG=C virsh "$@" } if [ -z "$RUNLEVEL" ]; then exit 0 fi if [ "$RUNLEVEL" -ne 0 ] && [ "$RUNLEVEL" -ne 1 ] && [ "$RUNLEVEL" -ne 6 ]; then exit 0 fi log_msg "libvirt-bin: entering pre-stop at $(date)" for uri in $libvirt_uris; do for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do log_msg "libvirt-bin: attempting clean shutdown of $domain at $(date)" run_virsh -c "$uri" shutdown "$domain" >/dev/null done done delay=$libvirtd_shutdown_timeout while [ $delay -gt 0 ]; do for uri in $libvirt_uris; do if ! run_virsh -c "$uri" list | awk '$3 == "running" {exit 1}'; then # VMs at this URI are still running. Wait, then # start at the beginning looking for running VMs. sleep 1 delay=$(($delay - 1)) continue 2 fi done break done for uri in $libvirt_uris; do for domain in $(run_virsh -c "$uri" list | awk '$3 == "running" {print $2}'); do log_msg "destroying $domain" run_virsh -c "$uri" destroy "$domain" >/dev/null done done log_msg "libvirt-bin: exiting pre-stop at $(date)" end script # /etc/default/libvirt-bin will be deprecated soon. # If you used to set $libvirtd_opts in /etc/default/libvirt-bin, # change the 'exec' line here instead. script [ -r /etc/default/libvirt-bin ] && . /etc/default/libvirt-bin exec /usr/sbin/libvirtd $libvirtd_opts end script