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

Why am I getting inconsistencies running virt-install BASH script vs using Python's subprocess.run() function during boot with Anaconda?

我正在尝试将用 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另一个 window/terminal 中的控制台。

进入控制台,我可以看到安装 运行s 进入了一些报告 "Kickstart file /run/install/ks.cfg is missing" 的 anaconda 问题。

我可以确认我所有的命令参数变量都在它们所属的位置。我同时使用了 --network bridge:br0 和 --bridge=br0 进行测试,并使用 '-x "ks=file:/centos7.ks' 和 --initrd 在本地定义了一个 kickstart 文件-inject=/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 查询的方法。

相当于shell脚本片段:

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

是(为简洁起见,假设有足够新的 Python 来支持 f 弦):

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

两种语言都没有文字引号,只有句法引号。