From: Daan De Meyer Date: Mon, 24 Feb 2025 16:14:01 +0000 (+0100) Subject: TEST-64-UDEV-STORAGE: Stop using mkosi configure scripts X-Git-Tag: v257.4~37 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2cbc67e476d78db8b6dfc1ab17cf4027ff24bdd4;p=thirdparty%2Fsystemd.git TEST-64-UDEV-STORAGE: Stop using mkosi configure scripts Now that we have mkosi sandbox, meson runs with the mkosi tools tree mounted (if one is used at all), so we can implement all the qemu feature checks in meson itself, removing the need for mkosi configure scripts. (cherry picked from commit ba29de84cf3967ac3b06707348493d5ddc65c7d8) --- diff --git a/test/TEST-64-UDEV-STORAGE/btrfs_basic.configure b/test/TEST-64-UDEV-STORAGE/btrfs_basic.configure deleted file mode 100755 index 85ec983fc33..00000000000 --- a/test/TEST-64-UDEV-STORAGE/btrfs_basic.configure +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"] - -for i in range(4): - id = f"drivebtrfsbasic{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "350M" if i == 0 else "128M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += [ - "-device", - f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefbtrfs{i}", - ] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/iscsi_lvm.configure b/test/TEST-64-UDEV-STORAGE/iscsi_lvm.configure deleted file mode 100755 index 1d7a0c5b9a1..00000000000 --- a/test/TEST-64-UDEV-STORAGE/iscsi_lvm.configure +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"] - -for i in range(4): - id = f"driveiscsibasic{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "150M" if i == 0 else "70M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += [ - "-device", - f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefiscsi{i}", - ] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/long_sysfs_path.configure b/test/TEST-64-UDEV-STORAGE/long_sysfs_path.configure deleted file mode 100755 index a920171add0..00000000000 --- a/test/TEST-64-UDEV-STORAGE/long_sysfs_path.configure +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -config["Drives"] += [ - { - "Id": "drive0", - "Size": "64M", - "Options": "cache=unsafe", - } -] -config["QemuArgs"] += ["-device", "pci-bridge,id=pci_bridge0,chassis_nr=64"] - -# Create 25 additional PCI bridges, each one connected to the previous one -# (basically a really long extension cable), and attach a virtio drive to -# the last one. This should force udev into attempting to create a device -# unit with a _really_ long name. -for bridge in range(1, 26): - config["QemuArgs"] += [ - "-device", - f"pci-bridge,id=pci_bridge{bridge},bus=pci_bridge{bridge - 1},chassis_nr={64 + bridge},addr=1", - ] - -config["QemuArgs"] += ["-device", f"virtio-blk-pci,drive=drive0,bus=pci_bridge25,addr=1,serial=long-sysfs-path"] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/lvm_basic.configure b/test/TEST-64-UDEV-STORAGE/lvm_basic.configure deleted file mode 100755 index c4074becb46..00000000000 --- a/test/TEST-64-UDEV-STORAGE/lvm_basic.configure +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"] - -for i in range(4): - id = f"drivelvmbasic{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "32M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += [ - "-device", f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeeflvm{i}", - ] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/mdadm_basic.configure b/test/TEST-64-UDEV-STORAGE/mdadm_basic.configure deleted file mode 100755 index d722e081e28..00000000000 --- a/test/TEST-64-UDEV-STORAGE/mdadm_basic.configure +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"] - -for i in range(5): - id = f"drivemdadmbasic{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "64M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += [ - "-device", f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefmdadm{i}", - ] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/mdadm_lvm.configure b/test/TEST-64-UDEV-STORAGE/mdadm_lvm.configure deleted file mode 100755 index d669895925c..00000000000 --- a/test/TEST-64-UDEV-STORAGE/mdadm_lvm.configure +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0"] - -for i in range(5): - id = f"drivemdadmlvm{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "64M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += [ - "-device", f"scsi-hd,drive={id},vendor=systemd,product=foobar,serial=deadbeefmdadmlvm{i}", - ] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/meson.build b/test/TEST-64-UDEV-STORAGE/meson.build index a91c23ae170..f1045e89b4a 100644 --- a/test/TEST-64-UDEV-STORAGE/meson.build +++ b/test/TEST-64-UDEV-STORAGE/meson.build @@ -11,31 +11,253 @@ unit = configure_file( }, ) -foreach testcase : [ - 'btrfs_basic', - 'iscsi_lvm', - 'long_sysfs_path', - 'lvm_basic', - 'mdadm_basic', - 'mdadm_lvm', - 'multipath_basic_failover', - 'nvme_basic', - 'nvme_subsystem', - 'simultaneous_events', - 'virtio_scsi_basic', - 'virtio_scsi_identically_named_partitions', -] +udev_storage_tests = [] + +cmdline = [] +qemu_args = ['-device', 'virtio-scsi-pci,id=scsi0'] + +foreach i : range(4) + id = f'drivebtrfsbasic@i@' + size = i == 0 ? '350M' : '128M' + cmdline += [f'--drive=@id@:@size@::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,vendor=systemd,product=foobar,serial=deadbeefbtrfs@i@'] +endforeach + +udev_storage_tests += { + 'name' : 'btrfs_basic', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = ['-device', 'virtio-scsi-pci,id=scsi0'] + +foreach i : range(4) + id = f'driveiscsibasic@i@' + size = i == 0 ? '150M' : '70M' + cmdline += [f'--drive=@id@:@size@::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,vendor=systemd,product=foobar,serial=deadbeefiscsi@i@'] +endforeach + +udev_storage_tests += { + 'name' : 'iscsi_lvm', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = ['--drive=drive0:64M::cache=unsafe'] +qemu_args = ['-device', 'pci-bridge,id=pci_bridge0,chassis_nr=64'] + +# Create 25 additional PCI bridges, each one connected to the previous one +# (basically a really long extension cable), and attach a virtio drive to +# the last one. This should force udev into attempting to create a device +# unit with a _really_ long name. +foreach bridge : range(1, 26) + bus = bridge - 1 + chassis = 64 + bridge + qemu_args += ['-device', f'pci-bridge,id=pci_bridge@bridge@,bus=pci_bridge@bus@,chassis_nr=@chassis@,addr=1'] +endforeach + +qemu_args += ['-device', 'virtio-blk-pci,drive=drive0,bus=pci_bridge25,addr=1,serial=long-sysfs-path'] + +udev_storage_tests += { + 'name' : 'long_sysfs_path', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = ['-device', 'virtio-scsi-pci,id=scsi0'] + +foreach i : range(4) + id = f'drivelvmbasic@i@' + cmdline += [f'--drive=@id@:32M::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,vendor=systemd,product=foobar,serial=deadbeeflvm@i@'] +endforeach + +udev_storage_tests += { + 'name' : 'lvm_basic', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = ['-device', 'virtio-scsi-pci,id=scsi0'] + +foreach i : range(5) + id = f'drivemdadmbasic@i@' + cmdline += [f'--drive=@id@:64M::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,vendor=systemd,product=foobar,serial=deadbeefmdadm@i@'] +endforeach + +udev_storage_tests += { + 'name' : 'mdadm_basic', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = ['-device', 'virtio-scsi-pci,id=scsi0'] + +foreach i : range(5) + id = f'drivemdadmlvm@i@' + cmdline += [f'--drive=@id@:64M::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,vendor=systemd,product=foobar,serial=deadbeefmdadmlvm@i@'] +endforeach + +udev_storage_tests += { + 'name' : 'mdadm_lvm', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = [] + +# Add 16 multipath devices, each backed by 4 paths +foreach ndisk : range(16) + ndiskfmt = ndisk >= 10 ? f'00@ndisk@' : f'000@ndisk@' + wwn = f'0xDEADDEADBEEF@ndiskfmt@' + size = ndisk == 0 ? '16M' : '1M' + + foreach nback : range(4) + id = f'drive@ndisk@x@nback@' + cmdline += [f'--drive=@id@:@size@::cache=unsafe:@ndisk@'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,serial=MPIO@ndisk@,wwn=@wwn@'] + endforeach +endforeach + +udev_storage_tests += { + 'name' : 'multipath_basic_failover', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = [] + +foreach i : range(10) + id = f'drivesimultaneousevents@i@' + cmdline += [f'--drive=@id@:128M::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,serial=deadbeeftest@i@'] +endforeach + +udev_storage_tests += { + 'name' : 'simultaneous_events', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +cmdline = [] +qemu_args = [] + +foreach i : range(4) + qemu_args += ['-device', f'virtio-scsi-pci,id=scsi@i@'] +endforeach + +foreach i : range(128) + id = f'drive@i@' + cmdline += [f'--drive=@id@:1M::cache=unsafe'] + div = i / 32 + mod = i % 32 + qemu_args += ['-device', f'scsi-hd,drive=@id@,bus=scsi@div@.0,channel=0,scsi-id=@mod@,lun=0'] +endforeach + +udev_storage_tests += { + 'name' : 'virtio_scsi_basic', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, +} + +qemu = find_program('qemu-system-@0@'.format(host_machine.cpu_family()), 'qemu-kvm', dirs : ['/usr/libexec'], native : true, required : false) +if qemu.found() + devices = run_command(qemu, '-device', 'help', check : true).stdout().strip() + if devices.contains('name "nvme"') + cmdline = [] + qemu_args = [] + + foreach i : range(20) + cmdline += [f'--drive=nvme@i@:1M::cache=unsafe'] + endforeach + + foreach i : range(5) + qemu_args += ['-device', f'nvme,drive=nvme@i@,serial=deadbeef@i@,max_ioqpairs=8'] + endforeach + + foreach i : range(5, 10) + qemu_args += ['-device', f'"nvme,drive=nvme@i@,serial= deadbeef @i@ ,max_ioqpairs=8"'] + endforeach + + foreach i : range(10, 15) + qemu_args += ['-device', f'"nvme,drive=nvme@i@,serial= dead/beef/@i@ ,max_ioqpairs=8"'] + endforeach + + foreach i : range(15, 20) + qemu_args += ['-device', f'"nvme,drive=nvme@i@,serial=dead/../../beef/@i@,max_ioqpairs=8"'] + endforeach + + udev_storage_tests += { + 'name' : 'nvme_basic', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, + } + + cmdline = [] + + foreach id : ['nvme0', 'nvme1'] + cmdline += [f'--drive=@id@:1M::cache=unsafe'] + endforeach + + qemu_args = [ + # Create an NVM Subsystem Device + '-device', 'nvme-subsys,id=nvme-subsys-64,nqn=subsys64', + # Attach two NVM controllers to it + '-device', 'nvme,subsys=nvme-subsys-64,serial=deadbeef', + '-device', 'nvme,subsys=nvme-subsys-64,serial=deadbeef', + # And create two shared namespaces attached to both controllers + '-device', 'nvme-ns,drive=nvme0,nsid=16,shared=on', + '-device', 'nvme-ns,drive=nvme1,nsid=17,shared=on', + ] + + udev_storage_tests += { + 'name' : 'nvme_subsystem', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, + } + endif + + if devices.contains('name "virtio-scsi-pci"') + cmdline = [] + qemu_args = ['-device', 'virtio-scsi-pci,id=scsi0,num_queues=4'] + + foreach i : range(16) + id = f'drive@i@' + cmdline += [f'--drive=@id@:40M::cache=unsafe'] + qemu_args += ['-device', f'scsi-hd,drive=@id@,bus=scsi0.0,channel=0,scsi-id=0,lun=@i@'] + endforeach + + udev_storage_tests += { + 'name' : 'virtio_scsi_identically_named_partitions', + 'cmdline' : cmdline, + 'qemu-args' : qemu_args, + } + endif +endif + + +foreach testcase : udev_storage_tests + qemu_args = ' '.join(testcase['qemu-args']) + cmdline = testcase['cmdline'] + [f'--qemu-args=@qemu_args@'] + integration_tests += [ integration_test_template + { - 'name' : '@0@-@1@'.format(name, testcase), + 'name' : '@0@-@1@'.format(name, testcase['name']), # Make sure the service is still named TEST-64-UDEV-STORAGE.service. 'unit' : unit, 'cmdline' : integration_test_template['cmdline'] + [ - 'systemd.setenv=TEST_FUNCTION_NAME=testcase_@0@'.format(testcase) - ], - 'mkosi-args' : integration_test_template['mkosi-args'] + [ - '--configure-script', files('@0@.configure'.format(testcase)), + 'systemd.setenv=TEST_FUNCTION_NAME=testcase_@0@'.format(testcase['name']) ], + 'mkosi-args' : integration_test_template['mkosi-args'] + cmdline, 'priority' : 10, 'vm' : true, # Suppress ASan error diff --git a/test/TEST-64-UDEV-STORAGE/multipath_basic_failover.configure b/test/TEST-64-UDEV-STORAGE/multipath_basic_failover.configure deleted file mode 100755 index a59927c3b7f..00000000000 --- a/test/TEST-64-UDEV-STORAGE/multipath_basic_failover.configure +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -# Add 16 multipath devices, each backed by 4 paths -# We don't use --qemu-drive for this since they have to share the file. -for ndisk in range(16): - wwn = f"0xDEADDEADBEEF{ndisk:04d}" - if ndisk == 0: - size = "16M" - else: - size = "1M" - - for nback in range(4): - id = f"drive{ndisk}x{nback}" - config["Drives"] += [ - { - "Id": id, - "Size": size, - "Options": "cache=unsafe", - "FileId": str(ndisk), - } - ] - config["QemuArgs"] += ["-device", f"scsi-hd,drive={id},serial=MPIO{ndisk},wwn={wwn}"] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/nvme_basic.configure b/test/TEST-64-UDEV-STORAGE/nvme_basic.configure deleted file mode 100755 index ed8304d8043..00000000000 --- a/test/TEST-64-UDEV-STORAGE/nvme_basic.configure +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import os -import shutil -import subprocess -import sys - - -config = json.load(sys.stdin) - -qemu = shutil.which("/usr/libexec/qemu-kvm") or f"qemu-system-{os.environ['QEMU_ARCHITECTURE']}" -result = subprocess.run([qemu, "-device", "help"], check=True, text=True, stdout=subprocess.PIPE) -if 'name "nvme"' not in result.stdout: - print("nvme device driver is not available, skipping test...", file=sys.stderr) - exit(77) - -def add_drive(i: int, serial: str) -> None: - global config - id = f"nvme{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "1M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += ["-device", f"nvme,drive={id},serial={serial},max_ioqpairs=8"] - -for i in range(5): - add_drive(i, serial=f"deadbeef{i}") -for i in range(5, 10): - add_drive(i, serial=f" deadbeef {i} ") -for i in range(10, 15): - add_drive(i, serial=f" dead/beef/{i} ") -for i in range(15, 20): - add_drive(i, serial=f"dead/../../beef/{i}") - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/nvme_subsystem.configure b/test/TEST-64-UDEV-STORAGE/nvme_subsystem.configure deleted file mode 100755 index ed8b39ac5ff..00000000000 --- a/test/TEST-64-UDEV-STORAGE/nvme_subsystem.configure +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import os -import shutil -import subprocess -import sys - - -config = json.load(sys.stdin) - -qemu = shutil.which("/usr/libexec/qemu-kvm") or f"qemu-system-{os.environ['QEMU_ARCHITECTURE']}" -result = subprocess.run([qemu, "-device", "help"], check=True, text=True, stdout=subprocess.PIPE) -if 'name "nvme"' not in result.stdout: - print("nvme device driver is not available, skipping test...", file=sys.stderr) - exit(77) - -for id in ("nvme0", "nvme1"): - config["Drives"] += [ - { - "Id": id, - "Size": "1M", - "Options": "cache=unsafe", - } - - ] - -config["QemuArgs"] += [ - # Create an NVM Subsystem Device - "-device", "nvme-subsys,id=nvme-subsys-64,nqn=subsys64", - # Attach two NVM controllers to it - "-device", "nvme,subsys=nvme-subsys-64,serial=deadbeef", - "-device", "nvme,subsys=nvme-subsys-64,serial=deadbeef", - # And create two shared namespaces attached to both controllers - "-device", "nvme-ns,drive=nvme0,nsid=16,shared=on", - "-device", "nvme-ns,drive=nvme1,nsid=17,shared=on", -] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/simultaneous_events.configure b/test/TEST-64-UDEV-STORAGE/simultaneous_events.configure deleted file mode 100755 index 668f3e2aa06..00000000000 --- a/test/TEST-64-UDEV-STORAGE/simultaneous_events.configure +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -for i in range(10): - id = f"drivesimultaneousevents{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "128M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += ["-device", f"scsi-hd,drive={id},serial=deadbeeftest{i}"] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/virtio_scsi_basic.configure b/test/TEST-64-UDEV-STORAGE/virtio_scsi_basic.configure deleted file mode 100755 index 91e1fe14e55..00000000000 --- a/test/TEST-64-UDEV-STORAGE/virtio_scsi_basic.configure +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import sys - - -config = json.load(sys.stdin) - -for i in range(4): - config["QemuArgs"] += ['-device', f"virtio-scsi-pci,id=scsi{i}"] - -for i in range(128): - id = f"drive{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "1M", - "Options": "cache=unsafe", - } - ] - config["QemuArgs"] += [ - '-device', - f"scsi-hd,drive={id},bus=scsi{i // 32}.0,channel=0," - f"scsi-id={i % 32},lun=0", - ] - -json.dump(config, sys.stdout) diff --git a/test/TEST-64-UDEV-STORAGE/virtio_scsi_identically_named_partitions.configure b/test/TEST-64-UDEV-STORAGE/virtio_scsi_identically_named_partitions.configure deleted file mode 100755 index 5ffade58005..00000000000 --- a/test/TEST-64-UDEV-STORAGE/virtio_scsi_identically_named_partitions.configure +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/python3 -# SPDX-License-Identifier: LGPL-2.1-or-later - -import json -import os -import shutil -import subprocess -import sys - - -config = json.load(sys.stdin) - -qemu = shutil.which("/usr/libexec/qemu-kvm") or f"qemu-system-{os.environ['QEMU_ARCHITECTURE']}" -result = subprocess.run([qemu, "-device", "help"], check=True, text=True, stdout=subprocess.PIPE) -if 'name "virtio-scsi-pci"' not in result.stdout: - print("virtio-scsi-pci device driver is not available, skipping test...", file=sys.stderr) - exit(77) - -num_disk = 16 - -config["QemuArgs"] += ["-device", "virtio-scsi-pci,id=scsi0,num_queues=4"] - -for i in range(0, num_disk): - id = f"drive{i}" - config["Drives"] += [ - { - "Id": id, - "Size": "40M", - "Options": "cache=unsafe" - } - ] - config["QemuArgs"] += ["-device", f"scsi-hd,drive={id},bus=scsi0.0,channel=0,scsi-id=0,lun={i}"] - -json.dump(config, sys.stdout)