Выполните следующие действия:
uname -a
затем используйте номер версии, полученный из uname -a
, чтобы установить правильный kernel-devel
т.е.
yum install kernel-devel-3.10.0-514.2.2.el7.x86_64
Несколько быстрых ответов: во-первых, вы не создали разреженный файл. Попробуйте выполнить эти дополнительные команды
dd if=/tmp/BIL of=/tmp/sparse seek=1000
ls -ls /tmp/sparse
Вы увидите, что размер составляет 512003 байта, но занимает только 8 блоков. Нулевые байты должны занимать целый блок и находиться на границе блока, чтобы они могли быть разреженными в файловой системе.
Почему второе вхождение "BIL" появляется не по порядку?
Потому что вы находитесь в системе с little-endian и пишете вывод в шортах. Используйте байты, как это делает cat.
Откуда cat и другие программы знают, что нужно печатать в правильном порядке?
Они работают с байтами.
Как программы типа ls различают "предполагаемый" размер и выделенный размер?
ls
и т.д. используют системный вызов stat(2)
, который возвращает 2 значения:
st_size; /* общий размер, в байтах */
blkcnt_t st_blocks; /* количество выделенных 512B блоков */
Какие инструменты я могу использовать для опроса информации о inode?
stat - это хорошо.
Есть ли инструмент, позволяющий просматривать прямые и косвенные блоки?
На ext2/3/4 вы можете использовать hdparm --fibmap
с именем файла:
$ sudo hdparm --fibmap ~/sparse
Размер блока файловой системы 4096, начинается с LBA 25167872; предполагается, что секторы по 512 байт.
byte_offset begin_LBA end_LBA sectors
512000 226080744 226080751 8
Вы также можете использовать debugfs
:
$ sudo debugfs /dev/sda3
debugfs: stat <1040667>
Inode: 1040667 Тип: regular Режим: 0644 Флаги: 0x0
Генерация: 1161905167 Версия: 0x000000
Пользователь: 127 Группа: 500 Размер: 335360
ACL файлов: 0 ACL каталогов: 0
Ссылки: 1 Blockcount: 664
Фрагмент: Адрес: 0 Номер: 0 Размер: 0
ctime: 0x4dd61e6c -- Fri May 20 09:55:24 2011
atime: 0x4dd61e29 -- Fri May 20 09:54:17 2011
mtime: 0x4dd61e6c -- Fri May 20 09:55:24 2011
Размер дополнительных полей inode: 4
БЛОКИ:
(0-11):4182714-4182725, (IND):4182726, (12-81):4182727-4182796
ИТОГО: 83
Почему dd усекает мой файл и может ли dd или другой инструмент записывать в середину файла?
Да, dd
может записывать в середину. Add conv=notrunc
.
Существуют ли механизмы, предотвращающие сжатие/увеличение разреженных файлов? И если нет, то почему разреженные файлы полезны?
Нет. Потому что они занимают меньше места.
Разреженный аспект файла должен быть полностью прозрачен для программы, что иногда означает, что разреженность может быть потеряна, когда программа обновляет файл.
Некоторые утилиты копирования имеют опции для сохранения разреженности, например tar --sparse
, rsync --sparse
.
Обратите внимание, что вы можете явно преобразовать выровненные нулевые блоки в файле в разреженность с помощью cp --sparse=always
и наоборот, преобразовать разреженное пространство в реальные нули с помощью cp --sparse=never
.