wic: root: Add an opt. destination on include-path

Allow specifying an optional destination to include-path and make the
option aware of permissions and owners.

It is very useful for making a partition that contains the rootfs for a
host and a target Eg:

/ -> Roofs for the host
/export/ -> Rootfs for the target (which will netboot)

Although today we support making a partition for "/export" this might
not be compatible with some upgrade systems, or we might be limited by
the number of partitions.

With this patch we can use something like:

part / --source rootfs --fstype=ext4 --include-path core-image-minimal-mtdutils export/ --include-path hello

on the .wks file.

Cc: Paul Barker <pbarker@konsulko.com>
(From OE-Core rev: e8c21c6ebaebde88151697381bdb2452f1171090)

Signed-off-by: Ricardo Ribalda Delgado <ricardo@ribalda.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ricardo Ribalda Delgado
2020-04-19 08:35:36 +02:00
committed by Richard Purdie
parent fc2589384b
commit a293c76c53
4 changed files with 72 additions and 12 deletions

View File

@@ -6,7 +6,7 @@ DEPENDS = "\
parted-native syslinux-native gptfdisk-native dosfstools-native \
mtools-native bmap-tools-native grub-efi-native cdrtools-native \
btrfs-tools-native squashfs-tools-native pseudo-native \
e2fsprogs-native util-linux-native \
e2fsprogs-native util-linux-native tar-native\
"
DEPENDS_append_x86 = " syslinux grub-efi systemd-boot"
DEPENDS_append_x86-64 = " syslinux grub-efi systemd-boot"

View File

@@ -971,14 +971,18 @@ DESCRIPTION
has an effect with the rootfs source plugin.
--include-path: This option is specific to wic. It adds the contents
of the given path to the resulting image. The path is
relative to the directory in which wic is running not
the rootfs itself so use of an absolute path is
recommended. This option is most useful when multiple
copies of the rootfs are added to an image and it is
required to add extra content to only one of these
copies. This option only has an effect with the rootfs
source plugin.
of the given path or a rootfs to the resulting image.
The option contains two fields, the origin and the
destination. When the origin is a rootfs, it follows
the same logic as the rootfs-dir argument and the
permissions and owners are kept. When the origin is a
path, it is relative to the directory in which wic is
running not the rootfs itself so use of an absolute
path is recommended, and the owner and group is set to
root:root. If no destination is given it is
automatically set to the root of the rootfs. This
option only has an effect with the rootfs source
plugin.
--change-directory: This option is specific to wic. It changes to the
given directory before copying the files. This

View File

@@ -137,7 +137,7 @@ class KickStart():
part.add_argument('--active', action='store_true')
part.add_argument('--align', type=int)
part.add_argument('--exclude-path', nargs='+')
part.add_argument('--include-path', nargs='+')
part.add_argument('--include-path', nargs='+', action='append')
part.add_argument('--change-directory')
part.add_argument("--extra-space", type=sizetype)
part.add_argument('--fsoptions', dest='fsopts')

View File

@@ -17,6 +17,7 @@ import shutil
import sys
from oe.path import copyhardlinktree
from pathlib import Path
from wic import WicError
from wic.pluginbase import SourcePlugin
@@ -126,8 +127,63 @@ class RootfsPlugin(SourcePlugin):
orig_dir, new_rootfs)
exec_native_cmd(pseudo_cmd, native_sysroot)
for path in part.include_path or []:
copyhardlinktree(path, new_rootfs)
for in_path in part.include_path or []:
#parse arguments
include_path = in_path[0]
if len(in_path) > 2:
logger.error("'Invalid number of arguments for include-path")
sys.exit(1)
if len(in_path) == 2:
path = in_path[1]
else:
path = None
# Pack files to be included into a tar file.
# We need to create a tar file, because that way we can keep the
# permissions from the files even when they belong to different
# pseudo enviroments.
# If we simply copy files using copyhardlinktree/copytree... the
# copied files will belong to the user running wic.
tar_file = os.path.realpath(
os.path.join(cr_workdir, "include-path%d.tar" % part.lineno))
if os.path.isfile(include_path):
parent = os.path.dirname(os.path.realpath(include_path))
tar_cmd = "tar c --owner=root --group=root -f %s -C %s %s" % (
tar_file, parent, os.path.relpath(include_path, parent))
exec_native_cmd(tar_cmd, native_sysroot)
else:
if include_path in krootfs_dir:
include_path = krootfs_dir[include_path]
include_path = cls.__get_rootfs_dir(include_path)
include_pseudo = os.path.join(include_path, "../pseudo")
if os.path.lexists(include_pseudo):
pseudo = cls.__get_pseudo(native_sysroot, include_path,
include_pseudo)
tar_cmd = "tar cf %s -C %s ." % (tar_file, include_path)
else:
pseudo = None
tar_cmd = "tar c --owner=root --group=root -f %s -C %s ." % (
tar_file, include_path)
exec_native_cmd(tar_cmd, native_sysroot, pseudo)
#create destination
if path:
destination = os.path.realpath(os.path.join(new_rootfs, path))
if not destination.startswith(new_rootfs):
logger.error("%s %s" % (destination, new_rootfs))
sys.exit(1)
Path(destination).mkdir(parents=True, exist_ok=True)
else:
destination = new_rootfs
#extract destination
untar_cmd = "tar xf %s -C %s" % (tar_file, destination)
if new_pseudo:
pseudo = cls.__get_pseudo(native_sysroot, new_rootfs, new_pseudo)
else:
pseudo = None
exec_native_cmd(untar_cmd, native_sysroot, pseudo)
os.remove(tar_file)
for orig_path in part.exclude_path or []:
path = orig_path