1#!/bin/sh 2 3DAEMON="libvirtd" 4EXECFILE="/usr/sbin/$DAEMON" 5PIDFILE="/var/run/$DAEMON.pid" 6 7LIBVIRTD_ARGS="" 8 9# shellcheck source=/dev/null 10[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON" 11 12trap 'rm -f "$TMP_MODULE_LIST" "$TMP_PIDFILE_LIST"' EXIT 13 14is_alive() { 15 [ -e "$1" ] \ 16 && exe="/proc/$(cat "$1" 2>/dev/null)/exe" \ 17 && [ -s "$exe" ] \ 18 && [ "$(readlink -f "$exe")" = "$2" ] 19} 20 21load_modules() { 22 printf 'Loading kernel modules: ' 23 kver="$(uname -r)" 24 TMP_MODULE_LIST="$(mktemp -q)" || { 25 echo 'FAIL creating temporary modules list' 26 exit 1 27 } 28 [ -d "/lib/modules/$kver/kernel/drivers/net" ] && \ 29 find "/lib/modules/$kver/kernel/drivers/net" \ 30 -name "tun.ko*" >> "$TMP_MODULE_LIST" 31 [ -d "/lib/modules/$kver/kernel/drivers/vhost" ] && \ 32 find "/lib/modules/$kver/kernel/drivers/vhost" \ 33 -name "vhost?net.ko*" >> "$TMP_MODULE_LIST" 34 [ -d "/lib/modules/$kver/kernel/drivers/net" ] && \ 35 find "/lib/modules/$kver/kernel/drivers/vfio" \ 36 -name "*.ko*" >> "$TMP_MODULE_LIST" 37 while read -r f; do 38 m="$(basename "${f%.ko*}")" 39 if modprobe -q "$m"; then 40 printf '%s ' "$m" 41 else 42 echo "FAIL on $m" 43 exit 1 44 fi 45 done < "$TMP_MODULE_LIST" 46 echo "OK" 47} 48 49# 50# If libvirtd dies it leves behind one stale dnsmasq per virtual network that 51# must be killed before starting libvirtd again. 52# 53rm_stale_dnsmasq() { 54 [ -d /var/run/libvirt/network ] || return 0 55 TMP_PIDFILE_LIST="$(mktemp -q)" || { 56 echo "Could not create temporary pidfile list" 57 exit 1 58 } 59 find /var/run/libvirt/network -name '*.pid' > "$TMP_PIDFILE_LIST" 60 while read -r pidfile; do 61 if is_alive "$pidfile" /usr/sbin/dnsmasq; then 62 start-stop-daemon -K -q -p "$pidfile" -x /usr/sbin/dnsmasq 63 status=$? 64 if [ "$status" -ne 0 ]; then 65 echo "Could not stop stale dnsmasq daemons" 66 exit 1 67 fi 68 rm -f "$pidfile" 69 fi 70 done < "$TMP_PIDFILE_LIST" 71} 72 73start() { 74 if is_alive "$PIDFILE" "$EXECFILE"; then 75 # libvirtd is already running. Leave it alone. 76 printf 'Starting %s: FAIL\n' "$DAEMON" 77 return 1 78 fi 79 rm_stale_dnsmasq 80 load_modules 81 printf 'Starting %s: ' "$DAEMON" 82 # shellcheck disable=SC2086 # we need the word splitting 83 start-stop-daemon -S -q -p "$PIDFILE" -x "$EXECFILE" \ 84 -- -d $LIBVIRTD_ARGS 85 status=$? 86 if [ "$status" -eq 0 ]; then 87 echo "OK" 88 else 89 echo "FAIL" 90 fi 91 return "$status" 92} 93 94stop() { 95 printf 'Stopping %s: ' "$DAEMON" 96 start-stop-daemon -K -q -p "$PIDFILE" -x "$EXECFILE" 97 status=$? 98 if [ "$status" -eq 0 ]; then 99 rm_stale_dnsmasq 100 echo "OK" 101 else 102 echo "FAIL" 103 fi 104 return "$status" 105} 106 107restart() { 108 stop 109 sleep 1 110 start 111} 112 113# On receipt of SIGHUP libvirtd will reload its configuration. 114reload() { 115 printf 'Reloading %s: ' "$DAEMON" 116 start-stop-daemon -K -s HUP -q -p "$PIDFILE" -x "$EXECFILE" 117 status=$? 118 if [ "$status" -eq 0 ]; then 119 echo "OK" 120 else 121 echo "FAIL" 122 fi 123 return "$status" 124} 125 126case "$1" in 127 start|stop|restart|reload) 128 "$1";; 129 *) 130 echo "Usage: $0 {start|stop|restart|reload}" 131 exit 1 132esac 133