розмір блоку файлу - різниця між stat і ls


9

Я помітив, що коли я роблю:

ls -ls file

Він забезпечує кількість блоків, скажімо, 8 блоків.

Коли я роблю:

stat file

Я помічаю, що кількість блоків дорівнює 16, вдвічі більше числа, заданого ls.

Розмір блоку в моїй файловій системі становить 4096. Я дізнався, що довільна одиниця для блоків, що використовуються ls, становить 1024. Чи правильно сказати, що stat використовує довільну одиницю в 512 байт під час звітування про блоки?

Якщо так, чи є причина невідповідності?

Я запускаю Ubuntu 11.10 у файловій системі ext4.

Відповіді:


9

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

Для людини 512-байтні одиниці не мають великого значення. 1 кБ - той самий порядок і набагато більш значимий. Блок файлової системи (найменша одиниця, на яку поділяється файл) насправді часто складається з декількох секторів: 1 кБ, 2 кБ та 4 кБ - загальні розміри блоків файлової системи; тому 512-байтовий блок не є сильно виправданим дизайном файлової системи, і немає жодних вагомих причин, крім традиції, щоб взагалі використовувати 512-байтовий блок поза драйвером диска.

Таким чином, у вас є традиція, яка не має для цього великої кількості, і більш читабельний конвент, який приймається. Трохи схожий на восьмигранний і шістнадцятковий: не існує одного правильного, а неправильного - це різні способи написання одних і тих же цифр.

У багатьох інструментах є можливість вибору одиниць відображення: ls --block-size=512для GNU ls, встановлення POSIXLY_CORRECT=1в середовищі для GNU dfі GNU duдля отримання 512-байтних одиниць (або передачі -kдля одиниці 1 кБ). Те, що statкоманда в GNU coreutils розкриває як "розмір блоку" ( %Bзначення), є залежним від ОС значенням внутрішнього інтерфейсу; залежно від ОС, це може бути або не бути пов’язаним з розміром, який використовується файловою системою або кодом диска (зазвичай це не так - див. Різниця між розміром блоку та розміром кластера ). В Linux значення становить 512, незалежно від того, що робить будь-який базовий драйвер. Цінність %Bніколи не має значення, це просто химерність, що вона взагалі існує.


4

Після копання у вихідний код та стандарт POSIX, я б сказав, що відповіді @ antje-m та @Gilles здебільшого вірні.

Варто навести коментар від POSIX.1-2008 , як короткий підсумок:

Використання 512-байтних одиниць є історичною практикою і підтримує сумісність з ls та іншими утилітами в цьому обсязі POSIX.1-2008. Це не вимагає, щоб сама файлова система базувалася на 512-байтових блоках. Варіант -k був доданий як компромісний захід. Стандартні розробники домовилися, що 512 байти - найкраща одиниця за замовчуванням через повну історичну узгодженість системи V (проти змішаного використання 512/1024-байт у системах BSD), а також можливість -k перейти на 1024- одиниці байтів були хорошим компромісом. Користувачі, які віддають перевагу більш логічній 1024-байтній кількості, можуть легко псевдоніми df до df -k, не порушуючи багато історичних сценаріїв, спираючись на 512-байтові одиниці.

Для розміру блоку в ls -s:

POSIX говорить, що розмір блоку за замовчуванням визначається реалізацією, якщо не вказано -kпараметр.

Розмір блоку за замовчуванням, реалізований у GNU coreutils ls, визначений у GNU gnulib: gnulib/lib/human.c

/* The default block size used for output.  This number may change in
   the future as disks get larger.  */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif

що походить від старої комісії:

commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date:   Mon Jun 29 15:23:04 1998 +0000

У самому повідомленні про фіксацію нічого не сказано про номер 1024.

І зауважте, що розмір блоку, який використовується duі dfстановить також 1024, lsпросто вирішив скластись з ними. Хоча для duі dfце суперечність стандарту POSIX (тому сюди POSIXLY_CORRECTприходить змінна середовище ). Це здається рішення команди GNU, дивіться сторінку вікіпедії POSIX про цю суперечку.

Для команди stat.

Він не є частиною стандарту POSIX, але системний виклик є. Однак одиниця розміру блоку не стандартизована ( sys_stat.h ):stat

Блок для елемента st_blocks в структурі stat не визначений в POSIX.1-2008.

statКоманда виводить на екран інформацію , представлену statсистемою виклику, а також з використанням 512 розмір блоку з рідкісним винятком (вони не є Linux, наприклад , HP-UX, IBM AIX і т.д. см макроси визначені в gnulib/lib/stat-size.h).

Тож число 512 - це більше історичний вибір і конвенція Linux.

GNU coreutils(Звідси і lsкоманда) не є частиною Linux ядра (звідси і statвиклик), вони націлені на різні аспекти системи, GNU coreutilsбільше для людини (легше читати), і Linux ядро для апаратного абстрактних (звідси ближче до апаратних засобів).

Редагувати: розмір блоку 4096 - це розмір "IO block", реальний фізичний розмір блоку, ймовірно, все ще 512 байт, як пояснено в цьому запитанні .


1

У statкоманди використовує фізичний розмір блоку на жорсткому диску. В основному всі жорсткі диски з часу їх створення в 1956 році використовували 512 байт-блоки. Однак це нещодавно почало змінюватися з майбутнім розширеного формату.

Я підозрюю, що ls"1024-байт-блокування також має історичну причину. Можливо, колись для файлової системи було загальне розмір блоку 1024, або він використовувався для надання розміру в кілобайт. Але (принаймні з GNU coreutils) можна вказати розмір блоку за допомогою --block-size=параметра.

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