使用 libvrt 的自定义 dnsmasq(或自定义选项)?

使用 libvrt 的自定义 dnsmasq(或自定义选项)?

目前,libvirt 中仅提供两个与网络启动相关的选项bootp
serverfile

因此对于这样的配置:

<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 似乎也不可能

答案1

Libvirt v5.6.0(2019-08-05)增加了对传递自定义选项的支持dnsmasq

文档

可以使用特殊的 XML 命名空间将选项直接传递到底层 dnsmasq 配置文件。使用 XML 命名空间不提供任何支持保证,因此使用时请自担风险。

此示例 XML 将传递选项字符串foo=barcname=*.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

就我而言,我希望在 libvirt 网络中使用自定义 DNS 服务器,而不是 提供的服务器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>

答案2

我遇到过同样的情况,尝试配置 libvirt dhcp火柴盒。作为参考,我当时在 Fedora 25 上工作

由于 libvirt 中 xml 解析的限制,第一个选项无法实现。第二个选项无法工作,因为配置将被 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

我可以使用 matchbox 通过 iPXE 启动 kvm vms

答案3

为了扩展 Jonathon 的回答,XML 命名空间转义比乍一看更有用(至少对我而言)。

在我的例子中,我生成 dnsmasq 配置文件(用于启动服务),并希望使用虚拟机进行测试。用 XML 包装整个配置文件会很繁琐。事实证明,我们可以通过使用以下方法相当轻松地摆脱 XML配置文件- 然后包含普通的 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>

 

(您只关心上面例子的前六行。)

答案4

Libvirt 明确避免允许将选项通用传递到 dnsmasq,因为我们希望使公共配置格式/API 不知道将 dnsmasq 作为 impl 后端的具体选择。如果您尝试更改 libvirt 写出的 dnsmasq 配置文件,您的更改稍后将被 libvirt 覆盖。

如果 libvirt 网络 XML 中缺少您需要的功能,我建议您向 libvirt 提交错误报告,请求添加这些功能。您提供的任何信息来解释使用这些功能的理由也将大有裨益。

相关内容