У меня есть разреженный файл, в котором размещены только некоторые блоки:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Я хотел бы знать, какие блоки файла на самом деле выделены. Есть ли системный вызов или интерфейс ядра, который можно использовать для получения списка распределений или дыр в файле?
Простая проверка на наличие достаточно длинной строки нулей (подход, используемый GNU cp, rsync и т. Д.) Не работает правильно:
~% cp example example1
~% du -h example1
32K example1
Это обнаружило другие последовательности нулей, которые были фактически распределены.
источник
--fibmap
вhdparm
утилите. Смотрите руководство.Существует коллекция программ на python, называемых sparseutils, которые используют
SEEK_HOLE
иSEEK_DATA
определяют, какие разделы файла представлены как дыры, а какие - данные. Использование довольно просто.mksparse
может использоваться для создания разреженного файла в соответствии с заданным макетом.sparsemap
Программа может быть использована для печати макета на стандартный вывод:источник
Это зависит от файловой системы. Я не верю, что это вызов, поэтому многие инструменты не справляются с копированием разреженных файлов. В цепочке инструментов GNU используется поиск больших блоков нулей, поскольку это позволяет им удалять неиспользуемые выделенные блоки. Многие инструменты копирования преобразуют разреженный файл в файл со всеми выделенными блоками.
Скорее всего, вам придется открыть инод и проанализировать результат. Формат Inode зависит от файловой системы. Некоторые файловые системы могут содержать часть ваших данных в самом inode.
источник
SEEK_DATA
иSEEK_HOLE
параметры дляlseek()
, как, например, в Solaris: opensolarisforum.org/man/man2/lseek.html