OpCode.eu.org

Blog O autorze O serwisie
2026-10-13

du kłamie, czyli copy-on-write i reflink

XFS (i niektóre inne systemy plików) od pewnego czasu obsługują mechanizm „Copy on Write” (CoW) korzystający z tzw. reflink.

Mechanizm ten powoduje że polecenie cp DUZY_PLIK DUZY_PLIK2 (w ramach tego samego systemu plików) wykona się szybko i nie spowoduje rzeczywistej zajętości miejsca. Stanie się tak dlatego że system plików zamiast przekopiować rzeczywiste dane oznaczy użyje referencji na istniejące oznaczając je jedynie jako do skopiowania przy modyfikacji.

Zachowanie to zależy także od implementacji kopiowania (np. polecenia cp). Polecenie cp z gnu-utils domyślnie używa reflink (copy-on-write) gdy jest wspierane przez filesystem. Zachowanie to można kontrolować opcją --reflink. Copy-on-write zostanie użyte domyślnie także przez rsync, ale np. nie przez scp (także uruchomione bez połączenia sieciowego).

problem z du

Efektem ubocznym tego będzie podawanie niewłaściwej zajętości miejsca przez polecenia typu du (du może w takiej sytuacji pokazywać znacznie większe użycie dysku więcej niż df, nawet większe niż pojemność tego file systemu).

Polecenie /sbin/filefrag -ek pozwala sprawdzić które dane są współdzielone między różnymi plikami, można go zatem użyć do korygowania wyniku du. Skrypt du.sh dokonuje właśnie takiej korekty w celu podania rzeczywistej zajętości dysku przez dany katalog.

Mimo to nadal usunięcie tego katalogu nie gwarantuje zwolnienia takiej ilości miejsca, gdyż mogą w nim być pliki z współdzielonymi danymi do innych katalogów. Jednak ma to miejsce także z klasycznymi linkami twardymi które du obsługuje poprawnie w ramach sumowanego katalogu (pomija je)

Tagi: debian