Детальна розріджена інформація про файли в 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. Цитуючи цей файл:

Ioctl fiemap - це ефективний метод для простору користувачів, щоб отримати відображення розмірів файлів. Замість відображення блок-за-блоком (наприклад, bmap), fiemap повертає список розширень.

Схоже, це така інформація, яку ви шукаєте. Підтримка файлових систем знову необов’язкова:

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

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


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.


1
Має бути якийсь FS-агностичний спосіб отримати цю інформацію. Читання безпосередньо з inode, безумовно, не є варіантом. Я шукав щось на зразок SEEK_DATAі SEEK_HOLEпараметри для lseek(), як, наприклад, є в Solaris: opensolarisforum.org/man/man2/lseek.html
Джуліано

@Juliano Погляд на опцію lseek для Linux не має цих варіантів. 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.