О размере файла и использовании диска в ext3

У меня есть несколько копий файла. Файлы берут 2390170 кибибитов каждый, согласно ls -lk и du --apparent-size -k.

Проблема - это du -k сообщают различные размеры для каждой копии: 2389824, 2392512, 2392512 и 2390336.

Я ожидал, что использование диска должно составить 2390172 кибибита (размер minimun количества блоков (597543), где файл соответствует.

Так, почему каждый файл имеет различное использование диска?

Я также видел, что одна из копий использует 2389824 кибибита, но размер файла на 346 кибибитов больше: 2390170. Как это имеет смысл?

PD: Все файлы находятся в той же ext3 файловой системе. Размер блока файловой системы 4096. Все файлы имеют тот же хеш.

Обновление: Из комментариев:

although the apparent size is usually smaller, it may be larger due to holes in ('sparse') files, internal fragmentation, indirect blocks, and the like

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

Я наблюдал это cp --sparse=always может сделать редкий файл из нередкого. cp --sparse=always результаты на файле, который использует 2390336 кибибитов cp --sparse=never результаты на файле, который использует 2392512 кибибитов

Таким образом, я предположу, что использование на 2389824 кибибита из одной из копий вызывается от другой реализации редкого алгоритма...

Исходный файл был скопирован от машины окон до sftp или самбы, и я думаю, что файл на 2389824 кибибита является копией его, но я не помню, как сделал я сделал это (я предполагаю, что с CP, но я не уверен).

3
задан 05.12.2010, 21:28

2 ответа

От man du:

- очевидный размер
распечатайте очевидные размеры, а не использование диска; хотя очевидный размер обычно меньше, это может быть больше из-за дыр в ('редких') файлах, внутренней фрагментации, косвенных блоках, и т.п.

От info du:

'-очевидный размер'
Распечатайте очевидные размеры, а не использование диска. Очевидный размер файла является числом байтов, о которых сообщают wc -c на регулярных файлах, или в более общем плане, ls -l --block-size=1 или stat --format=%s. Например, файл, содержащий слово 'зоопарк' без новой строки, конечно, имел бы очевидный размер 3. Такой маленький файл может потребовать где угодно от 0 до 16 кибибайт или больше дискового пространства, в зависимости от типа и конфигурации файловой системы, в которой находится файл. Однако редкий файл создал с этой командой:

      dd bs=1 seek=2GiB if=/dev/null of=big

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

[шахта акцента]

3
ответ дан 08.12.2019, 00:33

Существует две вещи, продолжающиеся здесь - файлы, которые больше, чем Вы ожидаете происходят из-за метаданных хранилища файловой системы, который считается к размеру файла. Файлы, которые меньше, чем Вы, ожидают происходят из-за функции UNIX, названной "редкие файлы".

Большие файлы

Для ext2/ext3 дисковое использование файла включает пространство, израсходованное структурами файловой системы, которые отслеживают то, где блоки данных находятся на диске. Смотрите на структуру Ext2 inode - inode является структурой данных, которая отслеживает полномочия файла, размер, и т.д. а также где его блоки данных находятся на диске. Сам inode не считается к использованию (это предварительно выделяется при создании файловой системы), но косвенные блоки.

Вычисление

Так, сказал Ваш файл с размером, 2390172 КБ берут 597 543 блока данных, как Вы. Местоположения 12 из тех блоков хранятся в самом inode, таким образом, они свободны. 13-е местоположение, сохраненное в inode, для косвенного блока - недавно выделенный блок, который хранит местоположения 1 024 блоков данных. Таким образом, это добавляет 1 блок к Вашему размеру файла и оставляет нас с 596 507 блоками.

14-й указатель местоположения в inode для вдвойне косвенного блока - блок выделил, который содержит, располагают местоположения с интервалами 1 024 косвенных блоков. 596507/1024 ~ = 582.52, таким образом, нам будут нужны 583 косвенных блока для содержания остальной части блоков данных плюс один вдвойне косвенный блок.

Так:

    1 (indirect from inode)
+   1 (doubly-indirect from inode)
+ 583 (indirect from doubly-indirect)
-----
= 585
= 598128 - 597543

И это составляет размер 2392512 (=598128*4).

Меньшие файлы

Я подозреваю, что меньшие файлы (2389824 КБ) являются редкими файлами, что означает, что некоторые блоки никогда не писались в и так не были выделены - освобожденные блоки определяются как являющийся переполненным, обнуляет. См. ответ Dennis Williamson для ссылок. Редкие файлы могут произойти, если программа, пишущий перемещениям указатель файла вокруг и пишет в различные положения в файле, вместо того, чтобы писать файл через с начала до конца. Для экстремального примера редкого файла попробуйте следующее:

du if=/dev/zero of=my_sparse_file bs=1000 count=1 seek=1000000

Если Вы ls получающийся файл, очевидный размер будет 1000001000. Однако, потому что только 1 000 байтов были записаны, только один блок данных используется, таким образом, только один блок данных выделяется. du сообщат используемых 12 КБ - один 4k блок для данных, один для вдвойне косвенного блока, и один для единственного косвенного блока, на который указывает вдвойне косвенный блок с его 976-м указателем. Ни одна из остальной части блоков файла не была выделена, или данные или метаданные.

После того как вдвойне косвенный блок заканчивается, файловая система начинает использовать трижды косвенный блок. Ваш файл поразит максимальный возможный ext3 размер файловой системы, прежде чем он заполнит тот.

1
ответ дан 08.12.2019, 00:33

Теги

Похожие вопросы