EXT3: Якщо розмір блоку становить 4K, чому ls -l показує розміри файлів нижче цього?


16

Якщо ви запустите ls -l у файлі, що містить одну букву, він буде розміщуватися у форматі 2B. Якщо ваша файлова система знаходиться в 4-х блоках, я вважаю, що вона округляє файли до розміру блоку? Це тому, що ls -l насправді зчитує кількість байтів з inode? За яких обставин вас округляють, щоб заблокувати відповіді проти фактичних відповідей на кількість байтів у утилітах GNU Linux 2.6 Kernel?


2
Майте на увазі, що ext4 вводить поняття "упаковка невеликих файлів", після чого невеликий файл буде займати той самий блок диска, який займає його inode (і, таким чином, уникати марно потрапляння
oakad

Відповіді:


20

Я думаю, ви отримали цю букву у файлі з, echo a > fileабо vim file, значить, у вас буде цей лист та додатковий новий рядок (два символи, таким чином, два байти). ls -lпоказує розмір файлу в байтах, а не блоках (якщо бути точнішим: довжина файлу ):

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

(зверніть увагу, що cat -Aнові символи відображаються як $символи)

На відміну від ls -l, duбуде показаний реальний розмір, зайнятий на диску:

$ du testfile
4

(насправді duпоказує розмір в одиницях 1кіБ, тому тут розмір становить 4 × 1024 байти = 4096 байт = 4 кіБ, що є розміром блоку в цій файловій системі)

Щоб lsпоказати це, вам доведеться використовувати -sопцію замість / на додаток до -l:

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

Перший стовпець - це виділений розмір, знову в одиницях 1кіБ. Останнє можна змінити, вказавши --block-size, напр

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
І, крім того, приємно мати дві інформації. Файлові системи можуть робити "ущільнення хвоста" (sp?) (Використовувати один блок, який спільно використовується серед коротких файлів), "копіювати при записі" та "пробивати дірку" ... роблячи розмір файлу <-> дисковим простором складним.
Рмано

9

Я думаю, що глибока відповідь така:

Довжина логічного файлу та займаний простір на диску - це справді різні речі.

Як показують інші відповіді, в принципі файл, створений двома байтами, має довжину два байти (показати за ls -l) і займає 4 KiB (показ по duабо ls -ls).

Побачити:

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

Ок, testмає довжину 1 і розмір (на диску) 4 KiB. Але:

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

(перша команда додає 8191 нульовий байт до test), тепер тест має довжину 8192, але все ще займає 4 кіБ на диску (у ньому є "дірка") (1).

Деяка файлова система також може компактувати короткі файли, щоб вони зайняли менше місця для спільного використання блоків (див., Наприклад, хвостові упаковки ), а інші, такі як btrfs, копіюють під час запису , тому взаємозв'язок між файлом, його логічною довжиною та тим, скільки місця він займає диск - складний.

Виноски:

(1) Це насправді не дірка , вона в кінці ... але все-таки вона працює до кінця прикладу.


5

ls -lце просто довгий формат. ls -lsвикористовується для відображення розміру блоку.

Тестування

echo "1" > 1.txt

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

Як ми бачимо, розмір файлу вказаний як 2B. Однак якщо вам потрібно перевірити розмір блоку, вам потрібно виконати команду нижче.

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

4 наведено вище розмір блоку. Ми також можемо перевірити те саме за допомогою statкоманди.

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

Тепер виникає питання, чому ls -lsрозмір блоку перераховується як 4, а statрозмір блоку відображається як 8. Причина такої поведінки чітко пояснюється у відповіді тут .

Багато дисків мають розмір сектору 512 байт, це означає, що будь-яке читання або запис на диску передає за один раз цілий сектор 512 байтів. Цілком природно розробити файлові системи, де сектор не розділений між файлами (це ускладнить дизайн та пошкодить продуктивність); тому файлові системи, як правило, використовують 512-байтові фрагменти для файлів. Звідси традиційні утиліти, такі як lsі duвказують розміри в одиницях з 512-байтних шматочків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.