From: Daan De Meyer Date: Sat, 12 Aug 2023 12:41:52 +0000 (+0200) Subject: Add QemuCdrom= option X-Git-Tag: v16~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4d38e2b0dc024ba873c15226dea7e01ae1ca3771;p=thirdparty%2Fmkosi.git Add QemuCdrom= option This attaches the image as a CD-ROM instead of a hard drive to the virtual machine. --- diff --git a/mkosi/config.py b/mkosi/config.py index 393affa67..b2bb4462a 100644 --- a/mkosi/config.py +++ b/mkosi/config.py @@ -736,6 +736,7 @@ class MkosiConfig: qemu_kvm: ConfigFeature qemu_vsock: ConfigFeature qemu_swtpm: ConfigFeature + qemu_cdrom: bool qemu_args: Sequence[str] preset: Optional[str] @@ -1458,6 +1459,14 @@ class MkosiConfigParser: parse=config_parse_feature, help="Configure whether to use qemu with swtpm or not", ), + MkosiConfigSetting( + dest="qemu_cdrom", + metavar="BOOLEAN", + nargs="?", + section="Host", + parse=config_parse_boolean, + help="Attach the image as a CD-ROM to the virtual machine", + ), MkosiConfigSetting( dest="qemu_args", metavar="ARGS", @@ -1989,6 +1998,10 @@ def load_kernel_command_line_extra(args: argparse.Namespace) -> list[str]: if not any(s.startswith("SYSTEMD_SULOGIN_FORCE=") for s in args.kernel_command_line_extra): cmdline += ["SYSTEMD_SULOGIN_FORCE=1"] + if args.qemu_cdrom: + # CD-ROMs are read-only so tell systemd to boot in volatile mode. + cmdline += ["systemd.volatile=yes"] + for s in args.kernel_command_line_extra: key, sep, value = s.partition("=") if " " in value: @@ -2264,6 +2277,7 @@ Clean Package Manager Metadata: {yes_no_auto(config.clean_package_metadata)} QEMU Use KVM: {config.qemu_kvm} QEMU Use VSock: {config.qemu_vsock} QEMU Use Swtpm: {config.qemu_swtpm} + QEMU Use CD-ROM: {yes_no(config.qemu_cdrom)} QEMU Extra Arguments: {line_join_list(config.qemu_args)} """ diff --git a/mkosi/qemu.py b/mkosi/qemu.py index 10b9d1b56..81cd8a328 100644 --- a/mkosi/qemu.py +++ b/mkosi/qemu.py @@ -267,21 +267,33 @@ def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: "-drive", f"file={ovmf_vars.name},if=pflash,format=raw", ] - if config.ephemeral: + if config.qemu_cdrom and config.output_format == OutputFormat.disk: + # CD-ROM devices have sector size 2048 so we transform the disk image into one with sector size 2048. + src = (config.output_dir / config.output).resolve() + fname = src.parent / f"{src.name}-{uuid.uuid4().hex}" + run(["systemd-repart", + "--definitions", "", + "--no-pager", + "--pretty=no", + "--offline=yes", + "--empty=create", + "--size=auto", + "--sector-size=2048", + "--copy-from", src, + fname]) + elif config.ephemeral: fname = stack.enter_context(copy_ephemeral(config, config.output_dir / config.output)) else: fname = config.output_dir / config.output - if config.output_format == OutputFormat.disk: - run([ - "systemd-repart", - "--definitions", "", - "--no-pager", - "--size", "8G", - "--pretty", "no", - "--offline", "yes", - fname, - ]) + if config.output_format == OutputFormat.disk and not config.qemu_cdrom: + run(["systemd-repart", + "--definitions", "", + "--no-pager", + "--size=8G", + "--pretty=no", + "--offline=yes", + fname]) # Debian images fail to boot with virtio-scsi, see: https://github.com/systemd/mkosi/issues/725 if config.output_format == OutputFormat.cpio: @@ -292,9 +304,9 @@ def run_qemu(args: MkosiArgs, config: MkosiConfig) -> None: "-initrd", fname, "-append", " ".join(config.kernel_command_line + config.kernel_command_line_extra)] - cmdline += ["-drive", f"if=none,id=hd,file={fname},format=raw", + cmdline += ["-drive", f"if=none,id=mkosi,file={fname},format=raw", "-device", "virtio-scsi-pci,id=scsi", - "-device", "scsi-hd,drive=hd,bootindex=1"] + "-device", f"scsi-{'cd' if config.qemu_cdrom else 'hd'},drive=mkosi,bootindex=1"] if config.qemu_swtpm != ConfigFeature.disabled and shutil.which("swtpm") is not None: sock = stack.enter_context(start_swtpm())