wic: Add gummiboot support
cover wic: Add gummiboot support
This add gummiboot support to wic. It also adds a new --sourceparams variable to the partition command, allowing plugins to be parameterized. The BootImgEFIPlugin makes use of it to support multiple loaders.
The following changes since commit 0f24d9c569db733b4f63803ee4a9c12ec1789791:
SIGGEN_EXCLUDERECIPES_ABISAFE: add initscripts (2014-08-11 17:44:12 +0100)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib.git tzanussi/wic-gummiboot-v1
http://git.yoctoproject.org/cgit/cgit.cgi/poky-contrib/log/?h=tzanussi/wic-gummiboot-v1
Tom Zanussi (7):
wic: Add '--sourceparams' partition option
wic: Add utility function for parsing sourceparams
wic: Add sourceparam param to partition plugin methods
wic: Parse and pass sourceparams to partition plugin methods
wic: Add gummiboot support to bootimg-efi
wic: Add sourceparams to mkefidisk.wks
wic: Add mkgummidisk kickstart file
scripts/lib/image/canned-wks/mkefidisk.wks | 2 +- scripts/lib/image/canned-wks/mkgummidisk.wks | 11 ++ .../lib/wic/kickstart/custom_commands/partition.py | 20 +++- scripts/lib/wic/pluginbase.py | 15 +-- scripts/lib/wic/plugins/source/bootimg-efi.py | 117 +++++++++++++++++---- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 10 +- scripts/lib/wic/plugins/source/rootfs.py | 5 +- scripts/lib/wic/utils/oe/misc.py | 23 ++++ 8 files changed, 164 insertions(+), 39 deletions(-) create mode 100644 scripts/lib/image/canned-wks/mkgummidisk.wks
Signature · 1 line
1.8.3.1
PATCH 1/7 wic: Add '--sourceparams' partition option
To go along with '--source' as a way to parameterize source plugins.
--- scripts/lib/wic/kickstart/custom_commands/partition.py | 6 ++++++ 1 file changed, 6 insertions(+)
scripts/lib/wic/kickstart/custom_commands/partition.py +6 -0
@@ -47,6 +47,7 @@ class Wic_PartData(Mic_PartData): Mic_PartData.__init__(self, *args, **kwargs) self.deleteRemovedAttrs() self.source = kwargs.get("source", None) + self.sourceparams = kwargs.get("sourceparams", None) self.rootfs = kwargs.get("rootfs-dir", None) self.source_file = "" self.size = 0
@@ -56,6 +57,8 @@ class Wic_PartData(Mic_PartData): if self.source: retval += " --source=%s" % self.source + if self.sourceparams: + retval += " --sourceparams=%s" % self.sourceparams if self.rootfs: retval += " --rootfs-dir=%s" % self.rootfs
@@ -490,6 +493,9 @@ class Wic_Partition(Mic_Partition): # and calculate partition size op.add_option("--source", type="string", action="store", dest="source", default=None) + # comma-separated list of param=value pairs + op.add_option("--sourceparams", type="string", action="store", + dest="sourceparams", default=None) # use specified rootfs path to fill the partition op.add_option("--rootfs-dir", type="string", action="store", dest="rootfs", default=None)
Signature · 1 line
1.8.3.1
PATCH 2/7 wic: Add utility function for parsing sourceparams
Parses strings of the form key1=val1[,key2=val2,...] and returns a dict. Also accepts valueless keys i.e. without =.
--- scripts/lib/wic/utils/oe/misc.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
scripts/lib/wic/utils/oe/misc.py +23 -0
@@ -179,3 +179,26 @@ def get_bitbake_var(key): val = get_line_val(line, key) return val return None + +def parse_sourceparams(sourceparams): + """ + Split sourceparams string of the form key1=val1[,key2=val2,...] + into a dict. Also accepts valueless keys i.e. without =. + + Returns dict of param key/val pairs (note that val may be None). + """ + params_dict = {} + + params = sourceparams.split(',') + if params: + for p in params: + if not p: + continue + if not '=' in p: + key = p + val = None + else: + key, val = p.split('=') + params_dict[key] = val + + return params_dict
Signature · 1 line
1.8.3.1
PATCH 3/7 wic: Add sourceparam param to partition plugin methods
In reply to Tom ZanussiThe sourceparam param allows source plugins to be parameterized generically (via --sourceparams="key=val[,key=val], implemented previously).
--- scripts/lib/wic/kickstart/custom_commands/partition.py | 6 +++--- scripts/lib/wic/pluginbase.py | 15 +++++++++------ scripts/lib/wic/plugins/source/bootimg-efi.py | 10 ++++++---- scripts/lib/wic/plugins/source/bootimg-pcbios.py | 10 ++++++---- scripts/lib/wic/plugins/source/rootfs.py | 5 +++-- 5 files changed, 27 insertions(+), 19 deletions(-)
scripts/lib/wic/kickstart/custom_commands/partition.py +3 -3
@@ -143,16 +143,16 @@ class Wic_PartData(Mic_PartData): msger.error("The '%s' --source specified for %s doesn't exist.\n\tSee 'wic list source-plugins' for a list of available --sources.\n\tSee 'wic help source-plugins' for details on adding a new source plugin." % (self.source, self.mountpoint)) self._source_methods = pluginmgr.get_source_plugin_methods(self.source, partition_methods) - self._source_methods["do_configure_partition"](self, cr, cr_workdir, + self._source_methods["do_configure_partition"](self, None, cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, native_sysroot) - self._source_methods["do_stage_partition"](self, cr, cr_workdir, + self._source_methods["do_stage_partition"](self, None, cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, native_sysroot) - self._source_methods["do_prepare_partition"](self, cr, cr_workdir, + self._source_methods["do_prepare_partition"](self, None, cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, rootfs_dir, native_sysroot)
scripts/lib/wic/pluginbase.py +9 -6
@@ -64,8 +64,9 @@ class SourcePlugin(_Plugin): msger.debug("SourcePlugin: do_install_disk: disk: %s" % disk_name) @classmethod - def do_stage_partition(self, part, cr, workdir, oe_builddir, bootimg_dir, - kernel_dir, native_sysroot): + def do_stage_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + native_sysroot): """ Special content staging hook called before do_prepare_partition(), normally empty.
@@ -80,8 +81,9 @@ class SourcePlugin(_Plugin): msger.debug("SourcePlugin: do_stage_partition: part: %s" % part) @classmethod - def do_configure_partition(self, part, cr, cr_workdir, oe_builddir, - bootimg_dir, kernel_dir, native_sysroot): + def do_configure_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + native_sysroot): """ Called before do_prepare_partition(), typically used to create custom configuration files for a partition, for example
@@ -90,8 +92,9 @@ class SourcePlugin(_Plugin): msger.debug("SourcePlugin: do_configure_partition: part: %s" % part) @classmethod - def do_prepare_partition(self, part, cr, cr_workdir, oe_builddir, bootimg_dir, - kernel_dir, rootfs_dir, native_sysroot): + def do_prepare_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, rootfs_dir, + native_sysroot): """ Called to do the actual content population for a partition i.e. it 'prepares' the partition to be incorporated into the image.
scripts/lib/wic/plugins/source/bootimg-efi.py +6 -4
@@ -42,8 +42,9 @@ class BootimgEFIPlugin(SourcePlugin): name = 'bootimg-efi' @classmethod - def do_configure_partition(self, part, cr, cr_workdir, oe_builddir, - bootimg_dir, kernel_dir, native_sysroot): + def do_configure_partition(self, source_params, part, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + native_sysroot): """ Called before do_prepare_partition(), creates grubefi config """
@@ -92,8 +93,9 @@ class BootimgEFIPlugin(SourcePlugin): cfg.close() @classmethod - def do_prepare_partition(self, part, cr, cr_workdir, oe_builddir, bootimg_dir, - kernel_dir, rootfs_dir, native_sysroot): + def do_prepare_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + rootfs_dir, native_sysroot): """ Called to do the actual content population for a partition i.e. it 'prepares' the partition to be incorporated into the image.
scripts/lib/wic/plugins/source/bootimg-pcbios.py +6 -4
@@ -65,8 +65,9 @@ class BootimgPcbiosPlugin(SourcePlugin): raise ImageError("Unable to set MBR to %s" % full_path) @classmethod - def do_configure_partition(self, part, cr, cr_workdir, oe_builddir, - bootimg_dir, kernel_dir, native_sysroot): + def do_configure_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + native_sysroot): """ Called before do_prepare_partition(), creates syslinux config """
@@ -118,8 +119,9 @@ class BootimgPcbiosPlugin(SourcePlugin): cfg.close() @classmethod - def do_prepare_partition(self, part, cr, cr_workdir, oe_builddir, bootimg_dir, - kernel_dir, rootfs_dir, native_sysroot): + def do_prepare_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + rootfs_dir, native_sysroot): """ Called to do the actual content population for a partition i.e. it 'prepares' the partition to be incorporated into the image.
scripts/lib/wic/plugins/source/rootfs.py +3 -2
@@ -62,8 +62,9 @@ class RootfsPlugin(SourcePlugin): return image_rootfs_dir @classmethod - def do_prepare_partition(self, part, cr, cr_workdir, oe_builddir, bootimg_dir, - kernel_dir, krootfs_dir, native_sysroot): + def do_prepare_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + krootfs_dir, native_sysroot): """ Called to do the actual content population for a partition i.e. it 'prepares' the partition to be incorporated into the image.
Signature · 1 line
1.8.3.1
PATCH 4/7 wic: Parse and pass sourceparams to partition plugin methods
In reply to Tom ZanussiAdd code to parse the sourceparams and pass them to the partition plugin methods.
--- scripts/lib/wic/kickstart/custom_commands/partition.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
scripts/lib/wic/kickstart/custom_commands/partition.py +11 -3
@@ -126,6 +126,11 @@ class Wic_PartData(Mic_PartData): Prepare content for individual partitions, depending on partition command parameters. """ + self.sourceparams_dict = {} + + if self.sourceparams: + self.sourceparams_dict = parse_sourceparams(self.sourceparams) + if not self.source: if not self.size: msger.error("The %s partition has a size of zero. Please specify a non-zero --size for that partition." % self.mountpoint)
@@ -143,16 +148,19 @@ class Wic_PartData(Mic_PartData): msger.error("The '%s' --source specified for %s doesn't exist.\n\tSee 'wic list source-plugins' for a list of available --sources.\n\tSee 'wic help source-plugins' for details on adding a new source plugin." % (self.source, self.mountpoint)) self._source_methods = pluginmgr.get_source_plugin_methods(self.source, partition_methods) - self._source_methods["do_configure_partition"](self, None, cr, cr_workdir, + self._source_methods["do_configure_partition"](self, self.sourceparams_dict, + cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, native_sysroot) - self._source_methods["do_stage_partition"](self, None, cr, cr_workdir, + self._source_methods["do_stage_partition"](self, self.sourceparams_dict, + cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, native_sysroot) - self._source_methods["do_prepare_partition"](self, None, cr, cr_workdir, + self._source_methods["do_prepare_partition"](self, self.sourceparams_dict, + cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, rootfs_dir, native_sysroot)
Signature · 1 line
1.8.3.1
PATCH 5/7 wic: Add gummiboot support to bootimg-efi
In reply to Tom ZanussiAdd gummiboot support to bootimg-efi, which retains the existing grub-efi support (though requires an update to the .wks file).
--- scripts/lib/wic/plugins/source/bootimg-efi.py | 113 +++++++++++++++++++++----- 1 file changed, 91 insertions(+), 22 deletions(-)
scripts/lib/wic/plugins/source/bootimg-efi.py +91 -22
@@ -42,19 +42,10 @@ class BootimgEFIPlugin(SourcePlugin): name = 'bootimg-efi' @classmethod - def do_configure_partition(self, source_params, part, cr, cr_workdir, - oe_builddir, bootimg_dir, kernel_dir, - native_sysroot): + def do_configure_grubefi(self, hdddir, cr, cr_workdir): """ - Called before do_prepare_partition(), creates grubefi config + Create loader-specific (grub-efi) config """ - hdddir = "%s/hdd/boot" % cr_workdir - rm_cmd = "rm -rf %s" % cr_workdir - exec_cmd(rm_cmd) - - install_cmd = "install -d %s/EFI/BOOT" % hdddir - exec_cmd(install_cmd) - splash = os.path.join(cr_workdir, "/EFI/boot/splash.jpg") if os.path.exists(splash): splashline = "menu background splash.jpg"
@@ -73,7 +64,7 @@ class BootimgEFIPlugin(SourcePlugin): grubefi_conf += "timeout=%s\n" % timeout grubefi_conf += "menuentry 'boot'{\n" - kernel = "/vmlinuz" + kernel = "/bzImage" if cr._ptable_format == 'msdos': rootstr = rootdev
@@ -93,6 +84,79 @@ class BootimgEFIPlugin(SourcePlugin): cfg.close() @classmethod + def do_configure_gummiboot(self, hdddir, cr, cr_workdir): + """ + Create loader-specific (gummiboot) config + """ + install_cmd = "install -d %s/loader" % hdddir + exec_cmd(install_cmd) + + install_cmd = "install -d %s/loader/entries" % hdddir + exec_cmd(install_cmd) + + (rootdev, root_part_uuid) = cr._get_boot_config() + options = cr.ks.handler.bootloader.appendLine + + timeout = kickstart.get_timeout(cr.ks) + if not timeout: + timeout = 0 + + loader_conf = "" + loader_conf += "default boot\n" + loader_conf += "timeout %d\n" % timeout + + msger.debug("Writing gummiboot config %s/hdd/boot/loader/loader.conf" \ + % cr_workdir) + cfg = open("%s/hdd/boot/loader/loader.conf" % cr_workdir, "w") + cfg.write(loader_conf) + cfg.close() + + kernel = "/bzImage" + + if cr._ptable_format == 'msdos': + rootstr = rootdev + else: + raise ImageError("Unsupported partition table format found") + + boot_conf = "" + boot_conf += "title boot\n" + boot_conf += "linux %s\n" % kernel + boot_conf += "options LABEL=Boot root=%s %s\n" \ + % (rootstr, options) + + msger.debug("Writing gummiboot config %s/hdd/boot/loader/entries/boot.conf" \ + % cr_workdir) + cfg = open("%s/hdd/boot/loader/entries/boot.conf" % cr_workdir, "w") + cfg.write(boot_conf) + cfg.close() + + + @classmethod + def do_configure_partition(self, part, source_params, cr, cr_workdir, + oe_builddir, bootimg_dir, kernel_dir, + native_sysroot): + """ + Called before do_prepare_partition(), creates loader-specific config + """ + hdddir = "%s/hdd/boot" % cr_workdir + rm_cmd = "rm -rf %s" % cr_workdir + exec_cmd(rm_cmd) + + install_cmd = "install -d %s/EFI/BOOT" % hdddir + exec_cmd(install_cmd) + + try: + if source_params['loader'] == 'grub-efi': + self.do_configure_grubefi(hdddir, cr, cr_workdir) + elif source_params['loader'] == 'gummiboot': + self.do_configure_gummiboot(hdddir, cr, cr_workdir) + else: + msger.error("unrecognized bootimg-efi loader: %s" % source_params['loader']) + except KeyError: + msger.error("bootimg-efi requires a loader, none specified") + + + @classmethod def do_prepare_partition(self, part, source_params, cr, cr_workdir, oe_builddir, bootimg_dir, kernel_dir, rootfs_dir, native_sysroot):
@@ -117,14 +181,21 @@ class BootimgEFIPlugin(SourcePlugin): (staging_kernel_dir, hdddir) exec_cmd(install_cmd) - shutil.copyfile("%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir, - "%s/grub.cfg" % cr_workdir) - - cp_cmd = "cp %s/EFI/BOOT/* %s/EFI/BOOT" % (staging_data_dir, hdddir) - exec_cmd(cp_cmd, True) - - shutil.move("%s/grub.cfg" % cr_workdir, - "%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir) + try: + if source_params['loader'] == 'grub-efi': + shutil.copyfile("%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir, + "%s/grub.cfg" % cr_workdir) + cp_cmd = "cp %s/EFI/BOOT/* %s/EFI/BOOT" % (staging_data_dir, hdddir) + exec_cmd(cp_cmd, True) + shutil.move("%s/grub.cfg" % cr_workdir, + "%s/hdd/boot/EFI/BOOT/grub.cfg" % cr_workdir) + elif source_params['loader'] == 'gummiboot': + cp_cmd = "cp %s/EFI/BOOT/* %s/EFI/BOOT" % (staging_data_dir, hdddir) + exec_cmd(cp_cmd, True) + else: + msger.error("unrecognized bootimg-efi loader: %s" % source_params['loader']) + except KeyError: + msger.error("bootimg-efi requires a loader, none specified") du_cmd = "du -bks %s" % hdddir out = exec_cmd(du_cmd)
@@ -164,5 +235,3 @@ class BootimgEFIPlugin(SourcePlugin): part.set_size(bootimg_size) part.set_source_file(bootimg) - -
Signature · 1 line
1.8.3.1
PATCH 6/7 wic: Add sourceparams to mkefidisk.wks
In reply to Tom ZanussiThe bootimg-efi plugin now requires a loader param, so supply it to retain existing behavior.
--- scripts/lib/image/canned-wks/mkefidisk.wks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/lib/image/canned-wks/mkefidisk.wks +1 -1
@@ -2,7 +2,7 @@ # long-description: Creates a partitioned EFI disk image that the user # can directly dd to boot media. -part /boot --source bootimg-efi --ondisk sda --label msdos --active --align 1024 +part /boot --source bootimg-efi --sourceparams="loader=grub-efi" --ondisk sda --label msdos --active --align 1024 part / --source rootfs --ondisk sda --fstype=ext3 --label platform --align 1024
Signature · 1 line
1.8.3.1
PATCH 7/7 wic: Add mkgummidisk kickstart file
In reply to Tom ZanussiThis is the same as mkefidisk but uses gummiboot instead of grub-efi.
--- scripts/lib/image/canned-wks/mkgummidisk.wks | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 scripts/lib/image/canned-wks/mkgummidisk.wks
scripts/lib/image/canned-wks/mkgummidisk.wks new file +11 -0
@@ -0,0 +1,11 @@ +# 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 bootimg-efi --sourceparams="loader=gummiboot" --ondisk sda --label msdos --active --align 1024 + +part / --source rootfs --ondisk sda --fstype=ext3 --label platform --align 1024 + +part swap --ondisk sda --size 44 --label swap1 --fstype=swap + +bootloader --timeout=10 --append="rootwait rootfstype=ext3 console=ttyPCH0,115200 console=tty0 vmalloc=256MB snd-hda-intel.enable_msi=0"
Signature · 1 line
1.8.3.1