Як перерахувати блоки даних файлів у Linux?


13

Як я розумію, кожен файл у подібній Unix операційній системі має номер inode (який можна переглядати за допомогою "ls -i"), і кожен inode - це список дискових блоків, що містять фактичні дані файлу.

Чи є команда Linux, яка приймає ім'я файлу як аргумент і виводить список блоків дисків, на які вказує inode цього файлу?

PS Розглянута файлова система є ext3.

Відповіді:


17

Ви можете використовувати інструмент "налагодження" для перегляду інформації про файл у командному рядку чи interactivley. або використовувати:

# debugfs /dev/<spartition>
# stat /path/to/file

або

# debugfs -R "stat /path/to/file" /dev/<partition>

наприклад:

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1

Зауважте, що аргумент для 'stat' не завжди / шлях / до / файл. Використання / path / to / file працює для файлів у кореневій файловій системі (встановлено в /), але не для шляхів, встановлених в іншій файловій системі. У цих випадках можна отримати повідомлення про помилку File not found by ext2_lookup. Тому краще використовувати позначення inode для аргументу stat. Використовуйте ls -iдля отримання номера inode файла, а потім викликайте налагодження з цим номером у '<>' замість / path / to / file. Наприклад:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR

@ElazarR Чи можете ви пояснити цей коментар? Чому path/to/fileне слід працювати у всіх випадках? Що мене бентежить, це те, що через debugfs ..... /dev/fs_blockdevмоє розуміння існує лише одна файлова система, що розглядається коли-небудь, і всі ці файли всередині цієї системи можна отримати або через їх шлях, або через thair inode, що ви хотіли висловити?
humanityANDpeace

@humanityANDpeace, у випадку, коли файл знаходиться у розділі (файловій системі), який знаходиться поза кореневою файловою системою, тобто встановлений у деякій точці монтажу під кореневим розділом, операція ext2_lookup, здається, не зможе знайти заданий шлях під даним пристроєм (перегородка). Це призводить до помилки, про яку я згадав. Наприклад, якщо ваші / домашні папки змонтовані з / dev / sda5 над кореневою файловою системою (яка є в іншому розділі, наприклад, / dev / sda3), то це debugfs -R "stat /home/myuser/foo.txt" /dev/sda5призводить до помилки. Але посилаючись на debugfs -R "stat /path/on/rootfs" /dev/sda3твори.
ElazarR

Я думаю, що вам потрібно sudo, інакше з’явиться якесь непосидне повідомлення.
Кедар Массваде

І зворотне питання: як ми можемо дізнатися, який файл використовує даний блок?
Луїс А. Флорит

4

Подивіться на синтаксис "налагодження", а конкретно на команду "stat". Це покаже вам список блоків даних, використовуваних файлом. Ви можете передати параметри "налагодженням" за допомогою аргументу "-f", щоб викликати його із сценарію.


4

Простий спосіб отримати список блоків (без необхідності читати з розділу, як у debugfsвідповідях) - використовувати FIBMAPioctl. Я не знаю жодної команди для цього, але написати її дуже просто; Швидкий пошук Google дав мені приклад використання FIBMAP , який робить саме те, що ви хочете. Однією з переваг є те, що він буде працювати в будь-якій файловій системі, яка підтримує bmapоперацію, а не тільки ext3.

Новішою (і більш ефективною) альтернативою є FIEMAPioctl, який також може повернути детальну інформацію про розширення (корисно для ext4).


3
hdparm --fibmap /path/to/filename

Я не буду працювати на zfs, але буду над ext4, btrfs, (v) жиром тощо

man 8 hdparm :

--fibmapПри використанні це повинен бути єдиний вказаний прапор. Для цього потрібен шлях до файлу як параметр і буде роздруковувати на диску диск розширень пристрою (секторні діапазони). Номери секторів наводяться як абсолютні номери LBA, посилаються на сектор 0 фізичного пристрою (а не на розділ чи файлову систему). Потім ця інформація може використовуватися для різних цілей, наприклад, для вивчення ступеня фрагментації великих файлів або визначення відповідних секторів для навмисного пошкодження під час процедур тестування несправностей.


1

Принаймні, на деяких машинах Linux ... "ls -s" може забезпечити те, що ви шукаєте.

Редагувати: моє погано, я бачу, що ви шукаєте список самих блоків, а не їх кількість.


-s показує розмір файлу в блоках - я хочу фактичний список номерів блоків.
Майк

-2

e2fsck -b 32768 / dev / hda1 я відчуваю, що ти можеш спробувати це, або якщо ти шукаєш більше docx на тому самому, ти можеш перевірити наступне

http://www.linux-tutorial.info/modules.php?name=MContent&pageid=97


Ця команда виконує перевірку файлової системи, приймаючи 32768 як резервний надблок. Про це він не просив.
Джеймс Броудхед
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.