Dlaczego istnieje tak wiele różnych sposobów pomiaru zużycia dysku?

113

Kiedy sumuję rozmiary moich plików, otrzymuję jedną cyfrę. Jeśli ucieknę du, dostanę inną postać. Jeśli uruchomię duwszystkie pliki na mojej partycji, nie będzie to zgodne z zastosowanymi dfoświadczeniami. Dlaczego jest tyle różnych liczb dla całkowitego rozmiaru moich plików? Nie można dodać komputerów?

Mówiąc o dodawaniu: kiedy dodam kolumny „Używany” i „Dostępny” df, nie otrzymuję całkowitej liczby. A ta całkowita liczba jest mniejsza niż rozmiar mojej partycji. A jeśli dodam rozmiary partycji, nie otrzymam rozmiaru dysku! Co daje?

Gilles
źródło

Odpowiedzi:

143

Dodawanie liczb jest łatwe. Problem polega na tym, że istnieje wiele różnych liczb do dodania.

Ile miejsca na dysku zajmuje plik?

Podstawową ideą jest to, że plik zawierający n bajtów wykorzystuje n bajtów miejsca na dysku, plus trochę dla niektórych informacji kontrolnych: metadane pliku (uprawnienia, znaczniki czasu itp.), I trochę narzutu dla informacji potrzebnych systemowi znajdź, gdzie plik jest przechowywany. Istnieje jednak wiele komplikacji.

Powikłania mikroskopowe

Pomyśl o każdym pliku jako serii książek w bibliotece. Mniejsze pliki tworzą tylko jeden wolumin, ale większe pliki składają się z wielu woluminów, takich jak encyklopedia. Aby móc zlokalizować pliki, istnieje katalog kart, który odwołuje się do każdego woluminu. Każdy tom ma trochę narzutu z powodu okładek. Jeśli plik jest bardzo mały, narzut ten jest stosunkowo duży. Również sam katalog kart zajmuje trochę miejsca.

Idąc nieco bardziej technicznie, w typowym prostym systemie plików, przestrzeń jest podzielona na bloki . Typowy rozmiar bloku to 4KiB. Każdy plik zajmuje całkowitą liczbę bloków. O ile rozmiar pliku nie jest wielokrotnością rozmiaru bloku, ostatni blok jest używany tylko częściowo. Tak więc plik 1-bajtowy i plik 4096-bajtowy zajmują 1 blok, podczas gdy plik 4097-bajtowy zajmuje dwa bloki. Możesz to zaobserwować za pomocą dupolecenia: jeśli twój system plików ma rozmiar bloku 4KiB, wtedy duzgłosi 4KiB dla pliku 1-bajtowego.

Jeśli plik jest duży, to dodatkowe bloki są potrzebne tylko do przechowywania listy bloków, które tworzą plik (są to bloki pośrednie , bardziej wyrafinowane systemy plików mogą zoptymalizować ten w postaci zakresów ). Nie wyświetlają się one w rozmiarze pliku zgłoszonym przez ls -lGNU du --apparent-size; du, który zgłasza użycie dysku w przeciwieństwie do rozmiaru, uwzględnia je.

Niektóre systemy plików próbują ponownie wykorzystać wolne miejsce w ostatnim bloku, aby spakować kilka ogonów plików w tym samym bloku . Niektóre systemy plików (takie jak ext4 od Linuksa 3.8 używają bloków 0 dla małych plików (zaledwie kilka bajtów), które całkowicie pasują do i-węzła.

Powikłania makroskopowe

Ogólnie, jak pokazano powyżej, całkowity rozmiar zgłaszany przez dujest sumą rozmiarów bloków lub zakresów używanych przez plik.

Rozmiar zgłaszany przez dumoże być mniejszy, jeśli plik jest skompresowany. Systemy uniksowe tradycyjnie obsługują prostą formę kompresji: jeśli blok pliku zawiera tylko bajty puste, to zamiast przechowywać blok zer, system plików może całkowicie pominąć ten blok. Plik z pominiętymi blokami taki jak ten nazywa się plikiem rzadkim . Pliki rzadkie nie są tworzone automatycznie, gdy plik zawiera dużą serię pustych bajtów, aplikacja musi ustawić, aby plik był rzadki.

Niektóre systemy plików, takie jak btrfs i zfs, obsługują kompresję ogólnego zastosowania .

Zaawansowane komplikacje

Dwie główne cechy bardzo nowoczesnych systemów plików, takie jak zfs i btrfs, znacznie zwiększają zależność między wielkością pliku a użyciem dysku: migawki i deduplikacja.

Migawki to stan zablokowania systemu plików w określonym dniu. Systemy plików obsługujące tę funkcję mogą zawierać wiele migawek wykonanych w różnych terminach. Te migawki oczywiście zajmują miejsce. Z jednej strony, jeśli usuniesz wszystkie pliki z aktywnej wersji systemu plików, system plików nie stanie się pusty, jeśli pozostaną migawki.

Każdy plik lub blok, który nie zmienił się od momentu utworzenia migawki lub pomiędzy dwoma migawkami, istnieje identycznie w migawce i w aktywnej wersji lub innej migawce. Jest to realizowane przez kopiowanie przy zapisie . W niektórych przypadkach może się zdarzyć, że usunięcie pliku w pełnym systemie plików zakończy się niepowodzeniem z powodu niewystarczającej ilości dostępnego miejsca - ponieważ usunięcie tego pliku wymagałoby wykonania kopii bloku w katalogu i nie ma już miejsca na ten blok.

Deduplikacja to technika optymalizacji pamięci, która polega na unikaniu przechowywania identycznych bloków. W przypadku typowych danych poszukiwanie duplikatów nie zawsze jest warte wysiłku. Zarówno zfs, jaki btrfs obsługują deduplikację jako funkcję opcjonalną.

Dlaczego suma duróżni się od sumy rozmiarów plików?

Jak widzieliśmy powyżej, rozmiar zgłaszany przez dudla każdego pliku jest zwykle sumą rozmiarów bloków lub zakresów używanych przez plik. Zauważ, że domyślnie ls -lwyświetla rozmiary w bajtach, ale dupodaje rozmiary w KiB lub 512-bajtowych jednostkach (sektorach) w niektórych bardziej tradycyjnych systemach ( du -kwymusza użycie kilobajtów). Większość współczesnych jednorożców obsługuje ls -lhi du -hużywa liczb „czytelnych dla człowieka” za pomocą K, M, G itp. (Odpowiednio dla KiB, MiB, GiB).

Po uruchomieniu duw katalogu sumuje się użycie na dysku wszystkich plików w drzewie katalogów, w tym samych katalogów . Katalog zawiera dane (nazwy plików i wskaźnik do miejsca, w którym znajdują się metadane pliku), więc potrzebuje trochę miejsca do przechowywania. Mały katalog zajmie jeden blok, większy katalog będzie wymagał więcej bloków. Ilość pamięci wykorzystywanej przez katalog czasami zależy nie tylko od zawartych w nim plików, ale również od kolejności ich wstawienia i usunięcia niektórych plików (w przypadku niektórych systemów plików może to powodować problemy - kompromis między miejscem na dysku a wydajnością ), ale różnica będzie niewielka (dodatkowy blok tu i tam). Kiedy biegnieszls -ld /some/directory, podany jest rozmiar katalogu. (Zauważ, że linia „total NNN” u góry wyniku ls -ljest liczbą niepowiązaną, jest to suma rozmiarów w blokach wymienionych pozycji, wyrażona w KiB lub sektorach.)

Pamiętaj, że duobejmuje pliki kropek, które lsnie są wyświetlane, chyba że użyjesz opcji -Alub -a.

Czasami duzgłasza mniej niż oczekiwana suma. Dzieje się tak, jeśli wewnątrz drzewa katalogów znajdują się twarde łącza : duzlicza każdy plik tylko raz.

W niektórych systemach plików, takich jak ZFSLinux, dunie zgłasza pełnego miejsca na dysku zajmowanego przez rozszerzone atrybuty pliku.

Uwaga: jeśli w katalogu znajdują się punkty montowania, dupoliczą również wszystkie pliki w tych punktach montowania, chyba że podano -xopcję. Jeśli na przykład chcesz mieć całkowity rozmiar plików w głównym systemie plików, uruchom du -x /, a nie du /.

Jeśli system plików jest podłączony do niepustego katalogu , pliki w tym katalogu są ukryte przez podłączony system plików. Nadal zajmują swoje miejsce, ale duich nie znajdują.

Usunięte pliki

Gdy plik zostanie usunięty , to tylko usuwa się wpis w katalogu, niekoniecznie sam plik. Aby faktycznie usunąć plik i tym samym odzyskać miejsce na dysku, konieczne są dwa warunki:

  • Liczba linków pliku musi spaść do 0: jeśli plik ma wiele twardych linków, usunięcie jednego nie wpływa na inne.
  • Tak długo, jak plik jest otwarty przez jakiś proces, dane pozostają. Plik jest usuwany dopiero po zamknięciu wszystkich procesów. Dane wyjściowe fuser -mlub lsofpunkt podłączenia obejmują procesy, w których plik jest otwarty w tym systemie plików, nawet jeśli plik zostanie usunięty.
  • nawet jeśli żaden proces nie ma otwartego usuniętego pliku, przestrzeń pliku może nie zostać odzyskana, jeśli plik ten jest zapleczem loopurządzenia. losetup -a(as root) może powiedzieć, które loopurządzenia są aktualnie skonfigurowane i na jakim pliku. Urządzenie pętli musi zostać zniszczone (za pomocą losetup -d), aby można było odzyskać miejsce na dysku.

Jeśli usuniesz plik w niektórych menedżerach plików lub środowiskach GUI, może on zostać umieszczony w koszu, gdzie można go usunąć. Tak długo, jak plik można usunąć, jego miejsce jest nadal zajęte.

Z czego dfdokładnie pochodzą te liczby ?

Typowy system plików zawiera:

  • Bloki zawierające dane plików (w tym katalogów) i niektóre metadane (w tym bloki pośrednie i rozszerzone atrybuty w niektórych systemach plików).
  • Darmowe bloki.
  • Bloki zarezerwowane dla użytkownika root.
  • superbloki i inne informacje kontrolne.
  • I-węzły
  • czasopismo

Tylko pierwszy rodzaj jest zgłaszany przez du. Jeśli chodzi o to df, co wchodzi w kolumny „używane”, „dostępne” i całkowitą, zależy od systemu plików (oczywiście używane bloki (w tym pośrednie) są zawsze w kolumnie „używane”, a nieużywane bloki zawsze w „ dostępne ”).

Systemy plików w ext2 / ext3 / ext4 rezerwują 5% miejsca dla użytkownika root. Jest to przydatne w głównym systemie plików, aby utrzymać działanie systemu, jeśli się zapełni (w szczególności do rejestrowania, i pozwolić administratorowi systemu przechowywać trochę danych podczas rozwiązywania problemu). Nawet w przypadku partycji danych, takich jak /homezachowanie zarezerwowanego miejsca jest przydatne, ponieważ prawie pełny system plików jest podatny na fragmentację. Linux próbuje uniknąć fragmentacji (co spowalnia dostęp do plików, szczególnie na obrotowych urządzeniach mechanicznych, takich jak dyski twarde), wstępnie przydzielając wiele kolejnych bloków podczas zapisywania pliku, ale jeśli nie ma wielu kolejnych bloków, to nie może działać .

Tradycyjne systemy plików, włącznie z ext4, ale bez btrfs, rezerwują stałą liczbę i- węzłów podczas tworzenia systemu plików. To znacznie upraszcza konstrukcję systemu plików, ale ma tę wadę, że liczba i-węzłów musi być odpowiednio dobrana: przy zbyt wielu i-węzłach marnuje się miejsce; przy zbyt małej liczbie i-węzłów w systemie plików może zabraknąć i-węzłów, zanim zabraknie miejsca. Polecenie df -ipodaje liczbę używanych i-węzłów i liczbę dostępnych (systemy plików, w których koncepcja nie ma zastosowania, mogą zgłaszać 0).

Uruchamianie tune2fs -lna woluminie zawierającym system plików ext2 / ext3 / ext4 zgłasza niektóre statystyki, w tym całkowitą liczbę i liczbę wolnych i-węzłów i bloków.

Inną funkcją, która może mylić materię, są podwoluminy (obsługiwane w btrfs i w zfs pod zestawami danych nazw ). Wiele podwoluminów ma tę samą przestrzeń, ale ma osobne korzenie drzewa katalogów.

Jeśli system plików jest podłączony przez sieć (NFS, Samba itp.), A serwer eksportuje część tego systemu plików (np . Serwer ma /homesystem plików i eksportuje/home/bob ), to dfna kliencie odzwierciedla dane dla całego systemu plików, a nie tylko dla części, która jest eksportowana i montowana na kliencie.

Co wykorzystuje miejsce na moim dysku?

Jak widzieliśmy powyżej, całkowity rozmiar zgłaszany przez dfnie zawsze uwzględnia wszystkie dane sterujące systemu plików. Użyj narzędzi specyficznych dla systemu plików, aby w razie potrzeby uzyskać dokładny rozmiar systemu plików. Na przykład w przypadku ext2 / ext3 / ext4 uruchom tune2fs -li pomnóż rozmiar bloku przez liczbę bloków.

Podczas tworzenia systemu plików zwykle wypełnia on dostępne miejsce na otaczającej partycji lub woluminie. Czasami możesz mieć mniejszy system plików, gdy przenosisz systemy plików lub zmieniasz rozmiar woluminów.

W systemie Linux lsblkprzedstawia ładny przegląd dostępnych woluminów pamięci. Aby uzyskać dodatkowe informacje lub jeśli nie masz lsblk, skorzystaj ze specjalistycznych narzędzi do zarządzania woluminami lub partycjonowania, aby sprawdzić, jakie masz partycje. W systemie Linux istnieje lvs, vgs, pvsdla LVM , fdiskdla tradycyjnych PC-style ( „MBR”) przegród (jak również GPT w dotychczasowych systemach), gdiskdla GPT partycji, disklabeldla etykiet dysków BSD Parteda itp pod Linuksem, cat /proc/partitionsdaje krótkie podsumowanie. Typowe instalacje mają co najmniej dwie partycje lub woluminy używane przez system operacyjny: system plików (czasem więcej) i wolumin wymiany .

Niektóre komputery mają partycję zawierającą BIOS lub inne oprogramowanie diagnostyczne. Komputery z UEFI mają dedykowaną partycję bootloadera.

Na koniec zauważ, że większość programów komputerowych używa jednostek opartych na mocach 1024 = 2 10 (ponieważ programiści kochają binarne i potęgi 2). Więc 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B, ... Oficjalnie, jednostki te są znane jako kibibyte KiB, mebibyte MiB, itp, ale większość oprogramowania tylko raporty k lub kB, M lub MB itp. Z drugiej strony producenci dysków twardych systematycznie stosują system metryczny (jednostki oparte na 1000). Tak więc dysk o pojemności 1 TB to tylko 931 GiB lub 0,904 TiB.

Gilles
źródło
1
@Kiwy tune2fswymaga dostępu do odczytu do urządzenia blokowego zawierającego system plików, co ogólnie wymaga rootowania, ponieważ pozwala to na odczyt zawartości dowolnego pliku.
Gilles
20
Wiem, że „dziękuję” jest zniechęcone w SE, ale Gilles zasługujesz na ogromne „dziękuję” za ten wspaniały post.
dotancohen
1
Pamiętam, jak widziałem katalog kart, gdy miałem 6 lat. Zastanawiam się, ilu nie będzie wiedziało, czym są?
Izkata,
1
@ illuminÉ To dla mnie zbyt zaawansowany system Solaris, nie wiem na jakim poziomie.
Gilles
1
du robi konto dla bloków pośrednich. To główna różnica w stosunku do rozmiaru pliku zgłoszonego przez ls -l.
Stéphane Chazelas,
4

Krótkie podsumowanie komplikacji związanych z obliczaniem rozmiarów plików i przestrzeni dyskowych:

  • Przestrzeń, jaką plik zajmuje na dysku, jest zwielokrotnieniem liczby bloków, jakie zajmuje, w stosunku do wielkości każdego bloku + liczby zajętych i-węzłów. 1 bajtowy plik zajmie co najmniej 1 blok, 1 i-węzeł i jeden wpis do katalogu.

    Ale może to zająć tylko 1 dodatkowy wpis katalogu, jeśli plik jest twardym łączem do innego pliku. Byłoby to tylko kolejne odniesienie do tego samego zestawu bloków.

  • Rozmiar zawartości pliku. To się lswyświetla.
  • Wolne miejsce na dysku nie jest rozmiarem największego pliku, w którym można zmieścić, ani sumą wszystkich rozmiarów zawartości pliku, które zmieszczą się na dysku. Jest gdzieś pomiędzy. Zależy to od liczby plików (zajmujących i-węzły), rozmiaru bloku i tego, jak dokładnie zawartość każdego pliku całkowicie wypełnia bloki.

To tylko drapanie po powierzchni systemów plików i jest zbyt uproszczone. Pamiętaj także, że różne systemy plików działają inaczej.

statjest bardzo pomocny w wykrywaniu niektórych z tych informacji. Oto kilka przykładów użycia statystyki i jej zastosowania: http://landoflinux.com/linux_stat_command_examples.html

Pedro
źródło
1
Plik 1-bajtowy zwykle zajmuje jeden blok, a nie 8. Utworzenie twardego łącza w ogóle nie tworzy i-węzła: jeden plik jest jednym i-węzłem bez względu na to, ile łączy do pliku. Utworzenie twardego łącza wymaga tylko miejsca na wpis w katalogu.
Gilles,
Dzięki za poprawki, co prawda moja pamięć dotycząca: głębsze studiowanie ext2 jest teraz trochę rozmyte. Śledziłem dane wyjściowe statystyki re: liczba bloków - wydawało się to nadmierne, ale o to chodzi. Poprawię odpowiedź.
Pedro
1
Wynika to z faktu, że 1 blok ext2 = 8 bloków statystycznych, jeśli system plików ext2 wykorzystuje bloki 4kB: stat z powodów historycznych liczy się w blokach 512-bajtowych. Zobacz unix.stackexchange.com/questions/14409/…
Gilles
2

Zilustruję tutaj różne przypadki, które powodują duodmienność df.

dfzlicza bloki przydzielone przez system plików, duużyj informacji o rozmiarze każdego pliku. Różnica może mieć wiele przyczyn:

1) Niepowiązane (usunięte) pliki, które są nadal otwarte przez aplikację. Brak informacji o pliku, blok jest nadal przydzielany. lsof +aL1 <filesystem>pomoże ci zidentyfikować procesy. Przez większość czasu musisz zabijać procesy, aby zwolnić miejsce (zależy to od procesu, czasem wystarczy przeładowanie konfiguracji).

2) Pliki poniżej punktów montowania ukryte, duale nie do df. debugfsmoże pomóc w odczytaniu systemu plików.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) Rzadkie pliki, które wyglądają na większe niż w rzeczywistości. nieprzydzielone bloki nie są liczone, dfale pozorny rozmiar pliku jest liczony przez du.

Pamiętaj, że twarde linki nie głupią du

Emmanuel
źródło
2

dfjest zwykle używany do sprawdzenia, jakie są systemy plików, jak pełny jest każdy z nich i gdzie są zamontowane. Jest to bardzo przydatne, gdy brakuje miejsca w systemie plików i być może chcesz przenosić różne systemy plików lub kupić większy dysk itp.

dupokazuje szczegóły, ile skumulowanej przestrzeni dyskowej zużywa każdy z katalogów (podobnie jak windirstatw systemie Windows). Idealne do znalezienia miejsca, w którym zajmujesz miejsce podczas próby czyszczenia plików.

Oprócz drobnych różnic liczbowych wyjaśnionych przez innych, myślę, że narzędzia dui dfnarzędzia służą bardzo różnym celom.

Jim Robertson
źródło