7

У меня был сбой жесткого диска, и мне удалось спасти некоторые данные с диска (1 ТБ) с помощью GNU ddrescue . Последние 800 ГБ диска были идеальными, без единой ошибки, но в первых 200 ГБ было почти 14000 ошибок (бадблоков), разбросанных по всей области. ddrescue создает лог-файл, который описывает, где находятся бадблоки.

ddrescue командной строки ddrescue:

ddrescue /dev/sdb /dev/sdd /mnt/sdc1/sdb.log -r -1 -f -d -v

Лог-файл выглядит так:

#      pos        size  status
0x00000000  0x1C08CE00  +
0x1C08CE00  0x00000200  -
0x1C08D000  0x011E6800  +
0x1D273800  0x00000200  -
0x1D273A00  0x005EC000  +
0x1D85FA00  0x00000200  -
...         ...         ...

Плюс (+) означает непрерывное хорошее пространство, минус (-) нечитаемый; положение и размер указаны в шестнадцатеричном формате. Чередование строк, оканчивающихся на '+', у меня есть список с позициями плохих блоков, но мне нужен способ соотнести эти плохие блоки с файлами в файловой системе, которая, кстати, NTFS.

Я знаю, что могу использовать что-то вроде DiskExplorer, чтобы сделать это вручную, но это было бы адом с 14000 секторов. Итак, есть более или менее автоматический и элегантный способ сделать это?

3 ответа3

6

После огромного успеха этого вопроса я остался без ответов, если таковые были. Но я продолжил исследования и нашел утилиту Microsoft, выпущенную в 1999 году под названием nfi.exe, которая входит в состав пакета поддержки OEM-производителей, фаза 3, выпуск 2 для Windows NT 4 и 2000. Утилита делает именно то, что мне нужно, получает сектор и возвращает файл. Но это делает это для отдельных секторов, поэтому мне пришлось создать скрипт для автоматизации процесса. Это скрипт Python (2.7+), который работает следующим образом:

Он получает в качестве входных данных файл журнала ddrescue, анализирует его, вызывает файл nfi.exe для каждого сектора в файле и создает список с файлами в алфавитном порядке.

>sector_correlator.py -h

usage: sector_correlator.py [-h] [-v] [-n \path\to\nfi.exe] [-V] [-L]
                        logfile nt-device-path output file

Receives a list of sectors and returns a list of files which resides in them.

positional arguments:
  logfile              path to ddrescue's logfile.
  nt-device-path       NT-style path to physical device, like
                       \device\harddisk1\dr1
  output file          filelist output file name

optional arguments:
  -h, --help           show this help message and exit
  -v, --version        show program's version number and exit
  -n \path\to\nfi.exe  nfi.exe's path, if not speciified, assumes's it is in
                       the same path as the script
  -V                   enables verbose mode
  -L                   save nfi.exe's output log to nfi_raw.log

Пример:

sector_correlator.py sdb.log \devices\harddisk0\dr0 filelist.txt

Где: sdb.log - это журнал ddrescue,

\device\harddisk0\dr0 - путь к HD в стиле NT (вы обнаружите его с помощью инструмента sysinternals под названием WinObj и утилиты управления дисками) WinObj показывает список физических устройств

и filelist.txt - это список файлов, который вы хотите. Это будет выглядеть так:

\Documents\Downloads\Evernote_4.5.1.5432.exe
\Documents\Downloads\Programs\Apophysis207SE.exe
\Documents\Downloads\Programs\GetGnuWin32-0.6.21.exe
\Documents\Downloads\Programs\mbam-setup.exe
\Documents\Downloads\Programs\msnbackup133.exe
\Documents\Downloads\Programs\x64Components_v254.exe

Другие аргументы в сценарии являются необязательными и объясняются, когда вы запускаете его с -h. По умолчанию сценарий предполагает, что файл nfi.exe находится в том же каталоге, если нет, используйте -n pathtonfi.exe.

Наконец, вот ссылка на скрипт: sector_correlator.py

Это очень элементарно и не имеет обработки ошибок, но выполняет свою работу.

1

Это скорее дополнение к ответу (# 1), основанное на моих попытках проверить мой неисправный диск. 1) вы все равно можете получить nfi.exe и использовать его (по крайней мере, с winxp). Вы загружаете файл, указанный как oem3sr2.zip на указанной выше странице MS в Ответе №1.

Я обнаружил, что с текущей версией nfi.exe вам НЕ нужно искать путь к диску. Подойдет простая буква диска, например "K:"

python sector_correlator.py badsectors.log k: badfiles.txt

Однако (и моя сила в Perl, поэтому не ожидайте многого от моего чтения Python), мне кажется, что скрипт проверяет только один блок на соответствие строки '-'. Таким образом, если файл журнала сообщил о 200 последовательных поврежденных блоках (второе число в строке файла журнала), то сценарий не проверил последние 199 блоков на предмет различных ассоциаций файлов.

В Linux вы можете использовать ddrescuelog -l- badsectors.log для расширения, чтобы показать все плохие блоки. К сожалению, и я не понимаю почему, реализация ddrescue в Ubuntu не включает ddrescuelog (но довольно просто получить последнюю версию из Debian, скомпилировать и установить ее, о самом простом, что я видел).

0

Я сейчас восстанавливаю плохой диск и собираюсь попробовать это:

http://sourceforge.net/projects/ddrutility/

... который (начиная с версии 2.1) включает ddru_ntfsfindbad:

Ddru_ntfsfindbad - это утилита для разделов NTFS, позволяющая определить, какие файлы связаны с поврежденными секторами в файле журнала ddrescue.

Установка означает компиляцию из исходного кода, но при наличии машины Ubuntu (VM), предоставленной инструкции это легко сделать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .