fs/btrfs: Introducing btrfs rootfs support.
Subsystems (2)
PATCH 2/2 fs/btrfs: Introducing btrfs rootfs support.
This patch makes it possible to format the rootfs using btrfs. It introduces the option; BR2_TARGET_ROOTFS_BTRFS
When selected, the user is able to specify the filesystem size, label, options, and node and sector sizes.
The new files are based on fs/ext2/{Config.in,ext2.mk}
--- fs/Config.in | 1 + fs/btrfs/Config.in | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ fs/btrfs/btrfs.mk | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 fs/btrfs/Config.in create mode 100644 fs/btrfs/btrfs.mk
fs/Config.in +1 -0
@@ -1,6 +1,7 @@ menu "Filesystem images" source "fs/axfs/Config.in" +source "fs/btrfs/Config.in" source "fs/cloop/Config.in" source "fs/cpio/Config.in" source "fs/cramfs/Config.in"
fs/btrfs/Config.in new file +51 -0
51 lines not on this page · raw message
fs/btrfs/btrfs.mk new file +39 -0
@@ -0,0 +1,39 @@ +################################################################################ +# +# Build the btrfs root filesystem image +# +################################################################################ + +BTRFS_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE)) +ifeq ($(BR2_TARGET_ROOTFS_BTRFS)-$(BTRFS_SIZE),y-) +$(error BR2_TARGET_ROOTFS_BTRFS_SIZE cannot be empty) +endif + +BTRFS_SIZE_NODE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_NODE)) +BTRFS_SIZE_SECTOR = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_SECTOR)) +BTRFS_FEATURES = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_FEATURES)) +# qstrip results in stripping consecutive spaces into a single one. So the +# variable is not qstrip-ed to preserve the integrity of the string value. +BTRFS_LABEL := $(subst ",,$(BR2_TARGET_ROOTFS_BTRFS_LABEL)) +# ") + +BTRFS_OPTS = \ + -r '$(TARGET_DIR)' \ + -L '$(BTRFS_LABEL)' \ + $(if $(BTRFS_SIZE_NODE),--nodesize '$(BTRFS_SIZE_NODE)') \ + $(if $(BTRFS_SIZE_SECTOR),--sectorsize '$(BTRFS_SIZE_SECTOR)') \ + $(if $(BTRFS_FEATURES),--features '$(BTRFS_FEATURES)') + +ROOTFS_BTRFS_DEPENDENCIES = host-btrfs-progs + +define ROOTFS_BTRFS_CMD + rm -f $@ + truncate -s $(BTRFS_SIZE) $@ + $(HOST_DIR)/bin/mkfs.btrfs $(BTRFS_OPTS) $@ \ + || { ret=$$?; \ + echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_BTRFS_SIZE)" 1>&2; \ + exit $$ret; \ + } +endef + +$(eval $(rootfs))
Signature · 1 line
2.11.0
PATCH 2/2 fs/btrfs: Introducing btrfs rootfs support.
Robert, All,
On 2018-08-23 23:01 +0100, Robert J. Heywood spake thusly:
Quoted 8 lines
This patch makes it possible to format the rootfs using btrfs. It introduces the option;
BR2_TARGET_ROOTFS_BTRFSWhen selected, the user is able to specify the filesystem size, label, options, and node and sector sizes.
The new files are based onfs/ext2/{Config.in,ext2.mk}Signed-off-by Robert J. Heywood <[email protected]>
However, two very minor comments, which a maintainer can fix while applying, and that escape my tired eye the previous iterations, see below...
Quoted 6 lines
fs/btrfs/Config.in new file +0
-0
fs/btrfs/Config.in line 8
Quoted 8 lines
fs/btrfs/Config.in new file +8
-0@@ -0,0 +1,51 @@ +config BR2_TARGET_ROOTFS_BTRFS + bool "btrfs root filesystem" + select BR2_PACKAGE_HOST_BTRFS_PROGS + help + Build a btrfs root filesystem. If you enable this option, you + probably want to enable the btrfs-progs package too. + +
Only one empty seprarting line is enough.
Quoted 6 lines
fs/btrfs/Config.in new file +6
-0+if BR2_TARGET_ROOTFS_BTRFS + +config BR2_TARGET_ROOTFS_BTRFS_LABEL + string "filesystem label" + +config BR2_TARGET_ROOTFS_BTRFS_SIZE
fs/btrfs/Config.in line 24
Quoted 10 lines
fs/btrfs/Config.in new file +10
-0+ string "filesystem size" + default "100m" + help + The size of the filesystem image in bytes. + Suffix with k, m, g or t for power-of-two kilo-, mega-, giga- + or terabytes. + +config BR2_TARGET_ROOTFS_BTRFS_SIZE_SECTOR + string "sector size" + default 4096
Defaults for string must be quoted.
It happens to work, because there is no symbol named `4096'.
fs/btrfs/Config.in line 36
Quoted 12 lines
fs/btrfs/Config.in new file +12
-0+ help + This value should be set to the page size in bytes. The default + value of 4096 is the the most common page size for most systems. + If the sectorsize differs from the page size, the created + filesystem may not be mountable by the kernel. + Therefore it is recommended to leave this value at 4096. Unless + you know that your kernel uses a different page size. + Suffix with k for power-of-two kilobytes. + +config BR2_TARGET_ROOTFS_BTRFS_SIZE_NODE + string "btree node size" + default 16384
Ditto.
Regards,
Yann E. MORIN.
Quoted 67 lines
fs/btrfs/Config.in new file +15
-0+ help + The tree block size in which btrfs stores metadata in bytes. + This must be a multiple of the sectorsize, but not larger than + 64KiB (65536). + Suffix with k for power-of-two kilobytes. + +config BR2_TARGET_ROOTFS_BTRFS_FEATURES + string "Filesystem Features" + help + A comma separated string of features that can be enabled + during creation time. + For a list of available options, use: + `.../host/bin/mkfs.btrfs -O list-all` + +endif # BR2_TARGET_ROOTFS_BTRFSfs/btrfs/btrfs.mk new file +39
-0@@ -0,0 +1,39 @@ +################################################################################ +# +# Build the btrfs root filesystem image +# +################################################################################ + +BTRFS_SIZE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE)) +ifeq ($(BR2_TARGET_ROOTFS_BTRFS)-$(BTRFS_SIZE),y-) +$(error BR2_TARGET_ROOTFS_BTRFS_SIZE cannot be empty) +endif + +BTRFS_SIZE_NODE = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_NODE)) +BTRFS_SIZE_SECTOR = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_SIZE_SECTOR)) +BTRFS_FEATURES = $(call qstrip,$(BR2_TARGET_ROOTFS_BTRFS_FEATURES)) +# qstrip results in stripping consecutive spaces into a single one. So the +# variable is not qstrip-ed to preserve the integrity of the string value. +BTRFS_LABEL := $(subst ",,$(BR2_TARGET_ROOTFS_BTRFS_LABEL)) +# ") + +BTRFS_OPTS = \ + -r '$(TARGET_DIR)' \ + -L '$(BTRFS_LABEL)' \ + $(if $(BTRFS_SIZE_NODE),--nodesize '$(BTRFS_SIZE_NODE)') \ + $(if $(BTRFS_SIZE_SECTOR),--sectorsize '$(BTRFS_SIZE_SECTOR)') \ + $(if $(BTRFS_FEATURES),--features '$(BTRFS_FEATURES)') + +ROOTFS_BTRFS_DEPENDENCIES = host-btrfs-progs + +define ROOTFS_BTRFS_CMD + rm -f $@ + truncate -s $(BTRFS_SIZE) $@ + $(HOST_DIR)/bin/mkfs.btrfs $(BTRFS_OPTS) $@ \ + || { ret=$$?; \ + echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_BTRFS_SIZE)" 1>&2; \ + exit $$ret; \ + } +endef + +$(eval $(rootfs))Signature · 6 lines
2.11.0 _______________________________________________ buildroot mailing list buildroot at busybox.net http://lists.busybox.net/mailman/listinfo/buildroot
Signature · 6 lines
.-----------------.--------------------.------------------.--------------------. | Yann E. MORIN | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: | | +33 662 376 056 | Software Designer | \ / CAMPAIGN | ___ | | +33 223 225 172 `------------.-------: X AGAINST | \e/ There is no | | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL | v conspiracy. | '------------------------------^-------^------------------^--------------------'
Thomas Petazzoni
AppliedPATCH 2/2 fs/btrfs: Introducing btrfs rootfs support.
In reply to Robert J. HeywoodHello Robert,
Quoted 8 lines · Robert J. Heywood
This patch makes it possible to format the rootfs using btrfs. It introduces the option;
BR2_TARGET_ROOTFS_BTRFSWhen selected, the user is able to specify the filesystem size, label, options, and node and sector sizes.
The new files are based onfs/ext2/{Config.in,ext2.mk}Signed-off-by Robert J. Heywood <[email protected]>
Thanks, I've applied, but I did a few changes. First, I fixed the issues pointed by Yann E. Morin in the Config.in file. But more importantly, see below.
fs/btrfs/btrfs.mk line 30
Quoted 2 lines
fs/btrfs/btrfs.mk new file +2
-0+define ROOTFS_BTRFS_CMD + rm -f $@
This is not needed, once you add the -f option to mkfs.btrfs, so I've done that.
fs/btrfs/btrfs.mk line 31
Quoted 1 line
fs/btrfs/btrfs.mk new file +1
-0+ truncate -s $(BTRFS_SIZE) $@
mkfs.btrfs has the --byte-count option that allows to set the size of the filesystem image to be generated, so I've used that instead and dropped the truncate -s.
fs/btrfs/btrfs.mk line 35
Quoted 4 lines
fs/btrfs/btrfs.mk new file +4
-0+ $(HOST_DIR)/bin/mkfs.btrfs $(BTRFS_OPTS) $@ \ + || { ret=$$?; \ + echo "*** Maybe you need to increase the filesystem size (BR2_TARGET_ROOTFS_BTRFS_SIZE)" 1>&2; \ + exit $$ret; \
This warning was not really useful: mkfs.btrfs automatically extends the image size as needed. So if you specify 100m, but you need 150m, mkfs.btrfs will anyway produce a 150m filesystem image, without bailing out. So an error of mkfs.brtfs cannot be explained by the BR2_TARGET_ROOTFS_BTRFS_SIZE value being too small. Therefore, I've dropped this error handling entirely.
Applied to next with those changes:
https://git.buildroot.org/buildroot/commit/?h=next&id=0aade4df1f80d7bff58da2b5d3dfd9d8d6ec4b7d
Thanks!
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Bootlin Embedded Linux and Kernel engineering https://bootlin.com