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

UnixForum






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

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

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

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

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

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

Назад: 1.6. Создаем резервную копию данных.

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

Итак, резервные копии всех ценных данных созданы, теперь можно без опаски браться за исправление таблицы разбиения диска. В конце концов, если что-то и рухнет, то остается возможность переустановить систему с нуля, а потом восстановить все данные из созданных архивов. Начать придется с выяснения того, какова же “истинная” геометрия моего диска, поскольку, как мы видели в листинге 1, в таблице разбиения диска оказалась неправильно указана именно его геометрия. После того, как будет определена каким-то образом “истинная” геометрия диска, можно будет попытаться поправить таблицу разделов.

Геометрия диска обычно указана на его корпусе. Я вскрыл системный блок и увидел следующее:
16383 Cyl 16 HDS 63 Sec 
LBA 78165360 

Для определения истинной геометрии диска можно воспользоваться процедурой автоматического распознавания диска, встроенной в BIOS. Если жесткий диск является "родным", то есть был установлен при сборке компьютера, а не заменен позже, то BIOS скорее всего должен правильно определить диск. Другое дело, если вы меняли диск и BIOS у вас уже устарел в сравнении с диском. Тут возможны неожиданности. Но у меня диск стоит "родной", и процедура автоматического определения диска в BIOS сообщила, что его геометрия имеет вид C/H/S = 19158/16/255 (это дает объем диска в 40020295680 байт или 38 166 MiB = 37,27 GiB).

В Linux геометрия диска определяется в процессе начальной загрузки системы и ее можно увидеть в выводе команды dmesg. Я увидел в этом выводе следующие строки:

Листинг 4.

hda: C/H/S=1277/240/255 from BIOS ignored
hda: ST340810A, ATA DISK drive
hda: 78165360 sectors (40021 MB) w/2048KiB Cache, CHS=77545/16/63
 hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 >

Как видите, BIOS выдал в этом случае совсем другие значения, а Линукс посчитал, что BIOS неправильно определил геометрию диска (хотя по объему это 40020664320 байт, то есть значение, очень близкое к предыдущему результату).

Программа fdisk дала результат, совпадающий в предыдущим (см. листинг 1).

Disk /dev/hda: 16 heads, 63 sectors, 77545 cylinders

Как видите, данные о геометрии диска, полученные средствами BIOS и средствами операционной системы, существенно различаются. Объясняется это тем, что существует три разных "геометрии" диска:

  • физические значения CHS, сообщаемые самим диском;
  • логические значения CHS, которые диск передает BIOS или OS;
  • логические значения CHS, используемые OS;
и возникает необходимость производить преобразования "геометрии" диска из одного типа в другой. Из-за этого возникает путаница и масса недоразумений. Поэтому однозначно решить, какова же "истинная" геометрия диска, чтобы задать правильные значения полей в таблице разбиения диска, довольно затруднительно. В моем случае по "большинству голосов" можно заключить, что геометрия диска имеет вид C/H/S = 77545/16/63.

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

Утилита gpart

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

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

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

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

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

Приведу результаты применения этой команды к моему диску :

Листинг 1.

[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.

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