diff options
| author | John Klug <john.klug@multitech.com> | 2018-07-31 17:48:08 -0500 |
|---|---|---|
| committer | John Klug <john.klug@multitech.com> | 2018-07-31 17:48:08 -0500 |
| commit | b5dd8c128624cb77576d692b68e24691d4d9a96d (patch) | |
| tree | 4a0cc0a718fa98582fd70719a83b826c2d990cf5 /scripts/lib/wic | |
| parent | e08c220730d5da161a746d811268eb1550beb856 (diff) | |
| download | mlinux-b5dd8c128624cb77576d692b68e24691d4d9a96d.tar.gz mlinux-b5dd8c128624cb77576d692b68e24691d4d9a96d.tar.bz2 mlinux-b5dd8c128624cb77576d692b68e24691d4d9a96d.zip | |
mLinux 4
Diffstat (limited to 'scripts/lib/wic')
45 files changed, 5732 insertions, 0 deletions
diff --git a/scripts/lib/wic/__init__.py b/scripts/lib/wic/__init__.py new file mode 100644 index 0000000..63c1d9c --- /dev/null +++ b/scripts/lib/wic/__init__.py @@ -0,0 +1,4 @@ +import os, sys + +cur_path = os.path.dirname(__file__) or '.' +sys.path.insert(0, cur_path + '/3rdparty') diff --git a/scripts/lib/wic/__version__.py b/scripts/lib/wic/__version__.py new file mode 100644 index 0000000..5452a46 --- /dev/null +++ b/scripts/lib/wic/__version__.py @@ -0,0 +1 @@ +VERSION = "2.00" diff --git a/scripts/lib/wic/canned-wks/common.wks.inc b/scripts/lib/wic/canned-wks/common.wks.inc new file mode 100644 index 0000000..5cf2fd1 --- /dev/null +++ b/scripts/lib/wic/canned-wks/common.wks.inc @@ -0,0 +1,3 @@ +# This file is included into 3 canned wks files from this directory +part /boot --source bootimg-pcbios --ondisk sda --label boot --active --align 1024 +part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024 diff --git a/scripts/lib/wic/canned-wks/directdisk-bootloader-config.cfg b/scripts/lib/wic/canned-wks/directdisk-bootloader-config.cfg new file mode 100644 index 0000000..a16bd6a --- /dev/null +++ b/scripts/lib/wic/canned-wks/directdisk-bootloader-config.cfg @@ -0,0 +1,11 @@ +# This is an example configuration file for syslinux. +PROMPT 0 +TIMEOUT 10 + +ALLOWOPTIONS 1 +SERIAL 0 115200 + +DEFAULT boot +LABEL boot +KERNEL /vmlinuz +APPEND label=boot root=/dev/sda2 rootwait rootfstype=ext4 video=vesafb vga=0x318 console=tty0 diff --git a/scripts/lib/wic/canned-wks/directdisk-bootloader-config.wks b/scripts/lib/wic/canned-wks/directdisk-bootloader-config.wks new file mode 100644 index 0000000..3529e05 --- /dev/null +++ b/scripts/lib/wic/canned-wks/directdisk-bootloader-config.wks @@ -0,0 +1,8 @@ +# short-description: Create a 'pcbios' direct disk image with custom bootloader config +# long-description: Creates a partitioned legacy BIOS disk image that the user +# can directly dd to boot media. The bootloader configuration source is a user file. + +include common.wks.inc + +bootloader --configfile="directdisk-bootloader-config.cfg" + diff --git a/scripts/lib/wic/canned-wks/directdisk-gpt.wks b/scripts/lib/wic/canned-wks/directdisk-gpt.wks new file mode 100644 index 0000000..ea01cf3 --- /dev/null +++ b/scripts/lib/wic/canned-wks/directdisk-gpt.wks @@ -0,0 +1,10 @@ +# 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. + + +part /boot --source bootimg-pcbios --ondisk sda --label boot --active --align 1024 +part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024 --use-uuid + +bootloader --ptable gpt --timeout=0 --append="rootwait rootfstype=ext4 video=vesafb vga=0x318 console=tty0" + diff --git a/scripts/lib/wic/canned-wks/directdisk-multi-rootfs.wks b/scripts/lib/wic/canned-wks/directdisk-multi-rootfs.wks new file mode 100644 index 0000000..8a81f8f --- /dev/null +++ b/scripts/lib/wic/canned-wks/directdisk-multi-rootfs.wks @@ -0,0 +1,23 @@ +# short-description: Create multi rootfs image using rootfs plugin +# long-description: Creates a partitioned disk image with two rootfs partitions +# using rootfs plugin. +# +# Partitions can use either +# - indirect rootfs references to image recipe(s): +# wic create directdisk-multi-indirect-recipes -e core-image-minimal \ +# --rootfs-dir rootfs1=core-image-minimal +# --rootfs-dir rootfs2=core-image-minimal-dev +# +# - or paths to rootfs directories: +# wic create directdisk-multi-rootfs \ +# --rootfs-dir rootfs1=tmp/work/qemux86_64-poky-linux/core-image-minimal/1.0-r0/rootfs/ +# --rootfs-dir rootfs2=tmp/work/qemux86_64-poky-linux/core-image-minimal-dev/1.0-r0/rootfs/ +# +# - or any combinations of -r and --rootfs command line options + +part /boot --source bootimg-pcbios --ondisk sda --label boot --active --align 1024 +part / --source rootfs --rootfs-dir=rootfs1 --ondisk sda --fstype=ext4 --label platform --align 1024 +part /rescue --source rootfs --rootfs-dir=rootfs2 --ondisk sda --fstype=ext4 --label secondary --align 1024 + +bootloader --timeout=0 --append="rootwait rootfstype=ext4 video=vesafb vga=0x318 console=tty0" + diff --git a/scripts/lib/wic/canned-wks/directdisk.wks b/scripts/lib/wic/canned-wks/directdisk.wks new file mode 100644 index 0000000..6db74a7 --- /dev/null +++ b/scripts/lib/wic/canned-wks/directdisk.wks @@ -0,0 +1,8 @@ +# 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.wks.inc + +bootloader --timeout=0 --append="rootwait rootfstype=ext4 video=vesafb vga=0x318 console=tty0" + diff --git a/scripts/lib/wic/canned-wks/mkefidisk.wks b/scripts/lib/wic/canned-wks/mkefidisk.wks new file mode 100644 index 0000000..696e94e --- /dev/null +++ b/scripts/lib/wic/canned-wks/mkefidisk.wks @@ -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=grub-efi" --ondisk sda --label msdos --active --align 1024 + +part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024 + +part swap --ondisk sda --size 44 --label swap1 --fstype=swap + +bootloader --timeout=10 --append="rootwait rootfstype=ext4 console=ttyPCH0,115200 console=tty0 vmalloc=256MB snd-hda-intel.enable_msi=0" diff --git a/scripts/lib/wic/canned-wks/mkgummidisk.wks b/scripts/lib/wic/canned-wks/mkgummidisk.wks new file mode 100644 index 0000000..66a22f6 --- /dev/null +++ b/scripts/lib/wic/canned-wks/mkgummidisk.wks @@ -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=ext4 --label platform --align 1024 + +part swap --ondisk sda --size 44 --label swap1 --fstype=swap + +bootloader --timeout=10 --append="rootwait rootfstype=ext4 console=ttyPCH0,115200 console=tty0 vmalloc=256MB snd-hda-intel.enable_msi=0" diff --git a/scripts/lib/wic/canned-wks/mkhybridiso.wks b/scripts/lib/wic/canned-wks/mkhybridiso.wks new file mode 100644 index 0000000..9d34e9b --- /dev/null +++ b/scripts/lib/wic/canned-wks/mkhybridiso.wks @@ -0,0 +1,7 @@ +# short-description: Create a hybrid ISO image +# long-description: Creates an EFI and legacy bootable hybrid ISO image +# which can be used on optical media as well as USB media. + +part /boot --source isoimage-isohybrid --sourceparams="loader=grub-efi,image_name=HYBRID_ISO_IMG" --ondisk cd --label HYBRIDISO --fstype=ext4 + +bootloader --timeout=15 --append="" diff --git a/scripts/lib/wic/canned-wks/qemux86-directdisk.wks b/scripts/lib/wic/canned-wks/qemux86-directdisk.wks new file mode 100644 index 0000000..a6518a0 --- /dev/null +++ b/scripts/lib/wic/canned-wks/qemux86-directdisk.wks @@ -0,0 +1,8 @@ +# short-description: Create a qemu machine 'pcbios' direct disk image +# long-description: Creates a partitioned legacy BIOS disk image that the user +# can directly use to boot a qemu machine. + +include common.wks.inc + +bootloader --timeout=0 --append="vga=0 uvesafb.mode_option=640x480-32 root=/dev/vda2 rw mem=256M ip=192.168.7.2::192.168.7.1:255.255.255.0 oprofile.timer=1 rootfstype=ext4 " + diff --git a/scripts/lib/wic/canned-wks/sdimage-bootpart.wks b/scripts/lib/wic/canned-wks/sdimage-bootpart.wks new file mode 100644 index 0000000..7ffd632 --- /dev/null +++ b/scripts/lib/wic/canned-wks/sdimage-bootpart.wks @@ -0,0 +1,6 @@ +# short-description: Create SD card image with a boot partition +# long-description: Creates a partitioned SD card image. Boot files +# are located in the first vfat partition. + +part /boot --source bootimg-partition --ondisk mmcblk --fstype=vfat --label boot --active --align 4 --size 16 +part / --source rootfs --ondisk mmcblk --fstype=ext4 --label root --align 4 diff --git a/scripts/lib/wic/conf.py b/scripts/lib/wic/conf.py new file mode 100644 index 0000000..f7d56d0 --- /dev/null +++ b/scripts/lib/wic/conf.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python -tt +# +# Copyright (c) 2011 Intel, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; version 2 of the License +# +# 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., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os + +from wic.ksparser import KickStart, KickStartError +from wic import msger +from wic.utils import misc + + +def get_siteconf(): + wic_path = os.path.dirname(__file__) + eos = wic_path.find('scripts') + len('scripts') + scripts_path = wic_path[:eos] + + return scripts_path + "/lib/image/config/wic.conf" + +class ConfigMgr(object): + DEFAULTS = { + 'common': { + "distro_name": "Default Distribution", + "plugin_dir": "/usr/lib/wic/plugins"}, # TODO use prefix also? + 'create': { + "tmpdir": '/var/tmp/wic', + "outdir": './wic-output', + "release": None, + "logfile": None, + "name_prefix": None, + "name_suffix": None} + } + + # make the manager class as singleton + _instance = None + def __new__(cls, *args, **kwargs): + if not cls._instance: + cls._instance = super(ConfigMgr, cls).__new__(cls, *args, **kwargs) + + return cls._instance + + def __init__(self, ksconf=None, siteconf=None): + # reset config options + self.reset() + + if not siteconf: + siteconf = get_siteconf() + + # initial options from siteconf + self._siteconf = siteconf + + if ksconf: + self._ksconf = ksconf + + def reset(self): + self.__ksconf = None + self.__siteconf = None + self.create = {} + + # initialize the values with defaults + for sec, vals in self.DEFAULTS.iteritems(): + setattr(self, sec, vals) + + def __set_ksconf(self, ksconf): + if not os.path.isfile(ksconf): + msger.error('Cannot find ks file: %s' % ksconf) + + self.__ksconf = ksconf + self._parse_kickstart(ksconf) + def __get_ksconf(self): + return self.__ksconf + _ksconf = property(__get_ksconf, __set_ksconf) + + def _parse_kickstart(self, ksconf=None): + if not ksconf: + return + + try: + ksobj = KickStart(ksconf) + except KickStartError as err: + msger.error(str(err)) + + self.create['ks'] = ksobj + self.create['name'] = os.path.splitext(os.path.basename(ksconf))[0] + + self.create['name'] = misc.build_name(ksconf, + self.create['release'], + self.create['name_prefix'], + self.create['name_suffix']) + +configmgr = ConfigMgr() diff --git a/scripts/lib/wic/config/wic.conf b/scripts/lib/wic/config/wic.conf new file mode 100644 index 0000000..a51bcb5 --- /dev/null +++ b/scripts/lib/wic/config/wic.conf @@ -0,0 +1,6 @@ +[common] +; general settings +distro_name = OpenEmbedded + +[create] +; settings for create subcommand diff --git a/scripts/lib/wic/creator.py b/scripts/lib/wic/creator.py new file mode 100644 index 0000000..5231297 --- /dev/null +++ b/scripts/lib/wic/creator.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python -tt +# +# Copyright (c) 2011 Intel, Inc. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation; version 2 of the License +# +# 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., 59 +# Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os, sys +from optparse import OptionParser, SUPPRESS_HELP + +from wic import msger +from wic.utils import errors +from wic.conf import configmgr +from wic.plugin import pluginmgr + + +class Creator(object): + """${name}: create an image + + Usage: + ${name} SUBCOMMAND <ksfile> [OPTS] + + ${command_list} + ${option_list} + """ + + name = 'wic create(cr)' + + def __init__(self, *args, **kwargs): + self._subcmds = {} + + # get cmds from pluginmgr + # mix-in do_subcmd interface + for subcmd, klass in pluginmgr.get_plugins('imager').iteritems(): + if not hasattr(klass, 'do_create'): + msger.warning("Unsupported subcmd: %s" % subcmd) + continue + + func = getattr(klass, 'do_create') + self._subcmds[subcmd] = func + + def get_optparser(self): + optparser = OptionParser() + optparser.add_option('-d', '--debug', action='store_true', + dest='debug', + help=SUPPRESS_HELP) + optparser.add_option('-v', '--verbose', action='store_true', + dest='verbose', + help=SUPPRESS_HELP) + optparser.add_option('', '--logfile', type='string', dest='logfile', + default=None, + help='Path of logfile') + optparser.add_option('-c', '--config', type='string', dest='config', + default=None, + help='Specify config file for wic') + optparser.add_option('-o', '--outdir', type='string', action='store', + dest='outdir', default=None, + help='Output directory') + optparser.add_option('', '--tmpfs', action='store_true', dest='enabletmpfs', + help='Setup tmpdir as tmpfs to accelerate, experimental' + ' feature, use it if you have more than 4G memory') + return optparser + + def postoptparse(self, options): + abspath = lambda pth: os.path.abspath(os.path.expanduser(pth)) + + if options.verbose: + msger.set_loglevel('verbose') + if options.debug: + msger.set_loglevel('debug') + + if options.logfile: + logfile_abs_path = abspath(options.logfile) + if os.path.isdir(logfile_abs_path): + raise errors.Usage("logfile's path %s should be file" + % options.logfile) + if not os.path.exists(os.path.dirname(logfile_abs_path)): + os.makedirs(os.path.dirname(logfile_abs_path)) + msger.set_interactive(False) + msger.set_logfile(logfile_abs_path) + configmgr.create['logfile'] = options.logfile + + if options.config: + configmgr.reset() + configmgr._siteconf = options.config + + if options.outdir is not None: + configmgr.create['outdir'] = abspath(options.outdir) + + cdir = 'outdir' + if os.path.exists(configmgr.create[cdir]) \ + and not os.path.isdir(configmgr.create[cdir]): + msger.error('Invalid directory specified: %s' \ + % configmgr.create[cdir]) + + if options.enabletmpfs: + configmgr.create['enabletmpfs'] = options.enabletmpfs + + def main(self, argv=None): + if argv is None: + argv = sys.argv + else: + argv = argv[:] # don't modify caller's list + + pname = argv[0] + if pname not in self._subcmds: + msger.error('Unknown plugin: %s' % pname) + + optparser = self.get_optparser() + options, args = optparser.parse_args(argv) + + self.postoptparse(options) + + return self._subcmds[pname](options, *args[1:]) diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py new file mode 100644 index 0000000..76b93e8 --- /dev/null +++ b/scripts/lib/wic/engine.py @@ -0,0 +1,220 @@ +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# Copyright (c) 2013, 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 module implements the image creation engine used by 'wic' to +# create images. The engine parses through the OpenEmbedded kickstart +# (wks) file specified and generates images that can then be directly +# written onto media. +# +# AUTHORS +# Tom Zanussi <tom.zanussi (at] linux.intel.com> +# + +import os +import sys + +from wic import msger, creator +from wic.utils import misc +from wic.plugin import pluginmgr +from wic.utils.oe import misc + + +def verify_build_env(): + """ + Verify that the build environment is sane. + + Returns True if it is, false otherwise + """ + if not os.environ.get("BUILDDIR"): + print "BUILDDIR not found, exiting. (Did you forget to source oe-init-build-env?)" + sys.exit(1) + + return True + + +CANNED_IMAGE_DIR = "lib/wic/canned-wks" # relative to scripts +SCRIPTS_CANNED_IMAGE_DIR = "scripts/" + CANNED_IMAGE_DIR + +def build_canned_image_list(path): + layers_path = misc.get_bitbake_var("BBLAYERS") + canned_wks_layer_dirs = [] + + if layers_path is not None: + for layer_path in layers_path.split(): + cpath = os.path.join(layer_path, SCRIPTS_CANNED_IMAGE_DIR) + canned_wks_layer_dirs.append(cpath) + + cpath = os.path.join(path, CANNED_IMAGE_DIR) + canned_wks_layer_dirs.append(cpath) + + return canned_wks_layer_dirs + +def find_canned_image(scripts_path, wks_file): + """ + Find a .wks file with the given name in the canned files dir. + + Return False if not found + """ + layers_canned_wks_dir = build_canned_image_list(scripts_path) + + for canned_wks_dir in layers_canned_wks_dir: + for root, dirs, files in os.walk(canned_wks_dir): + for fname in files: + if fname.endswith("~") or fname.endswith("#"): + continue + if fname.endswith(".wks") and wks_file + ".wks" == fname: + fullpath = os.path.join(canned_wks_dir, fname) + return fullpath + return None + + +def list_canned_images(scripts_path): + """ + List the .wks files in the canned image dir, minus the extension. + """ + layers_canned_wks_dir = build_canned_image_list(scripts_path) + + for canned_wks_dir in layers_canned_wks_dir: + for root, dirs, files in os.walk(canned_wks_dir): + for fname in files: + if fname.endswith("~") or fname.endswith("#"): + continue + if fname.endswith(".wks"): + fullpath = os.path.join(canned_wks_dir, fname) + with open(fullpath) as wks: + for line in wks: + desc = "" + idx = line.find("short-description:") + if idx != -1: + desc = line[idx + len("short-description:"):].strip() + break + basename = os.path.splitext(fname)[0] + print " %s\t\t%s" % (basename.ljust(30), desc) + + +def list_canned_image_help(scripts_path, fullpath): + """ + List the help and params in the specified canned image. + """ + found = False + with open(fullpath) as wks: + for line in wks: + if not found: + idx = line.find("long-description:") + if idx != -1: + print + print line[idx + len("long-description:"):].strip() + found = True + continue + if not line.strip(): + break + idx = line.find("#") + if idx != -1: + print line[idx + len("#:"):].rstrip() + else: + break + + +def list_source_plugins(): + """ + List the available source plugins i.e. plugins available for --source. + """ + plugins = pluginmgr.get_source_plugins() + + for plugin in plugins: + print " %s" % plugin + + +def wic_create(wks_file, rootfs_dir, bootimg_dir, kernel_dir, + native_sysroot, scripts_path, image_output_dir, + compressor, debug): + """Create image + + wks_file - user-defined OE kickstart file + rootfs_dir - absolute path to the build's /rootfs dir + bootimg_dir - absolute path to the build's boot artifacts directory + kernel_dir - absolute path to the build's kernel directory + native_sysroot - absolute path to the build's native sysroots dir + scripts_path - absolute path to /scripts dir + image_output_dir - dirname to create for image + compressor - compressor utility to compress the image + + Normally, the values for the build artifacts values are determined + by 'wic -e' from the output of the 'bitbake -e' command given an + image name e.g. 'core-image-minimal' and a given machine set in + local.conf. If that's the case, the variables get the following + values from the output of 'bitbake -e': + + rootfs_dir: IMAGE_ROOTFS + kernel_dir: DEPLOY_DIR_IMAGE + native_sysroot: STAGING_DIR_NATIVE + + In the above case, bootimg_dir remains unset and the + plugin-specific image creation code is responsible for finding the + bootimg artifacts. + + In the case where the values are passed in explicitly i.e 'wic -e' + is not used but rather the individual 'wic' options are used to + explicitly specify these values. + """ + try: + oe_builddir = os.environ["BUILDDIR"] + except KeyError: + print "BUILDDIR not found, exiting. (Did you forget to source oe-init-build-env?)" + |
