Этапы загрузки системы
Останов системы
Как уже говорилось, операция, обратная загрузке системы - останов - устроена в Linux как специальный уровень выполнения: 0 - если требуется выключить систему, и 6 - если требуется перезагрузка. Соответствующие каталоги rc0.d и rc6.d будут состоять почти сплошь из ссылок вида K*, но как минимум один сценарий, killall, будет запущен с параметром " start ". Этот сценарий остановит все процессы, которые не были остановлены K-сценариями: программы пользователей, демоны, запущенные администратором вручную, и т.п.
Нечего и говорить, что отключение электропитания в разгар работы системы - операция очень рискованная. Даже в самом удачном случае при повторной загрузке rc.sysinit увидит, что файловые системы не были размонтированы, и станет проверять их целостность. В не самом удачном случае эта целостность будет нарушена: некоторые открытые на запись и не закрытые файлы окажутся в странном, недописанном состоянии, появятся индексные дескрипторы, не связанные ни с каким каталогом и т.п. Как правило, такие ошибки исправляются программой восстановления файловых систем fsck: с одной стороны, за счет дополнительных свойств файловой системы (журналирование, сводящая вероятность порчи к минимуму, логически упорядоченная запись и т.п.), с другой - за счет некоторых предположений, которые делает сама утилита fsck. Однако надеяться на нее нельзя: очень редко, но бывают неразрешимые противоречия в лишенной цельности файловой системе, и тогда fsck обращается за помощью к администратору, требуя подтверждения действий (например, для удаления испорченного файла, который точно раньше был), или выполняя эти рискованные действия автоматически. В первом случае все время взаимодействия с администратором система будет работать в однопользовательском режиме, причем администратору предстоит разбираться с тем, что получилось; а во втором есть нешуточная вероятность того, что система испортится, а замечено это будет слишком поздно.
Останов системы может занимать больше времени, чем загрузка: например, процессы, выполняющие системный вызов (скажем, чтения с дискеты), не завершаются по сигналу TERM сразу, а получив его, могут некоторое время заниматься обработкой (дописыванием в файл и т.п.). Остановка службы, особенно сетевой, тоже может длиться долго: например, когда требуется сообщить о закрытии сервиса каждому клиенту. Однако только в этом случае можно быть уверенным, что все процессы завершились нормально, и что после перезагрузки они продолжат нормально работать.
В экстренных случаях (например, когда при сбое электропитания демон, обслуживающий устройство бесперебойного снабжения, сообщает, что ресурсы на исходе) безопаснее все-таки быстро поостанавливать процессы, чем дожидаться отключения питания на работающей системе. Для этого можно послать всем процессам сначала TERM, а короткое время спустя - KILL. Для обработки таких ситуаций в inittab есть методы, начинающиеся со слова " power ", а в /etc/rc.d - специальный сценарий rc.powerfail. На самый крайний случай существуют команды halt и reboot с ключом -f, однако их почти мгновенное действие практически эквивалентно внезапному отключению питания, и использовать их не рекомендуется.
Для останова или перезагрузки системы можно выполнять команды init 0 и init 6. Они вполне справятся с оповещением и остановкой активных программ, что займет минуту-две. А вот с пользователями, работающими в системе, все сложнее. Как правило, для завершения работы требуется хотя бы минут пять, а лучше - десять. Поэтому вежливые администраторы пользуются утилитой shutdown, которая запускается за несколько минут до времени перезагрузки, каждую минуту предупреждая пользователей о грядущем событии, после чего уже запускают init:
[root@localhost root]# shutdown -r +3 "Sorry, we need to reboot" Broadcast message from root (ttyS0) (Sun Nov 28 14:05:41 2004): Sorry, we need to reboot The system is going DOWN to maintenance mode in 3 minutes! . . . Broadcast message from root (ttyS0) (Sun Nov 28 14:06:41 2004): Sorry, we need to reboot The system is going DOWN to maintenance mode in 2 minutes! . . . Broadcast message from root (ttyS0) (Sun Nov 28 14:07:41 2004): Sorry, we need to reboot The system is going DOWN to maintenance mode in 1 minute! . . . Broadcast message from root (ttyS0) (Sun Nov 28 14:08:41 2004): Sorry, we need to reboot The system is going down to maintenance mode NOW! INIT: Switching to runlevel: 6 . . .Пример 10.12. Использование shutdown
Остается заметить, что у shutdown есть обязательный параметр - время начала останова (в примере он равен " +3 ", то есть "через три минуты"), и необязательный - " -r " ( r eboot, перезагрузка ) или " -h " ( h alt, останов ). Без необязательных параметров выполняется переход на первый уровень выполнения, причем запускается стартовый командный интерпретатор суперпользователя, а после его завершения система вновь переходит на уровень выполнения по умолчанию (используется, например, для профилактических действий в системе). Нажатие Ctrl+Alt+Del или кнопки выключения питания (в системах, где эта кнопка ничего не выключает, а лишь посылает соответствующий аппаратный сигнал) приводит к запуску именно shutdown -r или shutdown -h.