* [PATCH v5 1/6] efi: add efi_bootfs_populate API
2017-06-15 9:43 [PATCH v5 0/6] #10073: generic EFI for wic Ed Bartosh
@ 2017-06-15 9:44 ` Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 2/6] image_types_wic: add do_populate_bootfs task Ed Bartosh
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-06-15 9:44 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 9f8f75e..d98d213 100644
--- a/meta/classes/systemd-boot.bbclass
+++ b/meta/classes/systemd-boot.bbclass
@@ -63,6 +63,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] 7+ messages in thread* [PATCH v5 2/6] image_types_wic: add do_populate_bootfs task
2017-06-15 9:43 [PATCH v5 0/6] #10073: generic EFI for wic Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 1/6] efi: add efi_bootfs_populate API Ed Bartosh
@ 2017-06-15 9:44 ` Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 3/6] image_types_wic: merged 2 tasks Ed Bartosh
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-06-15 9:44 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 | 37 ++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/meta/classes/image_types_wic.bbclass b/meta/classes/image_types_wic.bbclass
index 5cd1c08..275f1d7 100644
--- a/meta/classes/image_types_wic.bbclass
+++ b/meta/classes/image_types_wic.bbclass
@@ -115,3 +115,40 @@ 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 ?= "systemd-boot"
+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 before do_image_wic
+do_populate_bootfs[depends] = "${MLPREFIX}${EFI_PROVIDER}:do_deploy virtual/kernel:do_deploy"
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 3/6] image_types_wic: merged 2 tasks
2017-06-15 9:43 [PATCH v5 0/6] #10073: generic EFI for wic Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 1/6] efi: add efi_bootfs_populate API Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 2/6] image_types_wic: add do_populate_bootfs task Ed Bartosh
@ 2017-06-15 9:44 ` Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 4/6] grub-efi: fixed default value of GRUB_ROOT Ed Bartosh
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-06-15 9:44 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 | 53 +++++++++++++++++++-----------------
1 file changed, 28 insertions(+), 25 deletions(-)
diff --git a/meta/classes/image_types_wic.bbclass b/meta/classes/image_types_wic.bbclass
index 275f1d7..825a67d 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 ?= "systemd-boot"
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,7 +147,11 @@ 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 before do_image_wic
-do_populate_bootfs[depends] = "${MLPREFIX}${EFI_PROVIDER}:do_deploy virtual/kernel:do_deploy"
+addtask do_prepare_wic_build before do_image_wic
+do_prepare_wic_build[depends] = "${MLPREFIX}${EFI_PROVIDER}:do_deploy virtual/kernel:do_deploy"
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 4/6] grub-efi: fixed default value of GRUB_ROOT
2017-06-15 9:43 [PATCH v5 0/6] #10073: generic EFI for wic Ed Bartosh
` (2 preceding siblings ...)
2017-06-15 9:44 ` [PATCH v5 3/6] image_types_wic: merged 2 tasks Ed Bartosh
@ 2017-06-15 9:44 ` Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 5/6] image_types_wic: schedule prepare_wic_build correctly Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 6/6] oe-selftest: add wic tests for generic EFI Ed Bartosh
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-06-15 9:44 UTC (permalink / raw)
To: openembedded-core
Currently GRUB_ROOT assigned a value of literal "${ROOT}" by default
if ROOT variable is not set. This causes kernel commandline to
look like this: "linux /vmlinuz LABEL=boot {ROOT}"
Used weak assignments of ROOT and GRUB_ROOT variables to make
sure GRUB_ROOT is "" by default.
Allowed empty GRUB_ROOT to be able to use only APPEND variable
for both EFI bootloaders (systemd-boot and grub-efi).
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta/classes/grub-efi.bbclass | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/meta/classes/grub-efi.bbclass b/meta/classes/grub-efi.bbclass
index bacbeb4..b55ac96 100644
--- a/meta/classes/grub-efi.bbclass
+++ b/meta/classes/grub-efi.bbclass
@@ -27,7 +27,8 @@ GRUB_TIMEOUT ?= "10"
GRUB_OPTS ?= "serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1"
EFIDIR = "/EFI/BOOT"
-GRUB_ROOT ?= "${ROOT}"
+ROOT ??= ""
+GRUB_ROOT ??= "${ROOT}"
APPEND ?= ""
# Need UUID utility code.
@@ -121,8 +122,6 @@ python build_efi_cfg() {
cfgfile.write('timeout=50\n')
root = d.getVar('GRUB_ROOT')
- if not root:
- bb.fatal('GRUB_ROOT not defined')
if gfxserial == "1":
btypes = [ [ " graphics console", "" ],
@@ -146,7 +145,8 @@ python build_efi_cfg() {
lb = "install-efi"
cfgfile.write('linux /vmlinuz LABEL=%s' % (lb))
- cfgfile.write(' %s' % replace_rootfs_uuid(d, root))
+ if root:
+ cfgfile.write(' %s' % replace_rootfs_uuid(d, root))
append = localdata.getVar('APPEND')
initrd = localdata.getVar('INITRD')
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 5/6] image_types_wic: schedule prepare_wic_build correctly
2017-06-15 9:43 [PATCH v5 0/6] #10073: generic EFI for wic Ed Bartosh
` (3 preceding siblings ...)
2017-06-15 9:44 ` [PATCH v5 4/6] grub-efi: fixed default value of GRUB_ROOT Ed Bartosh
@ 2017-06-15 9:44 ` Ed Bartosh
2017-06-15 9:44 ` [PATCH v5 6/6] oe-selftest: add wic tests for generic EFI Ed Bartosh
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-06-15 9:44 UTC (permalink / raw)
To: openembedded-core
When EFI is enabled we need to ensure that kernel and bootloader
artifacts are fully deployed before running prepare_wic_build.
This is done by scheduling this task after do_deploy task of
EFI_PROVIDER class and by adding dependencty to virtual/kernel:do_deploy.
Scheduled prepare_wic_build only if wic build is enabled to
avoid running it when it's not needed.
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
---
meta/classes/grub-efi.bbclass | 1 +
meta/classes/image_types_wic.bbclass | 26 +++++++++++++-------------
meta/classes/systemd-boot.bbclass | 1 +
3 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/meta/classes/grub-efi.bbclass b/meta/classes/grub-efi.bbclass
index b55ac96..1fa648d 100644
--- a/meta/classes/grub-efi.bbclass
+++ b/meta/classes/grub-efi.bbclass
@@ -18,6 +18,7 @@
do_bootimg[depends] += "${MLPREFIX}grub-efi:do_deploy"
do_bootdirectdisk[depends] += "${MLPREFIX}grub-efi:do_deploy"
+do_prepare_wic_build[depends] += "${MLPREFIX}grub-efi:do_deploy"
GRUB_SERIAL ?= "console=ttyS0,115200"
GRUB_CFG_VM = "${S}/grub_vm.cfg"
diff --git a/meta/classes/image_types_wic.bbclass b/meta/classes/image_types_wic.bbclass
index 825a67d..cf88853 100644
--- a/meta/classes/image_types_wic.bbclass
+++ b/meta/classes/image_types_wic.bbclass
@@ -69,6 +69,10 @@ 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_prepare_wic_build', 'do_image_wic', None, d)
+ if d.getVar('EFI_CLASS'):
+ d.appendVarFlag('do_prepare_wic_build', 'depends', ' virtual/kernel:do_deploy')
}
#
@@ -139,19 +143,15 @@ python do_prepare_wic_build() {
with open(wks_file, 'w') as f:
f.write(template_body)
- if d.getVar('USING_WIC'):
- # Generate parition UUID
- from uuid import uuid4
- partuuid = str(uuid4())
- d.setVar("ROOTFS_PARTUUID", partuuid)
+ # Generate parition UUID
+ from uuid import uuid4
+ partuuid = str(uuid4())
+ d.setVar("ROOTFS_PARTUUID", partuuid)
- if d.getVar("EFI_CLASS"):
- populate_bootfs(partuuid)
+ if d.getVar("EFI_CLASS"):
+ populate_bootfs(partuuid)
- template = d.getVar("_WKS_TEMPLATE")
- if template:
- write_wks_template(template, d.getVar('WKS_FULL_PATH'))
+ template = d.getVar("_WKS_TEMPLATE")
+ if template:
+ write_wks_template(template, d.getVar('WKS_FULL_PATH'))
}
-
-addtask do_prepare_wic_build before do_image_wic
-do_prepare_wic_build[depends] = "${MLPREFIX}${EFI_PROVIDER}:do_deploy virtual/kernel:do_deploy"
diff --git a/meta/classes/systemd-boot.bbclass b/meta/classes/systemd-boot.bbclass
index d98d213..f03fb88 100644
--- a/meta/classes/systemd-boot.bbclass
+++ b/meta/classes/systemd-boot.bbclass
@@ -11,6 +11,7 @@
do_bootimg[depends] += "${MLPREFIX}systemd-boot:do_deploy"
do_bootdirectdisk[depends] += "${MLPREFIX}systemd-boot:do_deploy"
+do_prepare_wic_build[depends] += "${MLPREFIX}grub-efi:do_deploy"
EFIDIR = "/EFI/BOOT"
--
2.1.4
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH v5 6/6] oe-selftest: add wic tests for generic EFI
2017-06-15 9:43 [PATCH v5 0/6] #10073: generic EFI for wic Ed Bartosh
` (4 preceding siblings ...)
2017-06-15 9:44 ` [PATCH v5 5/6] image_types_wic: schedule prepare_wic_build correctly Ed Bartosh
@ 2017-06-15 9:44 ` Ed Bartosh
5 siblings, 0 replies; 7+ messages in thread
From: Ed Bartosh @ 2017-06-15 9:44 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/cases/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/cases/wic.py b/meta/lib/oeqa/selftest/cases/wic.py
index ee9ff0f..7ebb950 100644
--- a/meta/lib/oeqa/selftest/cases/wic.py
+++ b/meta/lib/oeqa/selftest/cases/wic.py
@@ -885,3 +885,39 @@ part /etc --source rootfs --ondisk mmcblk0 --fstype=ext4 --exclude-path bin/ --r
self.assertEqual(0, result.status)
self.assertNotIn('\nBZIMAGE ', result.output)
self.assertNotIn('\nEFI <DIR> ', result.output)
+
+ @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] 7+ messages in thread