Компания ALT Linux
Опубликован: 14.12.2004 | Доступ: свободный | Студентов: 12603 / 1647 | Оценка: 4.19 / 3.84 | Длительность: 18:18:00
ISBN: 978-5-9556-0019-1
Лекция 12:

Досистемная начальная загрузка

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >

Получилось как всегда

Истинный порядок вещей, увы, всегда беспорядочнее теории. У последовательности начальной загрузки два врага: спешка и тяжелая наследственность (под "тяжелой наследственностью" мы понимаем то, что в компьютерном мире именуется legacy: совместимость со старыми версиями, соответствие устаревшему или изначально неудобному стандарту и т. п.). Например, нестандартные операционные системы, использующиеся на компьютерах с архитектурой i386, породили жесткие и очень неудобные требования к разметке диска. Первый сектор диска (и без того размером всего 512 байт) отведен и под загрузочную процедуру, Master Boot Record, MBR, и под таблицу разбиения диска - Hard Disk Partition Table, HDPT. Таблица разбиения диска занимает 64 байт, ключ 0xAA55 в конце сектора - еще два, на программную область остается 446, а ведь ей предстоит разбираться с тем, как размечен диск.

Мало того. В HDPT помещается только четыре записи о том, где и какие разделы есть на диске. Формат самих записей тоже страдает от тяжелой наследственности: параметры современных дисков хронически не помещаются в отведенные для них 16 байт. Чтобы диск можно было разделить более чем на четыре части, пришлось выдумывать механизм дополнительных разделов: одна из четырех записей указывает на extended partition - часть диска, в начале которой есть еще одна HDPT (еще четыре записи), описывающая разбиение этой части; если необходимо дальнейшее деление, заводится еще один дополнительный раздел и т. д. В довершение путаницы обычно используются только две из четырех записей в HDPT: первая ссылается на какую-нибудь файловую систему, вторая - на дополнительный раздел ; в HDPT этого раздела снова первая запись ссылается на файловую систему, вторая - на следующий вложенный дополнительный раздел и т. д.

Пример разбиения диска на трехсистемной машине приведен на рис. 12.1. Первый раздел занят файловой системой FAT-16 (установлен FreeDOS), второй отдан FreeBSD (дальнейшее разбиение этого раздела идет уже в терминах BSD), третий и последующие разделы используются Linux для файловых систем и области подкачки.

Пример разбиения диска IBM PC

Рис. 12.1. Пример разбиения диска IBM PC

Каждый дисковый раздел соответственно проименован в /dev, правда, способ именования для различных версий UNIX различен, а кроме того, различаются по именам и разные типы дисковых устройств. Если мы имеем дело с жестким диском стандарта ATA (на сегодня это самый распространенный тип дисковых носителей), то имена соответствующих файл-дырок в FreeBSD будут начинаться на ad, а в Linux - на hd. В обеих системах четыре раздела в HDPT из MBR нумеруются независимо от типа; они называются основными разделами ( primary partitions ). Для всего остального вводится сквозная нумерация: при просмотре цепочки дополнительных разделов пятым, шестым и т. д. считается очередной непустой (и не являющийся ссылкой на HDPT ) раздел.

Просмотреть таблицу разделов диска можно с помощью утилит семейства fdisk. Так выглядит наш пример с точки зрения sfdisk, написанной для Linux и перенесенной под FreeBSD (ОСТОРОЖНО! Утилиты семейства fdisk предназначены в основном для изменения таблиц диска!).

freebsd# sfdisk-linux -uS -l /dev/ad0

Disk /dev/ad0: 30.7 GB, 30750031872 bytes
255 heads, 63 sectors/track, 3738 cylinders
Units = sectors of 512 bytes, counting from 0

    Device Boot   Start         End     #sectors    Id  System
    /dev/ad0s1        63     2104514     2104452     6   FAT16
    /dev/ad0s2 * 2104515    12578894    10474380    a5  FreeBSD
    /dev/ad0s3  12578895    13601951    1023057     83  Linux
    /dev/ad0s4  13601952    60058655    46456704    5   Extended
    /dev/ad0s5  13602015    15698591    2096577     82  Linux swap
    /dev/ad0s6  15698655    27986111    12287457    83  Linux

В Linux эти разделы получили бы имена от hda1 до hda6, где а означает то же, что и 0 в FreeBSD: номер диска. Стоит заметить, что ad0s6 содержится в следующем дополнительном разделе, который начинается сразу за ad0s5, но собственного имени - согласно сквозной нумерации - не имеет. Начало ad0s6 отстоит от начала дополнительного раздела на одну дорожку (63 сектора), так же как и ad0s1 начинается с первой (а не с нулевой) дорожки диска.

BSD

Структура диска получается довольно сложной, а размер первого сектора - слишком малым. В таких условиях программная часть MBR работать как полноценный BootBlock не сможет. Фактически даже алгоритм разбора вложенных HDPT уже не помещается в 446 байт. Самое большее, на что способен такой предзагрузчик (в FreeBSD он называется boot0 ) - загрузить вместо себя один (первый, разумеется) сектор из раздела, упомянутого в HDPT -части MBR. В FreeBSD, путем особых хитростей, умудрились впихнуть выбор из четырех имеющихся разделов.

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

freebsd# disklabel /dev/ad0s2
# /dev/ad0s2:
#   size     offset  fstype      [fsize bsize bps/cpg]
 a: 524288        0  4.2BSD  2048 16384  32776 
 b: 1048576  524288  swap 
 c: 10474380      0  unused     0     0  # "raw" part, don't edit
 d: 524288  1572864  4.2BSD  2048 16384  32776 
 e: 8377228 2097152  4.2BSD  2048 16384  28552

Принято (но не требуется), чтобы корневая файловая система размещалась в подразделе "a" (в нашем примере - /dev/ad0s2a ), область подкачки - в подразделе "b". Кроме того, подраздел "c" соответствует всему ad0s2: его можно использовать, если не требуется разбивать диск на подразделы и записывать вторичный загрузчик. Вторичный загрузчик присоединяется к таблице BSD-подразделов. Фактически он попадает внутрь первой файловой системы - ad0s2a, поэтому в заголовках файловых систем BSD имеется 8 Кбайт свободного места. Здесь приходится бороться уже с наследственностью BSD: вторичный загрузчик оказывается тоже слишком маленьким. В него уже всего не вставишь - в частности, нельзя сделать так, чтобы вместе с ядром можно было загрузить несколько любых модулей-драйверов.

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

Два слова о FORTH-интерпретаторе: аналогичным способом устроена загрузка компьютеров фирмы Sun Microsystems, имеющих архитектуру sparc. Маленькое, но важное отличие состоит в том, что в компьютерах sparc процедура начальной загрузки целиком, включая FORTH, записана в ПЗУ. Учитывая то, что на качестве в Sun не экономят, а внешние устройства используют только строго стандартные, такое решение представляется очень удобным. Правда, дорогим.

Вот так попытка обойти legacy привела к изобретению четырех уровней загрузки. Поскольку по крайней мере три уровня - boot0, BootProg (в FreeBSD он называется boot2) и loader могут работать интерактивно, время работы каждого вполне ощутимо (от двух до десяти секунд: пользователь должен успеть набрать команду). В результате, если ничего предварительно не подстраивать, общее время досистемной загрузки растягивается, и вдобавок неосторожное нажатие (скажем, в ответ на подсказку BootProg ) на клавиши может привести к тому, что система не загрузится вообще.

< Лекция 11 || Лекция 12: 1234 || Лекция 13 >
Max Akt
Max Akt

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

Andranik Avakian
Andranik Avakian

41. УК РФ и Комментарии (ст. 273)

М. 2000 г. Издательство: ALT Linux, Институт Логики

Уголовный Кодекс РФ и комментарии к нему?

По ссылке открывается сайт документации Linux, раздел Linux Installation and Getting Started