为什么在用Anaconda启动时运行virt-install BASH脚本而不是使用Python的subprocess.run()函数时会出现不一致的地方?

问题描述 投票:0回答:1

我正在尝试将用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查询的解决方案。

python centos subprocess kvm libvirt
1个回答
0
投票
-x "ks=http://192.168.1.10/boot/centos7.ks"

是:

[ '-x', 'ks=http://192.168.1.10/boot/centos7.ks' ]

没有文字引号,只有语法引号。

© www.soinside.com 2019 - 2024. All rights reserved.