Как команда stat вычисляет блоки файла? - PullRequest
9 голосов
/ 28 августа 2009

Мне интересно, как команда stat вычисляет блоки файла. Я прочитал статья , там написано:

Значение st_blocks дает размер файла в 512-байтовых блоках. (Это может быть меньше, чем st_size / 512, например, когда файл имеет дыры.) Значение st_blksize дает «предпочтительный» размер блока для эффективного ввода-вывода файловой системы. (Запись в файл небольшими порциями может привести к неэффективному чтению-изменению-перезаписи.)

но я не могу проверить это в моем тесте.

моя файловая система ext3.

dumpe2fs -h / dev / sda3 показывает:

...
First block: 0
Block size: 4096
Fragment size: 4096
...

тогда я бегу

kent@KentT60:~/Desktop$ stat Email
File: `Email'
Size: 965 Blocks: 8 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746095 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
Access: 2009-08-11 21:36:36.000000000 +0200
Modify: 2009-08-11 21:36:35.000000000 +0200
Change: 2009-08-11 21:36:35.000000000 +0200

Если блок здесь означает: сколько блоков 512 байт, число должно быть 2, а не 8. Я думал, что размер блока из файловой системы (блок io) равен 4 КБ. Если fs получит файл Email, он получит минимум 4 КБ с диска (блоки 8 x 512 байт), что означает 965/512 + 6 = 8. Я не уверен, что догадка верна.

другой тест:

kent@KentT60:~/Desktop$ stat wxPython-demo-2.8.10.1.tar.bz2
File: `wxPython-demo-2.8.10.1.tar.bz2'
Size: 3605257 Blocks: 7056 IO Block: 4096 regular file
Device: 80ah/2058d Inode: 746210 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
Access: 2009-08-12 21:45:45.000000000 +0200
Modify: 2009-08-12 21:43:46.000000000 +0200
Change: 2009-08-12 21:43:46.000000000 +0200


3605257/512=7041.xx = 7042

следуя моему предположению выше, это будет 7042 + 6 = 7048. но результат статистики показывает 7056.

И еще один пример из интернета на http://www.computerhope.com/unix/stat.htm. Я копирую пример внизу страницы здесь:

File: `index.htm'
Size: 17137 Blocks: 40 IO Block: 8192 regular file
Device: 8h/8d Inode: 23161443 Links: 1
Access: (0644/-rw-r--r--) Uid: (17433/comphope) Gid: ( 32/ www)
Access: 2007-04-03 09:20:18.000000000 -0600
Modify: 2007-04-01 23:13:05.000000000 -0600
Change: 2007-04-02 16:36:21.000000000 -0600

В этом примере размер блока FS равен 8 КБ. Я полагаю, число блоков должно быть 16xN, но это 40. потеряться ...

Кто-нибудь может объяснить, как статистика вычисляет блоки?

Спасибо!

Ответы [ 2 ]

17 голосов
/ 28 августа 2009

Инструмент командной строки stat использует функции stat / fstat и т. Д., Которые возвращают данные в структуре stat. st_blocks член структуры stat возвращает:

Общее количество физических блоков размером 512 байт, фактически выделенных на диске. Это поле не определено для блочных или символьных специальных файлов.

Так что для вашего примера «Электронная почта», с размером 965 и числом блоков 8, это означает, что 8 * 512 = 4096 байт физически выделены на диске. Причина не в том, что файловая система на диске не выделяет пространство в единицах 512, а, очевидно, выделяет их в единицах 4096. (И единица выделения может варьироваться в зависимости от размера файла и сложности файловой системы. Например, ZFS поддерживает разные единицы размещения.)

Аналогично, для примера wxPython это указывает, что 7056 * 512 байт или 3612672 байт физически размещены на диске. Вы поняли.

Размер блока ввода-вывода является «подсказкой о« лучшем »размере блока для операций ввода-вывода» - обычно это единица выделения на физическом диске. Не путайте между блоком ввода-вывода и блоком, который stat использует для указания физического размера; блоки для физического размера всегда 512 байт.

Обновление на основе комментария:

Как я уже сказал, st_blocks - это то, как ОС показывает, сколько места используется файлом на диске. Фактические единицы размещения на диске - это выбор файловой системы. Например, ZFS может иметь блоки выделения переменного размера, даже в одном и том же файле , из-за способа распределения блоков: файлы начинаются с небольшого размера блока, а размеры блоков продолжают увеличиваться, пока не достигнут конкретный момент. Если файл будет позже усечен, он, вероятно, сохранит старый размер блока. Таким образом, основываясь на истории файла, он может иметь несколько возможных размеров блоков. Поэтому, учитывая размер файла, не всегда очевидно, почему он имеет конкретный физический размер.

Конкретный пример: на моем устройстве Solaris с файловой системой ZFS я могу создать очень короткий файл:

$ echo foo > test
$ stat test
  Size: 4               Blocks: 2          IO Block: 512    regular file
(irrelevant details omitted)

ОК, небольшой файл, 2 блока, для этого файла используется физический диск 1024.

$ dd if=/dev/zero of=test2 bs=8192 count=4
$ stat test2
  Size: 32768           Blocks: 65         IO Block: 32768  regular file

Хорошо, теперь мы видим использование физического диска 32,5 КБ и размер блока ввода-вывода 32 КБ. Затем я скопировал его в test3 и урезал этот test3 файл в редакторе:

$ cp test2 test3
$ joe -hex test3
$ stat test3
  Size: 4               Blocks: 65         IO Block: 32768  regular file

Хорошо, теперь вот файл с 4 байтами в нем - точно так же как test - но он физически использует 32,5 КБ на диске из-за способа, которым файловая система ZFS распределяет пространство. Размеры блоков увеличиваются при увеличении размера файла, но не уменьшаются при уменьшении размера файла. (И да, это может привести к значительному расходу пространства в зависимости от типов файлов и операций с файлами, которые вы выполняете в ZFS, поэтому он позволяет вам устанавливать максимальный размер блока для каждой файловой системы и динамически его изменять.)

Надеюсь, теперь вы должны понимать, что не обязательно существует простая связь между размером файла и использованием физического диска. Даже в приведенном выше примере непонятно, почему для хранения файла, размер которого точно равен 32 КБ, необходимо 32,5 Кбайт. Похоже, что ZFS обычно требуется дополнительно 512 байт для дополнительного собственного хранилища. Возможно, он использует это хранилище для контрольных сумм, подсчета ссылок, состояния транзакции - ведения учета файловой системы. Включая эти дополнения в указанный размер физического файла, создается впечатление, что ZFS пытается не вводить пользователя в заблуждение относительно физических затрат на файл. Это не означает, что банально перепроектировать расчет, не зная подробных сведений о реализации базовой файловой системы.

0 голосов
/ 03 сентября 2018

здесь нужно отметить одну вещь, что выделение блока данных выполняется указанным ниже способом:

1) по умолчанию для файла выделено 8 блоков данных, даже если мы записываем данные одного байта в файле. 2) когда мы закончим добавление данных размером 8 * 4096 байт в файл, после этого, если мы добавим дополнительный байт, снова будут выделены новые 8 блоков данных. итого 16 блоков данных.

ЕСЛИ ВЫ ПОНИМАЕТЕ ВЫШЕ ЗАЯВЛЕНИЙ, затем -------- (в вопросе) ----------------- таким образом, для 965 по умолчанию будет выделено 8 блоков данных, и когда это будет точно 4 * 4096 = 32768 и заполнение всего этого, если мы добавим еще один байт, то будет выделено 8 блоков данных, а для размера 32769 всего 16 блоков данных будут выделяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...