Can there be a warning if the filesystem is not one of the supported ones?

Alex

On Mon, 11 Jan 2021 at 11:33, Paul Barker <[email protected]> wrote:

> 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.
>
> Signed-off-by: Paul Barker <[email protected]>
> ---
>  scripts/lib/wic/partition.py             | 27 +++++++++++++++++++-----
>  scripts/lib/wic/plugins/source/rootfs.py |  9 +++++---
>  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():
>          self.fsuuid = args.fsuuid
>          self.type = args.type
>          self.updated_fstab_path = None
> +        self.has_fstab = False
> +        self.update_fstab_in_rootfs = False
>
>          self.lineno = lineno
>          self.source_file = ""
> @@ -125,6 +127,8 @@ class Partition():
>          partition command parameters.
>          """
>          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.size and not self.fixed_size:
> @@ -250,7 +254,7 @@ class Partition():
>
>          prefix = "ext" if self.fstype.startswith("ext") else self.fstype
>          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
>
>          # get the rootfs size in the right units for kickstart (kB)
> @@ -258,7 +262,7 @@ class Partition():
>          out = exec_cmd(du_cmd)
>          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):
>          """
>          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)
>          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)
>          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):
>          """
>          Prepare content for a btrfs rootfs partition.
> @@ -308,7 +321,7 @@ class Partition():
>               self.mkfs_extraopts, self.fsuuid, rootfs)
>          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):
>          """
>          Prepare content for a msdos/vfat rootfs partition.
> @@ -337,12 +350,16 @@ class Partition():
>          mcopy_cmd = "mcopy -i %s -s %s/* ::/" % (rootfs, rootfs_dir)
>          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
>          exec_cmd(chmod_cmd)
>
>      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):
>          """
>          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):
>                                 "it is not a valid path, exiting" %
> part.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")
>          if not os.path.lexists(pseudo_dir):
>              logger.warn("%s folder does not exist. "
> @@ -103,7 +104,7 @@ class RootfsPlugin(SourcePlugin):
>          new_rootfs = None
>          new_pseudo = None
>          # 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
>              # interfering with other tasks. Copy to workdir.
>              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)
>                      exec_native_cmd(rm_cmd, native_sysroot, pseudo)
>
> -            has_fstab = os.path.exists(os.path.join(new_rootfs,
> "etc/fstab"))
> -            if part.updated_fstab_path and has_fstab:
> +            # Update part.has_fstab here as fstab may have been added or
> +            # 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")
>                  # 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)
> --
> 2.26.2
>
>
> 
>
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#146583): 
https://lists.openembedded.org/g/openembedded-core/message/146583
Mute This Topic: https://lists.openembedded.org/mt/79592788/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to