我正在尝试将用BASH编写的kvm构建脚本转换为Python。在BASH中,我在脚本中编写了以下几行代码,以执行从ISO映像构建的新KVM实例:
virt-install \
--name=${VMNAME} \
--ram=${MEMSIZE} \
--vcpus=${VCPUS} \
--os-type "linux" \
--location ${ISOFILE} \
--file=/var/lib/libvirt/images/${VMNAME}.dsk \
--file-size=${DISKSIZE} \
--network bridge=br0 \
--graphics=none \
--os-variant="rhel7" \
-x 'console=ttyS0,115200n8 serial' \
-x "ks=http://192.168.1.10/boot/centos7.ks"
这将创建成功的构建,并且可以通过使用virt-install的“ virsh”控制台看到它。
我在Python中用来模仿BASH脚本中发生的情况的脚本如下:
kvm_cmd = ['/usr/bin/virt-install', \
'--name=' + SELECT_SPECS[0], \
'--ram=' + SELECT_SPECS[2], \
'--vcpus=' + SELECT_SPECS[3], \
'--os-type=linux', \
'--location=' + CONFIG_VM[1], \
'--file=/var/lib/libvirt/images/' + SELECT_SPECS[0] + '.dsk', \
'--file-size=' + SELECT_SPECS[4], \
'--network=bridge:br0', \
'--nographics', \
'--os-variant=' + CONFIG_VM[2], \
'-x "console=ttyS0,115200n8 serial"', \
'-x "ks=' + KS_REPO + CONFIG_VM[0] + '.ks"']
process = subprocess.run(kvm_cmd, stdout=subprocess.PIPE)
print(kvm_cmd)
print('VM ' + SELECT_SPECS[0] + ' created!')
return
现在,我正在尝试使用Python的subprocess.run()函数执行BASH命令。尽管在运行时没有看到串行输出,但是我可以在运行Python脚本时发送^]信号以退出控制台,然后在另一个窗口/终端中重新输入virsh控制台。
进入控制台,我看到安装遇到了一些anaconda问题,报告“ Kickstart文件/run/install/ks.cfg丢失”。
我可以确认所有命令参数变量都在其中。我已经使用了--network bridge:br0和--bridge = br0进行测试,以及使用'-x“ ks = file:/centos7.ks”和--initrd-inject = /在本地定义了kickstart文件path / to / centos7.ks,结果相同。
['/usr/bin/virt-install', '--name=test', '--ram=2048', '--vcpus=1', '--os-type=linux', \
'--location=/DataStore/ISOs/CentOS-7-x86_64-Minimal-1708.iso', '--file=/var/lib/libvirt/images/test.dsk', \
'--file-size=20', '--bridge=br0', '--graphics=none', '--os-variant=rhel7', '-x \
"console=ttyS0,115200n8 serial"', '-x "ks=http://192.168.1.10/boot/centos7.ks"']
有人可以帮我弄清楚为什么无法使用python的Subprocess.run()函数加载kickstart的原因,但是当我在BASH中运行命令时,我可以运行它没有问题吗?
除了在子进程中使用BASH virt-install之外,最好是在Python库中,还有一种使用上述详细信息创建kvm的更好方法吗?我看过libvirt,但找不到我的BASH查询的解决方案。
-x "ks=http://192.168.1.10/boot/centos7.ks"
是:
[ '-x', 'ks=http://192.168.1.10/boot/centos7.ks' ]
没有文字引号,只有语法引号。