Intereting Posts
tcsh, чтобы переместить курсор обратно в предыдущее пространство swapon: / swapfile: прочитать заголовок swap не удалось: неверный аргумент Bash while loop и чтение из трубы Можно ли отредактировать vsftpd.conf, предоставляя FTP-доступ пользователю только к нескольким каталогам внутри сервера? не удается запустить Chrome-браузер – сбой не удалось: разрешение отклонено Экран собирается спать, а затем не возвращается Почему переименование файла с помощью команды mv изменяет дату и время «изменения» inode? как получить процессор, которому в настоящее время назначен поток? Выполнение команды без ./ Почему существуют заглавные буквы в пакетах openSUSE? Вернуть btrfs в ext4 на mdadm raid Bash scripting – цикл до тех пор, пока значение возврата не будет 0 Отключить эмулированное колесо прокрутки (EmulateWheel) для определенных программ Использование DNSMasq для разрешения локального хоста Корица не работает на монетном дворе 17

Почему разница в размере файла и его размере на диске больше 4 KiB?

Файловая система ext4 обычно использует 4 блока KiB. Таким образом, когда вы пишете небольшой файл, а размер меньше 4 KiB, вы увидите разницу в любом файловом менеджере. Обычно есть два значения: размер файла и размер на диске. Первый кусок имеет правильное значение, а другой – умножение на 4 KiB.

В случае больших файлов я всегда думал, что размер не может отличаться более чем на 4 KiB (последний, не полностью написанный блок). Но в случае некоторых файлов на моем диске я вижу, что разница составляет более 4 KiB, например 9425 байт. Поэтому вопрос прост, почему размеры отличаются более чем на 4 KiB. Это из-за фрагментации или чего-то еще? Разве не странно, что некоторые блоки в середине файла не полностью написаны?

Список блоков, которые составляют файл, должен быть где-то сохранен. Как правило, в inode немного места, но если в индексном дескрипторе имеется слишком много блоков, файловая система выделяет непрямые блоки для хранения адреса блоков, в дополнение к блокам, которые содержат данные файла. По крайней мере, для ext2 / ext3 / ext4 в Linux, и я думаю, что для большинства Unix-подобных файловых систем в большинстве Unix-подобных операционных систем косвенные блоки учитываются при использовании диска на диске.

Ext4 использует деревья экстентов для хранения списков блоков. Если файл использует список последовательных блоков по порядку, это занимает одну запись в дереве. Таким образом, файл с небольшой фрагментацией не нуждается в каких-либо косвенных блоках, только одна запись в дереве, которая определяет первый блок и количество блоков. Для максимально фрагментированного файла требуется много непрямых блоков для хранения одной записи дерева на каждый блок. Если файл не фрагментирован или только очень немного, то не требуется косвенный блок, а использование диска на диске – это размер файла, округленный до целого числа блоков файловой системы. Фрагментированные файлы требуют косвенных блоков.

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

Вы можете изучить файловую систему ext2 / ext3 / ext4 с помощью команды debugfs . В debugfs, block blocks /path/to/file перечисляет блоки, используемые файлом; это показывает, насколько фрагментирован файл. Команда filefrag /path/to/file дает количество фрагментов; для ext4 это коррелирует с количеством непрямых блоков и, следовательно, с разницей между размером файла и использованием дискового пространства.

Я думаю, это может произойти в этой ситуации :

Если флаг FALLOC_FL_KEEP_SIZE указан в режиме, поведение вызова аналогично, но размер файла не изменяется, даже если offset + len больше размера файла. Предопределение нулевых блоков за пределами файла таким образом полезно для оптимизации загружаемых рабочих нагрузок.