1

如果这是一个简单的问题,我很抱歉,但我刚刚开始使用 qemu,找不到简单的方法来做到这一点。

我正在尝试自动化我的 KVM 部署。我目前遇到的问题是我找不到自动为 filterref 设置参数的方法。

这就是我的virt-install网络选项当前的样子,并且目前运行良好。

--network type=bridge,network=default,bridge=bridge0,model=e1000e,mac=$mac,filterref=clean-traffic

但是我找不到任何东西来设置一个参数来定义它应该被锁定到的 IP 地址。这是我在 xml 中想要的结果:

<filterref filter='clean-traffic'>
  <parameter name='IP' value='XXX.XXX.XXX.XXX'/>
</filterref>

我正在寻找一种自动添加该参数的方法,最好是直接使用virt-install或在某种程度上我可以运行脚本,输入我想要设置的几个变量。此时,VM 已经在运行并等待设置完成,并加载了过滤器。基本上我希望在第一次启动之前加载参数,这样任何人都不会试图弄乱 ip 地址。

这可能吗?

这是我现在刚刚复制到控制台的整个“脚本”。

name=WindowsTest
mac=00:50:56:00:05:C5
size=70
ram=6000
vcpus=6
let cores=vcpus/2

virt-install \
    --name=$name \
    --ram=$ram \
    --cpu=host \
    --vcpus=$vcpus,maxvcpus=$vcpus,sockets=1,cores=$cores,threads=2 \
    --os-type=windows \
    --os-variant=win10 \
    --disk path=/var/lib/libvirt/clutchImages/$name.qcow2,size=$size,format=qcow2,bus=virtio \
    --cdrom /var/isos/Windows_20H2_English.iso \
    --disk /var/isos/virtio-win-0.1.185.iso,device=cdrom \
    --network type=bridge,network=default,bridge=bridge0,model=e1000e,mac=$mac,filterref=clean-traffic  \
    --graphics spice,listen=157.90.2.208  \
    --graphics vnc

virsh 版本输出:

   virsh version
    Compiled against library: libvirt 6.0.0
    Using library: libvirt 6.0.0
    Using API: QEMU 6.0.0
    Running hypervisor: QEMU 4.2.0

我在 CentOS Linux 版本 8.3.2011 上。

4

2 回答 2

1

又快又脏

name=WindowsTest
mac=00:50:56:00:05:C5
IP=xxx.yyy.zzz.qqq
size=70
ram=6000
vcpus=6
let cores=vcpus/2

virt-install \
    --name=$name \
    --ram=$ram \
    --cpu=host \
    --vcpus=$vcpus,maxvcpus=$vcpus,sockets=1,cores=$cores,threads=2 \
    --os-type=windows \
    --os-variant=win10 \
    --disk path=/var/lib/libvirt/clutchImages/$name.qcow2,size=$size,format=qcow2,bus=virtio \
    --cdrom /var/isos/Windows_20H2_English.iso \
    --disk /var/isos/virtio-win-0.1.185.iso,device=cdrom \
    --network type=bridge,network=default,bridge=bridge0,model=e1000e,mac=$mac,filterref=clean-traffic  \
    --graphics spice,listen=157.90.2.208  \
    --graphics vnc
    --print-xml  > /tmp/{$name}.xml  && \ 
sed -i "s/<filterref.*/<filterref filter='clean-traffic'>\n <parameter name='IP' value='${IP}'\/>\n <\/filterref>/g" /tmp/{$name}.xml &&  \
virsh create /tmp/{$name}.xml
于 2021-12-17T15:46:18.070 回答
0

对 virt-install 的 xml 输出进行任意编辑

根据手册页,您可以使用 XPath 语法直接编辑 XML。

例如

virt-install \
#...
--network network="${net}",mac="${macaddr},filterref.filter=clean-traffic" \
--xml xpath.create=./devices/interface/filterref/parameter \
--xml xpath.set=./devices/interface/filterref/parameter/@name=IP \
--xml xpath.set=./devices/interface/filterref/parameter/@value=10.0.0.20
#...

virt-install 手册页摘录:

man virt-install | grep -m1 -A40 '\-\-xml'

--xml
    Syntax: --xml ARGS

    Make  direct edits to the generated XML using XPath syntax. Take an ex‐
    ample like

       virt-install --xml ./@foo=bar --xml ./newelement/subelement=1

    This will alter the generated XML to contain:

       <domain foo='bar' ...>
         ...
         <newelement>
           <subelement>1</subelement>
         </newelement>
       </domain>

    The --xml option has 4 sub options:

    --xml xpath.set=XPATH[=VALUE]
           The default behavior if no explicit suboption is set. Takes  the
           form  XPATH=VALUE unless paired with xpath.value . See below for
           how value is interpreted.

    --xml xpath.value=VALUE
           xpath.set will be interpreted only  as  the  XPath  string,  and
           xpath.value  will be used as the value to set. May help sidestep
           problems if the string you need to set  contains  a  '='  equals
           sign.

           If  value  is  empty,  it's treated as unsetting that particular
           node.

    --xml xpath.create=XPATH
           Create the node as an empty element. Needed for boolean elements
           like <readonly/>

    --xml xpath.delete=XPATH
           Delete the entire node specified by the xpath, and all its chil‐
           dren

XML 结果

<interface type="network">
  <!-- ... -->
  <filterref filter="clean-traffic">
    <parameter name="IP" value="10.0.0.20"/>
  </filterref>
</interface>

virsh version输出:

Compiled against library: libvirt 7.7.0
Using library: libvirt 7.7.0
Using API: QEMU 7.7.0
Running hypervisor: QEMU 6.2.0
于 2022-01-25T05:43:05.487 回答