S92libvirtd 2.9 KB

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