FreeBSD предоставляет несколько вспомогательных программ для остановки или автоматической перезагрузки системы или для смены режима работы системы с многопользовательского в однопользовательский. Безопасная остановка и перезагрузка системы требуют поддержки ядра. Эта поддержка предоставляется системным вызовом reboot.
Системный вызов reboot (автоматическая перезагрузка) является привилегированным вызовом. Параметр этого системного вызова определяет, как должна выключаться и перезагружаться система. Этот параметр является надмножеством флагов, передаваемых программой boot системе во время начальной загрузки последней. Система может быть остановлена (обычно посредством входа в бесконечный цикл) или может быть перезагружена в режиме однопользовательской или многопользовательской работы.
Имеются дополнительные элементы управления, которые можно использовать для форсирования создания аварийного дампа перед автоматической перезагрузкой и для отключения записи данных, находящихся в буферном кеше диска, если информация в буферном кеше является неверной.
При распознавании катастрофического сбоя обычно применяется также автоматическая перезагрузка.
Система перезагрузит себя автоматически, если она распознает невосстановимую ошибку в ходе обычной работы. Все сбои такого типа, называемые паникой, обрабатываются подпрограммой panic().
Когда система выключается, она проходит через три отдельные фазы.
- Выключение всех служб, которые зависят от файловой системы для хранения данных.
- Выключение самой файловой системы.
- Выключение служб, которые не зависят от файловой системы.
Эти три фазы необходимы, поскольку некоторые службы захотят записать в файловую систему некоторые последние данные, прежде чем она будет выключена, и чистый перезапуск может быть невозможен, если они не смогут это сделать.
Службы регистрируют в ядре обработчики событий для обеспечения упорядоченного выключения системы. Каждый обработчик события объявляется следующим макросом:
EVENTHANDLER_REGISTER (имя, функция, аргумент, приоритет)
Имя показывает, в какой части последовательности выключения будет вызвана функция обработчика события. Аргумент дает модулю возможность передать себе любые частные данные, необходимые для выключения себя. Приоритет упорядочивает процедуры выключения внутри фазы. Приоритет служит здесь тем же целям, каким служит аргумент порядок в макросе SYSINIT при создании упорядоченной последовательности запуска. Приоритет необходим для того, чтобы службы не отключались, когда от них зависят другие службы.
Фазы выключения
|
Имя |
|
Фаза выключения |
|
shutdown |
pre sync |
Перед синхронизацией дисков |
|
shutdown |
post_sync |
После синхронизации дисков |
|
shutdown |
final |
Непосредственно перед остановкой процессора |
Процедура выключения ядра сначала обходит список функций shutdown_pre_sync и вызывает каждую из них по очереди, а затем выключает файловые системы на локальных дисках. С находящимися в покое файловыми системами она вызывает функции shutdown_post_sync. При необходимости делается дамп ядра (например, если она была вызвана вследствие паники ядра). Дампы ядра записываются непосредственно в раздел подкачки, а не в обычную файловую систему, вот почему этот шаг можно делать после отключения файловых систем.
Наконец, процедура выключения ядра вызывает все функции, зарегистрированные в группе shutdown Jinal. Затем она входит в бесконечный цикл в ожидании сброса пользователем.
Основные тезисы: автоматическая перезагрузка, как отключить автоматическую перезагрузку, система выключения компьютера, автоматическая перезагрузка сервера, автоматическая перезагрузка компьютера