Как узнать, какие сектора жесткого диска занимают файл

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

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

Я пробовал гуглить, но ничего полезного не нашел. Может быть, я ищу не то, что нужно, но я вообще ничего не могу найти.

Любая помощь приветствуется, спасибо.


person Kratz    schedule 09.08.2010    source источник


Ответы (2)


О дисках

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

на справочной странице fdisk:

Если возможно, fdisk автоматически получит геометрию диска. Это не обязательно физическая геометрия диска (действительно, современные диски на самом деле не имеют ничего похожего на физическую геометрию, уж точно не то, что можно описать в упрощенной форме Цилиндры/Головки/Сектора)

Чтобы обойти эту проблему, современные диски адресуются с помощью логической блочной адресации, о которой знает операционная система. LBA — это схема адресации, в которой весь диск представлен в виде линейного набора блоков, каждый блок имеет одинаковое количество байтов (обычно 512 или больше).

О файлах

Чтобы понять, где находится «файл» на диске (на уровне LBA), вам нужно понять, что такое файл. Это будет зависеть от того, какую файловую систему вы используете. В файловых системах в стиле Unix существует структура, называемая inode, которая описывает файл. Индексный дескриптор хранит все атрибуты файла и указывает на LBA-местоположение фактических данных.

Пример Ubuntu

Вот пример поиска местоположения файловых данных LBA.

Сначала получите номер инода вашего файла

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

person Chandler    schedule 10.08.2010
comment
Почему для размера входного блока (ИБС) установлено значение 4096? - person Vishesh Handa; 09.11.2012
comment
@VisheshHanda - используется значение 4096, потому что это установленный размер блока на устройстве. - person slm; 28.12.2013

sudo hdparm --fibmap  file

Для ext, vfat и NTFS ..может и больше.

fibmap также является библиотекой Linux C.

person Dave Thompson    schedule 25.04.2015