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

UnixForum






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

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

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

Записки Джоя: процесс загрузки Red Hat Linux

Оригинал: Joey's Notes: The Red Hat Linux Boot Process
Автор: Джой Престиа (Joey Prestia)
Дата: Ноябрь 2008 г.
Перевод: Сергей Супрунов
Дата перевода: 09 февраля 2009 г.

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

Многие современные дистрибутивы прячут процесс загрузки от пользователя, используя экран-заставку (splash screen), который, как правило, можно сбросить, нажав клавишу <ESC> или ещё какую-то комбинацию клавиш в то время, когда заставка отображается; также может потребоваться удалить фрагмент rhgb quiet (для дистрибутивов, основанных на Red Hat) из строки kernel в /boot/grub/grub.conf. Поскольку дистрибутивов Linux существует великое множество, вам нужно уточнить процедуру сброса заставки (если в этом есть необходимость) в документации к вашему дистрибутиву.

Не лишним будет заметить: вы должны познакомиться с процессом загрузки до того, как проблемы возникнут. В процесс загрузки включено несколько важных файлов, и ошибки, скажем, в /boot/grub/grub.conf, /etc/fstab или /etc/inittab наверняка приведут к возникновению проблем. Так что, дополнительно к пониманию процесса загрузки, неплохо бы действительно изучить и эти файлы.

Предупреждение: если вы что-то делаете с /boot/grub/grub.conf или другим критически важным конфигурационным файлом, выполняйте это только на тестовом компьютере (в "песочнице"), пока вы полностью не начнёте понимать суть изменений. Я, чтобы приобрести опыт восстановления системы, моделируя различные проблемы загрузки, использую программу виртуализации Virtualbox.

[Когда работаете с важными файлами и у вас нет полной уверенности в ваших действиях, создание резервных копий не раз вас спасёт. Как минимум, следует сделать копию (а ещё лучше - серию копий) такого файла до того, как вы начнёте его изменять (например, grub.conf.3.orig для grub.conf), поскольку иногда критические ошибки некоторое время остаются незамеченными. -- прим.ред.]

Power-On Self Test

Начало загрузки - POST Первое, с чего начинается процесс загрузки - это самотестирование оборудования (POST), которое выполняется базовой системой ввода-вывода (BIOS) компьютера при включении питания. Задача этого самотестирования - внутренняя проверка компонентов системы. Способ, которым оно осуществляется, может отличаться для разных архитектур, но цель одна и та же. Обычно эта проверка распространяется на память системы (RAM), процессор, видеокарту, жёсткие диски и другие компоненты материнской платы. Многие платы расширения, такие как RAID-контроллеры, проводят собственную самопроверку. При возникновении ошибки генерируется или выводится на панель или консоль то или иное предупреждение; для сообщения об определённых ошибках POST использует последовательности звуковых сигналов. Если всё проходит нормально, BIOS считывает главную загрузочную запись (MBR) с жёсткого диска и загружает программу, которая там будет обнаружена, в память.

[Если говорить точнее, то MBR считывается не обязательно с жёсткого диска. В настройках BIOS можно задать последовательность проверки загрузочных устройств (жёсткий диск, CD-привод, дискета и т.п.), и программа-загрузчик будет считана с первого устройства, на котором она будет обнаружена - прим.перев.]

Главная загрузочная запись

Формат MBR Главная загрузочная запись (MBR) - это первые 512 байт загрузочного устройства, которые BIOS считывает в оперативную память. (Предполагается, что мы используем архитектуру x86.) Первые 446 байт из этих 512-ти обычно содержат низкоуровневый загрузочный код, ссылающийся на программу-загрузчик, размещаемую где-то в другом месте диска; он может даже указывать на другой диск. Следующие 64 байта содержат таблицу разделов диска (четыре 16-байтных записи, известных как схема основных разделов, или IBM Partition Table Scheme). Наконец, оставшиеся 2 байта - это так называемое "магическое число", используемое для обнаружения ошибок [по этой сигнатуре BIOS также определяет, является ли устройство загрузочным - прим.перев.].

Загрузчик

Назначение загрузчика - загрузить операционную систему. Существует множество загрузчиков, однако для Linux наиболее распространены LILO и GRUB. В Windows есть свой загрузчик - New Technology Loader (NTLDR). Временами вы можете сталкиваться с сообщением "NTLDR missing" - это сообщение об ошибке загрузчика Windows.

Независимо от того, какой именно загрузчик используется, важно помнить, что загрузчики очень сложны, и неопытный пользователь с правами root легко может привести его в неработоспособное состояние. На мой взгляд, экспериментировать и оттачивать свои навыки лучше всего только на машине, которую вы используете в качестве "песочницы", или в виртуальной среде. Одна-единственная опечатка при работе, скажем, с grub.conf, - и вы можете потерять больше времени на попытки исправить вашу ошибку, чем ожидали. Однако, если это происходит в "песочнице" и у вас есть время, вы приобретёте отличный опыт.

GRUB

Загрузочное меню GRUB Наиболее распространённый загрузчик, используемый сегодня в современных системах Linux, - это GRand Unified Bootloader (GRUB). Именно о нём мы и будем здесь говорить. GRUB - это программа, которая записывается в MBR и раздел /boot жёсткого диска и загружает операционную систему. Код загрузчика должен помещаться в 446 байт в MBR, но из-за постоянно повышающейся сложности операционных систем и необходимости загружать практически любую ОС, он значительно разросся в размерах. На данный момент часть кода загрузчика записывается в MBR, а оставшаяся - на раздел /boot. Кроме того, загрузчик GRUB имеет модульный дизайн и выполняет свою работу поэтапно, в несколько стадий, которые я рассмотрю лишь поверхностно.

Стадии GRUB

Работа GRUB делится на несколько стадий, называемых Stage1, Stage1_5 и Stage2. Ниже коротко рассматривается каждая из них.

Stage1

Код stage1 записывается в MBR. Из-за ограничений размера, stage1 обычно лишь указывает на следующую стадию GRUB - stage1_5 или stage2. GRUB может загружать или не загружать stage1_5, в зависимости от типа используемых файловых систем.

[root@localhost grub]# file stage1
stage1: x86 boot sector, code offset 0x48

Stage1_5

Stage1_5 является промежуточным этапом между stage1 и stage2. Если вы посмотрите на содержимое каталога /boot/grub, то увидите различные файлы stage1_5, связанные с различными файловыми системами. Каждый файл Stage1_5 имеет дело с определённым типом файловой системы. Этот код позволяет правильно распознавать ФС и работать с ней.

В моём каталоге /boot/grub размещаются следующие stage1_5-файлы:

e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
iso9660_stage1_5
jfs_stage1_5
minix_stage1_5
reiserfs_stage1_5
ufs2_stage1_5
vstafs_stage1_5
xfs_stage1_5

Stage2

Это основной образ GRUB, обычно размещающийся в файловой системе раздела /boot как файл /boot/grub/stage2. Он считывает файл /boot/grub/grub.conf, чтобы получить конфигурационную информацию, указывающую, как будет загружаться ядро. [Конфигурационный файл также может называться menu.lst - прим.перев.] Он также поддерживает интерактивный интерфейс, позволяющий вам устранять проблемы, переустанавливать загрузчик или изменять поведение GRUB. Stage2 предоставляет пользователю графическое меню загрузки. Если за отведённое время не будет нажата соответствующая клавиша для входа в скрытое меню или ничего не будет выбрано за заданный в настройках промежуток времени, GRUB загрузит пункт по умолчанию.

GRUB имеет действительно полезную функцию автодополнения клавишей <Tab>, помогающую запустить систему, если, к примеру, она перестала загружаться из-за ошибки в соответствующей строке вашего файла grub.conf. Мне много раз приходилось пользоваться этой возможностью, чтобы вновь заставить работать незагружающуюся систему.

/boot/grub/grub.conf

Этот файл определяет, какое ядро должно загружаться, а также файл образа initrd со всеми модулями, необходимыми для загрузки вашей системы.

Вот типичный для Red Hat Linux файл grub.conf:

Редактировать этот файл довольно просто, тем не менее, это довольно распространённый источник ошибок.

    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else, TAB lists the possible
   completions of a device/filename.]

grub> 

Ничего, кроме приглашения GRUB - и что теперь с этим делать? Если вы выполняете какие-нибудь изменения в этом файле, не забывайте сперва распечатывать его и делать резервную копию. Это спасёт вас, если вы сделаете опечатку. Бумажную копию можно будет использовать для повторного вызова опций, необходимых для того, чтобы загрузить вашу машину и исправить ошибку. Ошибки бывают разные, и имеет смысл хорошо познакомиться с некоторыми из наиболее распространённых, такими как неправильно заданное имя ядра или ошибочно определённый корневой раздел. Если вы всё же видите это приглашение GRUB, задайте себе следующий вопрос: "Что я должен сделать для восстановления системы?" Если на этот момент у вас нет никаких идей, но вы управляете системами Linux, вероятно, будет неплохо взять тестовую машину, смоделировать несколько ошибок в grub.conf и изучить ваш загрузчик. Ниже рассматривается, что нужно делать в подобной ситуации (обратите внимание на то, где я нажимаю клавишу <Tab>, чтобы просмотреть доступные опции).

Загрузка вручную с использованием автодополнения GRUB

grub> root (hd0,0)                               
 Filesystem type is ext2fs, partition type 0x83

grub> kernel /<TAB>               
 Possible files are: lost+found grub initrd-2.6.18-8.el5.img System.map-2.6.18-
8.el5 config-2.6.18-8.el5 symvers-2.6.18-8.el5.gz vmlinuz-2.6.18-8.el5

grub> kernel /vmlinuz-2.6.18-8.el5  ro root=LABEL=/
     [Linux-bzImage, setup=0x1e00, size=0x1ad054]

grub> initrd /<TAB>
 Possible files are: lost+found grub initrd-2.6.18-8.el5.img System.map-2.6.18-
8.el5 config-2.6.18-8.el5 symvers-2.6.18-8.el5.gz vmlinuz-2.6.18-8.el5

grub> initrd /initrd-2.6.18-8.el5.img
   [Linux-initrd @ 0xfe8a000, 0x15547c bytes]

grub> boot      

Строка root (hd0,0) определяет первый диск и первый раздел на этом диске. В строке kernel вы можете ввести '/', нажать <Tab> и просмотреть доступные опции, затем выбрать одну из них, напечатать несколько букв (достаточных для однозначного определения опции), и пусть GRUB сам дополнит команду. Дополнительная опция "ro root=LABEL=/" обусловлена моим опытом работы с системами Red Hat; ваш опыт может подсказывать вам иное, так что вам нужно будет проверить эти опции в вашем файле grub.conf. Аналогично поступаем со строкой initrd: после '/' нажимаете <Tab>, чтобы GRUB отобразил все доступные варианты. Также у вас может возникнуть необходимость определить некоторые модули и дополнительные опции.

Ядро

Загрузка ядра Когда загрузчик передаёт управление ядру и ядро начинает загружаться, на экран выводится масса разнообразной информации. В системах, основанных на Red Hat, этот вывод можно убрать, добавив в строке kernel опцию "rhgb quiet". Она означает "тихую графическую загрузку" и будет подавлять загрузочные сообщения ядра. Когда мне нужно увидеть эти сообщения, я прерываю цикл GRUB нажатием клавиши <Esc>, нажимаю <e> для входа в режим редактирования (подсказка по модификации аргументов ядра есть внизу экрана GRUB) и изменяю строку kernel. Удаление "rhgb quiet" позволяет мне видеть сообщения ядра, так что я могу определить, есть ли среди них относящиеся, скажем, к панике ядра или подобным проблемам.

На этом этапе ядро тестирует ваше оборудование и подстраивается под него. Ядро также подгружает модули из образа initrd, которые требуются для работы с вашим оборудованием. Учтите, что эта информация очень быстро пробегает по экрану, так что если вы считаете, что ваша проблема лежит на уровне ядра, смотрите очень внимательно, и вы наверняка получите подсказку о том, где её искать. Когда ядро завершает свою инициализацию, оно запускает первый системный процесс - /sbin/init.

[Большая часть загрузочной информации доступна в файле /var/log/dmesg сразу после загрузки. - прим.ред.]

INIT

Сообщения процесса init Init - это первый процесс, который запускается в вашей системе. Он считывает файл /etc/inittab, исполняет /etc/rc.d/rc.sysinit, затем переходит на уровень исполнения, определённый в /etc/inittab.

Init получает идентификатор процесса (PID), равный 1. На показанном выше рисунке есть строка "INIT: version 2.86 booting". В этой точке процесса загрузки на сцену и выходит /sbin/init. В строке, следующей сразу за этой, видны сообщения, отображаемые сценарием командной оболочки /etc/rc.d/rc.sysinit; фактически, весь экран занят сообщениями этого сценария, так что вы можете получить представление о функциях, которые он выполняет. Кроме того, init обычно запускает несколько копий /sbin/getty или /sbin/mingetty, которые обеспечивают работу ваших виртуальных терминалов. Благодаря им вы можете нажать комбинацию клавиш с <Ctrl> + <Alt> + <F1> по <F6> и попасть в соответствующий виртуальный терминал.

Теперь давайте рассмотрим файл /etc/inittab - конфигурационный файл для процесса init.

В зависимости от выполняемых действий на экран выводятся обычные диагностические сообщения, то есть [ OK ] или [Failed], чтобы можно было решить возникающие проблемы. Вы, возможно, обратили внимание на сообщение "Press 'I' to enter interactive startup" (в системах на базе Red Hat). Оно говорит о выполнении rc.sysinit и предоставляет оператору определённый уровень контроля над находящейся в процессе загрузки системой. Работа rc.sysinit завершается переходом на уровень исполнения, который определён в /etc/inittab как уровень по умолчанию. Это ещё одно место возникновения ошибок, поскольку на серверах строка "id:5:initdefault:" обычно выставлена в 3, так что машина загружается на уровень 3 вместо 5. Ещё одна точка потенциальных ошибок - строка "ca::ctraltdel:/sbin/shutdown -t3 -r now", закомментированная, чтобы избежать перезагрузки сервера "комбинацией из трёх пальцев" (<Ctrl> + <Alt> + <Del>). Люди есть люди, и им свойственно ошибаться. Мне попадались опечатки в обоих местах, приводившие к проблемам. В отличие от команды "mount -a", которая сообщит вам о наличии ошибок в определении точек монтирования в файле /etc/fstab, выполнение команды "init q" приводит к повторному считыванию /etc/inittab, но не проверяет ошибки в самих уровнях исполнения, так что лучший способ узнать, есть ли ошибки, - это изучить этот файл и быть очень, очень аккуратным, если вы решите вносить изменения в любой из файлов /etc/rc*/*.

Уровни исполнения

Продолжение загрузки Когда система переходит на соответствующий уровень исполнения (runlevel), на экран продолжат выводиться сообщения процесса init (при условии, что ваша машина настроена на их вывод), опять-таки заканчивающиеся на [ OK ] или [Failed], в зависимости от результата. Это сервисы, стартующие на ваших уровнях исполнения. Если вы посмотрите на свой файл /etc/inittab, вы найдёте там строку наподобие "id:5:initdefault:". Это ваш уровень исполнения по умолчанию. На большинстве серверов он будет выставлен в 3, на рабочих станциях, конечно же, в 5, чтобы сеанс X Window System запускался сразу же после загрузки системы.

Чтобы узнать, какие процессы стартуют или останавливаются на том или ином уровне исполнения, следует заглянуть в каталог /etc/rcX.d (где X - интересующий вас уровень исполнения). Внутри этого каталога размещаются символьные ссылки на файлы в каталоге /etc/init.d. Имена файлов начинаются либо с 'K', либо с 'S' (означающих "останов" (kill) или "запуск" (start) соответствующего демона на этом уровне исполнения). Число сразу после этой буквы задаёт порядок выполнения сценария, так как они стартуют в алфавитном порядке. В системах, основанных на Red Hat, команда "chkconfig" изменяет символьные ссылки для запуска или останова демона на требуемом уровне. Соответственно, меняется буква 'S' или 'K', зачастую изменяется и следующее за ней число.

Login

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

Ссылки



Примеч. от ведущего сайта Rus-Linux.net: В нашей Библиотеке имеется еще несколько статей о процедуре загрузки системы. Если вас эта тема интересует, загляните в раздел "Процесс начальной загрузки системы".