Real files size on LFS partition
I’ve been trying to figure out how much space is used by files that are stored on littlefs.
TLDR:
- File sizes would depend on block size, that was used for littlefs creation.
- Default values are 4096 for ESP32 & 8192 for ESP8266.
- Most accurate way is to mount using
littlefs-fuse
& get usage data.
How does platformio creates littlefs images
When you run pio run -t buildfs or pio run -t uploadfs it calls mklittlefs
tool as follows:
#ESP8266:
mklittlefs -c resources -p 256 -b 8192 -s 1024000 .pio/build/nodemcuv2/littlefs.bin
#ESP32:
tools/mklittlefs -c resources -p 256 -b 4096 -s 1507328 .pio/build/esp32/spiffs.bin
Where:
- -b - fs block size, in bytes
- -p - fs page size, in bytes
- -s - fs image size, in bytes
So if your storage drive block size is 4096, and littlefs is 8192, then you’ll get different size.
There are few different tools that would allow to analyze generated image. Let’s take a look at some of them.
Folder size comparison approach (Linux FS & LittleFS-fuse):
It is possible to mount generated littlefs.bin
image using littles-fuse, where you would get normal filesystem.
There’s great article that explains how to mount on linux.
Side-by side comparison gives different result.
Comment | result Linux | result LittleFS | command |
---|---|---|---|
Original resource folder (ls) | 90673 | 108665 | ls -la |
Original resource folder (du) | 116K | 176K | du -h . |
Platformio output / Other Tools
Data that is generated by platformio is not informative, it gives Image size & compression size during transfer. That roughly corresponds to what you would get by tar-gzip of resources folder:
Comment | result | command |
---|---|---|
Platformio upload size | 1MB / 38511 compressed | platformio run -t uploadfs |
binwalk | ???, see below | python -m binwalk img.bin |
tar & gzip res folder | 38269 | GZIP=-4 tar -zcf res2.tar img.bin |
Binwalk output:
It is possible to see fs contents using binwalk using command python -m binwalk img.bin
.
But there’s no clear indication of size of each file (even if files are detected correctly), just an address and address of next file.
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
286736 0x46010 HTML document header
298549 0x48E35 HTML document footer
303104 0x4A000 XML document, version: "1.0"
303338 0x4A0EA Copyright string: "copyright ownership."
335950 0x5204E HTML document header
339610 0x52E9A HTML document footer
345578 0x545EA Boot section Start 0x42424242 End 0x42
345582 0x545EE Boot section Start 0x42 End 0x0
368640 0x5A000 PNG image, 10 x 250, 8-bit/color RGBA, non-interlaced
376832 0x5C000 PNG image, 136 x 30, 8-bit/color RGBA, non-interlaced
376910 0x5C04E Zlib compressed data, best compression
385184 0x5E0A0 HTML document header
386675 0x5E673 HTML document footer
393216 0x60000 PNG image, 10 x 50, 8-bit/color RGBA, non-interlaced
401408 0x62000 PNG image, 10 x 100, 8-bit/color RGBA, non-interlaced
409793 0x640C1 Copyright string: "copyright ownership."
415130 0x6559A Copyright string: "copyright {"
417950 0x6609E HTML document header
420443 0x66A5B HTML document footer
425984 0x68000 PNG image, 146 x 92, 8-bit/color RGBA, non-interlaced
426046 0x6803E Zlib compressed data, best compression
Few words about platformio size
command.
It is just a wrapper for
xtensa-lx106-elf-size -B -d .pio/build/nodemcuv2/firmware.elf
I have absolutely no idea how to match numbers generated from this commands:
pio run:
RAM: [====== ] 57.7% (used 47292 bytes from 81920 bytes)
Flash: [======== ] 81.1% (used 847512 bytes from 1044464 bytes)
pio size:
text data bss dec hex filename
833484 14084 33264 880832 d70c0 firmware.elf
Troubleshooting
Sometimes fuse-mount would complain that device is busy
. See url for more info.