Recently I started researching how a KVM guest could tell who it’s host is. I dug into the KVM code and found in r77 there’s new functionality to pass -uuid on the command line on the host and access it from the qemu monitor. KVM-78 should have bios modifications such that ‘dmidecode’ will return this uuid if passed as well. As noted in that last link, libvirt doesn’t support that yet. Although it’s a trivial change I can’t really wait for all this stuff, nor do I want to take the time to package it.
The existing vmport code in qemu, best I can tell, is used mostly for some vmmouse stuff. I can’t find anywhere than anyone actually uses it. I don’t want to write code to start poking around memory holes, so I threw out the idea of prodding around there.
In the end, I used my infrastructure, again. kvm/libvirt hosts report their guests to iclassify based on hostname:
#!/usr/bin/ruby -w
# This is an iclassify script for updating a libvirt (KVM) host with the list of guests
# Until KVM guests can access their UUID, this will rely on hostname being unique
# 2008-10-28 -- Bryan McLellan
def update_guests
local_guests = Array.new
server_guests = Array.new
# Get the list of current guest hostnames
%x[virsh list --all 2>/dev/null].each { |line|
# ignore header lines, match lines that start with a number ID, grab hostname from second column
if row = line.match(/^\s+\d+\s+(\S+)/)
local_guests << row[1]
end
}
unless local_guests.empty?
# update the array, and try to give it a break if it's the same
server_guests = attrib?("guest-hostname")
replace_attrib("guest-hostname", local_guests) unless server_guests == local_guests
end
end
if tag?("kvm")
update_guests
end
Then I could modify my ruby script that displays virt server status, originally written when I was using just vmware servers, to also show kvm/libvirt hosts:
client = IClassify::Client.new(config[:server], config[:user], config[:passwd])
vmwarehosts = client.search('(tag:vmware-server OR tag:kvm) AND NOT tag:workstation', [])
vmwarehosts.sort_by { |node| node.description }.each do |node|
puts node.description
puts "\tmemory free/total: " + node.attrib?('memoryfree').gsub!(/[^0-9.]/,"") + "/" + node.attrib?('memorysize') \
+ "\tswap free/total: " + node.attrib?('swapfree').gsub!(/[^0-9.]/,"") + "/" + node.attrib?('swapsize')
print "\tguests: "
# remember that node.description and friends aren't always clean
guests = client.search("vmwarehost:#{node.attrib?('hostname')}", [])
guests.sort_by { |node| node.description }.each do |guest|
print "#{guest.attrib?('hostname')} "
end
if node.attrib?("guest-hostname")
node.attrib?("guest-hostname").each { |guest| print "#{guest} " }
end
puts "\n"
end
And I guess that works for me for now. Later it’ll be nice to use the host and guests’s real UUID as the iclassify uuid. That’s a project for another day.

Pingback: Chef 0.5.2 and Ohai 0.1.4 released at btm.geek