mirror of
git://git.yoctoproject.org/poky.git
synced 2025-07-19 21:09:03 +02:00
oeqa selftest uki.py: add tests for uki.bbclass
Tests builds and boots qemu into uki binary with systemd and sysvinit. Due to depedency to x86 specific ovmf UEFI firmware, tests are specific to x86 curently. UEFI firmware for ARM can be generated via qemuarm64-secureboot machine in meta-arm and similar tests on qemu will pass. (From OE-Core rev: 8a3cb17876dbcaf07696a4bcd454e2f9a444fb1b) Signed-off-by: Mikko Rapeli <mikko.rapeli@linaro.org> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
2f0ef8cd0e
commit
5fe59b3144
142
meta/lib/oeqa/selftest/cases/uki.py
Normal file
142
meta/lib/oeqa/selftest/cases/uki.py
Normal file
|
@ -0,0 +1,142 @@
|
|||
# Based on runqemu.py test file
|
||||
#
|
||||
# Copyright (c) 2017 Wind River Systems, Inc.
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
|
||||
from oeqa.selftest.case import OESelftestTestCase
|
||||
from oeqa.utils.commands import bitbake, runqemu, get_bb_var
|
||||
from oeqa.core.decorator.data import skipIfNotArch
|
||||
from oeqa.core.decorator import OETestTag
|
||||
import oe.types
|
||||
|
||||
class UkiTest(OESelftestTestCase):
|
||||
"""Boot Unified Kernel Image (UKI) generated with uki.bbclass on UEFI firmware (omvf/edk2)"""
|
||||
|
||||
@skipIfNotArch(['i586', 'i686', 'x86_64'])
|
||||
@OETestTag("runqemu")
|
||||
def test_uki_boot_systemd(self):
|
||||
"""Build and boot into UEFI firmware (omvf/edk2), systemd-boot, initrd without systemd, rootfs with systemd"""
|
||||
image = "core-image-minimal"
|
||||
runqemu_params = get_bb_var('TEST_RUNQEMUPARAMS', image) or ""
|
||||
cmd = "runqemu %s nographic serial wic ovmf" % (runqemu_params)
|
||||
if oe.types.qemu_use_kvm(self.td.get('QEMU_USE_KVM', 0), self.td["TARGET_ARCH"]):
|
||||
cmd += " kvm"
|
||||
|
||||
self.write_config("""
|
||||
# efi firmware must load systemd-boot, not grub
|
||||
EFI_PROVIDER = "systemd-boot"
|
||||
|
||||
# image format must be wic, needs esp partition for firmware etc
|
||||
IMAGE_FSTYPES:pn-%s:append = " wic"
|
||||
WKS_FILE = "efi-uki-bootdisk.wks.in"
|
||||
|
||||
# efi, uki and systemd features must be enabled
|
||||
INIT_MANAGER = "systemd"
|
||||
MACHINE_FEATURES:append = " efi"
|
||||
IMAGE_CLASSES:append:pn-core-image-minimal = " uki"
|
||||
|
||||
# uki embeds also an initrd
|
||||
INITRAMFS_IMAGE = "core-image-minimal-initramfs"
|
||||
|
||||
# runqemu must not load kernel separately, it's in the uki
|
||||
QB_KERNEL_ROOT = ""
|
||||
QB_DEFAULT_KERNEL = "none"
|
||||
|
||||
# boot command line provided via uki, not via bootloader
|
||||
UKI_CMDLINE = "rootwait root=LABEL=root console=${KERNEL_CONSOLE}"
|
||||
|
||||
# disable kvm, breaks boot
|
||||
QEMU_USE_KVM = ""
|
||||
|
||||
IMAGE_CLASSES:remove = 'testimage'
|
||||
""" % (image))
|
||||
|
||||
uki_filename = get_bb_var('UKI_FILENAME', image)
|
||||
|
||||
bitbake(image + " ovmf")
|
||||
with runqemu(image, ssh=False, launch_cmd=cmd) as qemu:
|
||||
self.assertTrue(qemu.runner.logged, "Failed: %s" % cmd)
|
||||
|
||||
# Verify from efivars that firmware was:
|
||||
# x86_64, qemux86_64, ovmf = edk2
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderFirmwareInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep 'EDK II'"
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
# Check that systemd-boot was the loader
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-boot"
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
# Check that systemd-stub was used
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/StubInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-stub"
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
# Check that the compiled uki file was booted into
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep '%s'" % (uki_filename)
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
@skipIfNotArch(['i586', 'i686', 'x86_64'])
|
||||
@OETestTag("runqemu")
|
||||
def test_uki_sysvinit(self):
|
||||
"""Build and boot into UEFI firmware (omvf/edk2), systemd-boot, initrd with sysvinit, rootfs with sysvinit"""
|
||||
config = """
|
||||
# efi firmware must load systemd-boot, not grub
|
||||
EFI_PROVIDER = "systemd-boot"
|
||||
|
||||
# image format must be wic, needs esp partition for firmware etc
|
||||
IMAGE_FSTYPES:pn-core-image-base:append = " wic"
|
||||
WKS_FILE = "efi-uki-bootdisk.wks.in"
|
||||
|
||||
# efi, uki and systemd features must be enabled
|
||||
MACHINE_FEATURES:append = " efi"
|
||||
DISTRO_FEATURES_NATIVE:append = " systemd"
|
||||
IMAGE_CLASSES:append:pn-core-image-base = " uki"
|
||||
|
||||
# uki embeds also an initrd, no systemd or udev
|
||||
INITRAMFS_IMAGE = "core-image-initramfs-boot"
|
||||
|
||||
# runqemu must not load kernel separately, it's in the uki
|
||||
QB_KERNEL_ROOT = ""
|
||||
QB_DEFAULT_KERNEL = "none"
|
||||
|
||||
# boot command line provided via uki, not via bootloader
|
||||
UKI_CMDLINE = "rootwait root=LABEL=root console=${KERNEL_CONSOLE}"
|
||||
|
||||
# disable kvm, breaks boot
|
||||
QEMU_USE_KVM = ""
|
||||
|
||||
IMAGE_CLASSES:remove = 'testimage'
|
||||
"""
|
||||
self.append_config(config)
|
||||
bitbake('core-image-base ovmf')
|
||||
runqemu_params = get_bb_var('TEST_RUNQEMUPARAMS', 'core-image-base') or ""
|
||||
uki_filename = get_bb_var('UKI_FILENAME', 'core-image-base')
|
||||
self.remove_config(config)
|
||||
|
||||
with runqemu('core-image-base', ssh=False,
|
||||
runqemuparams='%s slirp nographic ovmf' % (runqemu_params), image_fstype='wic') as qemu:
|
||||
# Verify from efivars that firmware was:
|
||||
# x86_64, qemux86_64, ovmf = edk2
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderFirmwareInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep 'EDK II'"
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
# Check that systemd-boot was the loader
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-boot"
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
# Check that systemd-stub was used
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/StubInfo-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep systemd-stub"
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
||||
|
||||
# Check that the compiled uki file was booted into
|
||||
cmd = "echo $( cat /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep '%s'" % (uki_filename)
|
||||
status, output = qemu.run_serial(cmd)
|
||||
self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
|
3
scripts/lib/wic/canned-wks/efi-uki-bootdisk.wks.in
Normal file
3
scripts/lib/wic/canned-wks/efi-uki-bootdisk.wks.in
Normal file
|
@ -0,0 +1,3 @@
|
|||
bootloader --ptable gpt --timeout=5
|
||||
part /boot --source bootimg-efi --sourceparams="loader=${EFI_PROVIDER}" --label boot --active --align 1024 --use-uuid --part-name="ESP" --part-type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B --fixed-size 512M
|
||||
part / --source rootfs --fstype=ext4 --label root --align 1024 --exclude-path boot/
|
Loading…
Reference in New Issue
Block a user