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

UnixForum






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

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

На главную -> MyLDP -> Тематический каталог -> Процесс начальной загрузки системы

Мультизагрузка: стелем соломку

Автор: Сергей Супрунов
Дата: Декабрь 2005 г.
Первоначально статья была опубликована в журнале "Системный администратор"


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

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

Нужно заметить, что существует несколько схем разметки жестких дисков, помимо привычного большинству пользователей деления на разделы. Например, FreeBSD может быть установлена на целый диск без использования таблицы разделов (так называемый режим dangerously dedicated). Windows на платформах Itanium использует схему GUID Partition Table (GPT), и так далее. Но в данной статье речь будет идти о традиционной разметке ATA-дисков, используемой большинством систем на платформе i386.

Что скрывают три буквы - MBR?

Наиболее важный субъект процедуры загрузки - первый сектор жесткого диска. Как правило, его обозначают аббревиатурой MBR (Master Boot Record). Упрощенно формат MBR представлен в таблице 1:

Таблица 1. Формат MBR
БайтыНазначение
0 - 445MBR-код
446 - 461Описание 1-го раздела
462 - 477Описание 2-го раздела
478 - 493Описание 3-го раздела
494 - 509Описание 4-го раздела
510 - 511Сигнатура 0xAA55

То есть он содержит код MBR-загрузчика, таблицу разделов (disk partition table, DPT) и сигнатуру, позволяющую распознать данный сектор как загрузочный.

Таблица разделов (64 байта) отводит по 16 байт для описания каждого раздела жесткого диска. Очевидно, что диск может содержать только 4 раздела, описанные в MBR (такие разделы называют первичными). Для обхода этого ограничения используются дополнительные (extended) разделы1. Первый сектор такого раздела аналогичен MBR и может содержать описание логического раздела (диска) и ссылку на следующий дополнительный раздел. В результате несколько дополнительных разделов создают своего рода цепочку ссылок. На рисунке 1 показан пример разбиения диска, поясняющий сказанное.

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

В DPT для каждого раздела содержатся его координаты, а также тип файловой системы и признак активности раздела. Как активный должен помечаться только один раздел; о том, зачем это нужно, поговорим чуть позже.

Координаты раздела записываются двумя способами - в виде номеров цилиндр-головка-сектор (CHS) начала и конца раздела, а также указанием линейного номера первого сектора и количества секторов (см. таблицу 2). Прочтите также врезку Сказание о 1024-м цилиндре, где вопросы геометрии рассмотрены несколько подробнее.

Таблица 2. Формат описателя раздела
БайтыНазначение
0Признак активности
1Номер головки начала раздела
2Номер сектора (биты 0-5) и старшие биты (биты 6-7) номера цилиндра начала раздела
3Младшие биты номера цилиндра начала раздела
4Тип файловой системы
5Номер головки конца раздела
6Номер сектора (биты 0-5) и старшие биты (биты 6-7) номера цилиндра конца раздела
7Младшие биты номера цилиндра конца раздела
8-11Номер первого сектора раздела от начала диска
12-15Количество секторов, занятых разделом

Наконец, программный код (в дальнейшем для него будет использоваться термин первичный загрузчик или MBR-код), располагающийся в начале первого сектора диска, в своем каноническом виде предназначен для анализа таблицы разделов, поиска в ней раздела, помеченного как активный, загрузки в память кода из первого сектора активного раздела (boot-сектора) и передачи ему управления. Именно по такому алгоритму происходит загрузка операционных систем семейства DOS / Windows 9x.

Загрузочный сектор

В первом секторе раздела, с которого предусмотрена загрузка операционной системы, обычно располагается код вторичного загрузчика, а сам сектор именуется загрузочным. Он (код) уже должен уметь работать с соответствующей файловой системой, поскольку в его задачу входит загрузка программы-лоудера (загрузчика 3-й ступени) или непосредственно ядра операционной системы, которые, как правило, являются обычными файлами.

Загрузка непосредственно ядра может использоваться для безусловной загрузки операционных систем семейства DOS / Windows 9x, то есть тех, где пользователю не предлагается выбор системы или параметров загрузки ядра, а требуется просто передать управление ядру системы, размещенному в строго определенном месте (чтобы его не приходилось искать).

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

Рассмотрим в общих чертах работу наиболее популярных загрузчиков (их подробное описание оставим за рамками данной статьи).

Загрузка в стиле DOS

Поговорим немного подробнее о том, как происходит загрузка систем DOS и Windows. Эти системы во время инсталляции записывают в MBR классический загрузчик, который ищет активный раздел и передает управление коду, размещенному в его первом секторе. Этот код, в свою очередь, запускает ядро системы.

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

В случае если загрузчик в MBR будет поврежден, восстановить его позволяет команда fdisk /mbr (в современных системах Windows вы ее, к сожалению, уже не найдете). Она перезаписывает только код первичного загрузчика (первые 446 байт), не затрагивая таблицу разделов.

А вот в NT все немножко сложнее

В операционных системах этого семейства используется еще один посредник - NTLoader. Эта программа позволяет более гибко управлять загрузкой, указывая расположение ядра системы или передавая управление на другие разделы диска. Ее загрузчик (вторичный применительно к процедуре загрузки) устанавливается в boot-сектор активного диска, а программа ntldr помещается в корне этого диска, в терминологии Windows это диск C: (при этом сама NT-система может быть инсталлирована на другой раздел, включая и логические диски). NTLoader руководствуется в своей работе конфигурационным файлом boot.ini (который размещается в корне файловой системы активного раздела, там же, где и ntldr).

NTLoader уже умеет работать с файловыми системами (как с FAT, так и NTFS), благодаря чему существует возможность2 установить несколько систем семейства Windows на один раздел. Например, если boot.ini будет выглядеть таким образом:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Windows 2000Pro" /fastdetect
C:\="Windows 98SE" 

то это позволит загрузить Windows 2000 из каталога WinNT диска C, в то время как Windows 98 будет занимать традиционную папку C:\Windows и загружаться посредством io.sys.

NTLoader обладает еще одним полезным навыком - он умеет загружать образы загрузочных секторов из файлов. Примеры практического использования этой функции можно найти далее в этой статье.

LILO и GRUB - близнецы-братья

Нет, конечно же, эти два популярных в среде Linux менеджера загрузки имеют ряд коренных отличий, однако применительно к теме данной статьи принцип их работы схож. Они записывают в MBR код, который безусловно (независимо от установленных признаков активности разделов) передает управление вторичному загрузчику (на этот раз он располагается непосредственно в файловой системе, а не в boot-секторе, причем в некоторых случаях это может быть не Linux-раздел; в случае GRUB возможно размещение части вторичного загрузчика - stage1_5 - и вне файловой системы). Эта программа отвечает за отображение меню выбора и (в случае, если выбрана загрузка Linux) передает управление загрузчику ядра.

Благодаря такому подходу, разработчики этих менеджеров загрузки смогли обойти очень жесткое ограничение на размер загрузочного сектора, но зато привязали себя (и пользователей) к Linux-разделу. То есть, если вы на свой компьютер с Windows решите поставить для пробы Linux (с LILO), а затем, по тем или иным причинам, захотите его удалить, то после удаления раздела с Linux ваша система потеряет способность. Впрочем, это довольно легко обойти с помощью организационных методов, например, размещая каталог /boot на отдельном небольшом разделе (и проследив, чтобы все нужные загрузчику файлы располагались в нем). Если же вы не были столь предусмотрительны, и при очередной загрузке видите на экране одинокое L, то решить эту проблему не сложно: загрузитесь с системной дискеты DOS или Windows 98 и выполните команду fdisk /mbr для записи стандартного загрузчика в MBR вместо LILO. Или перед тем, как удалять раздел, деинсталлируйте LILO следующей командой:

root# lilo u 

Правда, нужно учитывать, что восстановление произойдет успешно только в том случае, если в системе есть файлы с копией MBR до установки LILO (обычно они располагаются в каталоге /boot с именами boot.XXYY, например, boot.0300 для MBR первого диска). Когда вы выполняете команду /sbin/lilo для инсталляции загрузчика, нужные файлы должны создаваться автоматически; при повторных инсталляциях (когда вы меняете конфигурацию загрузчика или устанавливаете новое ядро) эти файлы не перезаписываются, сохраняя оригинальное содержимое. А вот если вы пробовали ставить GRUB, затем снова вернулись на LILO, то при выполнении вышеозначенной команды вы получите в MBR ваш старый GRUB-код.

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

Самый умный загрузчик

Разработчики BSD-систем пошли другим путем, и им удалось каким-то чудом втолкать в 446 байт, оставшихся в MBR после размещения там таблицы разделов и сигнатуры, полноценный3 загрузчик (BootEasy). Он способен проанализировать таблицу разделов и на ее основе предложить вам меню для выбора загружаемой системы. Конечно, доступное пространство не позволяет заниматься украшательством, поэтому выглядит меню предельно лаконично:

F1 DOS
F2 ??
F3 FreeBSD

Default: F3 _

Из этого примера видно, что загрузчик нашел три раздела: на первом - DOS (под это же обозначение попадают и системы Windows 9x), на втором - неизвестная загрузчику система (например, так может выглядеть раздел Linux swap), а на третьем - система FreeBSD. Четвертый раздел не размечен, поэтому в меню не представлен. В качестве загрузки по умолчанию (Default) предлагается та система, которая расположена на активном разделе. Причем BSD-загрузчик, ко всему прочему, умеет перезаписывать таблицу разделов, отмечая как активный тот раздел, который был выбран пользователем. То есть если вы сейчас нажмете F1, то загрузится, к примеру, Windows 98, и в следующий раз именно она будет предлагаться как система по умолчанию.

Обратите внимание, что эта способность перезаписывать таблицу разделов может стать источником проблем. Об этом подробно рассказано далее, при описании использования BSD-загрузчика при работе с несколькими жесткими дисками. При необходимости, вы можете отключить перезапись DPT, жестко назначив раздел по умолчанию, переустановив BootEasy с помощью команды boot0cfg (а заодно и изменив время ожидания выбора с 10 секунд, скажем, до 304):

root# boot0cfg -o noupdate -s 3 -t 550

Здесь опция -s задает номер раздела (начиная с 1), который будет использоваться по умолчанию, -t - задержку в тиках (1 секунда примерно соответствует 18 тикам). Будьте предельно осторожны с этой командой, и лучше ничего не делайте, если не до конца представляете, что при этом произойдет (хотя как же можно приобрести опыт, ничего не сломав?).

Грузим три системы с помощью загрузчика BSD

Посмотрим, как можно загрузить Windows, Linux и FreeBSD с помощью стандартного загрузчика FreeBSD. Собственно говоря, это наиболее простой путь - просто инсталлируйте FreeBSD последней, разрешите установку загрузчика в MBR, и больше ни о чем беспокоиться не нужно - загрузчик сам будет определять доступные разделы и предлагать их вам на выбор. Однако одним из серьезных недостатков является то, что BootEasy не умеет анализировать загрузочные сектора логических дисков (размещенных на дополнительных разделах), поэтому выбор будет ограничен системами, установленными в основные разделы5.

Если FreeBSD у вас уже установлена, и вы хотите установить еще и Linux, сохранив загрузчик, установите LILO или GRUB в загрузочный сектор Linux-раздела (большинство инсталляторов позволяют сделать соответствующий выбор). В этом случае BSD-загрузчик передаст управление на этот boot-сектор, а остальное сделает уже Linux-загрузчик.

Если же последней системой устанавливается Windows, то тут без реанимации не обойтись - после инсталляции вы сможете загрузиться только в Windows, поскольку системы от Microsoft безо всяких вопросов перезаписывают MBR тем кодом, какой им нужен. В этом случае вам придется воспользоваться системной дискетой, дистрибутивным диском или LiveCD, чтобы загрузить FreeBSD и восстановить загрузчик, используя команду boot0cfg.

В данной статье, говоря о загрузчике FreeBSD, упоминается лишь устанавливаемый по умолчанию BootEasy, однако нужно заметить, что он не единственный boot-менеджер для этой системы. В коллекции портов вы сможете найти несколько альтернатив, например, extipl (Extended IPL), gag и даже grub. Если вы используете один из них, уточните в документации, как следует выполнять те или иные действия.

Аналогичную задачу может решить и LILO

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

Например, загрузка системы Windows, установленной в первом разделе, может быть обеспечена такими строками в lilo.conf:

other = /dev/hda1    	# Указываем загрузочный раздел Windows
table = /dev/hda   	# Таблицу разделов следует искать в MBR
label = windows      # Наименование загружаемой системы

Если Windows для загрузки использует NTLoader, то при выборе пункта windows в меню LILO вы получите еще одно меню - на этот раз соответствующее файлу C:\boot.ini.

Поскольку на самом деле строка other просто указывает на некоторый boot-сектор, коду которого должно быть передано управление, то таким же образом можно загружать и другие системы, например, FreeBSD (указав соответствующий раздел).

А наибольшую гибкость обеспечивает GRUB

Загрузчик GRUB может не только передать управление на указанный раздел, но и непосредственно загрузить файлы чужих систем (например, FreeBSD). В частности, следующий фрагмент конфигурационного файла обеспечит загрузку FreeBSD, минуя ее вторичный загрузчик:

title FreeBSD			# Указываем имя ОС
root (hd0,2,a)			# Выбираем корневой раздел для загрузки
kernel /boot/loader		# Указываем файл для передачи управления

В этом случае GRUB передаст управление сразу на загрузчик ядра FreeBSD, который и выполнит дальнейшую загрузку. Обратите внимание, что в силу особенностей разбиения раздела, присущих FreeBSD (см. врезку Особенности именования разделов), нужно помимо диска и номера раздела указать еще букву подраздела FreeBSD (в нашем случае - a).

Для загрузки Windows из GRUB больше подойдет использование передачи управления по цепочке:

title Windows
rootnoverify (hd0,0) 
makeactive
chainloader +1

То есть будет выбран первый раздел, сделан активным, и на него будет передано управление. Дальнейшая загрузка, как и в случае с LILO, будет определяться настройками NTLoader (если он имеется).

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

title FreeBSD
chainloader (hd0,2)+1

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

title Windows 98
chainloader (hd0,0)/bootsect.dos

Файл bootsect.dos уже должен быть на вашем диске C: (именно его использует NTLoader, когда вы выбираете загрузку Windows 9x из меню NT-загрузчика). Если в boot.ini установить нулевую задержку и в качестве варианта по умолчанию выбрать загрузку Windows 2000, то вы вообще не будете видеть второе меню, делая выбор загружаемой системы только в меню GRUB.

А если я люблю NT?

Приложив некоторые усилия, можно заставить и NTLoader загружать альтернативные системы. Как мы уже упоминали выше, программа ntldr способна передавать управление образу загрузочного сектора, записанному в файл. Например, если у вас в hda1 (в терминологии Linux) установлена Windows XP, а в hda2 - Linux, то вы можете проделать следующее:

1. Загрузившись в Linux (например, с помощью дискеты; можно воспользоваться и LiveCD-дистрибутивом), сохраните первый сектор раздела hda2 в файл и скопируйте его на Windows-раздел:

root# dd if=/dev/hda2 of=bootsect.lnx 
root# mount /dev/hda1 /mnt 
root# cp bootsect.lnx /mnt
root# umount /mnt

Команды монтирования в этом примере предполагают, что Windows-раздел у вас описан в fstab. Иначе потребуется также указать тип монтируемой системы и, возможно, некоторые дополнительные параметры. Данный фрагмент сработает только в том случае, если на диске C: вы используете файловую систему FAT. В случае NTFS запись возможна, если файл назначения уже создан и имеет нужный размер, хотя проще и безопаснее воспользоваться посредником, например, дискетой или флэшкой, для переноса образа на диск C:.

Далее, перегрузившись в Windows, добавьте в файл boot.ini такую строчку (описание в кавычках может быть любым):

C:\bootsect.lnx="SUSE Linux 10.0"

Теперь, при следующей загрузке компьютера, вы обнаружите в предложенном вам меню новый пункт, выбрав который, попадете в Linux.

В случае FreeBSD все еще проще - вам просто нужно скопировать файл /boot/boot1 на диск C: под именем, скажем, bootsect.bsd, и добавить соответствующий пункт в меню boot.ini.

Такой подход может показаться удобным тем, кто постоянно работает с Windows, а Linux предназначается просто для тестирования, поскольку в случае необходимости вы в любое время можете удалить Linux-раздел, что никак не отразится на процедуре загрузки Windows.

Некоторые особенности работы с несколькими дисками

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

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

BootEasy для передачи управления на другой диск предложит вам еще один вариант выбора - F5. Если в MBR второго диска также установлен BSD-загрузчик, то будет выполнен анализ его таблицы разделов и сформировано меню для этого диска. Вернуться на первый можно той же клавишей F5.

А вот если вы используете NTLoader, то тут есть свои особенности...

В случае с LILO вы по-прежнему можете использовать описанную выше схему - сохраняя в файл образ соответствующего boot-сектора и подключая его в boot.ini. Но вот если на первом диске у вас установлена система Windows, а на втором - FreeBSD, и вы хотели бы использовать для загрузки NTLoader (в частности, чтобы иметь возможность безболезненно отключить второй диск), то, просто передав управление на образ загрузочного раздела (файл boot1), вы поставленную задачу не решите. Дело в том, что boot1 обращается к таблице разделов текущего диска, чтобы определить координаты сектора с системой FreeBSD. А поскольку текущим диском останется первый, то и поиск будет выполняться в его MBR-секторе. В результате вы вместо загрузки системы получите сообщение об ошибке.

Чтобы этого избежать, можно использовать образ MBR второго диска, в который должен быть установлен один из загрузчиков, и передавать управление на него. В случае с Linux особых проблем возникнуть не должно - во время инсталляции укажите, что хотите поставить LILO или GRUB в MBR второго диска (hdb), а после установки системы сохраните в файл образ MBR:

root# dd if=/dev/hdb of=bootsect.hdb bs=512 count=1

Теперь перепишите этот файл в Windows-раздел и настройте NTLoader, как было описано выше, и при выборе соответствующего пункта меню вы попадете в LILO или GRUB, который сделает всю оставшуюся работу.

Однако будьте предельно осторожны с загрузчиком BSD - он обязательно должен быть установлен, в нашем случае - в MBR второго диска, и использовать лучше образ этого сектора, снятый утилитой dd. Если это не было сделано, то файл boot0 не будет содержать таблицы разделов. А, как вы, должно быть, помните, BSD-загрузчик перезаписывает MBR, чтобы проставить признак активности раздела, загружавшегося последним. В итоге, если вы просто будете использовать boot0 в качестве образа MBR, то получите следующую схему:

  • Стандартный загрузчик из MBR первого диска находит активный раздел и загружает его boot-сектор.
  • Находящийся там NTLoader при выборе пункта FreeBSD загружает bootsect.bsd (который является копией boot0).
  • Загрузчик BSD, получив управление, загружает выбранную систему, проставляет признак активности в пустой таблице разделов и записывает ее в MBR.
  • Включив в следующий раз компьютер, вы обнаружите свой винчестер девственно чистым.

Однако не следует впадать в панику и начинать форматировать диск. Ваши данные никуда не делись - все на месте и ждут загрузки. Сломалась только таблица разделов, которую не сложно восстановить. Если, конечно, у вас будет под рукой нужный инструментарий (см. следующий раздел).

Страховка на все случаи жизни

Итак, что же нужно иметь под рукой, чтобы справиться с большинством проблем, которые могут возникнуть при загрузке системы?

Если вы часто используете Windows, и эта система вам очень дорога, то непременно обзаведитесь двумя-тремя (учитывая их непревзойденную надежность) системными дискетами, на которых хорошо бы держать и утилиты fdisk, format и т.п. Даже если вы работаете только в Windows XP, все равно подготовьте загрузочную дискету, например, с Windows 98. Поверьте, это не самая лучшая ситуация, когда вы не можете найти, откуда можно выполнить спасительную команду fdisk /mbr.

При использовании Windows 2000 или XP не поленитесь установить Recovery Console (см. врезку Использование консоли восстановления). Конечно, если у вас всегда под рукой инсталляционный диск, то это не является необходимым. Впрочем, места на диске консоль восстановления занимает немного, а выручить когда-нибудь сможет.

Для Linux и FreeBSD крайне полезны будут LiveCD, с которых можно будет загрузиться и устранить возникшую проблему. Также интересное решение было описано в прошлом номере Системного администратора в статье GRUB на CD, или Ещё один способ восстановить MBR.

Посмотрите, какие возможности по работе с диском предлагает ваша система. Например, большинство современных дистрибутивов Linux имеют очень развитые и удобные инструменты для работы с диском и загрузчиками.

Неплохо также иметь под рукой и специализированный LiveCD, предназначенный для аварийно-восстановительных работ. В принципе, вы можете создать и собственный дистрибутив, разместив на нем именно те инструменты, которые вы предпочитаете использовать. Но существуют и готовые решения, одно из которых - Knoppix.

Много про этот дистрибутив писать не буду. Отмечу лишь, что он несет на борту большое число утилит для разбиения и восстановления разделов диска - от традиционных fdisk и cfdisk до QTParted, позволяющей производить визуальное редактирование диска, в том числе и изменение размеров разделов без потери информации (однако это не отменяет необходимость обязательного создания резервных копий перед любыми манипуляциями с разделами). В частности, попытаться восстановить таблицу разделов, если она будет повреждена (например, в результате неправильных манипуляций с BootEasy), можно с помощью утилиты testdisk - она сканирует весь диск в поисках сигнатур, и по ним пытается восстановить DPT. Меня она пару раз выручала даже в условиях довольно сложной разметки. Пример ее работы, а также некоторые другие инструменты Knoppix показаны на рисунке 2.

С помощью Knoppix вы сможете восстановить и менеджеры загрузки. Например, чтобы восстановить LILO, cмонтируйте ваш Linux-раздел, скажем, в /mnt (при наличии нескольких разделов их тоже следует подключить, сохраняя иерархию; например раздел /boot смонтируйте как /mnt/boot), с помощью команды chroot /mnt сделайте его корневым и выполните команду /sbin/lilo для восстановления загрузчика.

Не поленитесь сохранить образы MBR и загрузочных секторов. Места они практически не занимают, записываются быстро, а вот восстановить с их помощью проблемный сектор (той же командой dd) может оказаться на порядок проще и быстрее, а главное - надежнее, чем с использованием различный утилит, которые, в принципе, могут и ошибиться. Единственное - не забывайте поддерживать этот архив в актуальном состоянии, чтобы не откатиться на тот момент, когда у вас не было установлено и половины систем.

Ну и неплохо также иметь записанную на бумаге таблицу разделов (ее можно сформировать с помощью fdisk) - иногда бывают секунды, когда все решают минуты В общем, порой оказывается намного проще (а то и единственно возможно) восстановить таблицу разделов вручную с помощью fdisk. А феноменальной памятью, чтобы запомнить все сектора и цилиндры, обладают не многие.

Заключение

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

Главное - не впадайте в панику и не совершайте скоропалительных действий. От того, броситесь вы восстанавливать разделы сразу же после возникновения проблемы или спустя неделю, ничего не изменится. А вот последствия ошибок могут быть весьма плачевными. Поэтому сначала попытайтесь вычислить, что же произошло, и на основании этого составьте план восстановительных мероприятий. Постарайтесь предугадать возможные проблемы, а также подготовьте точки отката для каждого шага (например, сохраняя образ текущего MBR, хоть он и может выглядеть совершенно бесполезным). Только после этого приступайте к спасению своих данных.

Удачи вам и крепких нервов!


Соглашение о терминах

Если говорить о процессе загрузки, то английский язык оказывается здесь несколько богаче русского. В нем есть два термина - booting и loading, описывающих разные этапы загрузки ОС. Мы же вынуждены плясать вокруг одного слова - загрузка, поэтому приведу небольшой словарик, которого будем придерживаться в этой статье (в скобках указаны синонимы):

Первичный загрузчик (MBR-код) - загрузочный код, размещаемый в MBR.
Вторичный загрузчик (boot-код) - загрузочный код, размещаемый в boot-секторе раздела.
Загрузчик ядра (loader) - программа, загружающая ядро ОС.

Термин загрузчик в зависимости от контекста может обозначать либо один из указанных кодов, либо весь набор программ, отвечающих за загрузку системы (например, BSD-загрузчик).


Сказание о 1024-м цилиндре

С давних времен умудренные опытом системные администраторы передают своим молодым коллегам наказ - не ставить операционную систему за пределами 1024-го цилиндра. Что же это за магический цилиндр и насколько проблема актуальна в наши дни?

Если посмотреть на структуру таблицы разделов (Таблица 2), то будет видно, что при CHS-адресации там отводится 6 бит для номера сектора, 8 - для головки, и 10 - для цилиндра. В результате мы получаем естественное (для BIOS) ограничение на адресуемое пространство: 63 сектора * 256 головок * 1024 цилиндра (те самые) * 512 байт в секторе = 8455716864 байт (диск около 8,46 Гб). Код первичного загрузчика, если он для работы с диском использует функцию BIOS INT13 (которая как раз и руководствуется CHS-адресацией), просто не сможет дотянуться до раздела, размещенного за указанным пределом.

В современных BIOS используется, как правило, расширенное прерывание INT13, позволяющее обойти это ограничение. В этом случае для доступа к разделу используется преобразование геометрии на лету (например, для цилиндра 1800 и головки 16 возвращается законный номер цилиндра 900 и головка 32). Кроме того, некоторые менеджеры загрузки способны самостоятельно рассчитывать местоположение разделов, основываясь на линейных координатах, именуемых также LBA - Linear Block Addressing (для указания первого сектора раздела в DPT отводится 4 байта, что позволяет адресовать порядка 2 Тбайт данных: 2**32 сектора * 512 байт). Например, так ведет себя LILO в случае использования опции linear в файле lilo.conf


Особенности именования разделов

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

Таблица 3. Обозначения разделов диска
РазделGRUBLinuxFreeBSD
Первый раздел на первом диске(hd0,0)hda1ad0s1
Второй раздел на первом диске(hd0,1)hda2ad0s2
Первый раздел на втором диске(hd1,0)hdb1ad1s1

Как видите, FreeBSD и GRUB нумеруют винчестеры начиная с нуля, Linux использует для их обозначения буквы a, b и т.д. Разделы Linux и FreeBSD считают с единицы, в то время как GRUB - с нуля.

Кроме того, FreeBSD использует собственную разметку внутри раздела. В ее терминологии разделы именуются слайсами (slice), а созданные в них подразделы - собственно разделами (partition). Эти разделы обозначаются буквами (первый раздел первого слайса будет обозначаться как ad0s1a.

Таблица 4. Соответствие между обозначением и контроллерами
ДискLinuxFreeBSD
Primary Masterhdaad0
Primary Slavehdbad1
Secondary Masterhdcad2
Secondary Slavehddad3

Обратите внимание еще на одну особенность - FreeBSD и Linux привязывают нумерацию раздела к контроллеру и режиму работы диска (таблица 4), в то время как GRUB считает реально присутствующие диски. Например, если вы подключите только один диск как Primary Slave, то Linux будет рассматривать его как hdb, в то время как GRUB - как (hd0).


Использование консоли восстановления

Как ни странно, но системы семейства Windows NT не предоставляют пользователю возможность использовать утилиту fdisk или как-то иначе работать с MBR и загрузочными секторами. Для этого используется Recovery Console (консоль восстановления), которую можно проинсталлировать на диск либо использовать непосредственно с дистрибутивного CD.

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

winnt32.exe /cmdcons

При следующей перезагрузке вы увидите новый пункт в меню NTLoader, вызывающий загрузочный образ из места расположения файлов консоли восстановления (обычно это C:\cmdcons\BOOTSECT.DAT).

Загрузившись в консоль, вы сможете выполнить ряд команд, среди которых интересные нам fixmbr и fixboot. Первая, как следует из названия, перезаписывает MBR стандартным кодом (не затрагивая таблицу разделов), вторая - заносит код вторичного загрузчика в boot-сектор активного раздела.

Конечно, консоль, установленная на диске, в случае проблем с загрузкой, скорее всего, окажется недоступной. В этом случае воспользуйтесь диском с дистрибутивом или заранее приготовленной дискетой.


Большая тайна маленькой дискетки

Вы никогда не задумывались, почему дискета, забытая в дисководе, прерывает загрузку компьютера с выдачей сообщения Non-System disk or disk error? Казалось бы, если дискета не загрузочная, то BIOS должен просто приступить к опросу следующего по списку устройства

Загрузитесь во FreeBSD или Linux и запишите в файл первый сектор чистой дискеты, только что из коробочки:

root# dd if=/dev/fd0 of=floppy.bs bs=512 count=1

Откройте его в каком-нибудь hex-просмотрщике (это можно сделать и в Midnight Commander), и - о чудо! - мы видим и код, и сигнатуру загрузочного раздела! То есть получается, что дискета может быть системной или нет, но она всегда загрузочная. И поэтому BIOS, обнаружив сигнатуру 0xAA55, отдает управление коду и умывает руки. Все остальные сообщения - это уже забота загрузчика, размещенного в boot-секторе нашей дискеты. А он, как можно увидеть, только и умеет, что ругаться на экране страшными для секретарш фразами.

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

Кстати, эта особенность активно используется при создании загрузочных (не системных!) дискет в Windows NT/2000/XP - при форматировании дискеты в этих системах в boot-сектор помещается свой код (рис. 5). Даже без дизассемблирования видно, что он ищет файл ntldr и выдает сообщения об ошибке только в случае неудачи. Если же ntldr на дискете будет обнаружен, то он загрузится в память, получит управление, считает boot.ini (его тоже следует разместить на дискете), и выполнит загрузку системы как положено, даже в случае повреждения кода в MBR.