Подробная информация о разреженных файлах в Linux

11

У меня есть разреженный файл, в котором размещены только некоторые блоки:

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

Я хотел бы знать, какие блоки файла на самом деле выделены. Есть ли системный вызов или интерфейс ядра, который можно использовать для получения списка распределений или дыр в файле?

Простая проверка на наличие достаточно длинной строки нулей (подход, используемый GNU cp, rsync и т. Д.) Не работает правильно:

~% cp example example1  
~% du -h example1 
32K     example1

Это обнаружило другие последовательности нулей, которые были фактически распределены.

Жулиано
источник

Ответы:

7

Есть похожий вопрос по SO . Принято в настоящее время ответ на @ephemient предлагает используя ioctlназывается , fiemapкоторая описана в linux/Documentation/filesystems/fiemap.txt. Цитирование из этого файла:

Fiemap ioctl - это эффективный метод для пространства пользователя для получения отображений экстентов файлов. Вместо блочного отображения (такого как bmap) fiemap возвращает список экстентов.

Похоже, это та информация, которую вы ищете. Поддержка файловыми системами снова необязательна:

Файловые системы, желающие поддерживать fiemap, должны реализовать ->fiemap обратный вызов в своей inode_operationsструктуре.

Поддержка для SEEK_DATAи SEEK_HOLEаргументы lseekвы , упомянутые в Solaris была добавлена в Linux 3.1 согласно странице человека , так что вы можете использовать это , как хорошо. В fiemap ioctlболее старом, так что может быть более переносимыми между различными версиями Linux на данный момент, в то время как lseekможет быть более переносимы между операционными системами , если Solaris имеет то же самое.

MVG
источник
2
Вы можете получить эту информацию FIEMAP, используя --fibmapв hdparmутилите. Смотрите руководство.
Тотор
2

Существует коллекция программ на python, называемых sparseutils, которые используют SEEK_HOLEи SEEK_DATAопределяют, какие разделы файла представлены как дыры, а какие - данные. Использование довольно просто. mksparseможет использоваться для создания разреженного файла в соответствии с заданным макетом.

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemapПрограмма может быть использована для печати макета на стандартный вывод:

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096
Ричард
источник
1

Это зависит от файловой системы. Я не верю, что это вызов, поэтому многие инструменты не справляются с копированием разреженных файлов. В цепочке инструментов GNU используется поиск больших блоков нулей, поскольку это позволяет им удалять неиспользуемые выделенные блоки. Многие инструменты копирования преобразуют разреженный файл в файл со всеми выделенными блоками.

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

BillThor
источник
1
Должен быть какой-то независимый от ФС способ получения этой информации. Чтение непосредственно из инода определенно не вариант. Я искал что-то вроде SEEK_DATAи SEEK_HOLEпараметры для lseek(), как, например, в Solaris: opensolarisforum.org/man/man2/lseek.html
Juliano
@Juliano Взгляд на опцию Linux lseek не имеет этих опций. Solaris поддерживает очень мало файловых систем, поэтому его будет относительно легко поддерживать. Linux поддерживает широкий спектр файловых систем, некоторые из которых не поддерживают разреженные файлы. Поддержка SEEK_DATA / SEEK_HOLE навязывает поддержку в коде для всех файловых систем. Эти методы могут не делать то, что вы ожидаете. См blogs.sun.com/bonwick/entry/seek_hole_and_seek_data больше данных со стороны Солнца.
BillThor
1
Файловые системы не должны ничего поддерживать с интерфейсом lseek (), ядро ​​создает список модулей файловой системы, которые поддерживают SEEK_DATA / SEEK_HOLE через свойство модуля. Это находится на самой странице руководства и в связанном блоге: «Для файловых систем, которые не предоставляют информацию о дырах, файл будет представлен как одна целая область данных».
Джулиано
@Juliano Все еще требуются моды ядра, а также изменения в lseek. Согласно записи в блоге, это довольно новая функциональность в Sun. Чтобы это работало, код файловой системы также должен быть изменен. Конечно, для обеспечения хуков ядра потребуются изменения во всех файловых системах, поддерживающих разреженные файлы.
BillThor