summaryrefslogtreecommitdiffstats
path: root/scripts/lib/wic
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib/wic')
-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)