Нахождение секторов жесткого диска, занимающих файл - PullRequest
5 голосов
/ 10 августа 2010

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 11 августа 2010

О дисках

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

со страницы руководства fdisk:

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

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

О файлах

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

Пример Ubuntu

Вот пример поиска местоположения файла LBAdata.

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

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

0 голосов
/ 25 апреля 2015
sudo hdparm --fibmap  file

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

fibmap - это также библиотека linux C.

...