btrfs miért nem tömörít?

Sziasztok!

BTRFS-sel kísérletezek, most 4.4-es Linux kernel felett. Régebben ha mount opcióként az fstab-ban compress-force=zlib szerepelt, akkor gzip-pel tömörítette az inode-okat. Az utóbbi idők Linux disztribúcióiban ezt nem tapasztalom.

Ha össze akarom tömöríteni, akkor
btrfs filesystem defragment -czlib -r /mountpoint
hatására tömörödik csak össze.

Az okát keresem, mit rontok el vagy mi változott a kernelben? Netán nem elég az fstab-ban mount opcióként, hanem kell kernel boot paraméter is?

Hozzászólások

Hirtelen két okot tudok elképzelni ami miatt nem megy a tömörítés.

1. A legtöbb mount options az egész fájlrendszerre vonatkozik és csak az első subvolume opciói fognak érvényre jutni. Pl. ha egy device-on (partíción) van a root és a home subvolume, a root-on nincs compression beállítva, de a home-on van, akkor se fog a home-on tömöríteni. (Most mount options apply to the whole filesystem, and only the options for the first subvolume to be mounted will take effect. This is due to lack of implementation and may change in the future.) Ezt megoldhatjuk úgy, hogy a tömörítendő subvolume-unk root könyvtárára beállítjuk a chattr paranccsal a c (compress) flag-et.

2. A Btrfs eldönti minden fájlról, hogy érdemes-e tömöríteni és, ha úgy találja, hogy nem, akkor nem tömöríti. Ezt felülbírálhatjuk a compress-force opcióval.

Eszembe jutott egy harmadik is, csak a compression beállítása után módosított, létrehozott fájlokat tömöríti be, a már ott lévőket nem tömöríti be automatikusan.

Köszönöm az ötleteket. Elgondolkoztam rajtuk.
Telepítéskor ahogy a telepító megformázta a partíciót, már terminálablakból nyomtam a 'mount /target -o remount,compress-force=zlib parancsot. De ha upgrade során telepítek csomagokat, azt sem nyomja össze, hanem a "btrfs fi defrag -czlib ..." parancs csinál látványos tömörítést ez esetben is.

A probléma tehát továbbra is fennáll, de az ötleteid alapján több részletet tudok írni.

Ubuntu disztró, egyetlen btrfs partícióval.

$ mount | grep btrfs
/dev/sda1 on / type btrfs (rw,noatime,nodiratime,compress-force=zlib,space_cache,subvolid=257,subvol=/@)

Viszont látszik, hogy '@' subvolume, amit boot paraméterként így old meg:

$ cat /proc/cmdline
BOOT_IMAGE=/@/boot/vmlinuz-4.4.0-4-generic root=UUID=b2b4d44b-00bd-41c1-b92e-0dbb35f473f4 ro rootflags=subvol=@ quiet splash vt.handoff=7

fstab tartalma:

$ cat /etc/fstab | grep btrfs
UUID=b2b4d44b-00bd-41c1-b92e-0dbb35f473f4 / btrfs noatime,nodiratime,compress-force=zlib,subvol=@ 0 1

És a dmesg ide vonatkozó része:

$ dmesg | grep -i btrfs
[ 2.935322] Btrfs loaded
[ 3.176639] BTRFS: device fsid b2b4d44b-00bd-41c1-b92e-0dbb35f473f4 devid 1 transid 3207 /dev/sda1
[ 3.245602] BTRFS info (device sda1): disk space caching is enabled
[ 3.245607] BTRFS: has skinny extents
[ 7.673702] BTRFS info (device sda1): force zlib compression
[ 7.673706] BTRFS info (device sda1): disk space caching is enabled

Ennek ellenére nem tömöríti látszólag a fájlokat. A témaindítóban írt 'btrfs fi ...' parancs viszont felére nyomja a disztribúciót.

A rejtély megoldását továbbra is keresem.

Elképzelhető, hogy a subvolume-oknál teljesen figyelmen kívül hagyja a tömörítési opciót (bár szerintem a manuálban nem ezt írják).
Ha gondolod azt kipróbálhatod, hogy bemountolod az egész device-t valahová (pl. /mnt/btrfs). Pl. a /etc/fstab -ba beteszed:

UUID=b2b4d44b-00bd-41c1-b92e-0dbb35f473f4 /mnt/btrfs btrfs noatime,nodiratime,compress-force=zlib 0 1

(A /mnt/btrfs-t létre kell hozni, bár ezt biztos tudod)

Kíváncsi vagyok, hogy ezután tömörít-e.

A gyökér fájlrendszer úgy néz ki, hogy azért nem tömörödött, mert a kernel a /-t tömörítetlenül csatolta a bootolás során, így a /@ subvolume, amit az Ubuntu telepítő csinál a /-nek, hiába adtam át a /@ számára az fstab-ban, hogy tömörített legyen, az már nem bírálta felül a kernel btrfs gyökérre vonatkozó tömörítetlen opcióját.

Megoldás:
$ cat /proc/cmdline
BOOT_IMAGE=/@/boot/vmlinuz-4.4.0-4-generic root=UUID=b2b4d44b-00bd-41c1-b92e-0dbb35f473f4 ro rootflags=subvol=@,compress-force=zlib quiet splash vt.handoff=7

Ennek hatására az alábbi kiemelt sor már a kernel által a boot során az első felcsatolásnál kerül be és nem csak a második blokkban a /@ fstab-ban leírt csatolásánál.

[ 2.882869] Btrfs loaded
[ 3.118777] BTRFS: device fsid b2b4d44b-00bd-41c1-b92e-0dbb35f473f4 devid 1 transid 3893 /dev/sda1
[ 3.188877] BTRFS info (device sda1): force zlib compression
[ 3.188883] BTRFS info (device sda1): disk space caching is enabled
[ 3.188886] BTRFS: has skinny extents
-------> eddig itt volt az fstab általi /@ csatolásnál force zlib compression
[ 8.875752] BTRFS info (device sda1): disk space caching is enabled

Remélem ezzel sikerült ezt is megoldani, még tesztelem.

Ha ez így van, akkor elég érdekes, mert egyrészt a bootolás során sem az egész device-t csatolja, csak a /@ subvolume-ot, másrészt pedig read-only módban, így nem is sok teteje van egy írási opciónak.

Lehet, hogy ott van a kutya elásva, hogy a remount során már nem veszi figyelembe a compress mount opciót? Ha így van, akkor más mount opciók is könnyen lehet, hogy így járnak és mindent a boot-hoz kell pakolni az fstab helyett.