| #!/sbin/runscript |
| |
| description="Virtual Machine Management daemon (libvirt)" |
| extra_started_commands="reload halt" |
| description_halt="Stops the libvirt daemon without stopping your VMs" |
| description_reload="Restarts the libvirt daemon without stopping your VMs" |
| |
| depend() { |
| USE_FLAG_FIREWALLD |
| use USE_FLAG_AVAHI USE_FLAG_ISCSI USE_FLAG_RBD dbus virtlockd |
| after ntp-client ntpd nfs nfsmount portmap rpc.statd iptables ip6tables ebtables corosync sanlock cgconfig xenconsoled |
| } |
| |
| libvirtd_virsh() { |
| local mode=$1 |
| shift |
| |
| # Silence errors because virsh always throws an error about |
| # not finding the hypervisor version when connecting to libvirtd |
| LC_ALL=C virsh -c ${mode}:///system "$@" 2>/dev/null |
| } |
| |
| libvirtd_dom_list() { |
| # Make sure that it wouldn't be confused if the domain name |
| # contains the word running. |
| libvirtd_virsh $1 list | awk '$3 == "running" { print $1 }' |
| } |
| |
| libvirtd_dom_count() { |
| # Make sure that it wouldn't be confused if the domain name |
| # contains the word running. |
| libvirtd_virsh $1 list | awk 'BEGIN { count = 0 } \ |
| $3 == "running" { count++ } \ |
| END { print count }' |
| } |
| |
| libvirtd_net_list() { |
| # The purpose of the awk is to avoid networks with 'active' in the name |
| libvirtd_virsh $1 net-list | awk '$2 == "active" { print $1 }' |
| } |
| |
| libvirtd_net_count() { |
| # The purpose of the awk is to avoid networks with 'active' in the name |
| libvirtd_virsh $1 net-list | awk 'BEGIN { count = 0 } \ |
| $2 == "active" { count++ } \ |
| END { print count }' |
| } |
| |
| |
| start() { |
| # Test configuration directories in /etc/libvirt/ to be either not |
| # present or a directory, i.e. not a regular file, bug #532892 |
| for dir in lxc nwfilter qemu storage; do |
| if [ -f /etc/libvirt/$dir ]; then |
| eerror "/etc/libvirt/$dir was created as a regular file. It must be either" |
| eerror "a directory or not present for libvirtd to start up successfully." |
| return 1 |
| fi |
| done |
| |
| ebegin "Starting libvirtd" |
| start-stop-daemon --start \ |
| --env KRB5_KTNAME=/etc/libvirt/krb5.tab \ |
| --exec /usr/sbin/libvirtd -- -d ${LIBVIRTD_OPTS} |
| eend $? |
| } |
| |
| stop() { |
| local counter= |
| local vm_name= |
| local net_name= |
| local dom_id= |
| |
| ebegin "Stopping libvirtd" |
| # try to shutdown all (KVM/Qemu) domains |
| if [ "${LIBVIRTD_KVM_SHUTDOWN}" != "none" ] \ |
| && [ "$(libvirtd_dom_count qemu)" != "0" ] ; then |
| |
| einfo " Shutting down domain(s):" |
| for dom_id in $(libvirtd_dom_list qemu) ; do |
| vm_name="$(libvirtd_virsh qemu domname ${dom_id} | head -n 1)" |
| einfo " ${vm_name}" |
| libvirtd_virsh qemu ${LIBVIRTD_KVM_SHUTDOWN} ${dom_id} > /dev/null |
| done |
| |
| if [ -n "${LIBVIRTD_KVM_SHUTDOWN_MAXWAIT}" ] ; then |
| counter="${LIBVIRTD_KVM_SHUTDOWN_MAXWAIT}" |
| else |
| counter=500 |
| fi |
| |
| if [ "${LIBVIRTD_KVM_SHUTDOWN}" = "shutdown" ]; then |
| einfo " Waiting ${counter} seconds while domains shutdown ..." |
| DOM_COUNT="$(libvirtd_dom_count qemu)" |
| while [ ${DOM_COUNT} -gt 0 ] && [ ${counter} -gt 0 ] ; do |
| DOM_COUNT="$(libvirtd_dom_count qemu)" |
| sleep 1 |
| counter=$((${counter} - 1)) |
| echo -n "." |
| done |
| fi |
| |
| if [ "$(libvirtd_dom_count qemu)" != "0" ] ; then |
| eerror " !!! Some guests are still running, stopping anyway" |
| fi |
| |
| fi |
| |
| if [ "${LIBVIRTD_KVM_NET_SHUTDOWN}" != "no" ] \ |
| && [ "$(libvirtd_net_count qemu)" != "0" ]; then |
| |
| einfo " Shutting down network(s):" |
| for net_name in $(libvirtd_net_list qemu); do |
| einfo " ${net_name}" |
| libvirtd_virsh qemu net-destroy ${net_name} > /dev/null |
| done |
| |
| if [ "$(libvirtd_net_count qemu)" != "0" ]; then |
| eerror " !!! Some networks are still active, stopping anyway" |
| fi |
| fi |
| |
| # Now actually stop the daemon |
| start-stop-daemon --stop --quiet --exec \ |
| /usr/sbin/libvirtd --pidfile=/var/run/libvirtd.pid |
| eend $? |
| } |
| |
| halt() { |
| ebegin "Stopping libvirtd without shutting down your VMs" |
| start-stop-daemon --stop --quiet --exec \ |
| /usr/sbin/libvirtd --pidfile=/var/run/libvirtd.pid |
| eend $? |
| } |
| |
| reload() { |
| halt |
| start |
| } |