#!/bin/sh set -e error () { echo "$0": "$@" >&2 exit 1 } usage () { echo 'usage: kvmstats [-a] [-u k|m|g]' >&2 exit 1 } for DEP in bc virsh do command -v $DEP > /dev/null || error $DEP command not found done POW=$(echo 1024 ^ 3 | bc) while [ $# -ne 0 ] && echo "$1" | grep -q '^-[[:alnum:]]' do case $1 in '-u') case $2 in 'k') POW=$(echo 1024 ^ 1 | bc) ;; 'm') POW=$(echo 1024 ^ 2 | bc) ;; 'g') POW=$(echo 1024 ^ 3 | bc) ;; *) usage esac ;; '-a') SHOW_AVAIL=y ;; *) usage esac shift done for VM in $(virsh list --name --all) do echo "$VM" virsh vcpucount --maximum --current "$VM" # libvirt store memory in KiB, POW must be lowered by 1 virsh domstats --balloon "$VM" | awk 'BEGIN { FS="=" } /balloon.maximum/ { print $2 / '$((POW / 1024))'}' for BLK in $(virsh domblklist "$VM" | sed '1,2d;/-$/d;/^$/d' | cut -d\ -f1) do virsh domblkinfo "$VM" "$BLK" done | awk '/Physical:/ { size += $2 } END { print int(size / '${POW}') }' virsh domstate "$VM" | grep -q '^running$' && echo yes || echo no done | xargs -n5 | ( echo vm vcpu ram disk running awk '{ print } /yes$/ { vcpu += $2; ram += $3; disk += $4; running++ } END { print "TOTAL(running)", vcpu, ram, disk, running }' if [ "$SHOW_AVAIL" ] then AV_CPU=$(nproc) AV_MEM=$(awk '/^MemTotal:/ { print int($2 / '$((POW / 1024))' ) }' /proc/meminfo) echo AVAILABLE "$AV_CPU" "$AV_MEM" fi ) | column -t