summaryrefslogtreecommitdiffstats
path: root/scripts/lib
diff options
context:
space:
mode:
authorPaul Barker <pbarker@konsulko.com>2021-01-19 16:26:10 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-01-20 22:46:18 +0000
commitda846838fc5d2a1b421767be68561cdaa08bca42 (patch)
tree6402f67ec29c819a984ec6c2212d08dbd54b4e4e /scripts/lib
parent36575a949399953f98fc1cfda4a3dcb5a295b02c (diff)
downloadpoky-da846838fc5d2a1b421767be68561cdaa08bca42.tar.gz
wic: Optimise fstab modification for ext2/3/4 and msdos partitions
The fix for [Yocto #13994] required the rootfs directory to be copied (using hardlinks if possible) when modifying the fstab file under wic. We can optimise this copy away for filesystems where we have the tools to modify the contents of the partition image after it is created. For ext2/3/4 filesystems we have the debugfs tool and for msdos/vfat filesystems we have the mcopy tool. So for any of these filesystems we skip the modification of the fstab file in the rootfs directory (and skip the associated copy unless it is otherwise necessary) and update the contents of fstab directly in the partition image. (From OE-Core rev: 5fb8ae0e9159597d7eaa9307a3a8543800bf9405) Signed-off-by: Paul Barker <pbarker@konsulko.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib')
-rw-r--r--scripts/lib/wic/partition.py27
-rw-r--r--scripts/lib/wic/plugins/source/rootfs.py9
2 files changed, 28 insertions, 8 deletions
diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
index f59eceb23d..e574f40c47 100644
--- a/scripts/lib/wic/partition.py
+++ b/scripts/lib/wic/partition.py
@@ -55,6 +55,8 @@ class Partition():
55 self.fsuuid = args.fsuuid 55 self.fsuuid = args.fsuuid
56 self.type = args.type 56 self.type = args.type
57 self.updated_fstab_path = None 57 self.updated_fstab_path = None
58 self.has_fstab = False
59 self.update_fstab_in_rootfs = False
58 60
59 self.lineno = lineno 61 self.lineno = lineno
60 self.source_file = "" 62 self.source_file = ""
@@ -125,6 +127,8 @@ class Partition():
125 partition command parameters. 127 partition command parameters.
126 """ 128 """
127 self.updated_fstab_path = updated_fstab_path 129 self.updated_fstab_path = updated_fstab_path
130 if self.updated_fstab_path and not (self.fstype.startswith("ext") or self.fstype == "msdos"):
131 self.update_fstab_in_rootfs = True
128 132
129 if not self.source: 133 if not self.source:
130 if not self.size and not self.fixed_size: 134 if not self.size and not self.fixed_size:
@@ -250,7 +254,7 @@ class Partition():
250 254
251 prefix = "ext" if self.fstype.startswith("ext") else self.fstype 255 prefix = "ext" if self.fstype.startswith("ext") else self.fstype
252 method = getattr(self, "prepare_rootfs_" + prefix) 256 method = getattr(self, "prepare_rootfs_" + prefix)
253 method(rootfs, oe_builddir, rootfs_dir, native_sysroot, pseudo) 257 method(rootfs, cr_workdir, oe_builddir, rootfs_dir, native_sysroot, pseudo)
254 self.source_file = rootfs 258 self.source_file = rootfs
255 259
256 # get the rootfs size in the right units for kickstart (kB) 260 # get the rootfs size in the right units for kickstart (kB)
@@ -258,7 +262,7 @@ class Partition():
258 out = exec_cmd(du_cmd) 262 out = exec_cmd(du_cmd)
259 self.size = int(out.split()[0]) 263 self.size = int(out.split()[0])
260 264
261 def prepare_rootfs_ext(self, rootfs, oe_builddir, rootfs_dir, 265 def prepare_rootfs_ext(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
262 native_sysroot, pseudo): 266 native_sysroot, pseudo):
263 """ 267 """
264 Prepare content for an ext2/3/4 rootfs partition. 268 Prepare content for an ext2/3/4 rootfs partition.
@@ -282,10 +286,19 @@ class Partition():
282 (self.fstype, extraopts, rootfs, label_str, self.fsuuid, rootfs_dir) 286 (self.fstype, extraopts, rootfs, label_str, self.fsuuid, rootfs_dir)
283 exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) 287 exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo)
284 288
289 if self.updated_fstab_path and self.has_fstab:
290 debugfs_script_path = os.path.join(cr_workdir, "debugfs_script")
291 with open(debugfs_script_path, "w") as f:
292 f.write("cd etc\n")
293 f.write("rm fstab\n")
294 f.write("write %s fstab\n" % (self.updated_fstab_path))
295 debugfs_cmd = "debugfs -w -f %s %s" % (debugfs_script_path, rootfs)
296 exec_native_cmd(debugfs_cmd, native_sysroot)
297
285 mkfs_cmd = "fsck.%s -pvfD %s" % (self.fstype, rootfs) 298 mkfs_cmd = "fsck.%s -pvfD %s" % (self.fstype, rootfs)
286 exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) 299 exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo)
287 300
288 def prepare_rootfs_btrfs(self, rootfs, oe_builddir, rootfs_dir, 301 def prepare_rootfs_btrfs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
289 native_sysroot, pseudo): 302 native_sysroot, pseudo):
290 """ 303 """
291 Prepare content for a btrfs rootfs partition. 304 Prepare content for a btrfs rootfs partition.
@@ -308,7 +321,7 @@ class Partition():
308 self.mkfs_extraopts, self.fsuuid, rootfs) 321 self.mkfs_extraopts, self.fsuuid, rootfs)
309 exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) 322 exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo)
310 323
311 def prepare_rootfs_msdos(self, rootfs, oe_builddir, rootfs_dir, 324 def prepare_rootfs_msdos(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
312 native_sysroot, pseudo): 325 native_sysroot, pseudo):
313 """ 326 """
314 Prepare content for a msdos/vfat rootfs partition. 327 Prepare content for a msdos/vfat rootfs partition.
@@ -337,12 +350,16 @@ class Partition():
337 mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (rootfs, rootfs_dir) 350 mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (rootfs, rootfs_dir)
338 exec_native_cmd(mcopy_cmd, native_sysroot) 351 exec_native_cmd(mcopy_cmd, native_sysroot)
339 352
353 if self.updated_fstab_path and self.has_fstab:
354 mcopy_cmd = "mcopy -i %s %s ::/etc/fstab" % (rootfs, self.updated_fstab_path)
355 exec_native_cmd(mcopy_cmd, native_sysroot)
356
340 chmod_cmd = "chmod 644 %s" % rootfs 357 chmod_cmd = "chmod 644 %s" % rootfs
341 exec_cmd(chmod_cmd) 358 exec_cmd(chmod_cmd)
342 359
343 prepare_rootfs_vfat = prepare_rootfs_msdos 360 prepare_rootfs_vfat = prepare_rootfs_msdos
344 361
345 def prepare_rootfs_squashfs(self, rootfs, oe_builddir, rootfs_dir, 362 def prepare_rootfs_squashfs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
346 native_sysroot, pseudo): 363 native_sysroot, pseudo):
347 """ 364 """
348 Prepare content for a squashfs rootfs partition. 365 Prepare content for a squashfs rootfs partition.
diff --git a/scripts/lib/wic/plugins/source/rootfs.py b/scripts/lib/wic/plugins/source/rootfs.py
index 6fd415af5b..96d940a91d 100644
--- a/scripts/lib/wic/plugins/source/rootfs.py
+++ b/scripts/lib/wic/plugins/source/rootfs.py
@@ -94,6 +94,7 @@ class RootfsPlugin(SourcePlugin):
94 "it is not a valid path, exiting" % part.rootfs_dir) 94 "it is not a valid path, exiting" % part.rootfs_dir)
95 95
96 part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir) 96 part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
97 part.has_fstab = os.path.exists(os.path.join(part.rootfs_dir, "etc/fstab"))
97 pseudo_dir = os.path.join(part.rootfs_dir, "../pseudo") 98 pseudo_dir = os.path.join(part.rootfs_dir, "../pseudo")
98 if not os.path.lexists(pseudo_dir): 99 if not os.path.lexists(pseudo_dir):
99 logger.warn("%s folder does not exist. " 100 logger.warn("%s folder does not exist. "
@@ -103,7 +104,7 @@ class RootfsPlugin(SourcePlugin):
103 new_rootfs = None 104 new_rootfs = None
104 new_pseudo = None 105 new_pseudo = None
105 # Handle excluded paths. 106 # Handle excluded paths.
106 if part.exclude_path or part.include_path or part.change_directory or part.updated_fstab_path: 107 if part.exclude_path or part.include_path or part.change_directory or part.update_fstab_in_rootfs:
107 # We need a new rootfs directory we can safely modify without 108 # We need a new rootfs directory we can safely modify without
108 # interfering with other tasks. Copy to workdir. 109 # interfering with other tasks. Copy to workdir.
109 new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs%d" % part.lineno)) 110 new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs%d" % part.lineno))
@@ -214,8 +215,10 @@ class RootfsPlugin(SourcePlugin):
214 rm_cmd = "rm -rf %s" % (full_path) 215 rm_cmd = "rm -rf %s" % (full_path)
215 exec_native_cmd(rm_cmd, native_sysroot, pseudo) 216 exec_native_cmd(rm_cmd, native_sysroot, pseudo)
216 217
217 has_fstab = os.path.exists(os.path.join(new_rootfs, "etc/fstab")) 218 # Update part.has_fstab here as fstab may have been added or
218 if part.updated_fstab_path and has_fstab: 219 # removed by the above modifications.
220 part.has_fstab = os.path.exists(os.path.join(new_rootfs, "etc/fstab"))
221 if part.update_fstab_in_rootfs and part.has_fstab:
219 fstab_path = os.path.join(new_rootfs, "etc/fstab") 222 fstab_path = os.path.join(new_rootfs, "etc/fstab")
220 # Assume that fstab should always be owned by root with fixed permissions 223 # Assume that fstab should always be owned by root with fixed permissions
221 install_cmd = "install -m 0644 %s %s" % (part.updated_fstab_path, fstab_path) 224 install_cmd = "install -m 0644 %s %s" % (part.updated_fstab_path, fstab_path)