我目前正在使用 XCP-ng 7.6.3,并且想要增加一点安全性并利用流量整形,我决定使用 PCI 直通 NIC。为了能够访问 dom0,我创建了一个仅在 dom0 和位于 domU 中的防火墙之间共享的 SSPN。启动 domU 会生成一个vif<X>.<Y>
附加的虚拟接口xapi<Z>
,通过手动为后者分配 IP,我可以在管理中启用远程功能。到目前为止一切顺利,一切都按预期运行。
问题是,我没有找到让 dom0 在启动虚拟接口时自动为自己分配 IP 的方法。我查看了 XCP、Xen 和 XenServer 文档很长时间,但只能找到自动为另一端的 domU 分配 IP 的方法,而不是 dom0。可以自动执行此操作吗?
如果不是通过 xapi/XCP 配置,是否有办法(甚至是脚本)以编程方式将静态 IP 附加到生成的接口,即使接口以不同的名称生成?
任何指示都值得赞赏。
答案1
经过几天的摸索,我得出结论,这是可能的。我借助 dom0 中的 XenAPI python 模块,用 python 编写了一个服务。存储库在这里,信息和手册参考这里。
简而言之,如下所示的代码片段:
with xenapi_session() as x:
vms = x.VM.get_all_records() # Get a list of VMs for multiple uses
# Find the ObscureRef of the target VM
vmref = [k for k in vms.keys() if vms[k]['name_label'] == VMNAME][0]
# Non-blocking listen for VM events
token = '' # Initial token
while bEndless:
output = x.event_from(['VM'], token, EVT_TIMEOUT)
token = output['token'] # Current token
for event in output['events']:
# Check the IP assigned to the VIFs of the target VM, if it's running
if (('add' == event['operation']) or
('mod' == event['operation'])) and \
(vmref == event['ref']) and \
('Running' == x.VM.get_power_state(vmref)):
if 'snapshot' not in event:
continue
vifs = event['snapshot']['VIFs'] # Virtual interfaces list
for vif in vifs:
net = x.VIF.get_network(vif) # Network ref
netrec = x.network.get_record(net) # Network record
if SSPNNAME != netrec['name_label']:
continue
# netrec['bridge'] holds the xapiN identifier that can
# be used with "ip addr add"
rebind_ip_address(netrec['bridge'])
几乎就是制作一个可以完成我最初要求的服务所需的全部内容。最后,我在服务器中添加了一些更有用的功能,例如自动 NFS/CIFS SR 重新挂载,但我不会在这里离题,因为这会偏离主题。