В настоящее время в 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 тоже кажется невозможным
Я был в той же ситуации, пытаясь настроить libvirt dhcp для спичечный коробок. Для справки я работал над Fedora 25
Первый вариант невозможен из-за ограничений парсинга xml в libvirt. Второй вариант не сработает, так как config будет перезаписан 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, используя спичечный коробок
Libvirt v5.6.0 (05.08.2019) добавлена поддержка передачи пользовательских параметров в dnsmasq
.
Из документация:
Для передачи параметров непосредственно в базовый файл конфигурации dnsmasq доступно специальное пространство имен XML. Использование пространств имен 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 явно исключает возможность общей передачи параметров в dnsmasq, поскольку мы хотим изолировать формат / API общедоступной конфигурации от информации о конкретном выборе dnsmasq в качестве серверной части impl. Если бы вы попытались изменить файл конфигурации dnsmasq, который записывает libvirt, ваши изменения были бы просто перезаписаны libvirt позже.
Если в сетевом XML libvirt отсутствуют какие-либо функции, которые вам нужны, я рекомендую вам отправить отчет об ошибке libvirt с просьбой их добавить. Любая информация, которую вы можете предоставить для объяснения причин их использования, также будет полезна.