Как я могу получить адреса дисков файлов в C / C ++? - PullRequest
0 голосов
/ 27 марта 2020

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

Есть идеи о том, как это сделать, особенно для ex4 & btrfs?

ОБНОВЛЕНИЕ: Я хочу получить адреса экстентов файла. Информация об адресах должна храниться где-то на диске. Я хочу получить эту информацию, чтобы отобразить физическое местоположение содержимого файла. Любые методы для достижения этого?

ОБНОВЛЕНИЕ: Привет всем! Спасибо за ваши ответы. То, что я хочу, это функция / команда, которая возвращает мне список адресов экстентов. debugfs представляется функцией / командой с наиболее важной функциональностью.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Текущее решение / обходной путь - вызывать эти функции с помощью popen:

filefrag -e / path / to / file

hdparm --fibmap / path / to / filename

Тогда нужно просто разобрать строковые выходы этих программ. Это не реальное решение (т. Е. Вывод на уровне C / C ++), но сейчас я его приму.

Источники:

https://unix.stackexchange.com/questions/106802/what-command-do-i-use-to-see-the-start-and-end-block-of-a-file-in-the-file-syste

https://serverfault.com/questions/29886/how-do-i-list-a-files-data-blocks-on-linux

0 голосов
/ 27 марта 2020

Это зависит от используемой вами файловой системы. Если вы используете Linux, вы можете использовать debufs для поиска файла в файловой системе.

Я должен сказать, что все FS монтируются через VFS, виртуальную файловую систему, которая похожа на упрощенный интерфейс с стандартные операции (открыть, закрыть, прочитать ...). Что это значит? Ни файловая система, ни ее содержимое (файлы, каталоги) не открываются непосредственно с диска, когда вы открываете что-то, вы перемещаете это в основную память (вашу оперативную память), выполняете свои операции, а когда вы закрываете что-то, оно возвращается на дисковод.

Теперь вопрос: могу ли я получить абсолютный адрес в ФС? Да, если вы откроете всю свою файловую систему, например open ("/dev/sdaX", 0_RDONLY);, и получите адрес относительно вашей файловой системы, используя, например, lseek в C.

И затем ... Могу ли я получить то же самое в весь диск? Нет, это потому, что вы не можете открыть весь диск как дескриптор файла. Помните /dev/sdaX в UNIX? Разделы и их можно открывать как файлы, потому что на них запущен виртуальный интерфейс.

Ваш последний ответ: Могу ли я прочитать действительно необработанное содержимое? Все файлы читаются по мере их появления на диске, единственное, что изменяется, - это дескриптор, используемый ОС, и некоторые данные о том, как они проиндексированы, все это в виде «заголовка файла».

Надеюсь, все ваши вопросы ответил.

...