Hello. I observe that uboot does not read files that are at the same time compressed and inlined when built with CONFIG_FS_BTRFS=y, CONFIG_CMD_BTRFS=y, and CONFIG_ZSTD=y. (In btrfs, inlining is storing the file directly in metadata to conserve space.) uboot can read inlined files, and can read compressed files, but fails when it is compressed and inlined at the same time. So, I have to remember to defragment extlinux.conf in order to boot from a btrfs-formatted partition with compression and inlining enabled when the file gets small.
$ sudo guix system delete-generations
deleting /var/guix/profiles/system-71-link
building /gnu/store/d72pav3b9mfczd6ajsqf8rlyqyzv180d-extlinux.conf.drv...
building
/gnu/store/qsg0svs0la42ciqmh4l4mbcify41p98y-install-bootloader.scm.drv...
$ guix shell compsize -- sudo compsize /boot/extlinux/extlinux.conf
Processed 1 file, 0 regular extents (0 refs), 1 inline, 1 fragments.
Type Perc Disk Usage Uncompressed Referenced
TOTAL 60% 497B 826B 826B
zstd 60% 497B 826B 826B
$ sudo btrfs filesystem defragment --nocomp /boot/extlinux/extlinux.conf
$ guix shell compsize -- sudo compsize /boot/extlinux/extlinux.conf
Processed 1 file, 0 regular extents (0 refs), 1 inline, 1 fragments.
Type Perc Disk Usage Uncompressed Referenced
TOTAL 100% 826B 826B 826B
none 100% 826B 826B 826B
Unfortunately, I often forget to do that. I would appreciate any advice
on how could I prevent this from happening.
I have tried setting "compression none" property on the file and on the
directory "/boot/extlinux" to prevent compression. However, the file is
copied from the store, where it is compressed, so the attribute does
not apply to it. Thus, it is still necessary to uncompress it after
copying when it is small.
Here is the part of the system configuration that recompiles uboot with
btrfs and zstd support.
(define u-boot-a64-olinuxino-emmc-btrfs
(package
(inherit u-boot-a64-olinuxino-emmc)
(arguments
(substitute-keyword-arguments
(package-arguments u-boot-a64-olinuxino-emmc)
((#:phases phases)
#~(modify-phases #$phases
(add-after 'unpack 'add-btrfs-kconfig
(lambda _
(let ((defconfig "configs/a64-olinuxino-emmc_defconfig"))
(when (file-exists? defconfig)
(let ((port (open-file defconfig "a")))
(with-output-to-port port
(lambda ()
(display "\nCONFIG_FS_BTRFS=y\n")
(display "CONFIG_CMD_BTRFS=y\n")
(display "CONFIG_ZSTD=y\n")))
(close-port port))))))))))))
Roman
signature.asc
Description: This is a digitally signed message part
