Библиотека сайта rus-linux.net
Загрузчики Linux
У кернела, ядра операционной системы Linux, есть возможность при загрузке ОС, в виде аргументов, вводимых в командной строке, воспринимать информацию, которая может содержать параметры инициализации некоторых устройств (в случае, если сам кернел не может определить их автоматически), или команды выбора уровня запуска системы, либо инструкции по настройкам памяти, корневой файловой системы и т. д. Но, если вы просто скопируете сам файл, который содержит образ кернела на дискету (напимер, командой cp zImage /dev/fd0), и попытаетесь загрузиться с этой дискеты, вы не сможете передать кернелу каких-либо аргументов в процессе загрузки операционной системы. Поэтому многие пользователи Linux используют специальные программы, такие, как LILO или loadlin, которые также могут передавать кернелу необходимые аргументы и загружать его.Рассмотрим несколько примеров программ, передающих кернелу аргументы в процессе загрузки, разберемся, как обрабатываются эти аргументы системой, как и в каком формате они передаются драйверам определенных устройств. Аргументы передаются кернелу в виде команд (или инструкций). Некоторые аргументы могут иметь числовые или строковые параметры. Важно отметить, что пробелы должны использоваться в аргументах загрузки только как разделители самих аргументов. В списке параметров одного аргумента отдельные его параметры отделяются друг от друга запятыми, без использования пробелов. Например:
ether=9,0x300,0xd000,0xd4000,eth0 root=/dev/hda1 *правильно*
ether = 9, 0x300, 0xd000, 0xd4000, eth0 root = /dev/hda1 *неправильно*
LILO (LInux LOader)
Программа LILO (загрузчик Linux), написанная Вернером Алмесбергером, используется наиболее часто. Она способна загружать различные версии кернела и хранит свои настройки в обычном текстовом файле. Многие дистрибутивы Linux устанавливают программу LILO как загрузчик ОС по умолчанию. LILO может без проблем загружать DOS, OS/2, Linux, FreeBSD и другие ОС, предоставляя пользователю возможность гибкого управления процессом загрузки.
В стандартной конфигурации эта программа приостанавливает процесс загрузки на начальной стадии и выводит на экран монитора свое приглашение:
LILO:
вскоре после включения компьютера. После чего LILO несколько секунд ожидает ввода аргументов и, если пользователь ничего не вводит, загружается операционная система в конфигурации default - по умолчанию. Обычные команды, которые указывают на тип ОС при загрузке, - это linux, msdos и backup. В виде дополнительных аргументов может передаваться команда выбора загрузочного диска, например:
LILO: linux root=/dev/hda1
Программа LILO поставляется с превосходной документацией, а все свои настройки хранит в файле /etc/lilo.conf. Этот файл содержит несколько секций (соответственно количеству выбираемых при загрузке ОС). Пользователь имеет возможность добавлять в этот файл свои настройки и команды вида "append=command". Такие команды могут быть добавлены в начале файла - в этом случае они будут применяться ко всем описанным ниже конфигурациям, либо в отдельной секции, описывающей параметры загрузки для конкретной ОС.
Пример файла /etc/lilo.conf для компьютера с ОС Linux, размещенной на диске /dev/hda2 и MS-DOS на /dev/hdb (второй жестком диске):
# Установить LILO как первичный загрузчик на диск /dev/hda
boot = /dev/hda
# Загрузочный имидж для установки
install = /boot/boot.b
# Раздел Linux
image = /vmlinuz # это сам кернел
label = linux # вот так его обзываем
root = /dev/hda2 # расположение корневой файловой системы
vga = ask # видеорежим VGA
append = "aha152x=0x340,11,7,1" # настройки для определения SCSI контроллера
# Раздел для загрузки MS-DOS
other = /dev/hdb1 # Это DOS раздел диска
label = msdos # вот так его обзываем
table = /dev/hdb # таблица разделов для второго диска
После того, как вы внесли изменения в файл /etc/lilo.conf, следует запустить программу /sbin/lilo, только сделать это должен администратор системы - пользователь root. Перезапускать программу /sbin/lilo следует также после каждого случая перекомпилляции кернела. По умолчанию LILO загружает операционную систему, которая первой описана в файле конфигурации.
LoadLin
Вторая программа - загрузчик ОС Linux. LoadLin - это DOS программа, которая может загружать кернел Linux из командной строки DOS и передавать ему необходимые аргументы. Она лучше устраивает тех пользователей, которые больше работают с MS-DOS и периодически переключаются на Linux.
Эта программа может быть полезна, если кое-какие аппаратные устройства вашего компьютера (контроллеры, накопители...) могут быть правильно инициализированы только поставленным в комплекте с ними драйвером под DOS. Самый распространенный пример - "SoundBlaster совместимые" аудиоплаты, для которых только DOS драйвер может привести в нужное состояние несколько таинственных регистров и сделать ее в самом деле совместимой с нужным стандартом. Загрузив DOS с нужным драйвером, можно загрузить Linux без "сброса" параметров, установленных этим драйвером, который обязательно произошел бы при перезагрузке системы. Теперь эта плата становится доступна и в ОС Linux.
Утилита rdev
Несколько загрузочных параметров кернела хранятся в нем самом в виде определенных значений, присвоенных по умолчанию при установке системы. Существует и специальная утилита - rdev, которая знает, где находятся эти параметры и как их изменить. Она имеет ряд псевдонимов-альясов, таких, как swapdev (управление своп-разделом диска), ramsize (управление RAM-диском), vidmode (изменение режимов видеоконтроллера), rootflags (режимы монтирования корневой файловой системы - только чтение или чтение/запись).
Как кернел сортирует аргументы
Аргументы, передаваемые системе при загрузке, имеют следующий формат:
name[=value_1][,value_2]... [,value_11]
где name - это уникальное ключевое слово, которое используется для идентификации определенной части кернела, которой и передаются следующие значения (если таковые имеются). Если системе передается несколько аргументов, то каждый из них имеет такой же формат и отделяется от других аргументов символом пробела. Число параметров, передаваемых с каждым аргументом, ограничено одиннадцатью. (В сверхсложных случаях, когда эти рамки нужно расширить, можно повторить тот же аргумент два раза с новыми параметрами.) Кернел накладывает еще одно ограничение - он может воспринимать только 10 целых (integer) чисел в качестве параметров, поэтому последний может быть только строкового (string) типа.
Основная сортировка аргументов происходит в файле linux/init/main.c. Вначале кернел ищет определенные аргументы "root=", "ro", "rw" или "debug". Их назначение мы рассмотрим ниже. Затем он просматривает настройки программ, содержащихся в массиве bootsetups в поиске совпадения со строкой заданного аргумента. Если вы задали при загрузке аргумент "foo=3,4,5,6,bar", то кернел проверяет наличие функции foo в этом массиве. Если она найдена, то кернел вызывает функцию инициализации, связанную с foo (foo_setup()), и передает ей эти аргументы - четыре целых числа - 3,4,5,6 и строку "bar".
Все аргументы, заданные в форме "foo=bar", которые не воспринимаются как функции инициализации, интерпретируются как команды присваивания значений переменным, примером (возможно, бесполезным на практике) может служить загрузочный аргумент "TERM=vt100".
Остальные агрументы, не воспринятые кернелом и не связанные с какими-либо переменными, передаются процессу с номером 1, программе init. Самый популярный аргумент, передаваемый процессу init, - это слово "single", по этой команде происходит загрузка операционной системы в однопользовательском режиме без запуска программ-демонов, управляющих поддержкой сетевых служб.
Загрузочные аргументы, связанные с выбором корневой файловой системы, настройками памяти и поведением системы:
аргумент | описание |
root= | Указывает на диск,который монтируется в качестве корневой файловой системы. Возможные значения: /dev/hdaN - /dev/hddN - жесткие дискиIDE,от a до d /dev/sdaN - /dev/sdeN - жесткие диски SCSI,от a до e /dev/fd0 или /dev/fd1 - 3.5" и 5.25" дисководы /dev/nfs - это уже под-ключение удаленной сетевой файловой системы. |
ro | Монтирование корневой файловой системы в режиме "только чтение". |
rw | Монтирование корневой файловой системы в режиме "чтение/запись". |
ramdisk_start= load_ramdisk= prompt_ramdisk= ramdisk_size= noinitrd= | Команды,управляющие работой кернела с RAM - диском,описывают его местонахождение до загрузки в память,размер,и т.д. |
mem=swap= buff= | Управление физической и виртуальной памятью компьютера. BIOS на многих РС может определять размер оперативной памяти,не превышающий 64 Мб,и это ограничение может быть снято прямым указанием кернелу актуального объема RAM. |
debug | Включается "режим отладки" - все сообщения об ошибках кернела выводятся на консоль. |
init= | Переназначение программы init на любую другую,например, "init=/bin/bash",вызовет сеанс шелла сразу после загрузки ОС. Такой режим может оказаться полезным. Если нормальная загрузка невозможна по причине сбоев или ошибок в конфигурации,то вызванный командный процессор позволит отредактировать файлы настроек,изменить конфигурацию системы. |
reboot= | Настройка реакции кернела на последовательность клавиш Ctrl-Alt-Del (горячая/холодная перезагрузка). |
reserve= | reserve=iobase,extent[,iobase,extent]... Используется для защиты указанных портов от тестирования (probe) при загрузке,а потребность в такой защите может возникнуть у владельцев устройств,которые таят возможность подвешивания компьютера при загрузке в особенностях своей конструкции. |
panic= | Очень неприятное событие,когда кернел впадает в панику (это значит,что он встретился с ошибкой, которую считает неразрешимой, и,по умолчанию, после вывода на экран сообщения система замирает и ждет,пока проходящий мимо гомо-cапиенс прочитает это сообщение и перегрузит машину). Если,например,при загрузке задать аргумент "panic=30",то кернел сам,после 30-ти секунд ожидания,сделает попытку перезагрузки. |
Этот список аргументов загрузки кернела далеко не полон, а если коснуться аргументов, управляющих настройками различных устройств (контроллеров, накопителей...), то подробный перечень может показаться бесконечным, так как даже устройства различных моделей, но одного производителя, используют не одинаковые параметры. Формат аргументов инициализации сетевых плат Ethernet:
ether=irq,iobase[,param_1,[param_2,...[param_8]]],name
Простейший вид этого аргумента:
ether=0,0,eth1
Присваивание нулевых значений IRQ и базового порта ввода-вывода приведет к тому, что кернел будет автоматически определять эти значения при загрузке (в режиме autoprobe). Параметры могут указывать номер канала DMA, тип шины и т.п.
Игорь Грень, gren@isir.minsk.by