Я ищу хороший простой способ найти, какие секторы занимают данный файл. Мое предпочтение языка является C#.
От моего A-уровня Вычислительный класс мне преподавали, что жесткий диск имеет справочную таблицу на нескольких первых КБ диска. В этой таблице существует связанный список для каждой детализации файла, какие секторы, которые занимает файл. Таким образом, я надеюсь, что существует удобный способ посмотреть в этой таблице для определенного файла и видеть, какие секторы это занимает.
Я попробовал Google'ing, но я ничто не нахожу полезным. Возможно, я не ищу правильную вещь, но я не могу найти ничего вообще.
Любая справка ценится, спасибо.
О дисках
Физическая геометрия современных жестких дисков больше не доступна операционной системе напрямую. Ранние жесткие диски были достаточно простыми, чтобы к ним можно было обращаться в соответствии с их физической структурой, головкой блока цилиндров и сектором. Современные накопители намного сложнее и используют такие системы, как запись битов зоны , в которых не все дорожки имеют одинаковое количество секторов. Уже нецелесообразно обращаться к ним в соответствии с их физической геометрией.
на странице руководства fdisk:
Если возможно, fdisk автоматически получит геометрию диска. Это не обязательно физическая геометрия диска (действительно, современные диски действительно не имеют ничего как физическая геометрия, конечно, не то, что можно описать в упрощенной форме Цилиндры / Головки / Секторы)
Чтобы обойти эту проблему, современные диски обращаются с помощью логической адресации блоков, о которой знает операционная система. LBA - это схема адресации, в которой весь диск представлен в виде линейного набора блоков, каждый из которых имеет одинаковое количество байтов (обычно 512 или больше).
О файлах
Чтобы понять, где находится «файл» на диске (на уровне LBA), вам необходимо понять, что такое файл. Это будет зависеть от того, какую файловую систему вы используете. В файловых системах в стиле Unix существует структура, называемая индексным дескриптором, которая описывает файл.Inode хранит все атрибуты файла и указывает на расположение LBA фактических данных.
Пример Ubuntu
Вот пример поиска LBA-местоположения файловых данных.
Сначала получите номер inode вашего файла
$ ls -i
659908 test.txt
Запустите отладчик файловой системы. yourPartition будет что-то вроде sda1, это раздел, на котором расположена ваша файловая система.
$sudo debugfs /dev/yourPartition
debugfs: stat <659908>
Inode: 659908 Type: regular Mode: 0644 Flags: 0x80000
Generation: 3039230668 Version: 0x00000000:00000001
...
...
Size of extra inode fields: 28
EXTENTS:
(0): 266301
Число в разделе «EXTENTS», 266301, является логическим блоком в файловой системе, в которой расположен ваш файл. Если ваш файл большой, в списке будет несколько блоков. Наверное, есть более простой способ получить этот номер, я не смог его найти.
Чтобы убедиться, что у нас есть правильный блок, используйте dd для чтения этого блока с диска. Чтобы узнать размер блока вашей файловой системы, используйте dumpe2fs.
dumpe2fs -h /dev/yourPartition | grep "Block size"
Затем укажите размер вашего блока в параметре ibs = и логический блок экстента в параметре skip = и запустите dd следующим образом:
sudo dd if=/dev/yourPartition of=success.txt ibs=4096 count=1 skip=266301
success.txt теперь должен содержать исходное содержимое файла.