Как мне перечислить блоки данных файла в Linux?

13

Насколько я понимаю, каждый файл в Unix-подобной операционной системе имеет номер инода (который можно просмотреть с помощью «ls -i»), а каждый инод - это список блоков диска, которые содержат фактические данные файла.

Существует ли команда Linux, которая принимает имя файла в качестве аргумента и распечатывает список блоков диска, на которые указывает индекс этого файла?

PS Рассматриваемая файловая система - ext3.

Майк
источник

Ответы:

17

Вы можете использовать инструмент «debugfs» для просмотра информации о файле в командной строке или в интерактиве. либо используйте:

# 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
katriel
источник
Обратите внимание, что аргумент для «stat» не всегда / path / to / file. Использование / path / to / file работает для файлов в корневых файловых системах (смонтированных в /), но не для путей, смонтированных в другой файловой системе. В этих случаях можно получить сообщение об ошибке File not found by ext2_lookup. Таким образом, лучше использовать обозначение inode для аргумента stat. Используйте ls -iдля получения номера индекса файла, затем вызывайте debugfs с этим номером в «<>» вместо / path / to / file. Например:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR
@ElazarR Можете ли вы объяснить этот комментарий? Почему path/to/fileне должно работать во всех случаях? Что меня смущает, так это то, debugfs ..... /dev/fs_blockdevчто в моем понимании только одна когда-либо рассматриваемая файловая система, и ко всем этим файлам в этой системе можно получить доступ либо по их пути, либо через их инод, что вы хотели выразить?
человечествоANDpeace
@humanityANDpeace, в случае, когда файл находится в разделе (файловой системе), который находится за пределами корневой файловой системы, т. е. смонтирован в некоторой точке монтирования под корневым разделом, операция ext2_lookup, по-видимому, не может найти указанный путь под данным устройством (раздела). Это приводит к ошибке, которую я упомянул. Например, если ваши / home папки монтируются из / dev / sda5 через корневую файловую систему (которая находится в другом разделе, например, / dev / sda3), это debugfs -R "stat /home/myuser/foo.txt" /dev/sda5приводит к ошибке. Но вызывая debugfs -R "stat /path/on/rootfs" /dev/sda3работает.
ElazarR
Я думаю, что вам нужно sudo, в противном случае будет отображаться какое-то бесполезное сообщение.
Кедар Мхасвад
И обратный вопрос: как мы можем узнать, какой файл использует данный блок?
Луис А. Флорит
4

Посмотрите на синтаксис для "debugfs" и, в частности, на команду "stat". Это покажет вам список блоков данных, используемых файлом. Вы можете передать параметры в «debugfs» с аргументом «-f», чтобы вызвать его из скрипта.

Эван Андерсон
источник
4

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

Более новой (и более эффективной) альтернативой является FIEMAPioctl, который также может возвращать подробную информацию о экстентах (полезно для ext4).

CesarB
источник
3
hdparm --fibmap /path/to/filename

Я не буду работать на zfs, но буду работать на ext4, btrfs, (v) fat и т. Д.

man 8 hdparm :

--fibmapКогда используется, это должен быть единственный данный флаг. Он требует путь к файлу в качестве параметра и распечатывает список экстентов устройства (секторов), занятых этим файлом на диске. Номера секторов даны как абсолютные номера LBA, на которые ссылается сектор 0 физического устройства ( не раздела или файловой системы). Эта информация может затем использоваться для различных целей, таких как проверка степени фрагментации больших файлов или определение соответствующих секторов для преднамеренного повреждения во время процедур тестирования с инжекцией ошибок.

ChewbaccaKL
источник
1

По крайней мере, на некоторых машинах Linux ... "ls -s" может предоставить то, что вы ищете.

Изменить: мой плохой, я вижу, что вы ищете список самих блоков, а не их количество.

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

e2fsck -b 32768 / dev / hda1 Я чувствую, что вы можете попробовать это или, если вы ищете больше docx на том же, вы можете проверить следующее

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

Раджу
источник
Эта команда запускает проверку файловой системы, принимая 32768 за резервный суперблок. Это не то, что он просил.
Джеймс Бродхед