diff options
author | Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> | 2020-04-19 08:35:36 +0200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2020-04-26 14:00:50 +0100 |
commit | a293c76c53f985efb4cfbb97aa4facb59c0ccfb6 (patch) | |
tree | 453ffcaf321a7a27d4b43dc5a45b9a5d2cf2a314 /scripts/lib/wic/plugins/source/rootfs.py | |
parent | fc2589384bbf40b2c2b3e81b668eac71762c192f (diff) | |
download | poky-a293c76c53f985efb4cfbb97aa4facb59c0ccfb6.tar.gz |
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>
Diffstat (limited to 'scripts/lib/wic/plugins/source/rootfs.py')
-rw-r--r-- | scripts/lib/wic/plugins/source/rootfs.py | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py index 247f61ff7c..544e868b5e 100644 --- a/scripts/lib/wic/plugins/source/rootfs.py +++ b/scripts/lib/wic/plugins/source/rootfs.py | |||
@@ -17,6 +17,7 @@ import shutil | |||
17 | import sys | 17 | import sys |
18 | 18 | ||
19 | from oe.path import copyhardlinktree | 19 | from oe.path import copyhardlinktree |
20 | from pathlib import Path | ||
20 | 21 | ||
21 | from wic import WicError | 22 | from wic import WicError |
22 | from wic.pluginbase import SourcePlugin | 23 | from wic.pluginbase import SourcePlugin |
@@ -126,8 +127,63 @@ class RootfsPlugin(SourcePlugin): | |||
126 | orig_dir, new_rootfs) | 127 | orig_dir, new_rootfs) |
127 | exec_native_cmd(pseudo_cmd, native_sysroot) | 128 | exec_native_cmd(pseudo_cmd, native_sysroot) |
128 | 129 | ||
129 | for path in part.include_path or []: | 130 | for in_path in part.include_path or []: |
130 | copyhardlinktree(path, new_rootfs) | 131 | #parse arguments |
132 | include_path = in_path[0] | ||
133 | if len(in_path) > 2: | ||
134 | logger.error("'Invalid number of arguments for include-path") | ||
135 | sys.exit(1) | ||
136 | if len(in_path) == 2: | ||
137 | path = in_path[1] | ||
138 | else: | ||
139 | path = None | ||
140 | |||
141 | # Pack files to be included into a tar file. | ||
142 | # We need to create a tar file, because that way we can keep the | ||
143 | # permissions from the files even when they belong to different | ||
144 | # pseudo enviroments. | ||
145 | # If we simply copy files using copyhardlinktree/copytree... the | ||
146 | # copied files will belong to the user running wic. | ||
147 | tar_file = os.path.realpath( | ||
148 | os.path.join(cr_workdir, "include-path%d.tar" % part.lineno)) | ||
149 | if os.path.isfile(include_path): | ||
150 | parent = os.path.dirname(os.path.realpath(include_path)) | ||
151 | tar_cmd = "tar c --owner=root --group=root -f %s -C %s %s" % ( | ||
152 | tar_file, parent, os.path.relpath(include_path, parent)) | ||
153 | exec_native_cmd(tar_cmd, native_sysroot) | ||
154 | else: | ||
155 | if include_path in krootfs_dir: | ||
156 | include_path = krootfs_dir[include_path] | ||
157 | include_path = cls.__get_rootfs_dir(include_path) | ||
158 | include_pseudo = os.path.join(include_path, "../pseudo") | ||
159 | if os.path.lexists(include_pseudo): | ||
160 | pseudo = cls.__get_pseudo(native_sysroot, include_path, | ||
161 | include_pseudo) | ||
162 | tar_cmd = "tar cf %s -C %s ." % (tar_file, include_path) | ||
163 | else: | ||
164 | pseudo = None | ||
165 | tar_cmd = "tar c --owner=root --group=root -f %s -C %s ." % ( | ||
166 | tar_file, include_path) | ||
167 | exec_native_cmd(tar_cmd, native_sysroot, pseudo) | ||
168 | |||
169 | #create destination | ||
170 | if path: | ||
171 | destination = os.path.realpath(os.path.join(new_rootfs, path)) | ||
172 | if not destination.startswith(new_rootfs): | ||
173 | logger.error("%s %s" % (destination, new_rootfs)) | ||
174 | sys.exit(1) | ||
175 | Path(destination).mkdir(parents=True, exist_ok=True) | ||
176 | else: | ||
177 | destination = new_rootfs | ||
178 | |||
179 | #extract destination | ||
180 | untar_cmd = "tar xf %s -C %s" % (tar_file, destination) | ||
181 | if new_pseudo: | ||
182 | pseudo = cls.__get_pseudo(native_sysroot, new_rootfs, new_pseudo) | ||
183 | else: | ||
184 | pseudo = None | ||
185 | exec_native_cmd(untar_cmd, native_sysroot, pseudo) | ||
186 | os.remove(tar_file) | ||
131 | 187 | ||
132 | for orig_path in part.exclude_path or []: | 188 | for orig_path in part.exclude_path or []: |
133 | path = orig_path | 189 | path = orig_path |