public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Andreas Reichel <andreas.reichel.ext@siemens.com>
To: Henning Schild <henning.schild@siemens.com>
Cc: isar-users@googlegroups.com,
	Cedric Hombourger <Cedric_Hombourger@mentor.com>
Subject: Re: [PATCH v2 12/17] wic: Add pcibios boot plugins and wks files
Date: Mon, 16 Apr 2018 12:52:29 +0200	[thread overview]
Message-ID: <20180416105229.GG8866@iiotirae> (raw)
In-Reply-To: <26083c546f8e46359f4a4edb29e169e9935fe6ee.1523628814.git.henning.schild@siemens.com>

On Fri, Apr 13, 2018 at 04:19:01PM +0200, Henning Schild wrote:
> Create a modified version of directdisk.wks that enabled legacy boot
> images in Isar. "bootimg-pcbios-isar" expects the buildchroot to contain
> the packages "syslinux syslinux-common" and will create a disk using this
> bootloader.
> 
> Signed-off-by: Henning Schild <henning.schild@siemens.com>
> ---
>  .../scripts/lib/wic/canned-wks/common-isar.wks.inc |   3 +
>  .../scripts/lib/wic/canned-wks/directdisk-isar.wks |   7 +
>  .../lib/wic/plugins/source/bootimg-pcbios-isar.py  | 217 +++++++++++++++++++++
>  3 files changed, 227 insertions(+)
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/common-isar.wks.inc
>  create mode 100644 meta-isar/scripts/lib/wic/canned-wks/directdisk-isar.wks
>  create mode 100644 meta-isar/scripts/lib/wic/plugins/source/bootimg-pcbios-isar.py
> 
> diff --git a/meta-isar/scripts/lib/wic/canned-wks/common-isar.wks.inc b/meta-isar/scripts/lib/wic/canned-wks/common-isar.wks.inc
> new file mode 100644
> index 0000000..c8ea4c2
> --- /dev/null
> +++ b/meta-isar/scripts/lib/wic/canned-wks/common-isar.wks.inc
> @@ -0,0 +1,3 @@
> +# This file is included into 3 canned wks files from this directory
> +part /boot --source bootimg-pcbios-isar --ondisk sda --label boot --active --align 1024
> +part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024
> diff --git a/meta-isar/scripts/lib/wic/canned-wks/directdisk-isar.wks b/meta-isar/scripts/lib/wic/canned-wks/directdisk-isar.wks
> new file mode 100644
> index 0000000..2b9576d
> --- /dev/null
> +++ b/meta-isar/scripts/lib/wic/canned-wks/directdisk-isar.wks
> @@ -0,0 +1,7 @@
> +# short-description: Create a 'pcbios' direct disk image
> +# long-description: Creates a partitioned legacy BIOS disk image that the user
> +# can directly dd to boot media.
> +
> +include common-isar.wks.inc
> +
> +bootloader  --timeout=0  --append="rootwait rootfstype=ext4 video=vesafb vga=0x318 console=tty0 console=ttyS0,115200n8"
> diff --git a/meta-isar/scripts/lib/wic/plugins/source/bootimg-pcbios-isar.py b/meta-isar/scripts/lib/wic/plugins/source/bootimg-pcbios-isar.py
> new file mode 100644
> index 0000000..0423862
> --- /dev/null
> +++ b/meta-isar/scripts/lib/wic/plugins/source/bootimg-pcbios-isar.py
> @@ -0,0 +1,217 @@
> +# ex:ts=4:sw=4:sts=4:et
> +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
> +#
> +# Copyright (c) 2014, Intel Corporation.
> +# All rights reserved.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License version 2 as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License along
> +# with this program; if not, write to the Free Software Foundation, Inc.,
> +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> +#
> +# DESCRIPTION
> +# This implements the 'bootimg-pcbios-isar' source plugin class for 'wic'
> +#
> +# AUTHORS
> +# Tom Zanussi <tom.zanussi (at] linux.intel.com>
> +#
> +
> +import logging
> +import os
> +
> +from wic import WicError
> +from wic.engine import get_custom_config
> +from wic.utils import runner
> +from wic.pluginbase import SourcePlugin
> +from wic.utils.misc import (exec_cmd, exec_native_cmd,
> +                            get_bitbake_var, BOOTDD_EXTRA_SPACE)
> +
> +logger = logging.getLogger('wic')
> +
> +class BootimgPcbiosIsarPlugin(SourcePlugin):
> +    """
> +    Create MBR boot partition and install syslinux on it.
> +    """
> +
> +    name = 'bootimg-pcbios-isar'
> +
> +    @classmethod
> +    def _get_syslinux_dir(cls, bootimg_dir):
> +        """
> +        Get path to syslinux from either default bootimg_dir
> +        or wic-tools STAGING_DIR.
> +        """
> +        for path in (bootimg_dir, get_bitbake_var("STAGING_DATADIR", "wic-tools")):
> +            if not path:
> +                continue
> +            syslinux_dir = os.path.join(path, 'syslinux')
> +            if os.path.exists(syslinux_dir):
> +                return syslinux_dir
> +
> +        raise WicError("Couldn't find syslinux directory, exiting")
> +
> +    @classmethod
> +    def do_install_disk(cls, disk, disk_name, creator, workdir, oe_builddir,
> +                        bootimg_dir, kernel_dir, native_sysroot):
> +        """
> +        Called after all partitions have been prepared and assembled into a
> +        disk image.  In this case, we install the MBR.
> +        """
> +        syslinux_dir = cls._get_syslinux_dir(bootimg_dir)
> +        if creator.ptable_format == 'msdos':
> +            mbrfile = os.path.join(syslinux_dir, "mbr/mbr.bin")
> +        elif creator.ptable_format == 'gpt':
> +            mbrfile = os.path.join(syslinux_dir, "mbr/gptmbr.bin")
I know that a GPT contains an MBR for compatibility reasons. But this is
usually just to stop the system from booting of the harddisk partitioned
by GPT if it is used in an older PC accidentally. Why would one want to
install syslinux with MBR support into the protected MBR of a GPT that
should not be used for booting? Or do I get that wrong?

> +        else:
> +            raise WicError("Unsupported partition table: %s" %
> +                           creator.ptable_format)
> +
> +        if not os.path.exists(mbrfile):
> +            raise WicError("Couldn't find %s.  If using the -e option, do you "
> +                           "have the right MACHINE set in local.conf?  If not, "
> +                           "is the bootimg_dir path correct?" % mbrfile)
> +
> +        full_path = creator._full_path(workdir, disk_name, "direct")
> +        logger.debug("Installing MBR on disk %s as %s with size %s bytes",
> +                     disk_name, full_path, disk.min_size)
> +
> +        rcode = runner.show(['dd', 'if=%s' % mbrfile,
> +                             'of=%s' % full_path, 'conv=notrunc'])
> +        if rcode != 0:
> +            raise WicError("Unable to set MBR to %s" % full_path)
> +
> +    @classmethod
> +    def do_configure_partition(cls, part, source_params, creator, cr_workdir,
> +                               oe_builddir, bootimg_dir, kernel_dir,
> +                               native_sysroot):
> +        """
> +        Called before do_prepare_partition(), creates syslinux config
> +        """
> +        hdddir = "%s/hdd/boot" % cr_workdir
> +
> +        install_cmd = "install -d %s" % hdddir
> +        exec_cmd(install_cmd)
> +
> +        bootloader = creator.ks.bootloader
> +
> +        custom_cfg = None
> +        if bootloader.configfile:
> +            custom_cfg = get_custom_config(bootloader.configfile)
> +            if custom_cfg:
> +                # Use a custom configuration for grub
> +                syslinux_conf = custom_cfg
> +                logger.debug("Using custom configuration file %s "
> +                             "for syslinux.cfg", bootloader.configfile)
> +            else:
> +                raise WicError("configfile is specified but failed to "
> +                               "get it from %s." % bootloader.configfile)
> +
> +        if not custom_cfg:
> +            # Create syslinux configuration using parameters from wks file
> +            splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg")
> +            if os.path.exists(splash):
> +                splashline = "menu background splash.jpg"
> +            else:
> +                splashline = ""
> +
> +            syslinux_conf = ""
> +            syslinux_conf += "PROMPT 0\n"
> +            syslinux_conf += "TIMEOUT " + str(bootloader.timeout) + "\n"
> +            syslinux_conf += "\n"
> +            syslinux_conf += "ALLOWOPTIONS 1\n"
> +            syslinux_conf += "SERIAL 0 115200\n"
> +            syslinux_conf += "\n"
> +            if splashline:
> +                syslinux_conf += "%s\n" % splashline
> +            syslinux_conf += "DEFAULT boot\n"
> +            syslinux_conf += "LABEL boot\n"
> +
> +            kernel = get_bitbake_var("KERNEL_IMAGE")
> +            initrd = get_bitbake_var("INITRD_IMAGE")
> +            syslinux_conf += "KERNEL " + kernel + "\n"
> +
> +            syslinux_conf += "APPEND label=boot root=%s initrd=%s %s\n" % \
> +                             (creator.rootdev, initrd, bootloader.append)
> +
> +        logger.debug("Writing syslinux config %s/hdd/boot/syslinux.cfg",
> +                     cr_workdir)
> +        cfg = open("%s/hdd/boot/syslinux.cfg" % cr_workdir, "w")
> +        cfg.write(syslinux_conf)
> +        cfg.close()
> +
> +    @classmethod
> +    def do_prepare_partition(cls, part, source_params, creator, 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.
> +        In this case, prepare content for legacy bios boot partition.
> +        """
> +        syslinux_dir = cls._get_syslinux_dir(bootimg_dir)
> +
> +        staging_kernel_dir = kernel_dir
> +        kernel = get_bitbake_var("KERNEL_IMAGE")
> +        initrd = get_bitbake_var("INITRD_IMAGE")
> +
> +        hdddir = "%s/hdd/boot" % cr_workdir
> +
> +        cmds = ("install -m 0644 %s/%s %s/%s" %
> +                (staging_kernel_dir, kernel, hdddir, kernel),
> +                "install -m 0644 %s/%s %s/%s" %
> +                (staging_kernel_dir, initrd, hdddir, initrd),
> +                "install -m 444 %s/modules/bios/ldlinux.c32 %s/ldlinux.c32" %
> +                (syslinux_dir, hdddir),
> +                "install -m 0644 %s/modules/bios/vesamenu.c32 %s/vesamenu.c32" %
> +                (syslinux_dir, hdddir),
> +                "install -m 444 %s/modules/bios/libcom32.c32 %s/libcom32.c32" %
> +                (syslinux_dir, hdddir),
> +                "install -m 444 %s/modules/bios/libutil.c32 %s/libutil.c32" %
> +                (syslinux_dir, hdddir))
> +
> +        for install_cmd in cmds:
> +            exec_cmd(install_cmd)
> +
> +        du_cmd = "du -bks %s" % hdddir
> +        out = exec_cmd(du_cmd)
> +        blocks = int(out.split()[0])
> +
> +        extra_blocks = part.get_extra_block_count(blocks)
> +
> +        if extra_blocks < BOOTDD_EXTRA_SPACE:
> +            extra_blocks = BOOTDD_EXTRA_SPACE
> +
> +        blocks += extra_blocks
> +
> +        logger.debug("Added %d extra blocks to %s to get to %d total blocks",
> +                     extra_blocks, part.mountpoint, blocks)
> +
> +        # dosfs image, created by mkdosfs
> +        bootimg = "%s/boot.img" % cr_workdir
> +
> +        dosfs_cmd = "mkdosfs -n boot -S 512 -C %s %d" % (bootimg, blocks)
> +        exec_native_cmd(dosfs_cmd, native_sysroot)
> +
> +        mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (bootimg, hdddir)
> +        exec_cmd(mcopy_cmd, native_sysroot)
> +
> +        syslinux_cmd = "syslinux %s" % bootimg
> +        exec_native_cmd(syslinux_cmd, native_sysroot)
> +
> +        chmod_cmd = "chmod 644 %s" % bootimg
> +        exec_cmd(chmod_cmd)
> +
> +        du_cmd = "du -Lbks %s" % bootimg
> +        out = exec_cmd(du_cmd)
> +        bootimg_size = out.split()[0]
> +
> +        part.size = int(bootimg_size)
> +        part.source_file = bootimg
> -- 
> 2.16.1
> 

-- 
Andreas Reichel
Dipl.-Phys. (Univ.)
Software Consultant

Andreas.Reichel@tngtech.com, +49-174-3180074
TNG Technology Consulting GmbH, Betastr. 13a, 85774 Unterfoehring
Geschaeftsfuehrer: Henrik Klagges, Dr. Robert Dahlke, Gerhard Mueller
Sitz: Unterfoehring * Amtsgericht Muenchen * HRB 135082


  reply	other threads:[~2018-04-16 10:56 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-13 14:18 [PATCH v2 00/16] wic integration Henning Schild
2018-04-13 14:18 ` [PATCH v2 01/17] Revert "wic: Make the bootimg-efi plugin generate usable images" Henning Schild
2018-04-13 14:18 ` [PATCH v2 02/17] Revert "wic: Introduce the `WicExecError` exception class" Henning Schild
2018-04-13 14:18 ` [PATCH v2 03/17] Revert "wic: Work around mcopy error" Henning Schild
2018-04-13 14:18 ` [PATCH v2 04/17] Revert "wic: Use sudo instead of pseudo" Henning Schild
2018-04-16 10:44   ` Andreas Reichel
2018-04-16 10:53     ` Andreas Reichel
2018-04-16 10:57     ` Henning Schild
2018-04-13 14:18 ` [PATCH v2 05/17] Revert "wic: Remove sysroot support" Henning Schild
2018-04-13 14:18 ` [PATCH v2 06/17] wic: now truly go for the wic version we claim to have Henning Schild
2018-04-13 14:18 ` [PATCH v2 07/17] Revert "isar-init-build-env: Add /sbin to PATH" Henning Schild
2018-04-13 14:18 ` [PATCH v2 08/17] classes: image: introduce size measuring function, for before do_*_image Henning Schild
2018-04-13 14:18 ` [PATCH v2 09/17] meta/image: Fix broken variables KERNEL_IMAGE and INITRD_IMAGE Henning Schild
2018-04-16 10:45   ` Andreas Reichel
2018-04-13 14:18 ` [PATCH v2 10/17] isar-init-build-env: make ISARROOT available in bitbake Henning Schild
2018-04-13 14:19 ` [PATCH v2 11/17] images: New class wic-img for wic intregration Henning Schild
2018-04-13 14:44   ` Henning Schild
2018-04-16 10:17     ` Claudius Heine
2018-04-16 10:25       ` Henning Schild
2018-04-16 10:31       ` Andreas Reichel
2018-04-13 14:19 ` [PATCH v2 12/17] wic: Add pcibios boot plugins and wks files Henning Schild
2018-04-16 10:52   ` Andreas Reichel [this message]
2018-04-16 11:48     ` Henning Schild
2018-04-13 14:19 ` [PATCH v2 13/17] scripts/start_vm: Enable booting of full disk images Henning Schild
2018-04-16 10:33   ` Andreas Reichel
2018-04-16 11:46     ` Henning Schild
2018-04-16 13:24       ` Andreas Reichel
2018-04-13 14:19 ` [PATCH v2 14/17] multiconfig: Switch qemuamd64-stretch to using wic by default Henning Schild
2018-04-16 10:25   ` Claudius Heine
2018-04-16 10:32     ` Henning Schild
2018-04-13 14:19 ` [PATCH v2 15/17] multiconfig: Switch qemui386-stretch " Henning Schild
2018-04-16 10:35   ` Andreas Reichel
2018-04-16 10:43     ` Henning Schild
2018-04-16 10:51       ` Henning Schild
2018-04-16 10:56         ` Claudius Heine
2018-04-13 14:19 ` [PATCH v2 16/17] docs: Change according to recent patches Henning Schild
2018-04-13 14:19 ` [PATCH v2 17/17] scripts/vm_smoke_test: double the timeout we wait for qemus Henning Schild
2018-04-16 10:47   ` Andreas Reichel
2018-04-16 11:45     ` Henning Schild
2018-04-25 15:53 ` [PATCH v2 00/16] wic integration Alexander Smirnov
2018-04-26 11:26   ` Henning Schild
2018-05-01 19:23 ` Alexander Smirnov
2018-05-03 16:32   ` Henning Schild
2018-05-03 16:39     ` Alexander Smirnov
2018-05-04  8:16       ` Henning Schild
2018-05-04  8:32         ` Alexander Smirnov
2018-05-04  9:30           ` Henning Schild

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180416105229.GG8866@iiotirae \
    --to=andreas.reichel.ext@siemens.com \
    --cc=Cedric_Hombourger@mentor.com \
    --cc=henning.schild@siemens.com \
    --cc=isar-users@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox