1
0
mirror of https://git.yoctoproject.org/poky synced 2026-06-02 13:29:49 +00:00

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: a56b9dbfeb410d235b5af2c5a846b3f1360d2d1d)

Signed-off-by: Paul Barker <pbarker@konsulko.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 5fb8ae0e9159597d7eaa9307a3a8543800bf9405)
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Paul Barker
2021-01-19 16:26:10 +00:00
committed by Richard Purdie
parent d2c89a6f15
commit 58e578f7b6
2 changed files with 28 additions and 8 deletions
+22 -5
View File
@@ -55,6 +55,8 @@ class Partition():
self.fsuuid = args.fsuuid self.fsuuid = args.fsuuid
self.type = args.type self.type = args.type
self.updated_fstab_path = None self.updated_fstab_path = None
self.has_fstab = False
self.update_fstab_in_rootfs = False
self.lineno = lineno self.lineno = lineno
self.source_file = "" self.source_file = ""
@@ -125,6 +127,8 @@ class Partition():
partition command parameters. partition command parameters.
""" """
self.updated_fstab_path = updated_fstab_path self.updated_fstab_path = updated_fstab_path
if self.updated_fstab_path and not (self.fstype.startswith("ext") or self.fstype == "msdos"):
self.update_fstab_in_rootfs = True
if not self.source: if not self.source:
if not self.size and not self.fixed_size: if not self.size and not self.fixed_size:
@@ -250,7 +254,7 @@ class Partition():
prefix = "ext" if self.fstype.startswith("ext") else self.fstype prefix = "ext" if self.fstype.startswith("ext") else self.fstype
method = getattr(self, "prepare_rootfs_" + prefix) method = getattr(self, "prepare_rootfs_" + prefix)
method(rootfs, oe_builddir, rootfs_dir, native_sysroot, pseudo) method(rootfs, cr_workdir, oe_builddir, rootfs_dir, native_sysroot, pseudo)
self.source_file = rootfs self.source_file = rootfs
# get the rootfs size in the right units for kickstart (kB) # get the rootfs size in the right units for kickstart (kB)
@@ -258,7 +262,7 @@ class Partition():
out = exec_cmd(du_cmd) out = exec_cmd(du_cmd)
self.size = int(out.split()[0]) self.size = int(out.split()[0])
def prepare_rootfs_ext(self, rootfs, oe_builddir, rootfs_dir, def prepare_rootfs_ext(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
native_sysroot, pseudo): native_sysroot, pseudo):
""" """
Prepare content for an ext2/3/4 rootfs partition. Prepare content for an ext2/3/4 rootfs partition.
@@ -282,10 +286,19 @@ class Partition():
(self.fstype, extraopts, rootfs, label_str, self.fsuuid, rootfs_dir) (self.fstype, extraopts, rootfs, label_str, self.fsuuid, rootfs_dir)
exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo)
if self.updated_fstab_path and self.has_fstab:
debugfs_script_path = os.path.join(cr_workdir, "debugfs_script")
with open(debugfs_script_path, "w") as f:
f.write("cd etc\n")
f.write("rm fstab\n")
f.write("write %s fstab\n" % (self.updated_fstab_path))
debugfs_cmd = "debugfs -w -f %s %s" % (debugfs_script_path, rootfs)
exec_native_cmd(debugfs_cmd, native_sysroot)
mkfs_cmd = "fsck.%s -pvfD %s" % (self.fstype, rootfs) mkfs_cmd = "fsck.%s -pvfD %s" % (self.fstype, rootfs)
exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo)
def prepare_rootfs_btrfs(self, rootfs, oe_builddir, rootfs_dir, def prepare_rootfs_btrfs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
native_sysroot, pseudo): native_sysroot, pseudo):
""" """
Prepare content for a btrfs rootfs partition. Prepare content for a btrfs rootfs partition.
@@ -308,7 +321,7 @@ class Partition():
self.mkfs_extraopts, self.fsuuid, rootfs) self.mkfs_extraopts, self.fsuuid, rootfs)
exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo) exec_native_cmd(mkfs_cmd, native_sysroot, pseudo=pseudo)
def prepare_rootfs_msdos(self, rootfs, oe_builddir, rootfs_dir, def prepare_rootfs_msdos(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
native_sysroot, pseudo): native_sysroot, pseudo):
""" """
Prepare content for a msdos/vfat rootfs partition. Prepare content for a msdos/vfat rootfs partition.
@@ -337,12 +350,16 @@ class Partition():
mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (rootfs, rootfs_dir) mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (rootfs, rootfs_dir)
exec_native_cmd(mcopy_cmd, native_sysroot) exec_native_cmd(mcopy_cmd, native_sysroot)
if self.updated_fstab_path and self.has_fstab:
mcopy_cmd = "mcopy -i %s %s ::/etc/fstab" % (rootfs, self.updated_fstab_path)
exec_native_cmd(mcopy_cmd, native_sysroot)
chmod_cmd = "chmod 644 %s" % rootfs chmod_cmd = "chmod 644 %s" % rootfs
exec_cmd(chmod_cmd) exec_cmd(chmod_cmd)
prepare_rootfs_vfat = prepare_rootfs_msdos prepare_rootfs_vfat = prepare_rootfs_msdos
def prepare_rootfs_squashfs(self, rootfs, oe_builddir, rootfs_dir, def prepare_rootfs_squashfs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
native_sysroot, pseudo): native_sysroot, pseudo):
""" """
Prepare content for a squashfs rootfs partition. Prepare content for a squashfs rootfs partition.
+6 -3
View File
@@ -94,6 +94,7 @@ class RootfsPlugin(SourcePlugin):
"it is not a valid path, exiting" % part.rootfs_dir) "it is not a valid path, exiting" % part.rootfs_dir)
part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir) part.rootfs_dir = cls.__get_rootfs_dir(rootfs_dir)
part.has_fstab = os.path.exists(os.path.join(part.rootfs_dir, "etc/fstab"))
pseudo_dir = os.path.join(part.rootfs_dir, "../pseudo") pseudo_dir = os.path.join(part.rootfs_dir, "../pseudo")
if not os.path.lexists(pseudo_dir): if not os.path.lexists(pseudo_dir):
logger.warn("%s folder does not exist. " logger.warn("%s folder does not exist. "
@@ -103,7 +104,7 @@ class RootfsPlugin(SourcePlugin):
new_rootfs = None new_rootfs = None
new_pseudo = None new_pseudo = None
# Handle excluded paths. # Handle excluded paths.
if part.exclude_path or part.include_path or part.change_directory or part.updated_fstab_path: if part.exclude_path or part.include_path or part.change_directory or part.update_fstab_in_rootfs:
# We need a new rootfs directory we can safely modify without # We need a new rootfs directory we can safely modify without
# interfering with other tasks. Copy to workdir. # interfering with other tasks. Copy to workdir.
new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs%d" % part.lineno)) new_rootfs = os.path.realpath(os.path.join(cr_workdir, "rootfs%d" % part.lineno))
@@ -214,8 +215,10 @@ class RootfsPlugin(SourcePlugin):
rm_cmd = "rm -rf %s" % (full_path) rm_cmd = "rm -rf %s" % (full_path)
exec_native_cmd(rm_cmd, native_sysroot, pseudo) exec_native_cmd(rm_cmd, native_sysroot, pseudo)
has_fstab = os.path.exists(os.path.join(new_rootfs, "etc/fstab")) # Update part.has_fstab here as fstab may have been added or
if part.updated_fstab_path and has_fstab: # removed by the above modifications.
part.has_fstab = os.path.exists(os.path.join(new_rootfs, "etc/fstab"))
if part.update_fstab_in_rootfs and part.has_fstab:
fstab_path = os.path.join(new_rootfs, "etc/fstab") fstab_path = os.path.join(new_rootfs, "etc/fstab")
# Assume that fstab should always be owned by root with fixed permissions # Assume that fstab should always be owned by root with fixed permissions
install_cmd = "install -m 0644 %s %s" % (part.updated_fstab_path, fstab_path) install_cmd = "install -m 0644 %s %s" % (part.updated_fstab_path, fstab_path)