, будет вызван интерпретатор /bin/sh.
Вторичный загрузчик понимает различные опции командной строки. Например, чтобы найти и загрузить альтернативное ядро, выполните следующую последовательность команд:
disk1s1a:> ls
d var
d stand
d etc
...
kernel.SYNACK
kernel.LMC
kernel
...
disk1s1a:> unload
disk1s1a:> load kernel.SYNACK
disk1s1a:> boot
Здесь демонстрируется, как оператор получает список файлов корневой файловой системы, выгружает стандартное ядро (/kernel), загружает новое ядро (/kernel.SYNACK) и продолжает процесс загрузки.
2.4. Стартовые сценарии
После выхода из интерактивного режима (или при автоматической загрузке, когда завершает работу командный интерпретатор, запущенный с правами пользователя root) программа init выполняет сценарии запуска системы. Они являются сценариями интерпретатора Bourne shell (sh), а их точное местоположение и содержимое зависят от системы.
Наиболее широко распространены два способа организации работы со стартовыми сценариями, уходящие корнями в историю. В BSD-системах эти файлы хранятся в каталоге /etc и их имена начинаются с префикса "rc". В системах семейства System V файлы сценариев располагаются в каталоге /etc/init.d, а ссылки на них созданы в каталогах /etc/rc0.d, /etc/rc1.d и т.д. Второй вариант организации является более четким и позволяет аккуратнее выполнять останов системы.
Ниже приведен перечень задач, которые часто выполняются инициализационными сценариями:
задание имени компьютера;
установка часового пояса;
проверка дисков с помощью команды fsck (только в автоматическом режиме);
монтирование системных дисков;
удаление файлов из каталога /tmp;
конфигурирование сетевых плат;
запуск процессов-демонов и сетевых служб.
Большинство стартовых сценариев выводит на консоль подробную информацию о выполняемых ими задачах. Это может оказать существенную помощь при отладке или поиске причин зависания в процессе начальной загрузки.
В старых системах нередко приходилось модифицировать стартовые сценарии, чтобы настроить их для конкретной среды. Сегодня сценарии, поставляемые разработчиком системы, должны быть достаточно общими, чтобы работать в системах любой конфигурации. Сведения о локальной конфигурации системы не задаются в самом сценарии, а помещаются в отдельный файл (или набор файлов). Конфигурационные файлы, как правило, представляют собой небольшие сценарии Bourne shell, включаемые в стартовые сценарии для получения доступа к некоторым переменным командного интерпретатора.
Стартовые сценарии в системах семейства System V
Сегодня сценарии в стиле System V наиболее распространены. Они используются в трех из четырех рассматриваемых нами операционных систем. Мы в первую очередь опишем общие принципы запуска системы, а затем перейдем к анализу особенностей конкретных ОС.
В системах семейства System V программа init определяет 7 "уровней выполнения", на каждом из которых должен выполняться конкретный набор системных сервисов.
Уровень 0 говорит о том, что система полностью прекратила работу.
Уровень 1 или S означает однопользовательский режим.
Уровни 2-5 предназначены для многопользовательского режима.
Уровень 6 определяет этап перезагрузки системы.
Уровни 0 и 6 отличаются тем, что система в действительности не может в них оставаться. Переход на эти уровни означает, что система либо завершает работу, либо перезагружается. В многопользовательском режиме чаще всего установлен уровень выполнения 2 или 3; уровни 4 и 5 используются редко. Уровни 1 и S различны для каждой системы.
Однопользовательскому режиму традиционно соответствует уровень 1. На этом уровне запрещены все многопользовательские сеансы и процессы удаленной регистрации, а в системе выполняется минимальный набор программ. Поскольку в данном режиме доступ к системе осуществляется с правами пользователя root, администраторам необходимо, чтобы при загрузке в таком режиме система выдавала приглашение на ввод пароля. Для этой цели предназначен уровень S: в нем создается отдельный процесс, выдающий требуемое приглашение на экран. В Solaris уровень S является вполне самостоятельным, но в Linux он носит переходный характер и завершается сразу после ввода пароля.
Создается впечатление, что уровней выполнения больше, чем нужно. Обычно это объясняется тем, что в телефонном коммутаторе 7 уровней, поэтому в UNIX-системе должно быть как минимум столько же. В Red Hat поддерживается до 10-ти уровней, хотя уровни 7-9 не определены.
В файле /etc/inittab содержатся параметры, определяющие, что должна делать программа init на каждом из уровней. Формат файла зависит от системы, но основная идея состоит в том, что в нем задаются команды, которые должны быть выполнены (или продолжать выполняться), когда система переходит на конкретный уровень.
В процессе загрузки программа init последовательно продвигается от уровня 0 к уровню, заданному по умолчанию в файле /etc/inittab. Чтобы осуществить переход между соседними уровнями, программа init выполняет команды из этого файла. Аналогичные действия производятся в обратном порядке при останове системы.
К сожалению, структура файла /etc/inittab довольно сложна и не всегда согласуется с тем, как на самом деле происходит запуск и останов сервисов в UNIX-системах. Чтобы сделать этот файл более полезным, многие системы семейства System V реализуют дополнительный, абстрактный уровень. Он обычно представлен в виде команды, которая запускается из файла /etc/inittab и осуществляет смену уровней. На этом уровне выполняются сценарии из каталога, зависящего от целевого уровня; они переводят систему в новое состояние.
Системным администраторам обычно нет необходимости работать непосредственно с файлом /etc/inittab, так как существующие сценарии подходят для большинства случаев. Далее в главе мы не будем упоминать этот файл и все те механизмы, которые связывают программу init со стартовыми сценариями. Просто когда мы говорим о том, что программа init выполняет такой-то сценарий, нужно понимать: связь со сценарием может быть косвенной.
Основные копии стартовых сценариев хранятся в каталоге init.d. Он, в свою очередь, может располагаться в каталоге /etc, но это не всегда так. Каждый сценарий отвечает за запуск одного демона или определенной подсистемы. Сценариям можно передавать аргументы start и top, которые означают, что соответствующий сервис должен быть либо запущен, либо остановлен. Большинство сценариев понимают также аргумент restart, который эквивалентен связке stop+start. Обладая правами системного администратора, можно вручную запускать или останавливать отдельные сервисы, вызывая нужный сценарий из каталога init.d и передавая ему требуемый аргумент.
Ниже показан простой сценарий, позволяющий запускать, останавливать или перезапускать демон sshd:
#! /bin/sh
test -f /usr/local/sbin/sshd || exit 0
case "$1" in
start)
echo -n "Starting sshd: sshd"
/usr/local/sbin/sshd
echo "."
;;
stop)
echo -n "Stopping sshd: sshd"
kill `cat /var/run/sshd.pid`
echo "."
;;
restart)
echo -n "Stopping sshd: sshd"
kill `cat /var/run/sshd.pid`
echo "."
echo -n "Starting sshd: sshd"
/usr/local/sbin/sshd
echo "."
;;
*)
echo "Usage: /etc/init.d/sshd start|stop|restart"
exit 1
;;
esac
Чтобы перейти на требуемый уровень, программа init должна получить дополнительную информацию о том, какие сценарии и с какими аргументами запускать. Но она не просматривает непосредственно каталог init.d, а обращается к каталогу rcуровень.d, где уровень - это номер требуемого уровня выполнения, к которому осуществляется переход (rc0.d, rc1.d и т.д.).
В каталогах rcуровень.d обычно содержатся символические ссылки на сценарии в каталоге init.d. Имена ссылок начинаются с префикса S или K, за которым идет номер и имя сервиса, управляемого сценарием (например, S34named). Если программа init переходит к более высокому уровню, она выполняет все сценарии с префиксом S ("start" - запуск) в порядке возрастания номеров, причем каждому сценарию передается аргумент start. Когда осуществляется переход к более низкому уровню, запускаются сценарии с префиксом K ("kill" - уничтожить) в порядке убывания номеров, и всем им передается аргумент stop. В зависимости от системы, программа init может просматривать только каталог rcуровень.d, относящийся к целевому уровню, либо все каталоги на пути от исходного к целевому уровню.
Чтобы сообщить системе, когда следует запускать тот или иной демон, необходимо создать символическую ссылку в соответствующем каталоге. В большинстве систем основная часть сетевых демонов запускается на уровне 2. Следующие команды информируют систему о том, что демон sshd должен быть запущен на уровне 2 и остановлен при завершении работы системы:
# ln -s /etc/init.d/sshd /etc/rc2.d/S99ssh2
# ln -s /etc/init.d/sshd /etc/rc0.d/K25ssh2
Первая ссылка говорит о том, что сценарий /etc/init.d/sshd следует запустить в самом конце этапа перехода на уровень 2 и передать ему аргумент start. Вторая ссылка сообщает, что в процессе завершения работы системы сценарий /etc/init.d/sshd должен быть запущен относительно рано, причем с аргументом stop. В некоторых системах процессы останова и перезагрузки трактуются по-разному, поэтому необходимо также поместить символическую ссылку в каталог /etc/rc6.d, чтобы обеспечить корректный останов демона при перезагрузке системы.
Solaris
Системы Solaris, HP-UX и Red Hat используют сценарии в стиле System V, которые хранятся в каталоге init.d. В Solaris этот каталог, как и каталоги rcуровень.d, находится в каталоге /etc.
Раньше стартовые сценарии Solaris обращались к конфигурационным файлам, разбросанным по всей системе, что приводило к невообразимой путанице. В последних версиях системы компания Sun устранила большинство проблем. Стартовые сценарии теперь значительно улучшены и большей частью самодостаточны.
Некоторые конфигурационные файлы собраны в каталоге /etc/defaults (табл. 2.3), однако общее число настраиваемых параметров не так уж велико. <%-2>Остальные файлы по-прежнему распределены между различными каталогами.<%0>
Таблица 2.3. Конфигурационные файлы стартовых сценариев Solaris
Файл | Назначение |
/etc/.UNCONFIGURED | Сообщает стартовым сценариям о необходимости полностью переконфигурировать систему (обычно используется только в процессе инсталляции) |
/etc/hostname.интерфейс | Содержит имя узла, связанное с указанным сетевым интерфейсом (сетевой платой) |
/etc/dhcp.интерфейс | Сообщает о том, что сетевой интерфейс должен быть сконфигурирован с помощью протокола DHCP |
/etc/defaultrouter | Содержит имя узла и адрес стандартного шлюза |
HP-UX
В HP-UX стартовые сценарии хранятся в каталоге /sbin/init.d. Каталоги символических ссылок также находятся в каталоге /sbin. Конфигурационные файлы размещаются в каталоге /etc/rc.config.d. Их имена соответствуют именам стартовых сценариев. Например, сценарий
/sbin/init.d/SnmpMaster
извлекает конфигурационную информацию из файла
/etc/rc.config.d/SnmpMaster
и вызывается программой init с помощью таких ссылок:
/sbin/rc2.d/S560SnmpMaster
/sbin/rc1.d/K440SnmpMaster
Результаты работы стартовых сценариев сохраняются в файле /etc/rc.log. Если какой-то из сценариев не смог выполниться, просмотрите этот файл на предмет наличия сообщений об ошибках или другой информации, позволяющей выявить суть проблемы. Это настолько полезная и несложная в реализации особенность, что просто удивительно, почему поставщики других систем не догадались сделать нечто подобное.
Конфигурационные файлы могут быть сложны для понимания, хотя они снабжены хорошими комментариями. В табл. 2.4 описано назначение файлов, которые модифицируются чаще других.
Таблица 2.4. Конфигурационные файлы HP-UX (каталог /etc/rc.config.d)
Файл(ы) | Назначение |
SnmpMaster | Включает или отключает поддержку протокола SNMP |
Snmp* | Другие параметры, связанные с протоколом SNMP |
acct | Включает или отключает подсистему учета процессов; см. acct(1M) |
auditing | Управляет работой подсистемы аудита; см. audsys(1M) и audevent(1M) |
cde | Содержит настройки CDE (Common Desktop Environment - единая настольная среда) |
clean* | Управляет операциями очистки, выполняемыми на этапе загрузки |
desktop | Определяет, какой из имеющихся рабочих столов будет выбран по умолчанию |
hpbase100conf | Конфигурирует устройства Fast Ethernet |
hpetherconf | Конфигурирует Ethernet-платы; см. lanadmin(1M) |
list_mode | Управляет отображением меню стартовой загрузки |
lp | Включает или отключает подсистему буферизации печати |
mailservs | Запускает утилиту sendmail или задает почтовый сервер |
nameservs | Конфигурирует или запускает демон службы имен |
nddconf | Задает параметры ядра, устанавливаемые на этапе загрузки с помощью демона ndd |
netconf | Задает параметры конфигурации сети (IP-адрес и т.п.) |
netdaemons | Указывает на то, какие сетевые демоны следует запустить |
nettl | Конфигурирует подсистемы сетевой трассировки и регистрации; см. nettl(1M), nettlconf(1M) и nettlgen.conf(4) |
nfsconf | Задает параметры NFS (Network File System - сетевая файловая система) |
pd | Конфигурирует сервис распределенной печати HP-UX |
vt | Запускает демон vtdaemon |
xfs | Включает и отключает сервис шрифтов X Windows |
Для большинства этих файлов вполне подходят стандартные установки. Чаще всего модифицируются файлы netconf, netdaemons и, возможно, nddconf.
Red Hat
Стартовые сценарии - это то, что отличает дистрибутивы Linux друг от друга. Например, сценарии Debian очень напоминают сценарии Solaris, а сценарии Slackware сходны со своими "родственниками" во FreeBSD. В Red Hat используются гибридные сценарии, сочетающие в себе черты сценариев System V и FreeBSD плюс еще несколько "наворотов", добавленных только для того, чтобы сделать жизнь администраторов сложнее.
В сценариях Red Hat достаточно сложно разобраться, так как в них могут присутствовать комментарии вида
# дурацкий прием, но должен работать
или
# это неправильно!
Программа init в Red Hat в основном соответствует своему аналогу в System V. На каждом уровне выполнения программа вызывает сценарий /etc/rc.d/rc, передавая ему номер уровня в качестве аргумента. Этот сценарий может выполняться как в обычном режиме, так и в режиме подтверждения, в котором перед выполнением каждого стартового сценария выдается запрос. Управлять символическими ссылками на стартовые сценарии можно с помощью команды chkconfig.
В Red Hat имеется также сценарий rc.local, напоминающий одноименный сценарий во FreeBSD. В процессе загрузки он выполняется последним. Не стоит добавлять в него собственные команды; лучше воспользоваться средствами System V.
Вот пример сеанса загрузки в Red Hat:
[информация о ядре]
INIT: version 2.77 booting
Welcome to Red Hat Linux
Press 'I' to enter interactive startup.
Mounting proc filesystem [ OK ]
Setting clock (utc): Fri Mar 10 07:16:41 MST 2000 [ OK ]
Loading default keymap [ OK ]
Activating swap partitions [ OK ]
...
Когда появится сообщение "Welcome to Red Hat Linux", можно нажать клавишу <I>, чтобы продолжить загрузку в режиме подтверждения. Однако подтверждение о нажатии самой клавиши выдано не будет. Red Hat спокойно продолжит монтировать локальные файловые системы, активизировать разделы диска подкачки, загружать таблицы клавиш и вести поиск модулей ядра. Только после перехода на уровень 3 программа init начнет выдавать запросы:
Welcome to Red Hat Linux
Press 'I' to enter interactive startup.
Mounting proc filesystem [ OK ]
Setting clock (utc): Fri Mar 10 07:16:41 MST 2000 [ OK ]
Loading default keymap [ OK ]
Activating swap partitions [ OK ]
Setting hostname redhat.synack.net [ OK ]
Checking root filesystem
/dev/hda1: clean, 73355/191616 files, 214536/383032 blocks [ OK ]
Remounting root filesystem in read-write mode [ OK ]
Finding module dependencies [ OK ]
Checking filesystems [ OK ]
Mounting local filesystems [ OK ]
Turning on user and group quotas for local filesystems [ OK ]
Enabling swap space [ OK ]
INIT: Entering runlevel: 3
Entering interactive startup
Start service kudzu (Y)es/(N)o/(C)ontinue? [Y]
Режимы интерактивной и однопользовательской загрузки начинаются с одного и того же места. Если в процессе загрузки возникли серьезные проблемы и этой точки достичь невозможно, воспользуйтесь спасательной загрузочной дискетой.
Можно передать загрузчику LILO параметр init=/bin/sh, чтобы заставить его вызвать командный интерпретатор однопользовательского режима еще до того, как будет запущена программа init . В этом случае все действия по запуску системы придется производить вручную, включая выполнение программы fsck и монтирование локальных файловых систем.
Повлиять на процесс загрузки в Red Hat можно путем модификации конфигурационных файлов, расположенных в каталоге /etc/sysconfig. Принципы работы с ними такие же, как и с файлами в каталоге /etc/rc.config.d в HP-UX, хотя самих файлов меньше, а опций в них больше (табл. 2.5).
Таблица 2.5. Файлы и подкаталоги каталога /etc/sysconfig в Red Hat
Файл/подкаталог | Назначение или содержимое |
apmd | Список аргументов для демона подсистемы APM (Advanced Power Management - расширенное управление питанием) |
clock | Задает тип системных часов (почти всегда UTC) |
console | Загадочный каталог, который всегда пуст |
hwconf | Включает всю информацию о системном оборудовании; используется сервисом Kudzu |
i18n | Содержит региональные установки системы (формат представления даты/времени, язык и т.д.) |
init | Определяет, как отображаются сообщения, поступающие от стартовых сценариев |
keyboard | Задает тип клавиатуры (используйте идентификатор "us" для стандартной 101-клавишной клавиатуры ) |
mouse | Задает тип мыши; используется системой X Windows и программой gpm |
network | Задает глобальные сетевые опции (имя узла, шлюз, маршрутизация и т.д.) |
network-scripts | Каталог, в котором содержатся вспомогательные сценарии и сетевые конфигурационные файлы |
pcmcia | Сообщает, следует ли запускать демоны PCMCIA, и содержит необходимые опции |
sendmail | Задает параметры для утилиты sendmail |
Некоторые элементы списка заслуживают дополнительных комментариев:
Файл hwconf | просматривается сервисом Kudzu, который проверяет, было ли добавлено или удалено какое-нибудь устройство, и запрашивает у пользователя дополнительные инструкции. В промышленных системах этот сервис можно деактивировать, поскольку он сильно задерживает процесс загрузки. Каждый раз, когда обнаруживается изменение аппаратной конфигурации, возникает задержка в 30 с. |
Каталог network-scripts | содержит вспомогательные файлы, связанные с сетевой конфигурацией. Все, что может потребоваться в нем изменить, - это файлы с именами ifcfg-интерфейс. Например, файл network-scripts/ifcfg-eth0 включает параметры платы с идентификатором eth0, в частности ее IP-адрес. О конфигурировании сетевых плат рассказывается в параграфе 13.10. |
Файл sendmail | содержит две переменные: DAEMON и QUEUE. Если переменная DAEMON равна yes, система запустит утилиту sendmail в процессе загрузки. Переменная QUEUE информирует утилиту sendmail о том, сколько времени после возникновения ошибки сообщение должно находиться в очереди, прежде чем будет предпринята попытка повторной отправки. |
FreeBSD
Представленная ниже информация касается FreeBSD, но общие принципы организации стартовых сценариев применимы ко всем BSD-системам.
Программа init во FreeBSD выполняет только один, главный сценарий - /etc/rc. Он, в свою очередь, запускает остальные сценарии, которые расположены в каталоге /etc и носят имена вида rc.имя. Сценарии запускаются в определенном порядке, а концепция уровней выполнения не поддерживается.
Сценарий /etc/rc начинает свою работу с выполнения трех сценариев, определяющих конфигурационную информацию:
/etc/defaults/rc.conf
/etc/rc.conf
/etc/rc.conf.local
В этих файлах задаются другие каталоги, в которых необходимо искать стартовые сценарии (имена каталогов заносятся в переменную local.startup). Кроме того, в них определяется ряд переменных интерпретатора shell, используемых последующими сценариями. Сценарий /etc/rc применяет команду source (точнее, ее оригинальный псевдоним '.'), чтобы преобразовать конфигурационные и все последующие сценарии в единый поток выполнения. Эта процедура включает в себя конкатенацию файлов в один большой сценарий.
Файл /etc/defaults/rc.conf содержит огромный перечень всех конфигурационных параметров и их стандартных значений. Его нельзя редактировать. Если требуется изменить значение какой-либо переменной, просто переопределите ее в файлах /etc/rc.conf и /etc/rc.conf.local. На страницах интерактивного руководства, посвященных файлу /etc/rc, приведен исчерпывающий список переменных, которые можно менять.
Заглянув в каталог /etc, вы можете обнаружить в нем много различных сценариев:
% ls /etc/rc*
rc rc.diskless1 rc.isdn rc.pccard
rc.atm rc.diskless2 rc.local rc.resume
rc.conf rc.firewall rc.serial rc.devfs
rc.i386 rc.network rc.shutdown rc.suspend
Если ядро сконфигурировано как бездисковый клиент, в первую очередь вызывается сценарий rc.diskless1. Затем вызываются сценарии rc.sysctl, rc.serial, rc.pccard и rc.network, после чего сценарий /etc/rc переходит к выполнению служебных функций. В качестве завершающего аккорда запускается сценарий rc.local. Если какой-то сценарий не определен, он просто пропускается (в приведенном выше списке сценарий rc.sysctl отсутствует).
Стандартный сценарий rc.serial ничего не делает, а лишь определяет набор функций, которые позволяют инициализировать последовательные порты и устройства на этапе загрузки.
Если в одном из файлов rc.conf задана поддержка интерфейсов PCMCIA/CardBus, сценарий rc.pccard загружает модули ядра, связанные с контроллером PCMCIA, и запускает демон pccardd, управляющий динамическим конфигурированием устройств PCMCIA по мере их подключения и отключения.
Сценарий rc.network инициализирует сетевую среду компьютера. Он использует переменные, определенные в файлах rc.conf, для конфигурирования сетевых интерфейсов, протоколов DHCP и PPP, маршрутизаторов и брандмауэров. Редактировать этот сценарий нет необходимости, так как все параметры содержатся в файлах rc.conf. Он вызывает другие сетевые стартовые сценарии: rc.atm, rc.isdn и rc.firewall.
Для конфигурирования сетевого интерфейса во FreeBSD предназначены три переменные: hostname, defaultrouter и ifconfig_инт (где инт - имя интерфейсного устройства). Переменная ifconfig_инт должна содержать строку опций, передаваемых команде ifconfig при инициализации устройства. Например, в строках сценария
hostname="my.fullyqualified.name"
ifconfig_de0="inet 192.168.1.2 netmask 0xffffff00"
defaultrouter="192.168.1.1"
узлу назначается IP-адрес 192.168.1.2 и задается стандартный адрес шлюза 192.168.1.1. Если данное интерфейсное устройство должно конфигурироваться динамически по протоколу DHCP, задайте строку следующего вида:
ifconfig_de0="DHCP"
Сервер DHCP автоматически назначит узлу IP-адрес, доменное имя и маршрут по умолчанию.
2.5. Перезагрузка и останов системы
UNIX-системы хранят буферы изменений в памяти и лишь изредка записывают их на диск. Это ускоряет выполнение операций дискового ввода-вывода, но также делает систему более подверженной потерям данных в случае внезапных зависаний.
Раньше UNIX-системы были очень щепетильны в отношении процедуры выключения. Современные системы более терпимы, но все же по возможности лучше корректно завершать работу. Неправильное выключение системы может привести к появлению труднообнаруживаемых, неочевидных ошибок, а иногда и к полному краху.
Перезагрузка операционной системы на персональном компьютере - средство решения почти всех проблем. Но при работе в UNIX советуем сначала подумать и только потом перезагружаться. Проблемы, возникающие в этой системе, как правило, скрытые и сложные, поэтому перезагрузка дает ожидаемый результат гораздо реже, чем в других системах. Кроме того, процесс перезагрузки UNIX занимает больше времени, что создает неудобства для пользователей.
Перезагружаться необходимо в том случае, когда подключается новое устройство или работающее устройство зависает так, что его невозможно сбросить. Если модифицируется файл конфигурации, который используется только при начальной загрузке, то изменения вступят в силу лишь после перезагрузки. И наконец, если систему "заклинило" так, что в ней невозможно зарегистрироваться, иного выхода, кроме как перезагрузиться, просто не существует.
В отличие от начальной загрузки, которая осуществляется одним-единственным способом, останов и перезагрузку системы можно выполнить по-разному:
выключить питание;
дать команду shutdown;
использовать команды halt и reboot (в BSD-системах и Linux);
послать программе init сигнал TERM;
изменить уровень выполнения программы init с помощью команды telinit (в системах семейства System V);
уничтожить процесс init.
Выключение питания
Даже в небольших UNIX-системах такой способ останова неприемлем. Он может привести не только к потере данных и повреждению системных файлов. Вы рискуете испортить дисковод, если он относится к числу тех, на которых перед отключением питания необходимо установить в соответствующее положение защитный переключатель либо произвести парковку головок.
В некоторых компьютерах (например, Hewlett-Packard) присутствует кнопка программного останова, при нажатии которой выполняется ряд команд, осуществляющих корректное завершение работы системы. Если вы не уверены, поддерживает ли ваш компьютер такую возможность, не нажимайте кнопку выключения питания в процессе работы системы. Будет меньше проблем, если остановить систему вручную.
Конечно, в случае наводнения или пожара лучше отключить питание, если вы не успеваете корректно остановить систему. В машинных залах и сейчас иногда встречается аварийная кнопка, которая позволяет выключить все оборудование одновременно.
Команда shutdown: корректный способ останова системы
Команда shutdown - самый безопасный и наиболее корректный способ остановить или перезагрузить систему либо вернуться в однопользовательский режим. К сожалению, трудно найти поставщика, который бы "не приложил руку" к ее аргументам. Мы рассмотрим эту команду в общем, а затем приведем сводку синтаксиса и аргументов, которые пригодятся при работе в какой-либо из описываемых систем.
Можно дать команде shutdown указание делать паузу перед остановом системы. Во время ожидания команда посылает зарегистрированным пользователям через постепенно укорачивающиеся промежутки времени сообщения, предупреждая их о приближающемся останове. По умолчанию в сообщениях говорится о том, что система заканчивает работу, и указывается время, оставшееся до останова. При желании администратор может добавить собственное короткое сообщение, в котором поясняется, почему система останавливается и сколько примерно времени придется подождать, прежде чем пользователи вновь смогут войти в систему.
Многие версии команды shutdown позволяют задать, что конкретно должна сделать система: остановиться, перейти в однопользовательский режим или перезагрузиться. Иногда можно также указать, необходимо ли после перезагрузки проверить диски с помощью команды fsck. В современных системах с большими дисками такая проверка займет много времени, поэтому в общем случае ее можно не выполнять, если работа системы была перед этим корректно завершена. В некоторых системах этап проверки дисков автоматически пропускается, если файловые системы были правильно демонтированы.
В табл. 2.6 перечислены аргументы командной строки команды shutdown для шести рассматриваемых систем. Прочерк означает вариант по умолчанию.
Таблица 2.6. Многоликая команда shutdown
Система | Путевое имя | Пауза | П1 | О | В | Без fsck |
Solaris | /usr/sbin/shutdown | -gсекунды | -i6 | -i0 | -iS | - |
HP-UX | /etc/shutdown | секунды | -r | -h | - | - |
Red Hat | /sbin/shutdown | время | -r | -h | - | -f |
FreeBSD | /sbin/shutdown | +минуты | -r | -h | - | - |
1 П - перезагрузка, О - останов, В - вход в однопользовательский режим.
Команда halt: более простой способ останова
Команда halt выполняет все основные операции, необходимые для останова системы. Чтобы вызвать эту команду, можно в командной строке указать shutdown -h или непосредственно halt. Команда halt регистрирует в журнальном файле событие останова, уничтожает несущественные процессы, выполняет команду sync (она, в свою очередь, осуществляет системный вызов sync), дожидается завершения операций дисковой записи, а затем прекращает работу ядра.
При указании команды halt -n системный вызов sync подавляется. Эта команда используется после восстановления корневого раздела командой fsck, чтобы ядро не могло затереть исправления старыми версиями раздела, хранящимися в кэше. Команда halt -q инициирует почти немедленный останов без синхронизации, уничтожения процессов и регистрации события. Флаг -q используется редко.
Команда reboot: быстрый перезапуск
Команда reboot почти идентична команде halt. Разница заключается в том, что система перезагружается, а не останавливается. Режим перезагрузки вызывается также командой shutdown -r. Помимо этого, команда shutdown поддерживает флаги -n и -q.
Передача программе init сигнала TERM
Результаты уничтожения программы init непредсказуемы и в большинстве случаев очень вредны. Перед тем как посылать этой программе какой-либо сигнал, обратитесь к документации. Когда BSD-версия программы init получает сигнал TERM, она обычно уничтожает все пользовательские процессы, демоны, процессы getty и переводит систему в однопользовательский режим. То же самое делает команда shutdown.
Для того чтобы послать процессу сигнал, нужно с помощью команды ps узнать идентификатор этого процесса. Программа init - это всегда процесс номер один. С целью отправки сигнала воспользуйтесь командой kill:
# sync; sync
# kill -TERM 1
Подробная информация о сигналах и команде kill приведена в главе 4.
Команда telinit: изменение уровня выполнения программы init
В системах, где программа init поддерживает несколько уровней выполнения, можно с помощью команды telinit дать программе указание перейти на конкретный уровень. Например, команда
# telinit S
переводит систему в однопользовательский режим в Solaris и HP-UX. В Red Hat необходимо указать 1, а не S, иначе будет запущен интерпретатор shell с правами пользователя root, а сам уровень изменен не будет:
# telinit 1
То же самое можно сделать с помощью команды
# shutdown -i1
которая, помимо всего прочего, может выдать предупреждающее сообщение и сделать небольшую паузу перед переходом на новый уровень.
Команда telinit наиболее полезна при проверке изменений, внесенных в файл inittab. При наличии флага -q команда заставит программу init повторно прочитать этот файл.
Уничтожение процесса init
Процесс init настолько важен для работы системы, что если его уничтожить с помощью команды kill -KILL или kill -9, то большинство систем автоматически перезагрузится (некоторые ядра при этом просто выдают сообщение о панике - фатальной ошибке). Это очень "грубый" способ перезагрузки. Лучше пользоваться командами shutdown и reboot.
Начало
Cодержание
Отрывок
[Заказать книгу в магазине "Мистраль"]