#!/usr/bin/bash # Init script for libvirtd on Slackware # Written by Matteo Bernardini # # Note that a dnsmasq daemon is started by libvirtd itself to serve # its virtual network, and possibly can conflict with a dnsmasq # already running on the system, see # http://wiki.libvirt.org/page/Libvirtd_and_dnsmasq # Note also that the tun, vhost_net and kvm related modules are # automatically loaded at start and removed at stop: edit the # script if this behaviour conflicts with anything else running # on your setup MODULES="tun vhost_net" TIMEOUT=${TIMEOUT:-40} LIBVIRTD_PIDFILE="/var/run/libvirt/libvirtd.pid" LIBVIRTD_OPTS=${LIBVIRT_OPTS:-" -v -f /etc/libvirt/libvirtd.conf -p $LIBVIRTD_PIDFILE "} VIRTLOGD_PIDFILE="/var/run/libvirt/virtlogd.pid" VIRTLOGD_OPTS=${VIRTLOGD_OPTS:-" -v -f /etc/libvirt/virtlogd.conf -p $VIRTLOGD_PIDFILE "} VIRTLOCKD_PIDFILE="/var/run/libvirt/virtlockd.pid" VIRTLOCKD_OPTS=${VIRTLOCKD_OPTS:-" -v -f /etc/libvirt/virtlockd.conf -p $VIRTLOCKD_PIDFILE "} check_running_machines() { count=0 for machine in $(/usr/sbin/virsh list --name --state-running | grep -v ^$) ; do /usr/sbin/virsh shutdown $machine done echo -n "Waiting machines" while [ $(/usr/sbin/virsh list --name --state-running | grep -v ^$ | wc -l) -gt "0" ]; do if [ "$count" -ge "$TIMEOUT" ];then break fi echo -n "." count=$(expr $count + 1) sleep 1 done echo "" if [ $(/usr/sbin/virsh list --name --state-running | grep -v ^$ | wc -l) -gt "0" ];then echo -n "The following machines are still running, forcing shutdown: " for machine in $(/usr/sbin/virsh list --name --state-running | grep -v ^$) ; do /usr/sbin/virsh destroy $machine echo -n "$machine " done echo "" sleep 2 fi } check_processor() { egrep 'vmx' /proc/cpuinfo > /dev/null if [ "$?" -eq "0" ];then MODULES="$MODULES kvm_intel kvm" fi check=$? egrep 'svm' /proc/cpuinfo > /dev/null if [ "$?" -eq "0" ];then MODULES="$MODULES kvm_amd kvm" fi check=$(expr $check + $?) if [ $check -eq "2" ];then echo "Your system does not support KVM!" fi } start_libvirtd() { if [ -f $LIBVIRTD_PIDFILE ];then echo "libvirt is already running..." exit 1 fi echo "Starting libvirtd: /usr/sbin/libvirtd -d " mkdir -p $(dirname $LIBVIRTD_PIDFILE) check_processor /sbin/modprobe -a $MODULES /usr/sbin/libvirtd -d -l $LIBVIRTD_OPTS } stop_libvirtd() { if [ ! -f $LIBVIRTD_PIDFILE ];then echo "libvirt is not running..." exit 2 fi check_running_machines check_processor echo "Stopping libvirtd..." for network in $(/usr/sbin/virsh net-list | tail -n +3 | awk '{print $1}'); do /usr/sbin/virsh net-destroy "$network" done kill -TERM $(cat $LIBVIRTD_PIDFILE) sleep 3 /sbin/modprobe -ra $MODULES 2>/dev/null } start_virtlogd() { if [ -f $VIRTLOGD_PIDFILE ];then echo "virtlogd is already running..." exit 1 fi echo "Starting virtlogd: /usr/sbin/virtlogd -d " mkdir -p $(dirname $VIRTLOGD_PIDFILE) /usr/sbin/virtlogd -d $VIRTLOGD_OPTS } stop_virtlogd() { if [ ! -f $VIRTLOGD_PIDFILE ];then echo "virtlogd is not running..." exit 2 fi echo "Stopping virtlogd..." kill -TERM $(cat $VIRTLOGD_PIDFILE) sleep 1 } start_virtlockd() { if [ -f $VIRTLOCKD_PIDFILE ];then echo "virtlockd is already running..." exit 1 fi echo "Starting virtlockd: /usr/sbin/virtlockd -d " mkdir -p $(dirname $VIRTLOCKD_PIDFILE) /usr/sbin/virtlockd -d $VIRTLOCKD_OPTS } stop_virtlockd() { if [ ! -f $VIRTLOCKD_PIDFILE ];then echo "virtlockd is not running..." exit 2 fi echo "Stopping virtlockd..." kill -TERM $(cat $VIRTLOCKD_PIDFILE) sleep 1 } case $1 in start) start_virtlockd start_virtlogd start_libvirtd ;; stop) stop_libvirtd stop_virtlogd stop_virtlockd ;; restart) stop_libvirtd stop_virtlogd stop_virtlockd sleep 2 start_virtlockd start_virtlogd start_libvirtd ;; *) echo "Usage: $0 (start|stop|restart)" ;; esac