Начальная загрузка
Категория: Запуск и останов системы | Автор: admin | 24-09-2009, 05:28 | Просмотров: 4818

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

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

Когда происходит включение питания, запускается на выполнение загрузочный код, хранящийся в ПЗУ. В его обязанность входит запуск ядра. Ядро опрашивает состояние оборудования, а затем запускает системный процесс init, идентификатор которого всегда равен 1.

Прежде чем на экране появляется регистрационное приглашение, происходит целый ряд событий. Файловые системы должны быть проверены и смонтированы, а системные демоны – запущены. Соответствующие процедуры реализуются с помощью сценариев интерпретатора shell, которые один за другим запускает init. Стартовые сценарии часто называют «rc-сценариями», поскольку они имеют префикс «rc». Он расшифровываются как «run command» - «команда запуска» - и является пережитком, доставшимся UNIX в наследство от операционной системы CTSS. Конкретная структура стартовых сценариев и способ их выполнения зависят от системы. Все эти вопросы будут рассмотрены в данной главе.

 

Автоматическая и ручная загрузка

 

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

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

 

Этапы загрузки

 

Обычно процесс начальной загрузки состоит из шести этапов:

  • загрузка и инициализация ядра;

  • распознание и конфигурирование устройств;

  • запуск самовыполняющихся системных процессов;

  • выполнение команд оператора (только при ручной загрузке);

  • выполнение стартовых сценариев;

  • переход в многопользовательский режим.

 

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

 

Инициализация ядра

 

Ядро UNIX само по себе является программой, и первый этап начальной загрузки заключается в считывании этой программы в память для последующего выполнения. Имя файла ядра определяется разработчиком конкретной системы, но традиционное название /unix или /vmunix. В настоящее время разработчики не придерживаются строго этого соглашения.

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

Ядро выполняет тестовые программы, позволяющие определить, сколько памяти имеется в наличии. Большинство внутренних структур ядра обладают фиксированным размером, поэтому ядро точно знает, сколько памяти нужно зарезервировать для самого себя. Эта память будет недоступной пользовательским процессам. В большинстве систем ядро выдает на консоль сообщение об общем объеме физической памяти и объеме памяти, не занятой ядром.

 

Конфигурация аппаратных средств

 

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

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

 

Системные процессы

 

После завершения базовой инициализации ядро создает в области памяти выделенной для процедур пользователя, несколько «самовыполняющихся» процессов. Это происходит в обход стандартного системного вызова fork (см. параграф 4.2).

Число и характер таких процессов определяется типом операционной системы. В BSD-системах создаются три процесса:

  • swapper (идентификатор 0);

  • init (идентификатор 1);

  • pagedaemon (идентификатор 2).

Число самовыполняющихся процессов в системах семейства System V варьируется:

  • sched (идентификатор 0);

  • init (идентификатор 1);

  • различные обработчики сигналов ядра.

В Linux процесс с идентификатором 0 отсутствует, а общее число самовыполняющихся процессов зависит от версии ядра:

  • init (идентификатор 1);

  • различные обработчики сигналов ядра (kflushd, kupdate, kpiod, kswapd).

Из всех упомянутых процессов только init является полноценным пользовательским процессом; остальные фактически представляют собой части ядра операционной системы, которые были преобразованы в процессы из концептуальных соображений.

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

 

Действия оператора (только при ручной загрузке)

 

Если систему нужно запустить в однопользовательском режиме, оператор указывает при запуске специальный флаг в командной строке, а ядро передает эту информацию процессу init. При загрузке в однопользовательском режиме обычно выдается приглашение ввести пароль пользователя root. Можно не задавать пароль, а просто нажать <Ctrl-D>, после чего загрузка продолжится в многопользовательском режиме. В Red Hat командный интерпретатор запускается без ввода пароля.


В однопользовательском режиме оператор может выполнять команды почти так же, как и в многопользовательском. Однако обычно автоматически монтируется только раздел с корневым каталогом. Другие файловые системы оператор доложен смонтировать вручную для того, чтобы использовать программы, находящиеся вне каталогов /bin, /sbin или /etc. Демоны в однопользовательском режиме не запускаются, поэтому команды, зависящие от некоторых серверных процессов (например, mail), работать не будут.

 

Во многих однопользовательских средах корневая файловая система монтируется доступной только для чтения. Если каталог /tmp является частью корневой системы, множество программ, работающих с временными файлами (например, редактор vi), откажутся выполняться. Чтобы исправить подобную ситуацию, необходимо в самом начале однопользовательского сеанса смонтировать каталог / в режиме чтение/запись. Как это сделать, зависит от системы. В большинстве случаев достаточно выполнить команду mount /, а всю необходимую информацию команда возьмет из файла fstab или vfstab.

(Red Hat)

В Red Hat система ведет себя немного «агрессивнее» в однопользовательском режиме. К тому моменту, когда отобразится приглашение интерпретатора shell, система попытается смонтировать все локальные файловые системы. На первый взгляд, это кажется удобным, но если с какой-нибудь файловой системой что-то не в порядке, возникают проблемы.

Команда fsck, которая проверяет и восстанавливает поврежденные файловые системы, обычно выполняется в процессе автоматической загрузки. Если система запускается в однопользовательском режиме, команду fsck нужно «прогнать» вручную. Подробно данная команда описана в параграфе 8.4.

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

 

Выполнение стартовых сценариев

 

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

Точное местонахождение, содержимое и организация стартовых сценариев заслуживают отдельного изучения (см. параграф 2.4).

 

Работа в многопользовательском режиме

 

После выполнения инициализационных сценариев система полностью готова к работе, за одним исключением: никто не может в нее войти. Для того чтобы с конкретного терминала можно было попасть в систему, необходимо, чтобы терминал имел свой процесс getty, ожидающий поступления запросов от этого терминала. По окончании работы последнего стартового сценария процесс init порождает все необходимые процессы getty, завершая процесс загрузки. Если система сконфигурирована для работы в графическом режиме, процесс init также порождает соответствующие регистрационные процессы, такие как xdm, gdm или dtlohin.

Необходимо помнить, что процесс init продолжает играть важную роль даже после завершения начальной загрузки. В BSD-системах он имеет всего два состояния: однопользовательское и многопользовательское. В других системах у него есть один однопользовательский и несколько многопользовательских «уровней выполнения», определяющих, какие ресурсы системы будут доступны пользователю. Уровни выполнения описаны в параграфе 2.4.



 (голосов: 0)
Версия для печати | Комментариев: 0
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.


 
Логин
Пароль
 

 
Locations of visitors to this page