Нахождение, какие секторы жесткого диска занимают файл

Я ищу хороший простой способ найти, какие секторы занимают данный файл. Мое предпочтение языка является C#.

От моего A-уровня Вычислительный класс мне преподавали, что жесткий диск имеет справочную таблицу на нескольких первых КБ диска. В этой таблице существует связанный список для каждой детализации файла, какие секторы, которые занимает файл. Таким образом, я надеюсь, что существует удобный способ посмотреть в этой таблице для определенного файла и видеть, какие секторы это занимает.

Я попробовал Google'ing, но я ничто не нахожу полезным. Возможно, я не ищу правильную вещь, но я не могу найти ничего вообще.

Любая справка ценится, спасибо.

6
задан Kratz 9 August 2010 в 23:05
поделиться

1 ответ

О дисках

Физическая геометрия современных жестких дисков больше не доступна операционной системе напрямую. Ранние жесткие диски были достаточно простыми, чтобы к ним можно было обращаться в соответствии с их физической структурой, головкой блока цилиндров и сектором. Современные накопители намного сложнее и используют такие системы, как запись битов зоны , в которых не все дорожки имеют одинаковое количество секторов. Уже нецелесообразно обращаться к ним в соответствии с их физической геометрией.

на странице руководства 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 теперь должен содержать исходное содержимое файла.

12
ответ дан 9 December 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: