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

UnixForum






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

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

Разделы диска и средства для работы с ними в Линукс

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

Назад Оглавление Вперед

6. Утилиты для восстановления таблицы разделов

Одним из поводов для обращения к утилитам разбиения диска являются те случаи, когда ваш диск перестал читаться. Причиной для этого может быть, в частности, повреждение таблицы разделов диска. В таком случае не стоит сразу бросаться к программам переразбиения типа fdisk - возможно, таблицу разбиения еще можно восстановить. И для этого в ОС Linux существуют специальные программные средства. Именно о таких средствах пойдет речь в настоящем разделе.

6.1. Программа gpart

Первое из таких средств - утилита gpart. Название утилиты gpart является сокращением от выражения “guess PC-type hard disk partitions” - “угадай тип раздела жесткого диска”. Автором этой утилиты является Michail Brzitwa <michail@brzitwa.de>.

Эта утилита предназначена как раз для тех случаев, когда таблица разделов в MBR жесткого диска разрушена или испорчена, но сами разделы на диске остались нетронутыми, хотя операционная система, может быть, и не может получить к ним доступ.

Работа утилиты основана на том, что первый блок данных любого раздела маркирован особым образом. И эти отметки можно обнаружить. Поскольку при создании раздела его начало обычно размещается в начале дорожки, задача поиска разделов на диске немного упрощается, что несколько ускоряет работу программы. С другой стороны, существует небольшая дополнительная проблема – после удаления разделов их начальные сектора сохраняются на диске до тех пор, пока в соответствующий сектор не будут записаны новые данные. А это происходит не сразу. Поэтому на старых дисках обнаруживается много”первых блоков раздела” и разработчики утилиты gpart должны были предпринять дополнительные меры для того, чтобы выделить из массы найденных начальных блоков “истинные”.

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

После того, как создан список найденных разделов, каждый раздел в этом списке помечается одной из следующих меток: "primary", "logical", "orphaned" или "invalid". Меткой "orphaned" помечаются логические разделы, которые найдены на диске, но не указаны в цепочке логических разделов. Такая ситуация может возникнуть в том случае, когда логический раздел удален из таблицы разделов в расширенном разделе, но в отведенное ему ранее пространство на диске не были записаны никакие данные. Разделы, помеченные как "invalid", могут возникнуть по разным причинам, которые в руководстве к программе подробно не описаны. Что касается первичных разделов, то программа распознает их достаточно хорошо. А вот с логическими разделами ситуация сложнее – тут возникает множество проблем и программа легко может ошибиться.

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

Листинг 13.

[root]# gpart /dev/hda 

Begin scan...
Possible partition(Linux swap), size(376mb), offset(0mb)
Possible partition(DOS FAT), size(1874mb), offset(376mb)
Possible partition(Linux ext2), size(94mb), offset(2251mb)
Possible partition(Linux ext2), size(1004mb), offset(2345mb)
Possible partition(Linux ext2), size(2008mb), offset(3349mb)
Possible partition(Linux ext2), size(8001mb), offset(5357mb)
Possible partition(Linux ext2), size(4800mb), offset(13358mb)
Possible partition(DOS FAT), size(20002mb), offset(18159mb)
End scan.

Checking partitions...
Partition(Linux swap or Solaris/x86): primary 
Partition(DOS or Windows 95 with 32 bit FAT): primary 
Partition(Linux ext2 filesystem): primary 
Partition(Linux ext2 filesystem): primary 
Partition(Linux ext2 filesystem): invalid primary 
Partition(Linux ext2 filesystem): invalid primary 
Partition(Linux ext2 filesystem): invalid primary 
Partition(DOS or Windows 95 with 32 bit FAT): invalid primary 
Ok.

Guessed primary partition table:
Primary partition(1)
   type: 130(0x82)(Linux swap or Solaris/x86)
   size: 376mb #s(771056) s(63-771118)
   chs:  (0/1/1)-(764/15/62)d (0/1/1)-(764/15/62)r

Primary partition(2)
   type: 011(0x0B)(DOS or Windows 95 with 32 bit FAT)
   size: 1874mb #s(3839472) s(771183-4610654)
   chs:  (765/1/1)-(1023/15/63)d (765/1/1)-(4574/0/63)r

Primary partition(3)
   type: 131(0x83)(Linux ext2 filesystem)
   size: 94mb #s(192780) s(4610655-4803434)
   chs:  (1023/15/63)-(1023/15/63)d (4574/1/1)-(4765/4/63)r

Primary partition(4)
   type: 131(0x83)(Linux ext2 filesystem)
   size: 1004mb #s(2056256) s(4803498-6859753)
   chs:  (1023/15/63)-(1023/15/63)d (4765/6/1)-(6805/4/62)r

Как видите, первичные разделы программа нашла. Только вот интерпретация выданных ею данных что-то вызывает у меня затруднение. Ну, я еще могу попытаться угадать, что значат первые две строки в описании каждого раздела: первая строка указывает тип раздела, во второй строке указан его размер, число секторов и размещение этих секторов в общей цепочке секторов на диске (еще раз подчеркну, что это просто моя догадка, поскольку в описании программы я ничего по этому вопросу не нашел). Относительно третьей строки тоже можно высказать некие предположения (например, что это указаны начало и конец раздела в нотации CHS), но что означают буквы "d" и "r", и в чем разница между значениями, которые стоят в скобках перед этими буквами, я сказать не могу. А в man-странице об этом вообще ничего не сказано.

Зато там сказано, что после того, как вы трижды проверите те данные, которые выдает программа gpart, вы можете с ее помощью записать исправленную таблицу первичных разделов в MBR, используя опцию -W следующим образом:

gpart -W /dev/sdc /dev/sdc

Однако, как предупреждает сам автор разработки на man-странице, "это действие достаточно опасное, так что будьте осторожны". Поскольку по складу характера я не склонен к авантюрам, я решил поэкспериментировать еще с одной программой – TestDisk.

6.2. Программа TestDisk

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

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

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

  • под DOS (как в "чистом" ДОС, так и окне под Win9x),
  • под Windows (NT4 / 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. В любом варианте запуска программы вначале выводится список дисков, обнаруженных в системе (рис. 29).

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

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

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

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

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

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

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

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

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

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

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

Если вы присмотритесь к рисунку 33, вы обратите внимание на то, что программа показывает всего два раздела. Это следствие того, что я слишком поспешно воспользовался командой 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. Дело в том, что мой опыт работы с этой программой был тоже весьма невелик. Я надеюсь, что общее представление о программе вы получили и теперь можете продолжить эксперименты с ней самостоятельно.

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

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

    Листинг 14.

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

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

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

    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, и геометрии диска, сообщаемой ядром.

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

  • 3. После восстановления раздела всегда запускайте проверку целостности ФС с помощью соответствующей ее типу утилиты:

    fsck.ext2 /dev/hdb1
    reiserfsck /dev/hdb3
    ...


Назад Оглавление Вперед