Пользовательские dnsmasq (или пользовательские параметры) с помощью libvrt?

В настоящее время только две опции, связанные с сетевой загрузкой, доступны в libvirt через bootp опции:
server а также file

Так что для конфигурации, как это:

<bootp file='test.ipx' server='10.10.10.2'/>

этот код генерируется:

dhcp-boot=test.ipx,,10.10.10.2

1) Как я могу добавить что-то вроде этого:

dhcp-userclass=set:ipxe,iPXE
dhcp-boot=tag:ipxe,http://matchbox.foo:8080/boot.ipxe

2) Или я могу изменить конфигурационный файл из var/lib/libvirt/dnsmasq/default.conf к чему-то еще

Вариант 1 кажется невозможным, глядя на код libvirt.
Вариант 2 также кажется невозможным

4 ответа

В Libvirt v5.6.0 (2019-08-05) добавлена ​​поддержка передачи пользовательских параметров в dnsmasq,

Из документации:

Специальное пространство имен XML доступно для передачи параметров непосредственно в базовый файл конфигурации dnsmasq. Использование пространств имен XML не сопровождается гарантиями поддержки, поэтому используйте их на свой страх и риск.

В этом примере XML передаст строки параметров foo=bar а также cname=*.foo.example.com,master.example.com непосредственно к базовому экземпляру dnsmasq.

<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
  ...
  <dnsmasq:options>
    <dnsmasq:option value="foo=bar"/>
    <dnsmasq:option value="cname=*.foo.example.com,master.example.com"/>
  </dnsmasq:options>
</network>

Fedora 31 поставляется с libvirt v5.6.0-4.fc31,

В моем случае я хочу использовать собственный DNS-сервер с моей сетью libvirt, а не тот, который предоставлен dnsmasq, Благодаря совету из этого ответа, я думаю, что это будет XML (но я не могу проверить, пока не обновлю libvirt):

<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
  ...
  <dnsmasq:options>
    <dnsmasq:option value="dhcp-option=6,192.168.0.90,192.168.0.98"/>
  </dnsmasq:options>
</network>

Я был в точно такой же ситуации, пытаясь настроить libvirt dhcp для matchbox. Для справки я работал над Fedora 25

Первый вариант невозможен из-за ограничений парсинга xml в libvirt. Второй вариант не будет работать, так как конфиг будет перезаписан libvirt. Вы не можете также настроить dnsmasq для работы в качестве прокси-сервера dhcp по тем же причинам, что и точка первая. Единственный способ, с помощью которого я нашел это, - полностью отключить dhcp для этой сети (используя virsh net-edit) и запустить dhcp как отдельный сервис.

Сеть libvirt по умолчанию запускает два экземпляра dnsmasq, один для dns, один для dhcp. В моем случае это было:

# netstat -tulpn | grep dnsmasq
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2229/dnsmasq
udp        0      0 192.168.122.1:53        0.0.0.0:*                           2229/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2229/dnsmasq
# ps aux | grep [d]nsmasq
nobody    2229  0.0  0.0  49104   372 ?        S    19:45   0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root      2230  0.0  0.0  49076   372 ?        S    19:45   0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

чтобы отключить dhcp, откройте конфигурацию сети:

virsh net-edit default

и удалите раздел dhcp

до:

<network>
  <name>default</name>
  <uuid>6fe7eafd-1925-4943-9596-2172bd55d1ac</uuid>
  <forward mode='route'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:08:ed:3b'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.99'/>
    </dhcp>
  </ip>
</network>

после:

<network>
  <name>default</name>
  <uuid>6fe7eafd-1925-4943-9596-2172bd55d1ac</uuid>
  <forward mode='route'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:08:ed:3b'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
  </ip>
</network>

перезапустите сеть, чтобы изменения вступили в силу:

virsh net-destroy default

virsh net-start default

и подтвердите, что сейчас работает только один экземпляр dnsmasq:

# netstat -tulpn | grep dnsmasq
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      2431/dnsmasq
udp        0      0 192.168.122.1:53        0.0.0.0:*                           2431/dnsmasq
# ps aux | grep [d]nsmasq
nobody    2431  0.0  0.0  49104   368 ?        S    19:55   0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper

Теперь вы хотите запустить собственный экземпляр, слушающий 0.0.0.0:67

dnsmasq уже был установлен для libvirt (с отключенной службой systemd и т. д.), поэтому мне просто нужно было создать следующий конфигурационный файл (с некоторыми специфичными для среды значениями, см. http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html):

# cat /etc/dnsmasq.d/default_dhcp.conf
pid-file=/var/run/libvirt/network/default_dhcp.pid
bind-dynamic
port=0
except-interface=lo
interface=virbr0
dhcp-range=192.168.122.2,192.168.122.99
dhcp-no-override
enable-tftp
tftp-root=/var/lib/tftp
dhcp-lease-max=98
dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile
dhcp-option=6,192.168.122.1

# if request comes from older PXE ROM, chainload to iPXE (via TFTP)
dhcp-boot=tag:!ipxe,undionly.kpxe
# if request comes from iPXE user class, set tag "ipxe"
dhcp-userclass=set:ipxe,iPXE
# point ipxe tagged requests to the matchbox iPXE boot script (via HTTP)
dhcp-boot=tag:ipxe,http://matchbox.foo:8080/boot.ipxe

# verbose
log-queries
log-dhcp

и запустить (и включить) демон с помощью:

systemctl start dnsmasq
systemctl enable dnsmasq

что привело к:

# netstat -tulpn | grep dnsmas
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1642/dnsmasq
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1642/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           2048/dnsmasq

и я мог бы iPXE загрузить KVM VMS с помощью Matchbox

Если расширить ответ Джонатона, то escape-пространство имен XML более полезно, чем кажется на первый взгляд (по крайней мере, для меня).

В моем случае я создаю файлы конфигурации dnsmasq (для службы загрузки) и хочу протестировать их на виртуальных машинах. Обертывать весь файл конфигурации в XML было бы утомительно. Оказывается, мы можем довольно легко уйти от XML, используя conf-файл , который затем включает в себя простые файлы конфигурации dnsmasq.

      <network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
  <dnsmasq:options>
    <dnsmasq:option value="conf-file=/config/dnsmasq.d/radar0.conf" />
    <dnsmasq:option value="conf-file=/config/dnsmasq.d/radar1.conf" />
  </dnsmasq:options>

  <name>cp.inner</name>
  <uuid>8bd7adb7-1b3e-4f4b-9745-ab2fc37d71a2</uuid>
  <forward mode='open'/>
  <bridge name='virbr1' stp='on' delay='0'/>
  <mac address='52:54:00:ec:2d:2f'/>
  <domain name='cp.inner'/>
  <ip address='10.32.1.1' netmask='255.255.255.0'>
  </ip>
</network>

 

(Вас интересуют только первые шесть строк приведенного выше примера.)

Libvirt явно избегает, разрешает общую передачу параметров в dnsmasq, так как мы хотим изолировать общедоступный формат конфигурации / API от знания о конкретном выборе dnsmasq в качестве внутреннего сервера impl. Если вы попытаетесь изменить файл конфигурации dnsmasq, который записывает libvirt, ваши изменения будут просто перезаписаны libvirt позже.

Если в libvirt network XML отсутствуют необходимые вам функции, я бы рекомендовал вам подать отчет об ошибке в libvirt с просьбой добавить их. Любая информация, которую вы можете предоставить для объяснения причин их использования, также будет полезна.

Другие вопросы по тегам