KVM/Libvirt: How to make local DHCP leases available to local DNS server through dnsmasq

dhcpdnsmasqdomain-name-systemlibvirt

On Ubuntu 17.04 with libvirt 3.0.0

I have multiple virtual networks defined on my Server:

# virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
...
 virtual-mgt-5        active     yes           yes
 ...

When a VM is started on "virtual-mgt-5" with an interface which needs the dnsmasq DHCP server to get its IP address/subnet length, it remains inaccessible through its FQDN once the IP information is acquired.

The default values are used for each dnsmasq instance:

systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-06-10 19:48:58 CEST; 3ms ago
     Docs: man:libvirtd(8)
           http://libvirt.org
 Main PID: 25365 (libvirtd)
    Tasks: 35 (limit: 4915)
   Memory: 27.1M
      CPU: 28ms
   CGroup: /system.slice/libvirtd.service
           ├─22262 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
           ├─22263 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
...
           ├─24061 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/virtual-mgt-5.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
           ├─24062 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/virtual-mgt-5.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
...
           ├─25365 /usr/sbin/libvirtd
           └─25384 /usr/sbin/dnsmasq --help

I wonder whether the option "–leasefile-ro" gets in the way or not: there may be a key=value in /etc/libvirt/qemu/networks/virtual-mgt-5.xml to enable this behavior, but I could not find it in the Network XML format.

The contents of the corresponding XML file are:

virsh net-edit virtual-mgt-5

<network ipv6='yes'>
  <name>virtual-mgt-5</name>
  <uuid>193ac2c9-13fc-44a6-83f8-477790f1f470</uuid>
  <forward mode='route'/>
  <bridge name='virbr5' stp='on' delay='0'/>
  <mac address='52:54:00:b9:ea:63'/>
  <domain name='actionmystique.net'/>
  <ip address='172.21.0.1' netmask='255.255.0.0'>
    <dhcp>
      <range start='172.21.0.1' end='172.21.255.254'/>
    </dhcp>
  </ip>
  <ip family='ipv6' address='fc21::1' prefix='64'>
    <dhcp>
      <range start='fc21::1' end='fc21::fffe'/>
    </dhcp>
  </ip>
</network>

Any suggestion?

Best Answer

Libvirt provides two 'nss' modules that can enable name resolution for guests. The 'libvirt' module resolves hostnames (defined in the network XML) to IP addrs. The 'libvirt-guest' module takes a slightly different approach, resolving the guest domain name, instead of hostname, to IP addresses. The latter means you don't need to add hostnames to the network XML - you can just virsh start myguest && ssh myguest

https://wiki.libvirt.org/page/NSS_module