Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

“И узнаешь ты много такого, о чем совсем не хотел знать”
Автор неизвестен

Заметки пользователя Linux

(C) В.А.Костромин, 2004.

Восстанавливаем таблицу разбиения диска

Назад: 1.7. Определяем “истинную” таблицу разделов. Программа gpart.

1.8. Определяем “истинную” таблицу разделов. Утилита TestDisk.

Примечание: В документации программа называется TestDisk, а вызывается она командой testdisk, поэтому не удивляйтесь, что я пишу название иногда с заглавными буквами, иногда без таковых.

Программа TestDisk предназначена для того, чтобы помочь восстановить потерянные разделы и/или восстановить возможность загрузки с диска, для которого такая возможность была утеряна вследствие сбоя в работе программного обеспечения, воздействия вируса или простой человеческой ошибки (например, если вы случайно затерли таблицу разделов). Она позволяет проанализировать структуру диска и найти потерянные разделы, а при необходимости и восстановить таблицу разделов. Утилита разработана К. Гренье (Christophe GRENIER). У меня в системе Knoppix 3.2 обнаружилась версия 4.0 этой программы, датированная 3 апреля 2002 г. А на сайте http://www.cgsecurity.org я обнаружил версию 5.3, снабженную довольно подробной документацией (man-страница к программе настолько краткая, что не позволяет понять, как этой программой пользоваться).

Программа TestDisk может быть запущена

  • под DOS (как в "чистом" ДОС, так и окне под Win9x),
  • под Windows (NT 4/2000/XP/2003),
  • под Linux или FreeBSD.

Программа может отыскать потерянные разделы с файловыми системами следующих типов:

  • BeFS ( BeOS )
  • DOS/Windows FAT12, FAT16 and FAT32
  • Ext2 and Ext3 ( Linux)
  • Linux Swap (версий 1 и 2)
  • Netware (только старых версий)
  • NTFS ( Windows NT/2K/XP )
  • ReiserFS (версий 1 и 2)
  • UFS ( FreeBSD/OpenBSD/NetBSD )
  • JFS

Как сообщает краткая справка к программе, запускается она в одном из следующих форматов.

testdisk [/log] [/debug] [/dump]

testdisk /list [/log]

Будучи запущенной с опцией /list, команда просто выводит список существующих разделов (точнее, видимо, содержимое таблиц разделов из MBR) на всех жестких дисках. Во всех остальных вариантах после запуска программы TestDisk выводит вначале фразу "Please wait..." и приступает к сбору данных от BIOS или OS.

Опции (необязательные) /log, /dump и /debug имеют следующее назначение:

  • /log - создавать файл протокола работы программы (его имя testdisk.log);
  • /debug - добавлять отладочную информацию;
  • /dump - отображать на экране и записывать в протокол содержание найденных начальных секторов разделов.

В документации к программе рекомендуется запускать ее с опциями /log и /debug. В любом варианте запуска программы вначале выводится список дисков, обнаруженных в системе (рис. 9).


Рис. 9. Основное меню программы testdisk

С помощью клавиш управления курсором "вверх/вниз" вы можете выбрать диск для анализа. В нижней части окна имеется список доступных команд, перемещаться по которому можно с помощью клавиш "вправо/влево". А строка подсказки, расположенная ниже этого меню, дает краткое пояснение к подсвеченному пункту. Когда нажимаем клавишу <Enter> при подсвеченном пункте меню Analyze вначале, видимо, выводится просто содержимое таблицы разделов из MBR и предлагается единственный пункт меню Quit (рис.10), что приводит пользователя в состояние некоторого недоумения.


Рис. 10. Первый результат работы программы testdisk

Однако повторное нажатие клавиши <Enter> запускает все же процесс анализа структуры разделов диска (рис.11), ход которого отображается в строке "Analyze cylinder NNNN/MMMM". Поскольку процесс анализа, надо отметить, продолжается очень долго, эта строка является не лишней, она помогает сохранить терпение.


Рис. 11. Процесс анализа диска

Анализ структуры диска заключается в том, что TestDisk просматривает начальные сектора всех цилиндров. Первичные разделы всегда размещаются начиная с первого сектора цилиндра (head=0, sector=1), а логические разделы - со второго сектора (head=1, sector=1). Сканируя все возможные начальные сектора разделов TestDisk анализирует их на наличие заголовков файловых систем (a filesystem header): для FAT или NTFS это загрузочный сектор, для EXT2/EXT3 - суперблок, для BSD - метка диска (disklabel) и так далее. Обнаружение такого заголовка интерпретируется как начало раздела соответствующего типа. Размер раздела определяется непосредственно исходя из его структуры на диске. Каждый обнаруженный во время такого сканирования раздел TestDisk добавляет в список найденных разделов.

Поскольку, как уже было сказано при описании утилиты gpart, на диске могут присутствовать "останки" или "следы присутствия" давно удаленных разделов, которые просто не были затерты более поздней информацией (это особенно часто случается в том случае, когда проводится детальный поиск потерянных разделов), пользователь должен внимательно проанализировать результаты поиска, чтобы выбрать те разделы, которые действительно присутствовали на диске перед тем, как была испорчена таблица разделов.

По завершении этого процесса программа предлагает (рис. 12) исправить характеристики разделов, которые указаны в первом столбце. Изменение этого параметра обнаруженного раздела осуществляется с помощью клавиш-стрелок "вправо\влево" (вы просто перебираете циклически значения, перечисленные в нижней строке экрана, пока не найдете нужное). Тут же можно изменить тип раздела, нажав клавишу <T>. А по клавише <P> можно вывести список файлов в том разделе, на который указывает подсветка.


Рис.12. Окно с результатами анализа диска

Еще одно нажатие клавиши <Enter> и мы видим дополнительное меню из трех пунктов (рис.13). С помощью пункта Search можно провести углубленный поиск потерянных разделов. А команда Write служит для того, чтобы записать на диск исправленную таблицу разделов.


Рис. 13. Дополнительное меню

Если вы присмотритесь к рисунку 13, вы обратите внимание на то, что программа показывает всего два раздела. Это следствие того, что я слишком поспешно воспользовался командой Write. Не знаю, в чем причина, но после выполнения команды Write та же утилита TestDisk стала видеть на моем диске только 2 раздела. Возможно, вина в этом полностью моя, но результат был обескураживающим. Прежде чем рассказывать о своих дальнейших действиях, я все же приведу еще описание других команд из основного меню программы, заимствованное из документации.

Команда меню Delete

Если вы выберете эту команду из меню программы TestDisk, будет обнулена таблица разделов в главной загрузочной записи, то есть во все 64 байта, отведенные под эту таблицу, будут записаны нулевые значения. Код загрузчика и другие данные в главном загрузочном секторе (байты сигнатуры и тому подобное) останутся нетронутыми.

Команда меню MBRCode

По этой команде TestDisk перезаписывает код первичного загрузчика и сигнатуру MBR (то есть значение 0xAA55 в двух последних байтах MBR). Это действие примерно аналогично тому, что делает команда MS-DOS fdisk, будучи запущенной с "недокументированной" опцией /MBR, то есть записывает код стандартного первичного загрузчика. Это может оказаться полезным в том случае, если ваша система вообще отказывается загружаться и вы уже исчерпали все другие способы выхода из этой ситуации.

Команда меню Geometry

Эта команда служит для того, чтобы задать значения параметров геометрии диска (число цилиндров, головок или секторов), которые TestDisk использует для поиска начальных секторов разделов. Дело в том, что программы для создания разделов для архитектуры i386 чаще всего создают разделы, оканчивающиеся на границе цилиндра. Поэтому изменение параметров геометрии, используемых программой, приводит к тому, что будут просматриваться другие сектора.

Команда не меняет параметров самого жесткого диска до тех пор, пока вы не выполните команду записи данных о найденных разделах на диск. Имейте в виду, что задание неправильной геометрии и запись этих неправильных данных на диск может привести к невозможности в дальнейшем восстановления ваших данных. Как предупреждает руководство, команда эта ТОЛЬКО ДЛЯ ЭКСПЕРТОВ.

Руководство рекомендует в том случае, если вы решите менять геометрию диска, изменять в первую очередь число логических головок, причем опробовать значения числа головок, равные 255, 16, 32, 64, 128 и 240.

Команда меню Options

Значения опций меняются путем "подсвечивания" нужной строки и нажатия клавиши ENTER. Изменять можно значения следующих опций:

  • Dump : Отображать содержимое "подозрительных" секторов (по умолчанию: не отображаются; опция аналогична опции /dump командной строки)
  • Cylinder boundary : границы разделов совпадают с началом цилиндров (по умолчанию: да).
  • Allow partial last cylinder : последний цилиндр может быть не полным (по умолчанию: нет)
  • Ask partition order : разделы могут быть переупорядочены (по умолчанию: нет)
  • Halt on errors : останавливаться при обнаружении ошибок дискового ввода/вывода (по умолчанию: да)
  • Maximize extended part : если существуют логические разделы, расширенный раздел будет использовать все доступное дисковое пространство (по умолчанию: нет).
  • Expert mode : Если эта опция установлена (значение "да"), программа предоставляет некоторые дополнительные возможности (по умолчанию: нет).
  • Quit : сохранить (запомнить) выбранные значения опций и вернуться к главному меню.

Команда меню Advanced

Только для экспертов, пытающихся восстановить и отремонтировать загрузочные сектора операционных систем! TestDisk позволяет вам выполнить некоторые действия с загрузочными секторами на FAT- и NTFS-разделах. Выберите раздел, который вы хотите модифицировать, и выберите команду Boot. За описанием того, какие возможности Вы при этом получите, я отошлю вас к документации, прилагаемой к программе.

На этом я, пожалуй, завершу краткое описание программы TestDisk. Дело в том, что мой опыт работы с этой программой был тоже весьма невелик. Как уже было сказано, я поторопился записать "исправленную" таблицу разделов на диск и в результате совершенно ее запортил! Что я ни делал, после попытки загрузиться с жесткого диска появлялись две пресловутые буквы "LI" и на этом все заканчивалось.

Тогда я решил установить систему заново. Очистил MBR командой
dd if=/dev/zero of=/dev/hda bs=512 count=1
и попытался установить на "чистый" диск Windows 2000. Программа инсталляции создала новый раздел, перенесла на него установочные файлы, после чего предложила перезагрузиться. После перезагрузки появилось сообщение "Missing operating system" и на этом снова все закончилось.

Тогда я попробовал поставить на диск Mandrake Linux 10.0. Установка прошла успешно, но после перезагрузки я получил тот же непонятный результат - "LI". Тут уж у меня зародилось сомнение в том, что я поставил правильный диагноз о причинах "заболевания" моей системы. Дело, видимо, не в искаженном загрузочном секторе! Так оно и оказалось! Причина, оказывается, была в том, что я неправильно задал порядок загрузочных устройств в BIOS. Вместо hdd-0 в качестве основного загрузочного устройства указал hdd-1 (перед ним шли CD-ROM и floppy). В результате BIOS пытался осуществить загрузку со второго жесткого диска, на котором я когда-то тоже что-то ставил (поэтому и появлялись буквы "LI", которые ввели меня в заблуждение), но на котором давно не было никакой операционной системы (и вообще диск был уже дефектным). О том, что было дальше, я расскажу в следующей заметке.

В заключение приведу еще два небольших примечания:

  • 1. В процессе поиска инструментов для восстановления таблицы разделов я натолкнулся на ссылку о том, что существует еще программа rescuept, автором которой является Andries Brouwer (автор двух HOWTO о разделах диска, смотри ссылки). Эта утилита входит в состав пакета util-linux, который вы можете найти почти на любом ftp-сайте с программным обеспечением для Linux. Однако, поскольку я с этой програмой не работал, сказать о ней ничего не могу.
  • 2. Для корректировки таблицы разделов диска можно использовать и утилиту sfdisk, речь о которой пойдет в следующей части настоящих заметок. У команды sfdisk имеется опция -V, которая служит для проверки таблицы разбиения диска. Правда, мне показалось, что результат ее выполнения команды sfdisk -V дает очень мало полезной информации:

Листинг 5.

[root]# /sbin/sfdisk -V /dev/hda

Warning: extended partition does not start at a cylinder boundary.
DOS and Linux will interpret the contents differently.

Но, если вы знаете как исправить таблицу разделов, можно поступить следующим образом: вначале таблица разделов диска выгружается в файл, корректируется, а затем снова загружается в начальный сектор диска. Делается это так:

Листинг 6.

sfdisk -d /dev/hda > hda.out
sfdisk /dev/hdb < hda.out

Утилита sfdisk интерпретирует строки входного файла как

                <start>  <size> <id> <bootable> <c,h,s> <c,h,s> 

Отдельные поля при этом разделяются пробелами, запятыми или точкой с запятой (возможно с последующими пробелами). При этом два последних поля (<c,h,s>) могут быть опущены - программа сама вычислит нужные значения исходя из значения полей start и length, и геометрии диска, сообщаемой ядром.

Но я не решился воспользоваться этим способом корректировки таблицы разбиения диска.