Я прохожу курс "Операционная система Unix" и после тестов, вижу в отчете, что этот тест сдало еще 25 человек. Почему так мало, это ведь реально хороший и полезный урок. Здесь естьи теория и практичесские материалы. Сам курс написан хорошо, живым языком. И здесь я получил ответы на вопросы по Linux, которые боялся спросить. Наверное это из-за того, что в названии курса написано не Linux, а Unix и это многих отпугивает. |
Досистемная начальная загрузка
Получилось как всегда
Истинный порядок вещей, увы, всегда беспорядочнее теории. У последовательности начальной загрузки два врага: спешка и тяжелая наследственность (под "тяжелой наследственностью" мы понимаем то, что в компьютерном мире именуется 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 для файловых систем и области подкачки.
Каждый дисковый раздел соответственно проименован в /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 ) на клавиши может привести к тому, что система не загрузится вообще.