if state.config.output_format == OutputFormat.cpio and state.config.bootable == ConfigFeature.auto:
return
+ if state.config.architecture.to_efi() is None and state.config.bootable == ConfigFeature.auto:
+ return
+
if not any(gen_kernel_images(state)) and state.config.bootable == ConfigFeature.auto:
return
# nul terminators in argv so let's communicate the cmdline via a file instead.
(state.workspace / "cmdline").write_text(f"{' '.join(cmdline).strip()}\x00")
- stub = state.root / f"usr/lib/systemd/boot/efi/linux{state.config.architecture.to_efi()}.efi.stub"
+ if not (arch := state.config.architecture.to_efi()):
+ die(f"Architecture {state.config.architecture} does not support UEFI")
+
+ stub = state.root / f"usr/lib/systemd/boot/efi/linux{arch}.efi.stub"
if not stub.exists():
die(f"sd-stub not found at /{stub.relative_to(state.root)} in the image")
"--os-release", f"@{state.root / 'usr/lib/os-release'}",
"--stub", stub,
"--output", output,
- "--efi-arch", state.config.architecture.to_efi(),
+ "--efi-arch", arch,
]
if not state.config.tools_tree:
if state.config.output_format in (OutputFormat.cpio, OutputFormat.uki) and state.config.bootable == ConfigFeature.auto:
return
+ if state.config.architecture.to_efi() is None and state.config.bootable == ConfigFeature.auto:
+ return
+
roothash = finalize_roothash(partitions)
initrds = []
definitions = state.workspace / "repart-definitions"
if not definitions.exists():
definitions.mkdir()
- bootloader = state.root / f"efi/EFI/BOOT/BOOT{state.config.architecture.to_efi().upper()}.EFI"
+ if (arch := state.config.architecture.to_efi()):
+ bootloader = state.root / f"efi/EFI/BOOT/BOOT{arch.upper()}.EFI"
+ else:
+ bootloader = None
# If grub for BIOS is installed, let's add a BIOS boot partition onto which we can install grub.
bios = (state.config.bootable != ConfigFeature.disabled and want_grub_bios(state))
)
)
- esp = (state.config.bootable == ConfigFeature.enabled or
- (state.config.bootable == ConfigFeature.auto and bootloader.exists()))
+ esp = (
+ state.config.bootable == ConfigFeature.enabled or
+ (state.config.bootable == ConfigFeature.auto and bootloader and bootloader.exists())
+ )
if esp or bios:
# Even if we're doing BIOS, let's still use the ESP to store the kernels, initrds and grub
import enum
import platform
+from typing import Optional
from mkosi.log import die
from mkosi.util import StrEnum
return a
- def to_efi(self) -> str:
- a = {
+ def to_efi(self) -> Optional[str]:
+ return {
Architecture.x86_64 : "x64",
Architecture.x86 : "ia32",
Architecture.arm64 : "aa64",
Architecture.loongarch64 : "loongarch64",
}.get(self)
- if not a:
- die(f"Architecture {self} does not support UEFI")
-
- return a
def to_qemu(self) -> str:
a = {
return a
+ def supports_smbios(self) -> bool:
+ return self in (Architecture.x86, Architecture.x86_64, Architecture.arm, Architecture.arm64)
+
def is_native(self) -> bool:
return self == self.native()
def find_qemu_binary(config: MkosiConfig) -> str:
- binaries = ["qemu", "qemu-kvm", f"qemu-system-{config.architecture.to_qemu()}"]
+ binaries = ["qemu", "qemu-kvm"] if config.architecture.is_native() else []
+ binaries += [f"qemu-system-{config.architecture.to_qemu()}"]
for binary in binaries:
if shutil.which(binary) is not None:
return binary
accel = "kvm"
if config.qemu_firmware == QemuFirmware.auto:
- firmware = QemuFirmware.linux if config.output_format == OutputFormat.cpio else QemuFirmware.uefi
+ if config.output_format == OutputFormat.cpio or config.architecture.to_efi() is None:
+ firmware = QemuFirmware.linux
+ else:
+ firmware = QemuFirmware.uefi
else:
firmware = config.qemu_firmware
"-mon", "console",
]
- for k, v in config.credentials.items():
- cmdline += ["-smbios", f"type=11,value=io.systemd.credential.binary:{k}={base64.b64encode(v.encode()).decode()}"]
- cmdline += ["-smbios", f"type=11,value=io.systemd.stub.kernel-cmdline-extra={' '.join(config.kernel_command_line_extra)}"]
+ if config.architecture.supports_smbios():
+ for k, v in config.credentials.items():
+ cmdline += ["-smbios", f"type=11,value=io.systemd.credential.binary:{k}={base64.b64encode(v.encode()).decode()}"]
+ cmdline += ["-smbios", f"type=11,value=io.systemd.stub.kernel-cmdline-extra={' '.join(config.kernel_command_line_extra)}"]
# QEMU has built-in logic to look for the BIOS firmware so we don't need to do anything special for that.
if firmware == QemuFirmware.uefi:
elif config.architecture == Architecture.arm64:
cmdline += ["-device", "tpm-tis-device,tpmdev=tpm0"]
- if use_vsock:
+ if use_vsock and config.architecture.supports_smbios():
addr, notifications = stack.enter_context(vsock_notify_handler())
cmdline += ["-smbios", f"type=11,value=io.systemd.credential:vmm.notify_socket={addr}"]