summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2021-05-25 13:29:51 +0200
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-05-31 14:31:01 +0100
commit63b3c44d273d03fe3ac98d6f7c8e8475b468b44e (patch)
treec5146ab07d46bd7958ebf3790ba115ed948614be /scripts
parent40d3366bea8d2417e89a37c6f2d38e1542160342 (diff)
downloadpoky-63b3c44d273d03fe3ac98d6f7c8e8475b468b44e.tar.gz
Add support for erofs filesystems
Since Linux 5.4 a new read-only filesystem is available, erofs. Compared to squashfs it offers much better read performance with and without compression enabled. It suppports two optional compressors, lz4 and lz4hc. >From the mkfs.erofs man page: EROFS is a new enhanced lightweight linux read-only filesystem with modern designs (eg. no buffer head, reduced metadata, inline xattrs/data, etc.) for scenarios which need high-performance read-only requirements, e.g. Android OS for smartphones and LIVECDs. It also provides fixed-sized output compression support, which improves storage density, keeps relatively higher compression ratios, which is more useful to achieve high performance for embedded devices with limited memory since it has unnoticable memory overhead and page cache thrashing. This commit adds support for three new filesystem targets: erofs: erofs without compression erofs-lz4: erofs with lz4 compresssion enabled erofs-lz4hc: erofs with lz4hc compression enabled (From OE-Core rev: 41dead1ff8ccc49e6cd6e6f5d41a59d164693e0d) Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/lib/wic/help.py1
-rw-r--r--scripts/lib/wic/ksparser.py7
-rw-r--r--scripts/lib/wic/partition.py16
-rw-r--r--scripts/lib/wic/plugins/source/rawcopy.py6
4 files changed, 23 insertions, 7 deletions
diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py
index bd3a2b97df..991e5094bb 100644
--- a/scripts/lib/wic/help.py
+++ b/scripts/lib/wic/help.py
@@ -930,6 +930,7 @@ DESCRIPTION
930 ext4 930 ext4
931 btrfs 931 btrfs
932 squashfs 932 squashfs
933 erofs
933 swap 934 swap
934 935
935 --fsoptions: Specifies a free-form string of options to be 936 --fsoptions: Specifies a free-form string of options to be
diff --git a/scripts/lib/wic/ksparser.py b/scripts/lib/wic/ksparser.py
index 3eb669da39..7a4cc83af5 100644
--- a/scripts/lib/wic/ksparser.py
+++ b/scripts/lib/wic/ksparser.py
@@ -157,7 +157,8 @@ class KickStart():
157 part.add_argument('--fsoptions', dest='fsopts') 157 part.add_argument('--fsoptions', dest='fsopts')
158 part.add_argument('--fstype', default='vfat', 158 part.add_argument('--fstype', default='vfat',
159 choices=('ext2', 'ext3', 'ext4', 'btrfs', 159 choices=('ext2', 'ext3', 'ext4', 'btrfs',
160 'squashfs', 'vfat', 'msdos', 'swap')) 160 'squashfs', 'vfat', 'msdos', 'erofs',
161 'swap'))
161 part.add_argument('--mkfs-extraopts', default='') 162 part.add_argument('--mkfs-extraopts', default='')
162 part.add_argument('--label') 163 part.add_argument('--label')
163 part.add_argument('--use-label', action='store_true') 164 part.add_argument('--use-label', action='store_true')
@@ -229,6 +230,10 @@ class KickStart():
229 err = "%s:%d: SquashFS does not support LABEL" \ 230 err = "%s:%d: SquashFS does not support LABEL" \
230 % (confpath, lineno) 231 % (confpath, lineno)
231 raise KickStartError(err) 232 raise KickStartError(err)
233 # erofs does not support filesystem labels
234 if parsed.fstype == 'erofs' and parsed.label:
235 err = "%s:%d: erofs does not support LABEL" % (confpath, lineno)
236 raise KickStartError(err)
232 if parsed.fstype == 'msdos' or parsed.fstype == 'vfat': 237 if parsed.fstype == 'msdos' or parsed.fstype == 'vfat':
233 if parsed.fsuuid: 238 if parsed.fsuuid:
234 if parsed.fsuuid.upper().startswith('0X'): 239 if parsed.fsuuid.upper().startswith('0X'):
diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py
index 76d144d12d..e0b2c5bdf2 100644
--- a/scripts/lib/wic/partition.py
+++ b/scripts/lib/wic/partition.py
@@ -141,9 +141,9 @@ class Partition():
141 native_sysroot) 141 native_sysroot)
142 self.source_file = "%s/fs.%s" % (cr_workdir, self.fstype) 142 self.source_file = "%s/fs.%s" % (cr_workdir, self.fstype)
143 else: 143 else:
144 if self.fstype == 'squashfs': 144 if self.fstype in ('squashfs', 'erofs'):
145 raise WicError("It's not possible to create empty squashfs " 145 raise WicError("It's not possible to create empty %s "
146 "partition '%s'" % (self.mountpoint)) 146 "partition '%s'" % (self.fstype, self.mountpoint))
147 147
148 rootfs = "%s/fs_%s.%s.%s" % (cr_workdir, self.label, 148 rootfs = "%s/fs_%s.%s.%s" % (cr_workdir, self.label,
149 self.lineno, self.fstype) 149 self.lineno, self.fstype)
@@ -369,6 +369,16 @@ class Partition():
369 (rootfs_dir, rootfs, extraopts) 369 (rootfs_dir, rootfs, extraopts)
370 exec_native_cmd(squashfs_cmd, native_sysroot, pseudo=pseudo) 370 exec_native_cmd(squashfs_cmd, native_sysroot, pseudo=pseudo)
371 371
372 def prepare_rootfs_erofs(self, rootfs, cr_workdir, oe_builddir, rootfs_dir,
373 native_sysroot, pseudo):
374 """
375 Prepare content for a erofs rootfs partition.
376 """
377 extraopts = self.mkfs_extraopts or ''
378 erofs_cmd = "mkfs.erofs %s -U %s %s %s" % \
379 (extraopts, self.fsuuid, rootfs, rootfs_dir)
380 exec_native_cmd(erofs_cmd, native_sysroot, pseudo=pseudo)
381
372 def prepare_empty_partition_ext(self, rootfs, oe_builddir, 382 def prepare_empty_partition_ext(self, rootfs, oe_builddir,
373 native_sysroot): 383 native_sysroot):
374 """ 384 """
diff --git a/scripts/lib/wic/plugins/source/rawcopy.py b/scripts/lib/wic/plugins/source/rawcopy.py
index 3c4997d8ba..fa7b1eb8ac 100644
--- a/scripts/lib/wic/plugins/source/rawcopy.py
+++ b/scripts/lib/wic/plugins/source/rawcopy.py
@@ -29,9 +29,9 @@ class RawCopyPlugin(SourcePlugin):
29 cmd = 'btrfs filesystem label %s %s' % (dst, label) 29 cmd = 'btrfs filesystem label %s %s' % (dst, label)
30 elif fstype == 'swap': 30 elif fstype == 'swap':
31 cmd = 'mkswap -L %s %s' % (label, dst) 31 cmd = 'mkswap -L %s %s' % (label, dst)
32 elif fstype == 'squashfs': 32 elif fstype in ('squashfs', 'erofs'):
33 raise WicError("It's not possible to update a squashfs " 33 raise WicError("It's not possible to update a %s "
34 "filesystem label '%s'" % (label)) 34 "filesystem label '%s'" % (fstype, label))
35 else: 35 else:
36 raise WicError("Cannot update filesystem label: " 36 raise WicError("Cannot update filesystem label: "
37 "Unknown fstype: '%s'" % (fstype)) 37 "Unknown fstype: '%s'" % (fstype))