为什么在使用 Anaconda 启动期间运行 virt-install BASH 脚本与使用 Python 的 subprocess.run() 函数不一致?



我正在尝试将用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=/path/to/centos7.ks 在本地定义一个 kickstart 文件,结果相同。

['/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查询的解决方案。

相当于 shell 脚本片段:

-x 'console=ttyS0,115200n8 serial' 
-x "ks=http://${KS_REPO}/boot/${CONFIG_VM}.ks"

is(假设一个足够新的 Python 来支持 f 字符串以简洁起见(:

[
'-x', 'console=ttyS0,115200n8 serial',
'-x', f'ks=http://{KS_REPO}/boot/{CONFIG_VM[0]}.ks',
]

两种语言都没有字面上的引号,只有句法引号。

最新更新