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

UnixForum






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

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

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

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

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

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

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

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

1.1. Предисловие

В эту ситуацию я попал недавно. Не буду пока рассказывать, как это получилось, но в результате компьютер у меня вообще отказался загружаться. Загрузчик LILO выдавал две буквы “LI”, после чего все замирало. Я решил, что испорчена главная загрузочная запись (Master Boot Record) на моем жестком диске. А на этом диске (объемом, кстати, 40 Гбайт, причем половина его была отдана Линуксу, а вторая половина - Windows) у меня было много чего собрано, так что просто переустанавливать систему как-то не хотелось. К сожалению, загрузочная дискета у меня отсутствовала – в ходе многочисленных переустановок системы она была как-то испорчена, а восстановлением ее я вовремя не озаботился.

Надо сказать, что я почти не сомневался, что смогу восстановить информацию, поскольку знал, что никаких необратимых действий с жестким диском не выполнял, так что вся информация должна быть цела, надо только до нее добраться. Подтверждение этого я получил достаточно быстро, запустив дистрибутив Knoppix с загрузочного CD-ROM. Пришлось, правда, немного повозиться - я хоть и имел в запасе такой Live-CD, но еще ни разу им не пользовался. Он у меня отказался вначале нормально выйти в графический режим, однако после того, как я вышел в меню запуска (по клавише F2) и задал обычное для моего монитора разрешение 1024х768, все пошло. И я увидел на рабочем столе значки всех моих разделов (см. рис.1, для просмотра полномасштабного рисунка откройте его в отдельном окне).

Рис. 1. Значки “потерянных” разделов на рабочем столе.

Щелчок мышкой по любому из значков разделов на рабочем столе приводил к тому, что открывалось окно браузера Konqueror, в котором отображалось содержание этого раздела. На рисунке 2 вы видите, что раздел /dev/hda5 являлся у меня корневым разделом.


Рис. 2. Корневой каталог жесткого диска

Замечание: Между прочим, тут я подумал, что Линукс может добраться до содержимого раздела и не обращаясь к таблице разделов (когда чуть позже я начал разбираться с устройством таблицы разделов, я понял, что это мое предположение не верно, я потом это объясню). А, во-вторых, я обратил внимание на то, что Knoppix умеет распознавать тип файловой системы, потому что одинаково успешно открываются разделы с файловыми системами ext2, ext3, FAT16 и NTFS. А я ведь не создавал для него файл /etc/fstab! Позже мы тоже поймем, почему это происходит.

Хорошо, информация цела, так что задача восстановления системы сводится к тому, чтобы восстановить первый сектор жесткого диска с его главной загрузочной записью и таблицей разделов диска. Если вас такое вступление заинтересовало, читаем дальше.

1.2. Первые попытки

Вначале я попытался восстановить работоспособность системы известным методом “научного тыка”, основываясь на тех знаниях, которые у меня имелись. Надо сказать, что система у меня была установлена из дистрибутива ASP Linux 7.2, потом дополнялась какими-то отдельными пакетами, работала устойчиво, в ней запускалась система виртуальных машин VMware, поэтому полностью переустанавливать ее мне не хотелось.

Вначале я надумал просто переустановить Lilo из-под Knoppix. В соответствии с man lilo эта команда, запущенная с опцией -M, записывает новую загрузочную запись из "mbr.b", которая встроена в /sbin/lilo (как я выяснил чуть позже опция -M имеется только у Lilo версии 22.х).

Получил права root-а командой "su -" и запустил Lilo командой /sbin/lilo -M /dev/hda. В ответ получил такое сообщение:
Unrecognized token "! Please edit /etc/lilo.conf before running lilo!" at or above line 20 in file '/etc/lilo.conf'

Открыв файл /etc/lilo.conf (в дистрибутиве Knoppix это ссылка на /KNOPPIX/etc/lilo.conf), я обнаружил, что в нем есть предупреждение о том, что строку "! Please edit /etc/lilo.conf before running lilo!" надо предварительно удалить. А ведь эта строка говорит о том, что файл /etc/lilo.conf необходимо предварительно подредактировать! Этим и пришлось заняться.

Я сделал в этом файле следующие изменения:
- указал в качестве загрузочного устройства /dev/hda;
- строку "install=/boot/boot-menu.b" заменил на "install=/mnt/hda3/boot-menu.b"; (предварительно смонтировал старый раздел boot в каталог /mnt/hda3);
- вставил разделы image из старого файла /etc/lilo.conf.
И снова запустил команду lilo в следующем формате:

/sbin/lilo -C /mnt/floppy/lilo.conf -M /dev/hda

Результат перезагрузки - тот же: остановка загрузки после появления двух букв "LI".

Тогда я надумал смонтировать свои старые разделы и сделать chroot. Снова загрузил Knoppix и выполнил следующие команды:
[root] mount -t ext2 /dev/hda5 /mnt/hda5
[root] mount -t ext2 /dev/hda3 /mnt/hda5/boot
[root] mount -t ext2 /dev/hda6 /mnt/hda5/usr
[root] mount -t ext2 /dev/hda8 /mnt/hda5/home
[root] chroot /mnt/hda5

Затем выполнил команду "/sbin/lilo -t -v". Сообщений об ошибках не было, поэтому запустил "/sbin/lilo" без параметров. Как будто все прошло нормально. Перезапускаюсь. Результат прежний.

В ходе этих экспериментов как раз и выяснилось, что опция -M имеется только в версии Lilo из дистрибутива Knoppix. На диске же у меня была версия 21.7, где такой опции нет, зато есть -P fix. Однако при ее использовании результат тоже не изменился.

Но поскольку удается сделать chroot, причем после этого я вижу как будто только свою старую файловую систему, надумал я изготовить загрузочную дискету для своей старой системы с помощью команды mkbootdisk. Заглянув на man-страничку, выяснил, что для этого нужно дать следующую команду:
[root] mkbootdisk --device /dev/fd0 2.4.18-5asp

Это был первый успех - дискета успешно создалась и с ее помощью удалось загрузиться, причем я получил полностью свою старую систему. Поскольку загрузочная дискета в Линукс обладает тем свойством, что после окончания процесса загрузки ее можно убрать из дисковода (если, например, вам необходимо использовать другую дискету), причем ее даже размонтировать не требуется, то, в принципе, уже можно жить! Единственный недостаток у такого метода - загрузка проходит чуть медленнее.

Хоть и можно так жить, но все же хочется восстановить нормальную процедуру загрузки. И не потому, что с дискеты медленнее, а даже просто из принципа.

Поэтому я запустил fdisk /dev/hda из-под Knoppix. И получил следующий результат:

Листинг 1.
Command (m for help): p

Disk /dev/hda: 16 heads, 63 sectors, 77545 cylinders
Units = cylinders of 1008 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/hda1             1       765    385528   82  Linux swap
Partition 1 does not end on cylinder boundary:
    phys=(47, 254, 62) should be (47, 15, 63)
/dev/hda2   *       766      4575   1919736    c  Win95 FAT32 (LBA)
Partition 2 does not end on cylinder boundary:
    phys=(304, 254, 63) should be (304, 15, 63)
/dev/hda3          4575      4766     96390   83  Linux
Partition 3 does not end on cylinder boundary:
    phys=(298, 254, 63) should be (298, 15, 63)
/dev/hda4          4766     77536  36676395    f  Win95 Ext'd (LBA)
Partition 4 does not end on cylinder boundary:
    phys=(1023, 14, 63) should be (1023, 15, 63)
/dev/hda5          4766      6806   1028128+  83  Linux
/dev/hda6          6806     10886   2056288+  83  Linux
/dev/hda7         10886     27142   8193118+  83  Linux
/dev/hda8         27142     36896   4915858+  83  Linux
/dev/hda9         36896     77536  20482843+   b  Win95 FAT32
Этот результат как будто подтвержает мое предположение о том, что каким-то образом искажена таблица разделов диска. Еще одно подтверждение этому я нашел в своей книге [1], где приводил цитату из руководства Вернера Альмесбергера к загрузчику Lilo, в которой рассказывается о причинах остановки загрузки на разных этапах. В частности, там сообщается следующее:

"LI — первичный загрузчик сумел загрузить вторичный загрузчик, но не сумел запустить его на выполнение. Это может быть вызвано ошибкой в задании геометрии диска или тем, файл /boot/boot.b был перемещен без перезапуска /sbin/lilo".

Поскольку Lilo я переустанавливал и результата это не дало, то причина моих трудностей кажется, определилась однозначно - сбой в таблице разделов диска. Остается найти способ этот сбой исправить. И отправился я в Интернет за поиском рецептов. О том, что мне удалось выяснить, будет рассказано далее в этой серии заметок.

Все ссылки на найденные мной источники информации по данному вопросу перечислены в списке ссылок. Я же постараюсь в краткой форме изложить суть вопроса, то есть фактически приведу только краткий конспект перечисленных в этом списке материалов, дополненный рассказом о моем собственном опыте.

Продолжение: 1.3. Зачем нужны разделы?.