* [PATCH 1/4] efi: add efi_bootfs_populate API
2017-05-10 8:05 [PATCH 0/4] #10073: generic EFI for wic Ed Bartosh
@ 2017-05-10 8:05 ` Ed Bartosh
2017-05-10 8:05 ` [PATCH 2/4] timage_types_wic: add do_populate_bootfs task Ed Bartosh
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Ed Bartosh @ 2017-05-10 8:05 UTC (permalink / raw)
To: openembedded-core
Added API to populate ${WORKDIR}/bootfs directory with EFI
artifacts to both EFI provider classes(grub-efi and systemd-boot).
This API will be used to prepare artifacts for the wic image
build.
[YOCTO #10073]
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta/classes/grub-efi.bbclass | 6 ++++++
meta/classes/systemd-boot.bbclass | 6 ++++++
2 files changed, 12 insertions(+)
diff --git a/meta/classes/grub-efi.bbclass b/meta/classes/grub-efi.bbclass
index df7fe18..bacbeb4 100644
--- a/meta/classes/grub-efi.bbclass
+++ b/meta/classes/grub-efi.bbclass
@@ -71,6 +71,12 @@ efi_hddimg_populate() {
efi_populate $1
}
+efi_bootfs_populate() {
+ bootfs_dir="${WORKDIR}/bootfs"
+ efi_populate $bootfs_dir
+ cp --dereference ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} $bootfs_dir/vmlinuz
+}
+
python build_efi_cfg() {
import sys
diff --git a/meta/classes/systemd-boot.bbclass b/meta/classes/systemd-boot.bbclass
index 4e69a2c..7e842af 100644
--- a/meta/classes/systemd-boot.bbclass
+++ b/meta/classes/systemd-boot.bbclass
@@ -62,6 +62,12 @@ efi_hddimg_populate() {
efi_populate $1
}
+efi_bootfs_populate() {
+ bootfs_dir="${WORKDIR}/bootfs"
+ efi_populate $bootfs_dir
+ cp --dereference ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} $bootfs_dir/vmlinuz
+}
+
python build_efi_cfg() {
s = d.getVar("S")
labels = d.getVar('LABELS')
--
2.1.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/4] timage_types_wic: add do_populate_bootfs task
2017-05-10 8:05 [PATCH 0/4] #10073: generic EFI for wic Ed Bartosh
2017-05-10 8:05 ` [PATCH 1/4] efi: add efi_bootfs_populate API Ed Bartosh
@ 2017-05-10 8:05 ` Ed Bartosh
2017-05-10 8:05 ` [PATCH 3/4] image_types_wic: merged 2 tasks Ed Bartosh
2017-05-10 8:05 ` [PATCH 4/4] oe-selftest: add wic tests for generic EFI Ed Bartosh
3 siblings, 0 replies; 5+ messages in thread
From: Ed Bartosh @ 2017-05-10 8:05 UTC (permalink / raw)
To: openembedded-core
This task generates root partition UUID and calls efi_bootfs_populate
API of current EFI provider to populate bootfs directory with
EFI artifacts.
[YOCTO #10073]
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta/classes/image_types_wic.bbclass | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/meta/classes/image_types_wic.bbclass b/meta/classes/image_types_wic.bbclass
index 4711c24..0ef587b 100644
--- a/meta/classes/image_types_wic.bbclass
+++ b/meta/classes/image_types_wic.bbclass
@@ -115,3 +115,39 @@ python do_rootfs_wicenv () {
addtask do_rootfs_wicenv after do_image before do_image_wic
do_rootfs_wicenv[vardeps] += "${WICVARS}"
do_rootfs_wicenv[prefuncs] = 'set_image_size'
+
+# Set variables for efi_bootfs_populate
+GRUB_CFG ?= "${WORKDIR}/grub_wic.cfg"
+SYSTEMD_BOOT_CFG ?= "${WORKDIR}/loader_wic.conf"
+GRUB_GFXSERIAL ?= "1"
+LABELS_WIC ?= "boot install"
+LABELS ?= "${LABELS_WIC}"
+
+EFI_PROVIDER ?= "grub-efi"
+EFI_CLASS = "${@bb.utils.contains("MACHINE_FEATURES", "efi", "${EFI_PROVIDER}", "", d)}"
+inherit ${EFI_CLASS}
+
+python do_populate_bootfs() {
+ def populate_bootfs(partuuid):
+ # remove bootfs dir as it may have files from previous build
+ bootfs = os.path.join(d.getVar("WORKDIR"), 'bootfs')
+ if os.path.exists(bootfs):
+ import shutil
+ shutil.rmtree(bootfs)
+
+ d.setVar("APPEND", "root=PARTUUID=%s" % partuuid)
+ bb.build.exec_func('build_efi_cfg', d)
+
+ bb.build.exec_func('efi_bootfs_populate', d)
+
+ if d.getVar('USING_WIC'):
+ # Generate parition UUID
+ from uuid import uuid4
+ partuuid = str(uuid4())
+ d.setVar("ROOTFS_PARTUUID", partuuid)
+
+ if d.getVar("EFI_CLASS"):
+ populate_bootfs(partuuid)
+}
+
+addtask do_populate_bootfs after do_image before do_image_wic
--
2.1.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 3/4] image_types_wic: merged 2 tasks
2017-05-10 8:05 [PATCH 0/4] #10073: generic EFI for wic Ed Bartosh
2017-05-10 8:05 ` [PATCH 1/4] efi: add efi_bootfs_populate API Ed Bartosh
2017-05-10 8:05 ` [PATCH 2/4] timage_types_wic: add do_populate_bootfs task Ed Bartosh
@ 2017-05-10 8:05 ` Ed Bartosh
2017-05-10 8:05 ` [PATCH 4/4] oe-selftest: add wic tests for generic EFI Ed Bartosh
3 siblings, 0 replies; 5+ messages in thread
From: Ed Bartosh @ 2017-05-10 8:05 UTC (permalink / raw)
To: openembedded-core
Merged do_write_wks_template and do_populate_bootfs into
new task do_prepare_wic_build to be able to write the same
partition UUID into bootloader configuration files and
kickstart file.
[YOCTO #10073]
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta/classes/image_types_wic.bbclass | 51 +++++++++++++++++++-----------------
1 file changed, 27 insertions(+), 24 deletions(-)
diff --git a/meta/classes/image_types_wic.bbclass b/meta/classes/image_types_wic.bbclass
index 0ef587b..f37865f 100644
--- a/meta/classes/image_types_wic.bbclass
+++ b/meta/classes/image_types_wic.bbclass
@@ -43,27 +43,6 @@ do_image_wic[depends] += "wic-tools:do_populate_sysroot"
WKS_FILE_DEPENDS ??= ''
DEPENDS += "${@ '${WKS_FILE_DEPENDS}' if d.getVar('USING_WIC') else '' }"
-python do_write_wks_template () {
- """Write out expanded template contents to WKS_FULL_PATH."""
- import re
-
- template_body = d.getVar('_WKS_TEMPLATE')
-
- # Remove any remnant variable references left behind by the expansion
- # due to undefined variables
- expand_var_regexp = re.compile(r"\${[^{}@\n\t :]+}")
- while True:
- new_body = re.sub(expand_var_regexp, '', template_body)
- if new_body == template_body:
- break
- else:
- template_body = new_body
-
- wks_file = d.getVar('WKS_FULL_PATH')
- with open(wks_file, 'w') as f:
- f.write(template_body)
-}
-
python () {
if d.getVar('USING_WIC'):
wks_file_u = d.getVar('WKS_FULL_PATH', False)
@@ -90,7 +69,6 @@ python () {
# file in process_wks_template as well, so just put it in
# a variable and let the metadata deal with the deps.
d.setVar('_WKS_TEMPLATE', body)
- bb.build.addtask('do_write_wks_template', 'do_image_wic', None, d)
}
#
@@ -127,7 +105,11 @@ EFI_PROVIDER ?= "grub-efi"
EFI_CLASS = "${@bb.utils.contains("MACHINE_FEATURES", "efi", "${EFI_PROVIDER}", "", d)}"
inherit ${EFI_CLASS}
-python do_populate_bootfs() {
+python do_prepare_wic_build() {
+ # Prepare required artifacts for the wic image build:
+ # - Populate {WORKDIR}/bootfs directory with EFI content
+ # - Write wks.in template into the .wks file
+
def populate_bootfs(partuuid):
# remove bootfs dir as it may have files from previous build
bootfs = os.path.join(d.getVar("WORKDIR"), 'bootfs')
@@ -140,6 +122,23 @@ python do_populate_bootfs() {
bb.build.exec_func('efi_bootfs_populate', d)
+ def write_wks_template(template_body, wks_file):
+ """Write out expanded template contents to WKS_FULL_PATH."""
+ import re
+
+ # Remove any remnant variable references left behind by the expansion
+ # due to undefined variables
+ expand_var_regexp = re.compile(r"\${[^{}@\n\t :]+}")
+ while True:
+ new_body = re.sub(expand_var_regexp, '', template_body)
+ if new_body == template_body:
+ break
+ else:
+ template_body = new_body
+
+ with open(wks_file, 'w') as f:
+ f.write(template_body)
+
if d.getVar('USING_WIC'):
# Generate parition UUID
from uuid import uuid4
@@ -148,6 +147,10 @@ python do_populate_bootfs() {
if d.getVar("EFI_CLASS"):
populate_bootfs(partuuid)
+
+ template = d.getVar("_WKS_TEMPLATE")
+ if template:
+ write_wks_template(template, d.getVar('WKS_FULL_PATH'))
}
-addtask do_populate_bootfs after do_image before do_image_wic
+addtask do_prepare_wic_build after do_image before do_image_wic
--
2.1.4
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 4/4] oe-selftest: add wic tests for generic EFI
2017-05-10 8:05 [PATCH 0/4] #10073: generic EFI for wic Ed Bartosh
` (2 preceding siblings ...)
2017-05-10 8:05 ` [PATCH 3/4] image_types_wic: merged 2 tasks Ed Bartosh
@ 2017-05-10 8:05 ` Ed Bartosh
3 siblings, 0 replies; 5+ messages in thread
From: Ed Bartosh @ 2017-05-10 8:05 UTC (permalink / raw)
To: openembedded-core
Added test_generic_efi_grub_qemu and test_generic_efi_systemd_qemu
test cases and wks template to build and boot generic EFI images in qemu.
[YOCTO #10073]
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta-selftest/wic/test_generic_efi.wks.in | 9 ++++++++
meta/lib/oeqa/selftest/wic.py | 36 +++++++++++++++++++++++++++++++
2 files changed, 45 insertions(+)
create mode 100644 meta-selftest/wic/test_generic_efi.wks.in
diff --git a/meta-selftest/wic/test_generic_efi.wks.in b/meta-selftest/wic/test_generic_efi.wks.in
new file mode 100644
index 0000000..fecf3fd
--- /dev/null
+++ b/meta-selftest/wic/test_generic_efi.wks.in
@@ -0,0 +1,9 @@
+# short-description: Create an EFI disk image
+# long-description: Creates a partitioned EFI disk image that the user
+# can directly dd to boot media.
+
+part /boot --source rootfs --rootfs-dir=${WORKDIR}/bootfs --fstype=vfat --label boot --active --align 1024
+
+part / --source rootfs --fstype=ext4 --label root --align 1024 --uuid ${ROOTFS_PARTUUID}
+
+bootloader --ptable gpt
diff --git a/meta/lib/oeqa/selftest/wic.py b/meta/lib/oeqa/selftest/wic.py
index cdec80c..9cb9507 100644
--- a/meta/lib/oeqa/selftest/wic.py
+++ b/meta/lib/oeqa/selftest/wic.py
@@ -789,3 +789,39 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
# 8 blocks is 4K (physical sector size)
self.assertEqual(dest_stat.st_blocks, 8)
os.unlink(dest)
+
+ @only_for_arch(['i586', 'i686', 'x86_64'])
+ def test_generic_efi_grub_qemu(self):
+ """Test generic efi (grub-efi) image in qemu"""
+ config = 'IMAGE_FSTYPES = "wic"\nMACHINE_FEATURES_append = " efi"\n'\
+ 'EFI_PROVIDER = "grub-efi"\n'\
+ 'WKS_FILE = "test_generic_efi.wks.in"\n'
+
+ self.append_config(config)
+ self.assertEqual(0, bitbake('core-image-minimal ovmf').status)
+ self.remove_config(config)
+
+ with runqemu('core-image-minimal', ssh=False,
+ runqemuparams='ovmf', image_fstype='wic') as qemu:
+ cmd = "grep sda. /proc/partitions |wc -l"
+ status, output = qemu.run_serial(cmd)
+ self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
+ self.assertEqual(output, '2')
+
+ @only_for_arch(['i586', 'i686', 'x86_64'])
+ def test_generic_efi_systemd_qemu(self):
+ """Test generic efi (systemd-boot) image in qemu"""
+ config = 'IMAGE_FSTYPES = "wic"\nMACHINE_FEATURES_append = " efi"\n'\
+ 'EFI_PROVIDER = "systemd-boot"\n'\
+ 'WKS_FILE = "test_generic_efi.wks.in"\n'
+
+ self.append_config(config)
+ self.assertEqual(0, bitbake('core-image-minimal ovmf').status)
+ self.remove_config(config)
+
+ with runqemu('core-image-minimal', ssh=False,
+ runqemuparams='ovmf', image_fstype='wic') as qemu:
+ cmd = "grep sda. /proc/partitions |wc -l"
+ status, output = qemu.run_serial(cmd)
+ self.assertEqual(1, status, 'Failed to run command "%s": %s' % (cmd, output))
+ self.assertEqual(output, '2')
--
2.1.4
^ permalink raw reply related [flat|nested] 5+ messages in thread