LINUX.ORG.RU

Доступ к HDD при помощи C++

 , ,


0

1

Всем привет, в Linux-системах я новичок и многого могу не знать. Суть вопроса состоит в том, что мне необходимо получить адрес физического начала заданного файла на HDD. Файловая система ext4. Подскажите, каким образом я могу добиться нужного результата и, если несложно, продемонстрируйте часть кода. Спасибо

Начала? Про фрагментацию не слышал?

anonymous
()

Я думаю, для начала надо открыть файл устройста /dev/sd*, обладая правами рута.

Затем найти нужный файл, после чего искать информацию в его структуре inode. См., например, https://en.wikipedia.org/wiki/Inode_pointer_structure . Но задача эта нетривиальная, и стандартных способов на уровне ANSI/ISO C, POSIX, X/Open, API Linux и т. д. не существует, т. к. стандартные api предоставляют логическую структуру файла, как непрерывного массива, в то время как на диске он может располагаться в несмежных блоках. Ну и если такая программа будет не только читать, но ещё и писать, то легко разрушить всю ф/с.

aureliano15 ★★
()

си++ тут не нужен. Надо понимать, что такое диск, что такое разделы на нём, что такое файловая система. Для ext* есть утилита debugfs.

legolegs ★★★★★
()

программа filefrag делает примерно это:

# filefrag -v /bin/bash
Filesystem type is: 9123683e
File size of /bin/bash is 778840 (191 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..     189:  149315905.. 149316094:    190:            
   1:      190..     190:    6747217..   6747217:      1:  149316095: last,eof
/bin/bash: 2 extents found

пользуется ioctl(FS_IOC_FIEMAP): https://www.kernel.org/doc/Documentation/filesystems/fiemap.txt

Пример использования в коде filefrag: https://github.com/tytso/e2fsprogs/blob/08ddd208ff89b3b7735e6edc60a7a3717e7da...

sf ★★★
()
Ответ на: комментарий от aureliano15

Спасибо. Постараюсь разобраться со всем этим, а насчет дефрагментации - это усложнит задачу, но, думаю, что она решаема.

real_linuxoid
() автор топика
Ответ на: комментарий от sf

Спасибо за помощь, читал про ioctl(); но думал, что может быть другой способ.

real_linuxoid
() автор топика
Ответ на: комментарий от aureliano15

Хотелось бы еще спросить, если в Линуксе, а именно в ф/с ext4, какая-то таблица, в которой хранятся адреса кластеров какого-либо файла, например, как в ntfs таблица mft?

real_linuxoid
() автор топика
Ответ на: комментарий от real_linuxoid

какая-то таблица, в которой хранятся адреса кластеров

Как реализована ext4 во всех деталях - не скажу. Это надо смотреть в спецификациях.

aureliano15 ★★
()
Ответ на: комментарий от real_linuxoid

Если не ошибаюсь, man debugfs. В общем, всё это гуглится.

true_admin ★★★★★
()
Ответ на: комментарий от real_linuxoid

нужно гарантированно удалять файл

А бэкапов там не делают?

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.