Formuła: Co to jest , że liczba?
total int = Suma (physic_blocks_in_use) * physic_block_size / ls_block_size) dla każdego pliku.
Gdzie:
ls_block_size
jest dowolną zmienną środowiskową (zwykle 512 lub 1024 bajtów), którą można dowolnie modyfikować z włączoną
--block-size=<int>
flagą ls
, POSIXLY_CORRECT=1
zmienną środowiskową GNU (w celu uzyskania jednostek 512-bajtowych) lub-k
flagą, która wymusza jednostki 1kB.
physical_block_size
jest zależną od systemu operacyjnego wartością wewnętrznego interfejsu bloku, który może, ale nie musi, być połączony z podstawowym sprzętem. Ta wartość wynosi zwykle 512b lub 1k, ale jest całkowicie zależna od systemu operacyjnego. Można to ujawnić poprzez %B
wartość na stat
lub fstat
. Zauważ, że ta wartość (prawie zawsze) nie jest związana z liczbą fizycznych bloków na nowoczesnym urządzeniu magazynującym.
Dlaczego takie zagmatwane?
Ta liczba jest dość oderwana od wszelkich fizycznych lub znaczących wskaźników. Wielu młodszych programistów nie miało doświadczenia z dziurami w plikach lub dowiązaniami twardymi / sym . Ponadto dokumentacja dostępna na ten konkretny temat praktycznie nie istnieje.
Rozłączność i niejednoznaczność terminu „rozmiar bloku” jest wynikiem wielu różnych miar, które można łatwo pomylić, oraz stosunkowo głębokich poziomów abstrakcji obracających się wokół dostępu do dysku.
Przykłady sprzecznych informacji: du
(lubls -s
) vs.stat
Uruchomienie du *
w folderze projektu daje następujące efekty : (Uwaga: ls -s
zwraca te same wyniki).
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
Razem : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 bloki
Jednak biegając stat
, widzimy inny zestaw wartości. Uruchomienie stat
w tym samym katalogu daje:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
Razem: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 bloków
Uwaga: Możesz użyć polecenia stat * --printf="%b\t(%B)\t%n: %s bytes\n"
>, aby wyprowadzić (w kolejności) liczbę bloków, (w parach) rozmiar tych bloków, nazwę pliku i rozmiar w bajtach, jak pokazano powyżej.
Istnieją dwie ważne rzeczy na wynos:
stat
zgłasza zarówno plik, jak physical_blocks_in_use
iphysical_block_size
jak zostały użyte w powyższym wzorze. Zauważ, że są to wartości oparte na interfejsach systemu operacyjnego.
du
przedstawia to, co jest ogólnie akceptowane, jako dość dokładne oszacowanie wykorzystania dysku fizycznego.
Dla odniesienia, oto ls -l
katalog powyżej:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h