Загрузка на компьютерах SPARC
Если POST прошел нормально, программа автозагрузки пытается загрузить систему, используя имя устройства и имя файла ядра, записанные в boot-device и boot-file. Эти параметры могут быть изменены программой eeprom из командной строки или после останова системы из командной строки ok.
После начального загрузчика запускается ufsboot, если загрузка происходит с диска, или inetboot, если выполняется загрузка по сети.
Загрузка по сети может идти с использованием DHCP или RARP/bootparams, в зависимости от настроек и конфигурации сети - для загрузки по DHCP должен быть доступен DHCP-сервер.
Команду boot среды OpenBoot можно использовать для задания протокола загрузки:
boot net:rarp
boot net:dhcp
Если протокол не указан, используется указанный по умолчанию. Загрузка осуществляется через интерфейс, для которого определен псевдоним net.
Загрузка с использованием RARP
Начальный загрузчик выполняет ARP-запрос, после получения ответа посылает запрос в локальную сеть по протоколу TFTP для загрузки программы inetboot. Загрузив inetboot, загрузчик передает ей управление, а она отправляет еще один ARP-запрос и находит файловую систему в сети, с которой производится в дальнейшем загрузка ядра по протоколу bootparams.
Загрузка с использованием DHCP
Начальный загрузчик посылает запрос, в котором сообщает MAC-адрес интерфейса с псевдонимом net и архитектуру компьютера, а в ответ получает IP-адрес, параметры загрузки и настройки сети. После их получения начальный загрузчик загружает inetboot через сеть, inetboot загружает ядро, которое загружает необходимые ему файлы, после чего выгружает inetboot. Затем запускается dhcpagent (он указан в стартовых скриптах), получающий остальные настройки по DHCP.
Загрузка с диска
Загрузка тоже разделяется на начальную и вторичную, если имя файла ядра указано не как полное имя (начинающееся с символа /), то вторичный загрузчик ищет ядро в каталоге, соответствующем аппаратной платформе компьютера: /platform/platform-name или /platform/hardware-class-name (если указано полное имя – загружается этот файл).
Среда OpenBoot, команда boot
В системах со SPARC-архитектурой после процедуры POST, выполняемой firmware, запускается загрузчик, предоставляющий интерфейс среды OpenBoot. Приглашение среды представляет собой слово ok и в ответ на него можно вводить команды.
Синтаксис команды boot:
boot [device] [arguments],
например
boot –as - загрузка ядра, используемого по умолчанию, в однопользовательском режиме,
boot kernel/unix –as – принудительная загрузка 32-разрядного ядра в однопользовательском режиме,
boot kernel/sparcv9/unix –as – то же для 64-разрядного ядра.
Если дать команду boot без параметров, система загрузится с устройства, указанного в переменной boot-device (если в режиме диагностики – diag-device). Аргументы команды boot не анализируются загрузчиком OpenBoot, а передаются вторичному загрузчику.
Если команде boot переданы аргументы, содержимое переменных boot-file и diag-file игнорируется. Например, в команде boot –s ключ –s является аргументом.
Инициализация ядра
Сразу после того, как ядру передается управление, оно начинает загрузку модулей. Драйвер файловой системы еще не загружен, поэтому для чтения модулей ядро использует ufsboot (для UFS). После монтирования корневой файловой системы ядро выгружает ufsboot и выполняет остаток загрузки. Оно монтирует указанные в /etc/vfstab файловые системы и запускает процесс /sbin/init, он запускает скрипты, перечисленные в /etc/inittab, а потом передает управление службе svc.startd. Начиная с Solaris 10 рабочий режим определяется установками системы SMF - тем, какой этап системы требуется загрузить. По умолчанию происходит загрузка milestone/multi-user-server, а набор служб для перехода к этому этапу указан в /var/svc/profile/generic.xml.
В Solaris ядро настраивается динамически - изменить параметры ядра можно как при перезагрузке, так и во время работы. Оно состоит из статической части и модулей, которые загружаются по мере необходимости – при запуске системы или в момент первого обращения к ним. Ядро выгружает модуль тогда, когда он не нужен, а память, занимаемая им, нужна.
Список загруженных в данный момент модулей:
modinfo
Id Loadaddr Size Info Rev Module Name
0 fffffffffb800000 173c7e - 0 unix ()
1 fffffffffb904cf0 28e6e0 - 0 genunix ()
3 fffffffffbb3c000 5e50 1 1 specfs (filesystem for specfs)
4 fffffffff7e87000 1b8a8 155 1 dtrace (Dynamic Tracing)
5 fffffffffbb41db0 57f0 16 1 devfs (devices filesystem 1.19)
6 fffffffffbb47358 108e8 17 1 dev (/dev filesystem 1.6)
7 fffffffffbb57760 9500 - 1 dls (Data-Link Services v1.13)
8 fffffffffbb608d8 5b88 - 1 mac (MAC Services v1.22)
10 fffffffffbb660d0 3ff8 1 1 TS (time sharing sched class)
<…>
Модули ядра хранятся в каталогах /kernel и /usr/kernel, специфичные для данной платформы - в /platform/`uname –m`/kernel и /platform/` uname –i`/kernel (эти каталоги существуют не всегда).
Путь к каталогу, где нужно искать модули, загружаемые при старте системы;
модули, которые надо загрузить сразу; корневое устройство; значения параметров ядра, отличающиеся от используемых по умолчанию, указываются в /etc/system. Если нет ни самого файла, ни его резервной копии, в качестве имени файла system при загрузке указывается /dev/null (все значения изменяются на принятые по умолчанию).
Если файл /etc/inittab был изменен (например, при установке приложения), для интеграции содержимого файла в базу данных о службах запускается inetconv – иначе изменения в файле не повлияют на порядок загрузки служб в системе. Все указанные в /etc/inittab службы запускаются в статусе legacy_run после запуска всех остальных служб SMF.
Сценарии запуска системы
В каталогах /etc/rcN.d лежат скрипты запуска системы. Имена файлов в каталогах имеют вид KnnNAME или SnnNAME, где nn – порядковый номер, а NAME – имя приложения (S – start, K – kill – запуск и останов соответственно). Вначале запускаются скрипты с меньшим порядковым номером.
Файлы /etc/rcN являются символическими ссылками на файлы /sbin/rcN. Возможность использования скриптов сохранена для совместимости с приложениями сторонних разработчиков, модифицирующих /etc/inittab и размещающих скрипты в каталогах /etc/rcN.d.
Программы shutdown, init, poweroff, halt, reboot
Для перевода системы из одного режима в другой в Solaris можно использовать:
/usr/sbin/shutdown
/sbin/init
/usr/sbin/halt
/usr/sbin/reboot
/usr/sbin/poweroff
Программы /usr/sbin/shutdown, /sbin/init, /usr/sbin/halt выполняют завершение всех процессов, записывают несохраненные данные на диск, и переводят систему в новый режим работы, а /usr/sbin/reboot выполняет все перечисленное и затем переводит систему в режим, определенный как initdefault в /etc/inittab.
Команда poweroff эквивалентна init 5. Пользователи не оповещаются об изменении режима работы, скрипты завершения не выполняются, выключается питание компьютера, если это поддерживается программно.
В некоторых SPARC-системах используются сочетания клавиш Stop+A или L1+A, при этом производится аварийная остановка, т.е. все процессы прерываются немедленно.
shutdown
Синтаксис:
shutdown [-y] [-g период ожидания [-i режим]
-y – автоматически отвечает на все запросы о перезагрузке системы;
-g – период_ожидания,
-i –режим, в которое будет переведена система после предупреждений, если они выдаются.
Эта команда выполняется только root для изменения режима работы системы. По умолчанию команда переводит систему в режим 0 (shutdown state). Shutdown посылает всем работающим пользователям предупреждающее сообщение о том, что система готовится к переходу в другой режим работы, и окончательное сообщение о начале перехода. Если программа не может найти файл /etc/default/shutdown или не может прочитать значение, она выдает предупреждение и устанавливает период ожидания в 60 секунд. Прежде чем начинать остановку демонов и прекращение процессов, а также запись на диск данных файлового кэша и демонтирование всех файловых систем, по умолчанию запрашивается подтверждение.
Если зарегистрирован только пользователь, выполняющий команду shutdown, или если период ожидания задан равным нулю, предупреждающее сообщение не выводится.
init
С помощью программы init систему можно перевести в любой режим работы:
init режим работы
Можно указать режимы a, b, c и q - псевдорежимы, существующие для того, чтобы было можно с помощью init запустить программы, соответствующие в /etc/inittab данным режимам. Например, команда init q вызывает перечитывание процессом init файла /etc/inittab.
Программа telinit является символической ссылкой на init и применяется для передачи команд запущенной в данный момент программе init.
halt
Команда используется для немедленного начала останова системы и от shutdown отличается тем, что не предупреждает пользователей об остановке работы. Выполняет запись кэшируемых данных на диск.
reboot
Выполняется быстрее, чем shutdown, потому что не выполняет скрипты останова и не посылает сообщений пользователям; выполняет запись кэшируемых данных на диск, как и halt.
С помощью reboot можно передать ключи загрузчику OpenBoot, например
reboot -- -rs
изменяет таблицу устройств.
Чтобы отделить ключи самой reboot от передаваемых загрузчику, перед ключами последнего ставится два дефиса подряд.
Некоторые версии OpenBoot поддерживают клавиатурные команды, изменяющие поведение OpenBoot при загрузке:
- Stop - пропустить исполнение процедуры POST,
- Stop+A - прерывание всех запущенных в настоящее время процессов и предоставление командной строки в среде OpenBoot,
- Stop+D - включение режима диагностики, эквивалентно установке переменной diag-switch? в значение true,
- Stop+F - запуск Forth Monitor,
- Stop+N - переустановка всех переменных NVRAM в значения по умолчанию,
Комбинации клавиш указаны в файле /etc/default/kbd, и там же их можно изменить. Для изменения стандартных назначений на новые после редактирования файла нужно дать команду kbd –i.