00 EROFS Neden? SquashFS ile Karşılaştırma
EROFS (Extendable Read-Only File System), Huawei tarafından Android cihazların
system.img bölümü için tasarlanmış, Linux 5.4'te ana çekirdeğe dahil
edilmiş salt okunur bir dosya sistemidir. SquashFS'e kıyasla rastgele erişim sıkıştırması,
daha düşük mount gecikmesi ve parça tabanlı (chunk-based) sıkıştırma çözme mimarisiyle
öne çıkar.
Geleneksel SquashFS, veriyi sabit boyutlu bloklara (genellikle 128 KB) böler ve bir bloktan herhangi bir bayta erişmek için tüm bloğu belleğe çekip sıkıştırmayı çözmeniz gerekir. Bu yaklaşım sıkıştırma oranını artırırken rastgele erişim maliyetini yükseltir. EROFS ise z-erofs katmanı aracılığıyla dosyayı mantıksal blok gruplarına (logical cluster) ayırır; her grup bağımsız olarak sıkıştırılır ve doğrudan page cache'e eşlenir. Böylece disk üzerindeki verinin büyük bölümü belleğe yüklenmeden yalnızca ihtiyaç duyulan parça çözülür.
SquashFS erişim modeli:
uygulama okuma isteği
|
v
128 KB blok belleğe al
|
v
tüm bloğu sıkıştırma çöz
|
v
hedef veriyi döndür [gereksiz sıkıştırma çözme maliyeti]
EROFS z-erofs erişim modeli:
uygulama okuma isteği
|
v
mantıksal küme indeksini hesapla
|
v
yalnızca ilgili kümeyi sıkıştırma çöz
|
v
page cache'e eşle ve döndür [minimal bellek baskısı]
Gömülü sistemlerde bu fark kritiktir: 256 MB RAM'e sahip bir cihazda rootfs okumalarının büyük blok sıkıştırma çözme döngülerine takılması, hem gecikme hem de bellek kullanımı açısından olumsuz sonuçlar doğurur. EROFS bu sorunu yapısal olarak çözer.
| Özellik | SquashFS | EROFS |
|---|---|---|
| Sıkıştırma granülaritesi | Sabit blok (128 KB) | Mantıksal küme (4–32 KB) |
| Rastgele erişim maliyeti | Yüksek (tam blok çözme) | Düşük (küme düzeyi çözme) |
| Page cache entegrasyonu | Kısıtlı | Doğal (inline page mapping) |
| Mount gecikmesi | Orta | Düşük (metadata cache) |
| Desteklenen sıkıştırıcılar | gzip, lz4, lzo, xz, zstd | lz4, lzma, deflate, zstd |
| Kernel giriş versiyonu | 2.6.29 | 5.4 |
| Android kullanımı | Eski sürümler | Android 12+ |
EROFS ayrıca fragment packing özelliği sunar: küçük dosyalar (genellikle 4 KB altı) tek bir sıkıştırılmış parçada bir araya getirilir, böylece çok sayıda küçük dosya içeren rootfs imajlarında hem disk hem de bellek kullanımı belirgin biçimde azalır.
01 Dosya Sistemi Yapısı
EROFS on-disk yapısı superblock, inode tablosu, xattr depolama alanı ve z-erofs sıkıştırma katmanından oluşur. Bu katmanları anlamak, imaj optimizasyonu ve sorun giderme için temel oluşturur.
Disk üzerindeki yerleşim sabit bir sıraya sahiptir. Superblock, blok 0'dan itibaren 1024 bayt ofsetle başlar ve dosya sistemine ait tüm üst düzey meta verileri barındırır. İnode'lar compact (32 bayt) veya extended (64 bayt) formatında depolanır; extended inode zaman damgası, xattr ve büyük dosya boyutu için ek alanlar sağlar.
Blok 0 : başlangıç dolgusu (1024 B)
Blok 0+1024 : Superblock (128 B)
Blok 1 .. : İnode tablosu (compact/extended karışık)
: xattr meta veri alanı
: Veri blokları (sıkıştırılmış veya ham)
: z-erofs cluster indeks tablosu
: Shared xattr deposu
Superblock alanları (önemli olanlar):
z-erofs sıkıştırma katmanı: Her sıkıştırılmış dosya, mantıksal küme tanımlayıcıları (logical cluster descriptor) dizisine sahiptir. Her tanımlayıcı, fiziksel blok konumunu, sıkıştırma türünü ve kümenin tipine (HEAD veya NONHEAD) göre parametrelerini içerir. HEAD tipi kümeler sıkıştırma akışının başını işaret eder; NONHEAD kümeler bir önceki HEAD'in devamıdır ve ek disk alanı tüketmez.
xattr depolama: EROFS, xattr verilerini paylaşımlı bir havuzda saklar. Aynı xattr değerini taşıyan birden fazla dosya bu havuza referans verir; bu yaklaşım SELinux etiketleri gibi tekrarlayan xattr'ların oluşturduğu alan israfını ortadan kaldırır.
# Mevcut bir EROFS imajının superblock bilgilerini görüntüleme
dump.erofs -s rootfs.erofs
# Tüm inode listesi (verbose)
dump.erofs -i rootfs.erofs
# Belirli bir inode'un ayrıntıları
dump.erofs --inode=/etc/passwd rootfs.erofs
02 mkfs.erofs ile İmaj Oluşturma
mkfs.erofs aracı, erofs-utils paketinde yer alır ve bir dizinden EROFS imajı
üretir. Sıkıştırma algoritması, fragment packing, xattr kopyalama ve tekrarlanabilir yapı
seçenekleri bu araçla yapılandırılır.
erofs-utils derleme ve kurulum:
# Bağımlılıklar (Ubuntu/Debian)
sudo apt-get install liblz4-dev liblzma-dev zlib1g-dev libzstd-dev
# Kaynak koddan derleme
git clone https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git
cd erofs-utils
./autogen.sh
./configure --enable-lz4 --enable-lzma --enable-zstd
make -j$(nproc)
sudo make install
Temel kullanım:
# LZ4HC ile EROFS imajı oluşturma
mkfs.erofs -z lz4hc,12 rootfs.erofs /path/to/rootfs/
# LZMA ile maksimum sıkıştırma
mkfs.erofs -z lzma,9 rootfs.erofs /path/to/rootfs/
# Zstandard ile denge
mkfs.erofs -z zstd,3 rootfs.erofs /path/to/rootfs/
# Fragment packing etkin (küçük dosyalar birleştirilir)
mkfs.erofs -z lz4hc,12 --fragments rootfs.erofs /path/to/rootfs/
# Tekrarlanabilir yapı (zaman damgasını sabitle)
mkfs.erofs -z lz4hc,12 -T 0 rootfs.erofs /path/to/rootfs/
Önemli mkfs.erofs seçenekleri:
Yocto entegrasyonu için özel bir imaj sınıfı oluşturma:
# meta-custom/classes/erofs-image.bbclass
EROFS_COMPRESSION ?= "lz4hc,9"
EROFS_EXTRA_ARGS ?= "--fragments --dedupe -T 0"
do_image_erofs() {
mkfs.erofs \
-z ${EROFS_COMPRESSION} \
${EROFS_EXTRA_ARGS} \
${IMGDEPLOYDIR}/${IMAGE_NAME}.erofs \
${IMAGE_ROOTFS}
}
IMAGE_CMD:erofs = "do_image_erofs"
IMAGE_FSTYPES += "erofs"
Fragment packing kullanıldığında, özellikle /lib altındaki küçük paylaşımlı
kütüphane dosyaları ile /etc altındaki yapılandırma dosyaları birleştirilerek
imaj boyutu %5–15 oranında küçülebilir. Bu kazanım, dosya sistemi erişim örüntüsüne göre
değişir.
03 Kernel Yapılandırması
EROFS desteği kernel yapılandırmasında etkinleştirilmesi gereken birkaç seçenek içerir. Çekirdek boyutunu küçük tutmak için sıkıştırma algoritmalarını ve ek özellikleri dikkatli seçin.
Zorunlu çekirdek seçenekleri:
# Temel EROFS desteği (zorunlu)
CONFIG_EROFS_FS=y
# Genel sıkıştırma altyapısı
CONFIG_EROFS_FS_ZIP=y
# LZMA sıkıştırma desteği
CONFIG_EROFS_FS_ZIP_LZMA=y
# Zstandard desteği (kernel 5.16+)
CONFIG_EROFS_FS_ZIP_ZSTD=y
# Yüksek öncelikli iş kuyruğu (düşük gecikmeli sistemler için)
CONFIG_EROFS_FS_PCPU_KTHREAD=y
Modül olarak derlemek yerine =y ile çekirdeğe gömmek önerilir; bu sayede
initramfs evresinde EROFS rootfs'e geçiş sorunsuz gerçekleşir. Eğer initrd ayrı bir
ext4/cpio ise modül kullanılabilir, ancak rootfs EROFS ise mutlaka gömülü olmalıdır.
ARM64 gömülü platform için örnek defconfig eki:
# arch/arm64/configs/my_embedded_defconfig eklentisi
CONFIG_EROFS_FS=y
CONFIG_EROFS_FS_ZIP=y
CONFIG_EROFS_FS_ZIP_LZMA=y
CONFIG_EROFS_FS_ZIP_ZSTD=y
# SquashFS artık gerekli değilse devre dışı bırak
# CONFIG_SQUASHFS is not set
Çekirdek boyutu etkisi (ARM64, allmodconfig baz alınarak):
| Yapılandırma | vmlinuz artışı | Not |
|---|---|---|
| CONFIG_EROFS_FS=y | ~60 KB | Temel destek, sıkıştırmasız |
| +CONFIG_EROFS_FS_ZIP=y | ~25 KB | LZ4 çözme motoru |
| +CONFIG_EROFS_FS_ZIP_LZMA=y | ~80 KB | LZMA/XZ çözme kodu |
| +CONFIG_EROFS_FS_ZIP_ZSTD=y | ~40 KB | Zstandard çözme kodu |
Kaynak kısıtlı platformlarda yalnızca CONFIG_EROFS_FS_ZIP=y (LZ4)
etkinleştirip LZMA ve ZSTD'yi dışarıda bırakmak çekirdek boyutunu minimize eder.
LZ4HC ile üretilen bir EROFS imajını böyle bir çekirdek başarıyla okuyabilir; ancak
LZMA veya ZSTD ile üretilen imajları mount etmeye çalışırsanız
-EOPNOTSUPP hatası alırsınız.
Buildroot ile entegrasyon için BR2_PACKAGE_EROFS_UTILS=y seçeneğini
make menuconfig üzerinden Filesystem images altında etkinleştirebilirsiniz.
Ayrıca BR2_TARGET_ROOTFS_EROFS=y ile EROFS imajı otomatik üretilir.
04 Gömülü rootfs Olarak EROFS
EROFS'u gömülü bir cihazın kök dosya sistemi olarak kullanmak, salt okunur bir boot akışı gerektirir. initramfs entegrasyonu, read-only boot stratejisi ve üzerine yazılabilir katman ekleme adımlarını bu bölümde ele alacağız.
EROFS rootfs, doğrudan bir flash bölümüne (MTD veya eMMC) yazılabilir. Boot yükleyicisi çekirdeği yükledikten sonra kernel komut satırı parametresi ile kök bölümü belirtilir:
# U-Boot bootargs — eMMC bölümü üzerinde EROFS rootfs
setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=erofs ro quiet"
# MTD NAND üzerinde (UBI + EROFS)
setenv bootargs "console=ttyS0,115200 ubi.mtd=rootfs root=ubi0:rootfs rootfstype=erofs ro"
# NVMe üzerinde
setenv bootargs "console=ttyS0,115200 root=/dev/nvme0n1p3 rootfstype=erofs ro"
Saf salt okunur bir rootfs, önyükleme sonrasında /var, /tmp ve
/run gibi dizinlere yazma ihtiyacı doğurur. Bu durumu çözmek için tmpfs veya
kalıcı bir overlay katmanı kullanılır:
# /etc/fstab: tmpfs ile geçici yazılabilir dizinler
tmpfs /tmp tmpfs defaults,size=64m 0 0
tmpfs /var tmpfs defaults,size=32m 0 0
tmpfs /run tmpfs defaults,size=16m 0 0
# Önyükleme sonrası gerekli dizinleri oluştur
# /etc/tmpfiles.d/var-layout.conf
d /var/log 0755 root root -
d /var/lib 0755 root root -
d /var/run 0755 root root -
initramfs içinde EROFS pivot_root akışı: küçük bir initramfs EROFS bölümünü mount eder,
overlay katmanı hazırlar ve switch_root ile gerçek rootfs'e geçer.
Açılış akışı:
U-Boot / GRUB
| kernel + initramfs yükle
v
Kernel başlatma
|
v
initramfs (busybox init / dracut)
| mount /dev/mmcblk0p2 /newroot -t erofs -o ro
| mount tmpfs /newroot/var
| mount tmpfs /newroot/tmp
v
switch_root /newroot /sbin/init
|
v
systemd / sysvinit (EROFS rootfs üzerinde)
eMMC'de A/B bölüm düzeni ile EROFS kullanımı güvenli OTA güncellemesi sağlar: güncelleme sırasında pasif bölüm yeni EROFS imajıyla yazılır, başarılı boottest sonrası aktif bölüm değiştirilir. EROFS imajının bütünlüğü dm-verity ile doğrulanabilir.
05 Sıkıştırma Profilleri ve Benchmark
Doğru sıkıştırma algoritması ve seviyesinin seçimi hem imaj boyutunu hem de çalışma zamanı performansını doğrudan etkiler. Bu bölümde EROFS + LZ4HC ile SquashFS + ZSTD karşılaştırması ve flash okuma hızı ölçümleri ele alınmaktadır.
Test ortamı: Cortex-A53 @ 1.4 GHz, eMMC 5.1, 256 MB DDR3, ~180 MB rootfs (Yocto
kirkstone core-image-full-cmdline). Ölçümler time find / ve
dd if=/dev/mmcblk0p2 of=/dev/null bs=4M ile alınmıştır.
| Format | İmaj boyutu | Mount süresi | find / süresi | Sekansiyel okuma |
|---|---|---|---|---|
| SquashFS + gzip | 98.4 MB | 0.21 s | 4.8 s | 42 MB/s |
| SquashFS + lz4 | 121.7 MB | 0.18 s | 3.2 s | 68 MB/s |
| SquashFS + zstd,3 | 91.2 MB | 0.19 s | 4.1 s | 55 MB/s |
| EROFS + lz4hc,9 | 105.3 MB | 0.12 s | 2.9 s | 71 MB/s |
| EROFS + zstd,3 | 95.8 MB | 0.14 s | 3.1 s | 62 MB/s |
| EROFS + lzma,6 | 82.1 MB | 0.13 s | 5.8 s | 31 MB/s |
| EROFS + lz4hc,9 + fragments | 99.7 MB | 0.11 s | 2.7 s | 73 MB/s |
Sonuçlardan çıkan öneriler: Flash erişim hızını önceliklendiriyorsanız EROFS + LZ4HC + fragments kombinasyonu optimumdur. Depolama alanı kritikse EROFS + LZMA tercih edilebilir; ancak LZMA'nın yüksek CPU maliyeti nedeniyle uygulama başlatma süreleri uzar. Zstandard, ikisi arasında iyi bir denge noktasıdır.
Sıkıştırma profili karşılaştırma betiği:
#!/bin/sh
# compress_bench.sh — farklı profilleri karşılaştır
ROOTFS=/path/to/rootfs
for ALG in "lz4hc,9" "zstd,3" "lzma,6"; do
OUT="rootfs_${ALG%%,*}.erofs"
echo "=== $ALG ==="
time mkfs.erofs -z "$ALG" --fragments "$OUT" "$ROOTFS"
ls -lh "$OUT"
done
Flash ortama özel not: NOR flash üzerinde çalışan sistemlerde (özellikle QSPI NOR, ~50 MB/s sekansiyel okuma) LZ4HC avantajı belirginleşir çünkü sıkıştırma çözme işlemi flash okuma darboğazına kıyasla çok daha hızlıdır. NAND flash sistemlerinde ise bant genişliği daha yüksek olduğundan ZSTD daha dengeli sonuçlar verir.
06 Android Kullanımı
Android 12'den itibaren Google, system.img ve vendor.img
bölümleri için EROFS'u varsayılan dosya sistemi olarak belirlemiştir. Bu bölümde
Android bağlamındaki yapılandırma ve referans parametreler ele alınmaktadır.
AOSP'de EROFS imajları make_erofs aracıyla üretilir. Android Build sistemi
BOARD_*_FILE_SYSTEM_TYPE değişkenleri üzerinden dosya sistemi türünü seçer:
# device/manufacturer/product/BoardConfig.mk
# System bölümü için EROFS
BOARD_SYSTEMIMAGE_FILE_SYSTEM_TYPE := erofs
BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := erofs
# Vendor bölümü için EROFS
BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := erofs
# Product bölümü için EROFS
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := erofs
# EROFS sıkıştırma parametreleri
INTERNAL_USERIMAGES_EROFS_COMPRESSOR := lz4hc,9
INTERNAL_USERIMAGES_EROFS_COMPRESS_HINTS := true
Android'de EROFS imajları dm-verity ile birlikte kullanılır; imaj bütünlüğü çekirdek tarafından her mount işleminde doğrulanır:
Android Verified Boot akışı:
Bootloader (AVB doğrulama)
|
v
vbmeta.img doğrula (imza)
|
v
system.img hash ağacı doğrula (dm-verity)
|
v
EROFS + dm-verity katmanı mount et
|
v
/system salt okunur erişim
vendor.img yapısı OEM donanım sürücülerini barındırır; EROFS sayesinde
bu bölümün mount gecikmesi azalır ve sistem açılış süresi kısalır. Google'ın iç
ölçümlerine göre Pixel cihazlarında SquashFS'ten EROFS'a geçiş, soğuk açılış süresini
yaklaşık 100 ms kısaltmıştır.
Android GKI çekirdeklerinde EROFS yapılandırması:
# arch/arm64/configs/gki_defconfig (Android Common Kernel)
CONFIG_EROFS_FS=y
CONFIG_EROFS_FS_ZIP=y
# LZMA Android 12+ GKI'da varsayılan olarak etkin
CONFIG_EROFS_FS_ZIP_LZMA=y
AOSP dışı gömülü Linux projelerinde Android bağlamına benzer bir dm-verity + EROFS
zinciri kurulabilir. veritysetup aracı ile hash ağacı oluşturulur,
U-Boot veya özel bir bootloader doğrulama yapar ve kernel dm-verity üzerinden EROFS
imajını mount eder. Bu konu Secure Boot rehberinde ayrıntılı ele alınmaktadır.
07 overlayfs ile EROFS
EROFS salt okunur alt katman (lower layer) olarak mükemmel çalışır; overlayfs üst katmanı (upper layer) tmpfs veya kalıcı bir ext4 bölümü olabilir. Bu yapı OTA güncellemelerini basitleştirir ve rootfs bütünlüğünü korur.
Temel mantık: EROFS bölümü değişmez, güvenli bir taban sağlar; overlay üst katmanı çalışma zamanı değişikliklerini (log dosyaları, yapılandırma, durum bilgisi) yönetir. Cihaz fabrika ayarlarına sıfırlanmak istendiğinde üst katmanı temizlemek yeterlidir.
# Geçici overlay (tmpfs üst katmanı — yeniden başlatmada sıfırlanır)
mount -t erofs /dev/mmcblk0p2 /mnt/ro -o ro
mount -t tmpfs tmpfs /mnt/overlay
mkdir -p /mnt/overlay/upper /mnt/overlay/work
mount -t overlay overlay /newroot \
-o lowerdir=/mnt/ro,upperdir=/mnt/overlay/upper,workdir=/mnt/overlay/work
# Kalıcı overlay (ext4 üst katmanı — yeniden başlatmada korunur)
mount -t erofs /dev/mmcblk0p2 /mnt/ro -o ro
mount -t ext4 /dev/mmcblk0p3 /mnt/rw
mkdir -p /mnt/rw/upper /mnt/rw/work
mount -t overlay overlay /newroot \
-o lowerdir=/mnt/ro,upperdir=/mnt/rw/upper,workdir=/mnt/rw/work
Çoklu alt katman (multi-lower) düzeni: ek OTA delta katmanları ile temel EROFS imajına dokunmadan güncelleme uygulanabilir.
Çoklu alt katman overlay yapısı:
/newroot (birleşik görünüm)
|
overlayfs
|
+-- upper: /mnt/rw/upper (ext4, yazılabilir)
+-- work: /mnt/rw/work
+-- lower: /mnt/delta2:/mnt/delta1:/mnt/base
| | |
OTA v3 farkı OTA v2 farkı Temel EROFS
systemd birimi ile overlay mount otomasyonu:
# /etc/systemd/system/overlay-rootfs.service
[Unit]
Description=EROFS + overlayfs birleşik kök hazırlama
DefaultDependencies=no
Before=local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/setup-overlay.sh
[Install]
WantedBy=local-fs.target
#!/bin/sh
# /usr/sbin/setup-overlay.sh
set -e
mount -t erofs /dev/mmcblk0p2 /mnt/ro -o ro,noatime
mount -t ext4 /dev/mmcblk0p3 /mnt/rw -o noatime
mkdir -p /mnt/rw/upper /mnt/rw/work
mount -t overlay overlay /mnt/merged \
-o lowerdir=/mnt/ro,upperdir=/mnt/rw/upper,workdir=/mnt/rw/work
echo "Overlay hazir."
Dikkat: overlayfs üst katmanında inode sayısı sınırlı olabilir. tmpfs kullanıldığında
tmpfs -o nr_inodes=32768 ile sınır belirleyin; aksi hâlde çalışma zamanında
"no space left on device" hatası alınabilir.
08 Hata Ayıklama
EROFS sorunlarını teşhis etmek için erofsfuse kullanıcı alanı aracı, fsck.erofs bütünlük denetimi, çekirdek izleme olayları ve mount parametrelerinin doğru yapılandırılması gerekir.
erofsfuse — kullanıcı alanında EROFS mount:
# erofsfuse ile imajı kullanıcı alanında aç (root yetkisi gerekmez)
erofsfuse rootfs.erofs /mnt/test
# İçeriği incele
ls /mnt/test/etc/
cat /mnt/test/etc/os-release
# Unmount
fusermount -u /mnt/test
fsck.erofs — imaj bütünlük denetimi:
# Temel bütünlük denetimi
fsck.erofs rootfs.erofs
# Ayrıntılı çıktı
fsck.erofs -v rootfs.erofs
# Tüm dosyaları çıkart ve doğrula
fsck.erofs --extract rootfs.erofs /tmp/extract_test/
Çekirdek izleme olayları:
# EROFS izleme noktalarını listele
ls /sys/kernel/debug/tracing/events/erofs/
# Tüm EROFS olaylarını etkinleştir
echo 1 > /sys/kernel/debug/tracing/events/erofs/enable
echo 1 > /sys/kernel/debug/tracing/tracing_on
# Belirli bir işlem için izle
echo 0 > /sys/kernel/debug/tracing/trace
# ... tetikleyici işlem çalıştır ...
cat /sys/kernel/debug/tracing/trace | grep erofs
Yaygın mount parametreleri ve sorun giderme:
# Başarısız mount sonrası çekirdek günlüğü
dmesg | grep -i erofs
# Sıkça karşılaşılan hatalar:
# "EROFS: failed to read superblock"
# -> imaj bozuk veya yanlış blok offset kullanılmış
# "EROFS: unsupported feature"
# -> çekirdek CONFIG_EROFS_FS_ZIP_LZMA olmadan derlendi,
# LZMA imajı mount edilmeye çalışılıyor
# "EROFS: I/O error"
# -> flash/eMMC okuma hatası; donanım sorununu araştır
# imaj MD5 ile bütünlük hızlı doğrulama
md5sum rootfs.erofs
# Üretilen imajın sağlama toplamını deploy öncesi kayıt altına alın
dump.erofs ile ayrıntılı inceleme: Bir sorunun hangi dosyadan
kaynaklandığını belirlemek için dump.erofs --inode=YOLU komutu ilgili
inode'un mantıksal küme haritasını ve fiziksel blok konumlarını gösterir. Bu çıktı,
bir flash bölümündeki bozuk bloğun hangi dosyayı etkilediğini tespit etmede kullanılabilir.
# Belirli bir dosyanın inode ve küme bilgisi
dump.erofs --inode=/usr/bin/python3 rootfs.erofs
# Örnek çıktı:
# inode 1234: size=3145728, nblocks=48
# cluster[0]: type=HEAD, blkaddr=0x200, clustersize=8
# cluster[1]: type=NONHEAD, delta=1
# ...
# cluster[47]: type=HEAD, blkaddr=0x22f, clustersize=8