wic: rawcopy: Add support for packed images

Add support for packed images to wic rawcopy handler do minimize disk
usage in deploy directory and reuse of packed images between wic and
swupdate. Add `unpack` to sourceparams to unpack an bz2, gz and xz
archives.

Example:
part / --source rawcopy --sourceparams="file=core-image-minimal-qemu.ext4.gz,unpack"

(From OE-Core rev: 4c97d25791389ece041565981ba3207ce9949a1a)

Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Stefan Herbrechtsmeier 2022-02-14 16:45:18 +01:00 committed by Richard Purdie
parent 5d16ba9078
commit 0c20edddfc

View File

@ -4,6 +4,8 @@
import logging
import os
import signal
import subprocess
from wic import WicError
from wic.pluginbase import SourcePlugin
@ -38,6 +40,25 @@ class RawCopyPlugin(SourcePlugin):
exec_cmd(cmd)
@staticmethod
def do_image_uncompression(src, dst, workdir):
def subprocess_setup():
# Python installs a SIGPIPE handler by default. This is usually not what
# non-Python subprocesses expect.
# SIGPIPE errors are known issues with gzip/bash
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
extension = os.path.splitext(src)[1]
decompressor = {
".bz2": "bzip2",
".gz": "gzip",
".xz": "xz"
}.get(extension)
if not decompressor:
raise WicError("Not supported compressor filename extension: %s" % extension)
cmd = "%s -dc %s > %s" % (decompressor, src, dst)
subprocess.call(cmd, preexec_fn=subprocess_setup, shell=True, cwd=workdir)
@classmethod
def do_prepare_partition(cls, part, source_params, cr, cr_workdir,
oe_builddir, bootimg_dir, kernel_dir,
@ -56,7 +77,13 @@ class RawCopyPlugin(SourcePlugin):
if 'file' not in source_params:
raise WicError("No file specified")
src = os.path.join(kernel_dir, source_params['file'])
if 'unpack' in source_params:
img = os.path.join(kernel_dir, source_params['file'])
src = os.path.join(cr_workdir, os.path.splitext(source_params['file'])[0])
RawCopyPlugin.do_image_uncompression(img, src, cr_workdir)
else:
src = os.path.join(kernel_dir, source_params['file'])
dst = os.path.join(cr_workdir, "%s.%s" % (os.path.basename(source_params['file']), part.lineno))
if not os.path.exists(os.path.dirname(dst)):