EXT3: Jeśli rozmiar bloku wynosi 4K, dlaczego ls -l pokazuje rozmiary plików poniżej tego?

16

Jeśli uruchomisz ls -l na pliku, który zawiera jedną literę, będzie miał rozmiar 2B. Jeśli twój system plików ma 4k bloków, pomyślałem, że zaokrąglił pliki do rozmiaru bloku? Czy to dlatego, że ls -l faktycznie odczytuje liczbę bajtów z i-węzła? W jakich okolicznościach zaokrąglasz się w górę, aby blokować odpowiedzi w porównaniu z odpowiedziami na rzeczywistą liczbę bajtów w narzędziach GNU jądra Linux 2.6?

Gregg Leventhal
źródło
2
Pamiętaj, że ext4 wprowadza koncepcję „pakowania małych plików”, w której mały plik będzie zajmował ten sam blok dysku, który zajmuje jego i-węzeł (a tym samym unikniesz marnowania bloków dysku): lwn.net/Articles/469805
oakad

Odpowiedzi:

20

Sądzę, że umieściłeś tę jedną literę w pliku za pomocą echo a > filelub vim file, co oznacza, że ​​będziesz miał tę literę i dodatkową nową linię (dwa znaki, a więc dwa bajty). ls -lpokazuje rozmiar pliku w bajtach, a nie blokach (a dokładniej: długość pliku ):

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

(uwaga, która cat -Awyświetla $znaki nowej linii jako znak)

W przeciwieństwie do ls -l, dupokaże rzeczywisty rozmiar zajmowany na dysku:

$ du testfile
4

(faktycznie dupokazuje rozmiar w jednostkach 1kiB, więc tutaj rozmiar to 4 × 1024 bajty = 4096 bajtów = 4 kiB, co jest rozmiarem bloku w tym systemie plików)

Aby to lspokazać, musisz użyć -sopcji zamiast / oprócz -l:

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

Pierwsza kolumna to przydzielony rozmiar, ponownie w jednostkach 1kiB. Ostatni można zmienić, określając --block-sizenp

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
Andreas Wiese
źródło
3
Co więcej, miło jest mieć dwie informacje. Systemy plików mogą wykonywać „zagęszczanie ogona” (sp?) (Używać jednego bloku współużytkowanego przez krótkie pliki), „kopiować przy zapisie” i „dziurkowanie” ... co sprawia, że ​​relacja rozmiaru pliku <-> przestrzeń dyskowa jest złożona.
Rmano
9

Myślę, że głęboka odpowiedź jest następująca:

Logiczna długość pliku i zajmowane miejsce na dysku to naprawdę różne rzeczy.

Jak pokazują inne odpowiedzi, w zasadzie plik utworzony z dwóch bajtów ma długość dwóch bajtów (pokaż wg ls -l ) i zajmuje 4 KiB (pokaż przez dulub ls -ls).

Widzieć:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

Dobrze, test ma długość 1 i rozmiar (na dysku) 4 KiB. Ale:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(pierwsze polecenie dodaje 8191 bajtów zerowych test), teraz test ma długość 8192, ale nadal zajmuje 4 KiB na dysku (ma w nim „dziurę”) (1).

Niektóre systemy plików mogą także kompaktować krótkie pliki, aby zajmowały mniej miejsca, dzieląc bloki (patrz na przykład pakowanie ogona ), a inne, takie jak btrfs, kopiują podczas zapisu , więc związek między plikiem, jego logiczną długością i ilością miejsca zajmuje dysk jest skomplikowany.

Przypisy:

(1) To nie jest tak naprawdę dziura , jest na końcu ... ale nadal działa do końca przykładu.

Rmano
źródło
5

ls -lto tylko długi format. ls -lssłuży do wyświetlenia rozmiaru bloku.

Testowanie

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

Jak widzimy, rozmiar pliku jest wymieniony jako 2B. Jeśli jednak chcesz sprawdzić rozmiar bloku, musisz uruchomić poniższe polecenie.

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

4 powyżej pokazuje użyty rozmiar bloku. Możemy to również zweryfikować za pomocą statpolecenia.

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

Teraz pojawia się pytanie, dlaczego ls -lswyświetla rozmiar bloku jako 4, a statwyświetla rozmiar bloku jako 8. Powód tego zachowania jest wyjaśniony w odpowiedzi tutaj .

Wiele dysków ma rozmiar sektora 512 bajtów, co oznacza, że ​​każdy odczyt lub zapis na dysku przenosi cały sektor 512 bajtów naraz. Projektowanie systemów plików, w których sektor nie jest podzielony między pliki, jest dość naturalne (co skomplikowałoby projekt i obniżyłoby wydajność); dlatego systemy plików zwykle używają porcji 512-bajtowych. Stąd tradycyjne narzędzia, takie jak lsi duwskazują rozmiary w jednostkach po 512 bajtów.

Ramesh
źródło