summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorPaul Barker <pbarker@konsulko.com>2021-01-19 16:26:08 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-02-03 14:13:54 +0000
commitcbb3b9d6f498d7aab482c4fa3d76f85f8cd82ff0 (patch)
tree7aceec7a55ed2764fb84a06546c83ff9140e2b35 /scripts
parent9dee79c91533a160a03db5493bd34d648b0b6d87 (diff)
downloadpoky-cbb3b9d6f498d7aab482c4fa3d76f85f8cd82ff0.tar.gz
wic: Update pseudo db when excluding content from rootfs
To exclude content from the rootfs, wic makes a copy (using hardlinks if possible) of the rootfs directory and associated pseudo db, then removes files & directories as needed. However if these files and directories are removed using the python functions os.remove and shutil.rmtree, the copied pseudo db will not be updated correctly. For files copied from the original rootfs, if hardlinks were used successfully when copying the rootfs this should mean that the relevant inodes can't be reused and so the risk of pseudo aborts should be avoided. However, this logic doesn't apply for directories (as they can't be hardlinked) or for files added via the '--include-path' argument (as they weren't present in the original rootfs) and so there remains some risk of inodes being reused and the pseudo db becoming corrupted. To fix this, use the 'rm' command under pseudo when removing files & directories from the copied rootfs to ensure that the copied pseudo db is updated. (From OE-Core rev: 5bfdebe05a4eed1df29b2ad7c3871d323646cc50) Signed-off-by: Paul Barker <pbarker@konsulko.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit d5db7e268947f0392c2126137571a44acd29ccd6) Signed-off-by: Steve Sakoman <steve@sakoman.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/lib/wic/plugins/source/rootfs.py13
1 files changed, 8 insertions, 5 deletions
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index 8b2a067385..c96c539d03 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -129,17 +129,20 @@ class RootfsPlugin(SourcePlugin):
129 logger.error("'%s' points to a path outside the rootfs" % orig_path) 129 logger.error("'%s' points to a path outside the rootfs" % orig_path)
130 sys.exit(1) 130 sys.exit(1)
131 131
132 if new_pseudo:
133 pseudo = cls.__get_pseudo(native_sysroot, new_rootfs, new_pseudo)
134 else:
135 pseudo = None
132 if path.endswith(os.sep): 136 if path.endswith(os.sep):
133 # Delete content only. 137 # Delete content only.
134 for entry in os.listdir(full_path): 138 for entry in os.listdir(full_path):
135 full_entry = os.path.join(full_path, entry) 139 full_entry = os.path.join(full_path, entry)
136 if os.path.isdir(full_entry) and not os.path.islink(full_entry): 140 rm_cmd = "rm -rf %s" % (full_entry)
137 shutil.rmtree(full_entry) 141 exec_native_cmd(rm_cmd, native_sysroot, pseudo)
138 else:
139 os.remove(full_entry)
140 else: 142 else:
141 # Delete whole directory. 143 # Delete whole directory.
142 shutil.rmtree(full_path) 144 rm_cmd = "rm -rf %s" % (full_path)
145 exec_native_cmd(rm_cmd, native_sysroot, pseudo)
143 146
144 part.prepare_rootfs(cr_workdir, oe_builddir, 147 part.prepare_rootfs(cr_workdir, oe_builddir,
145 new_rootfs or part.rootfs_dir, native_sysroot, 148 new_rootfs or part.rootfs_dir, native_sysroot,