STAT Размер блока / используемые блоки - PullRequest
3 голосов
/ 11 декабря 2011

У меня есть вопрос, который сбивает меня с толку, и моя задача - выполнить фрагментацию.

stat() for a file:
st_size = 10520
st_blksize = 4096
st_blocks = 24

В некоторых местах я читал, что st_blksize - это общий размер блока файловой системы, который в данном случаеравно 4096, но этот файл будет вписываться в 3 blocks, 10520 / 512 равно 20.5, что означает 3.5 blocks неиспользуемого пространства, даже если оно выделено.Означает ли это, что в этом файле есть 1792 неиспользуемых байтов (фрагментация)?

Как я уже упоминал, я прочитал об этом честно и прочитал много противоречивых текстов, хотел бы, чтобы кто-то это очистилраз и навсегда!

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Я не думаю, что ваш проект действительно решаем на уровне API stat(2).Рассмотрим случай файла длиной 4096 байт.Предположим, что он был создан путем многократного добавления 512-байтовых блоков снова и снова.Предположим, что файловая система была полностью заполнена, за исключением одного 512-байтового блока, для каждой записи.Предположим, что 512-байтовый блок, доступный для каждой записи, был расположен в произвольно доступном месте на диске.

Этот файл фрагментирован на 100% - нет двух блоков рядом друг с другом.

Итем не менее, показатель, основанный исключительно на переменных stat(2), вполне может показать, что в файле нет ни одного потраченного впустую блока.

При попытке отследить ответ на ваш реальный вопрос я дошел до ext3_write_begin() перед тем, как отозвать - надеюсь, что это полезная отправная точка для вашего поиска.

Обновление

Если вы заинтересованы в поиске фрагментации, я думаю, чтоместо для начала - команда bmap из программы debugfs(8):

debugfs:  bmap sars_first_radio_show.zip 0
94441752
debugfs:  bmap sars_first_radio_show.zip 1
94441781
debugfs:  bmap sars_first_radio_show.zip 2
94441782
debugfs:  bmap sars_first_radio_show.zip 3
94441783
debugfs:  bmap sars_first_radio_show.zip 4
94441784
debugfs:  bmap sars_first_radio_show.zip 5
94459905
debugfs:  bmap sars_first_radio_show.zip 6
95126019
debugfs:  bmap sars_first_radio_show.zip 7
95126020
debugfs:  bmap sars_first_radio_show.zip 8
95126021
debugfs:  bmap sars_first_radio_show.zip 9
95126022
debugfs:  

Здесь показаны первые десять блоков для файла sars_first_radio_show.zip;Вы можете видеть, что блоки не все смежные: 944417 {52,81,82,83,84}, 94459905, 951260 {19,20,21,22}.

Вы можете написать сценарий ответаоколо debugfs(8) или вы можете использовать библиотечные процедуры libext2fs самостоятельно.Это был бы значительный шаг по сложности по сравнению с stat(2) упражнениями, которые вы проходили - но ответы означали бы что-то , а не были бы просто смутным предположением.

0 голосов
/ 14 марта 2016

IIRC st_blocks, должен сообщить st_size / 512, чтобы различные программы Linux работали правильно.Это не обязательно связано с тем, сколько блоков выделено в файловой системе.Кроме того, st_blksize сообщает только приложениям более высокого уровня, какой размер считывается и записывается для отправки системным вызовам для достижения оптимальной производительности.Еще раз это не обязательно означает, что файловая система на самом деле хранит вещи с такими размерами блоков.

Реальный ответ на ваши вопросы относительно фрагментации файла будет сильно зависеть от FS, с которой вы работаете.Я рекомендую начать чтение с более низкого уровня

...