Unix на рабочей станции Беста с точки зрения администратора Текст подготовлен НПО "КЛОТО"   ЁСОДЕРЖАНИЕ ╢ 1. Введение ╤2 2. Процесс загрузки системы ╤3 2.1. Задание загружаемого файла ╤3 2.2. Процесс init. Понятие уровня выполнения ╤4 2.3. Файл /etc/inittab ╤5 2.4. Некоторые действия по инициализации ╤7 2.5. Проверка файловых систем ╤9 3. Выключение системы ╤12 3.1. Процедура /etc/shutdown ╤12 3.2. Процедура /etc/finito ╤13 4. Регистрация новых пользователей ╤14 4.1. Процедура /etc/nuser ╤14 4.2. Файлы /etc/passwd и /etc/group ╤14 5. Вход пользователя в систему ╤17 5.1. Файл /etc/profile ╤17 5.2. Файл .profile ╤18 6. Создание нового ядра ОС UNIX ╤20 6.1. Файлы io.h, master и dfile ╤20 6.2. Процесс перегенерации системы ╤22 7. Сохранение и восстановление системы ╤24 7.1. Создание минимального варианта системы на флоппи-диске и ленте ╤24 7.2. Запись системной информации на ленту и восстановление ее с ленты ╤24 8. Система меню для выполнения административных действий ╤27 Приложение A. Назначение некоторых каталогов и файлов ╤29 Приложение B. Команды администратора ОС UNIX ╤33 Приложение C. Сводка синтаксиса команд администратора ╤35  Ё1. ВВЕДЕНИЕ ╢ Администрирование ОС UNIX - большая и сложная тема. В данном руководстве затрагиваются лишь некоторые ее аспекты. В первую очередь подробно рассматриваются процессы загрузки системы и ее выключения. Цель рассмотрения - научиться управлять этими про- цессами. Далее с той же целью рассматриваются регистрация новых пользователей и процесс входа пользователя в систему. Следующая тема - перегенерация системы, создание минимального варианта системы на флоппи-диске и стримерной ленте. Кратко описана сис- тема для интерактивного выполнения административных функций sy- sadm(1M). В приложении описывается назначение некоторых катало- гов и файлов. Вне рассмотрения остались такие темы, как администрирование принтеров, сбор и обработка статистики, работа с удаленными системами и некоторые другие.  Ё2. ПРОЦЕСС ЗАГРУЗКИ СИСТЕМЫ ╢  Ё2.1. Задание загружаемого файла ╢ После включения питания станции БЕСТА на экране консольного терминала появляется приглашение boot: которое выдает программа начальной загрузки, хранящаяся в ПЗУ. Сразу же отметим, что строка, которая набирается в ответ, долж- на заканчиваться символом <CR>. В качестве ответа нужно задать имя файла, который будет загру- жен в оперативную память и начнет выполняться. Вообще говоря, файл задается с помощью конструкции устройство:имя_файла Для стандартной конфигурации станции БЕСТА устройство должно выбираться из следующего списка: a Винчестерский диск. f Флоппи-диск. t Стримерная лента. r Диск в памяти. Обычно в качестве имени_файла указывается unix, но в принципе можно, во-первых, загружать операционную систему из другого файла, а, во-вторых, можно загружать вообще не операционную систему, а свою программу (если она сумеет управиться с аппа- ратным окружением). Если в ответ на приглашение boot: ввести знак вопроса (и, ес- тественно, <CR>), на экран будет выдана справочная информация о возможных ответах. Наконец, нажатие одной клавиши <CR> эквивалентно заданию конст- рукции a:/unix, то есть файла unix, расположенного в корневом каталоге файловой системы на винчестерском диске. В последующих разделах будут описаны процедуры получения флоп- пи-дисков и лент, с которых можно выполнить загрузку. Здесь же отметим, что при загрузке с ленты автоматически создается диск в памяти, куда и переписывается содержимое ленты, после чего начинается процесс загрузки с этого диска. Нетрудно понять, что в такой конфигурации система будет работать значительно быст- рее, чем после загрузки с флоппи-диска, поэтому целесообразно иметь загружаемый вариант системы именно на ленте. Более подробно процесс начальной загрузки описан в статье bo- ot(8) Справочника администратора.  Ё2.2. Процесс init. Понятие уровня выполнения ╢ В качестве последнего шага загрузки ОС UNIX запускается процесс init - главный диспетчер процессов. Его основная задача - соз- дание и перезапуск процессов в соответствии со схемой, храня- щейся в файле /etc/inittab [см. inittab(4)]. Процесс init дол- жен существовать все время, пока функционирует система. С точки зрения процесса init система в любой момент времени на- ходится на определенном уровне выполнения. Уровень выполнения может рассматриваться как программная конфигурация системы, причем каждая конфигурация допускает существование только опре- деленной группы процессов. Процессы, запускаемые init'ом на каждом уровне выполнения, описаны в файле /etc/inittab. Уровень выполнения задается цифрой от 0 до 6 или буквой S. В последнем случае говорят, что система находится в однопользова- тельском режиме. В этом режиме активен только консольный терми- нал, за которым работа ведется от имени пользователя root. Дей- ствия, требующие монопольного доступа к компьютеру (например, переконфигурирование системы) следует выполнять именно в одно- пользовательском режиме. Обычно после загрузки системы с флоп- пи-диска или ленты она оказывается на уровне S. Уровень 2 называют многопользовательским. Это обычный режим функционирования системы, в который она попадает после загрузки с винчестера. Уровень 6 предназначен для работы процедур выключения компьюте- ра. Для остальных уровней нет стандартного предназначения. Отметим только, что уровень 3 зарезервирован за многопользовательским режимом, в котором доступны сетевые услуги. Процесс init просматривает файл /etc/inittab и запускает ука- занные там процессы, если запрашивается переход на новый уро- вень выполнения, произошла ошибка питания или завершается один из потомков init'а. Если нужно вызвать принудительный просмотр файла /etc/inittab без перехода на новый уровень, следует вы- полнить команду /etc/init q Тонкости работы процесса init изложены в статье init(1M) Спра- вочника администратора.  Ё2.3. Файл /etc/inittab ╢ Файл /etc/inittab - это таблица, которая управляет программой init(1M) как главным диспетчером процессов. Программа init пе- риодически просматривает строки файла inittab и, если нужно, запускает заданные в некоторых строках процессы. Первая строка файла inittab задает начальный уровень выполне- ния, на который система перейдет после загрузки. Эта строка должна иметь следующий формат: имя:уровень_выполнения:initdefault: Если в качестве уровня_выполнения задана двойка, после загрузки система окажется в многопользовательском режиме. Если посмот- реть на первую строку файла /etc/inittab , расположенного на винчестерском диске, то окажется, что она выглядит так: is:2:initdefault: Файл /etc/inittab из минимального варианта системы на флоппи╜ диске или ленте в качестве первой строки содержит is:S:initdefault: В результате после загрузки минимального варианта система ока- зывается в однопользовательском режиме. Последующие строки файла inittab должны иметь такой формат: имя:уровень_выполнения:действие:процесс Перечисленные поля имеют следующий смысл. Назначение имени ╜ однозначно идентифицировать строку. Поле уровень_выполнения содержит перечень уровней, на которых процесс из данной строки может существовать. При переходе на новый уровень, вообще говоря, запускаются новые процессы и уничтожается часть старых. Поле действие определяет дисциплину обработки процесса, указан- ного в данной строке. Программа init среди прочих распознает следующие действия: bootwait╢ Эта строка будет обработана один раз при переходе init из однопользовательского режима в многополь- зовательский после загрузки системы. (Если дейст- вие initdefault соответствует уровню выполнения 2, то указанный в строке процесс будет запущен сразу после загрузки системы). Программа init запускает процесс, дожидается его завершения и после этого не перезапускает процесс. wait╢ При переходе на уровень_выполнения, совпадающий с указанным в строке, запустить процесс и ожидать его завершения. При всех последующих просмотрах файла inittab на том же уровне выполнения игнори- ровать строку. respawn╢ Если процесс не существует, то запустить его, не ждать завершения (продолжать просмотр файла init- tab), после завершения процесса перезапустить его. Если процесс уже существует, ничего не делать и продолжать просмотр файла inittab. off╢ Если процесс, ассоциированный с данной строкой, выполняется, ему посылается предупреждающий сигнал SIGTERM и дается 20 секунд на завершение, после чего он принудительно терминируется сигналом SIG- KILL. Если процесс не существует, строка игнориру- ется. powerfail╢ Выполнять указанный в строке процесс только при получении init'ом сигнала об ошибке питания. В поле процесс задается команда shell'а, которую нужно выпол- нить. Чтобы употребить в этой команде комментарий, нужно вос- пользоваться записью ;#комментарий. Обычно действие respawn сопровождает процесс getty(1M), который выдает на терминал приглашение для входа в систему. Если по ка- кой-либо причине приглашение больше выдавать не нужно (сломался терминал или вместо терминала подключили графопостроитель), действие respawn нужно заменить на off. Напротив, когда требу- ется подключить новый терминал, off заменяется на respawn. На- помним, что для немедленного просмотра init'ом измененного фай- ла /etc/inittab служит команда /etc/init q Подчеркнем, что при подключении к последовательным или парал- лельным портам новых устройств или отключении старых не требу- ется перегенерировать систему - достаточно изменить файл /etc/ inittab.  Ё2.4. Некоторые действия по инициализации ╢ Рассмотрим некоторые строки файла /etc/inittab, управляющего процессом загрузки системы на станции БЕСТА: is:2:initdefault: bc:2345:bootwait:/etc/bcheckrc /dev/console 2>&1 br::bootwait:/etc/brc >/dev/console 2>&1 r0:0:wait:/etc/rc0 >/dev/console 2>&1 r2:2:wait:/etc/rc2 >/dev/console 2>&1 co::respawn:/etc/getty console console 03::off:/etc/getty tty3 9600A 04::respawn:/etc/getty tty4 9600A Первая из строк предписывает процессу init в качестве последне- го действия по загрузке системы перейти на уровень 2. Строка bc принимается во внимание при переходе из однопользова- тельского режима на уровни со второго по пятый. При этом выпол- няется shell-процедура /etc/bcheckrc , устанавливающая часовой пояс данной вычислительной установки и проверяющая корректность файловых систем. После завершения процедуры /etc/bcheckrc процесс init переходит к следующей строке и запускает shell-процедуру /etc/brc , кото- рая заносит корневую файловую систему в таблицу смонтированных файловых систем. Напомним, что пустое содержимое поля уровень_- выполнения эквивалентно упоминанию всех уровней. Строка с именем r0 в процессе загрузки системы будет пропущена, поскольку выполняется переход не на нулевой, а на второй уро- вень; следующим запущенным процессом будет /etc/rc2. Эту shell╜ процедуру стоит рассмотреть подробнее: set `who -r` if [ $9 = "S" ] then echo "The system is coming up. Please wait." elif [ -d /etc/rc2.d ] then for f in /etc/rc2.d/K* do if [ -s ${f} ] then /bin/sh ${f} stop fi done fi if [ -d /etc/rc2.d ] then for f in /etc/rc2.d/S* do if [ -s ${f} ] then /bin/sh ${f} start fi done fi if [ $9 = "S" ] then echo "\n ****** MULTI-USER MODE `/bin/date` ****** \n" fi Напомним, что команда who -r выдает информацию о текущем и пре- дыдущем уровнях выполнения, а также о времени последней смены уровней. В частности, девятым из выдаваемых слов будет предыду- щий уровень. В процессе загрузки он равен S, так что проверяе- мое условие ($9 = "S") окажется истинным и процедура выдаст со- общение о том, что система на подходе. Если бы переход на уровень 2 выполнялся не из однопользователь- ского режима, в цикле были бы запущены файлы из каталога /etc/ rc2.d, имена которых начинаются на K. Назначение этих процедур - ликвидировать процессы, которые не должны существовать на уровне 2; поэтому процедуры и запускаются с аргументом stop. Далее следует цикл, в котором с аргументом start запускаются файлы, имена которых начинаются на S. Они предназначены для вы- полнения таких инициализационных действий, как монтирование файловых систем, запуск планировщика строчных принтеров и дру- гих демонов и т.п. По поводу файлов, выполняющих действия по терминированию и/или инициализации, приняты следующие соглашения. Все подобные файлы помещаются в каталог /etc/init.d под мнемоничными именами (нап- ример, MOUNTFSYS или lineprinter). В каталогах /etc/rcn.d (n - номер уровня) создаются ссылки на соответствующие файлы из /etc/init.d с именами вида [KS]??имя_в_/etc/init.d Первая буква - K или S - показывает, для чего используется в данном каталоге файл: для терминирования или инициализации. В качестве двух следующих символов задаются цифры. Дело в том, что вместо шаблона файлов shell подставляет подходящие имена в алфавитном порядке. Чем меньше двузначное число в имени файла, тем раньше этот файл будет выполнен. Например, в каталоге /etc/rc2.d есть файлы S03MOUNTFSYS и S04RMTMPFILES. Поскольку первое из этих имен лексикографически меньше второго, сначала будут смонтированы файловые системы, а уже затем удалены вре- менные файлы. Процесс сбора информации об ошибках оборудования (файл S80errlog) будет запущен в конце цикла. Тем самым пара цифр - средство для упорядочения действий по терминированию и инициализации. Если нужно исключить какое-либо действие из циклов терминирова- ния или инициализации, нужно или удалить соответствующую ссыл- ку, или переименовать ее, чтобы она не начиналась с K или S. Можно порекомендовать при переименовании делать первую букву строчной (k или s) - тогда легко получить список исключенных действий и при необходимости вернуть то или иное действие в число выполняемых. Вернемся к рассмотрению файла /etc/inittab. После завершения процедуры /etc/rc2 init перейдет к интерпретации последующих строк. Он запустит процесс getty(1M), указанный в строке с име- нем co, но не будет ждать его завершения, поскольку в качестве действия задано respawn. Когда же процесс getty все же завер- шится (а случится это после входа пользователя в систему с дан- ного терминала и последующего выхода из нее), он (процесс get- ty) будет запущен снова. Следующая строка файла /etc/inittab будет проигнорирована, поскольку действием является off. Обра- ботка строки с именем 04 совершенно аналогична обработке строки co. Затем init будет ожидать завершения какого-либо из своих потомков, после чего вновь выполнит просмотр файла /etc/init- tab, чтобы обеспечить своевременный перезапуск процессов.  Ё2.5. Проверка файловых систем ╢ Из shell-процедуры /etc/bcheckrc вызывается утилита fsck(1M), выполняющая проверку и корректировку файловых систем в интерак- тивном режиме. Опишем эту утилиту подробнее. Обращение к fsck среди прочих может включать следующие аргумен- ты: /etc/fsck [-y] [-n] [файловая_система ...] Проверяемая файловая система задается именем содержащего ее специального файла. Если файловая_система не указана, проверя- ются файловые системы из списка, хранящегося в файле /etc/ checklist. По умолчанию на выполнение действий по устранению повреждений файловой системы у пользователя запрашивается подтверждение. В случае положительного ответа (yes) повреждение ликвидируется. Опции имеют следующий смысл: -y Считать, что на все вопросы дается положительный ответ. -n Считать, что на все вопросы дается отрицательный ответ. Не пытаться ликвидировать повреждения и не открывать файловую систему на запись. Утилита fsck при устранении повреждений ведет себя достаточно разумно. Рекомендуется положиться на нее и указывать опцию -y - это избавит Вас от лишних сомнений. Выявляются следующие нарушения целостности файловой системы: ╙ На блок имеется более одной ссылки из описателей файлов и/или списка свободных блоков. ╙ Блок, на который ссылается описатель файла или список свободных блоков, находится за пределами файловой сис- темы. ╙ Имеются некорректные счетчики числа ссылок. ╙ При проверке размеров: выявлено некорректное число блоков; размер каталога оказался не кратен 16. ╙ Обнаружен описатель файла, имеющий некорректный формат. ╙ Выявлены неучтенные блоки. ╙ При проверке каталогов: обнаружен элемент каталога, указывающий на свобод- ный описатель файла; выявлен недопустимый номер описателя файла. ╙ При проверке суперблока: описателей файлов оказалось более 65536; оказалось, что под описатели файлов выделено боль- ше блоков, чем есть в файловой системе. ╙ Обнаружено нарушение формата списка свободных блоков. ╙ Выявлены некорректные значения счетчиков свободных бло- ков и/или свободных описателей файлов. Непустые файлы, на которые нет ссылок, с согласия пользователя (а каталоги - обязательно) перемещаются в каталог lost+found. Если не указана опция -n, пустые файлы и каталоги удаляются. Каталог lost+found должен существовать, располагаться в корне проверяемой файловой системы и иметь свободные места для зане- сения новых элементов. Чтобы удовлетворить всем требованиям, надо перед выполнением fsck создать каталог /lost+found, запи- сать в него несколько файлов, а потом удалить их. Для стандартной конфигурации станции БЕСТА в файле /etc/check- list задан следующий подразумеваемый список проверяемых файло- вых систем: /dev/dsk/hd0s0 /dev/dsk/hd0s1 Именно они проверяются и корректируются в процессе загрузки ОС UNIX. Когда файловая система находится в некорректном состоянии, ее нельзя смонтировать. Если при попытке смонтировать флоппи-диск ОС UNIX отвечает отказом, попытайтесь исправить положение ко- мандой /etc/fsck -y /dev/dsk/fd после чего повторите попытку монтирования. К сожалению, если в некорректном состоянии оказался описатель открытого файла, утилита fsck не сможет исправить положение. Чаще всего таким открытым файлом с нарушенным числом ссылок на него оказывается /dev/console; в результате корневую файловую систему не удается привести в корректное состояние, и процесс загрузки ОС UNIX раз за разом терпит неудачу. Единственный вы- ход из создавшегося положения - загрузить минимальный вариант ОС с флоппи-диска или ленты и выполнить команду /etc/fsck -y /dev/dsk/hd0s0 Открытый файл /dev/console будет находиться не на винчестерском диске, поэтому fsck сможет скорректировать число ссылок. Практический вывод состоит в том, что если ОС UNIX не удается загрузить с винчестерского диска, следует выполнить загрузку с флоппи-диска или ленты, а затем попытаться исправить или восс- тановить файловую систему на устройстве /dev/dsk/hd0s0.  Ё3. ВЫКЛЮЧЕНИЕ СИСТЕМЫ ╢ Чтобы начать процесс выключения системы БЕСТА, следует войти с консольного терминала в пользователя down или, будучи пользова- телем root и находясь в корневом каталоге, выполнить команду /etc/shutdown или, наконец, в ответ на приглашение Console login: ввести sysadm reboot В любом случае будет использоваться процедура /etc/shutdown, которую мы и рассмотрим.  Ё3.1. Процедура /etc/shutdown ╢ Shell-процедура shutdown(1M) предназначена для перевода системы из многопользователського режима на указанный уровень (по умол- чанию на уровень S, то есть в однопользовательский режим). Перед началом действий по изменению уровня выполнения утилита посылает сначала предупреждающее, а после задержки и финальное сообщения. По умолчанию перед терминированием процессов запра- шивается подтверждение. Утилита shutdown вызывается следующим образом: /etc/shutdown [-y] [-gзадержка] [-iуровень_выполнения] Опциям приписан следующий смысл: -y Отменить запрос подтверждения. Команда будет рабо- тать без вмешательства пользователя. По умолчанию, между предупреждающим и финальным сообщениями пре- дусмотрена задержка в 60 секунд; такая же задержка выполняется между финальным сообщением и запросом подтверждения. -gзадержка╢ Изменить стандартную величину задержки. Новая за- держка задается в секундах. Например, аргумент -g0 означает отсутствие задержки. -iуровень_выполнения╢ Уровень_выполнения передается утилите init(1М). Система перейдет на этот уровень после всех сооб- щений, задержек и подтверждений. Подразумеваемый уровень есть S. Рекомендуемые уровни_выполнения и действия при переходе на них: 0 Остановить систему, подготовив ее к безопасному выключению питания. Выключить питание, если позво- ляет аппаратура. Для выполнения этих действий вы- зывается shell-процедура /etc/rc0. 1, s, S╢ Перевести систему в однопользовательский режим, используя процедуру /etc/rc0. Разница между уров- нями S и 1 состоит в том, что на уровне S все про- цессы, порожденные init, завершены, но файловые системы не размонтированы. На уровне 1 размонтиро- ваны все файловые системы, кроме корневой, и за- вершены все пользовательские процессы, кроме кон- сольных. 6 Остановить систему и подготовиться к перезагрузке. При входе в пользователя down происходит автоматическое выпол- нение команды /etc/shutdown -g0 то есть с нулевой задержкой начинается процесс перевода системы в однопользовательский режим.  Ё3.2. Процедура /etc/finito ╢ Shell-процедура finito(1M) служит для остановки системы и под- готовки ее к перезагрузке, если исходным уровнем выполнения яв- ляется S. Утилита finito выполняет размонтирование всех смонти- рованных файловых систем (кроме корневой), выталкивает буфера и вызывает команду init 6 В файле /etc/inittab имеется строка rb:6:wait:/etc/uadmin 2 2 >/dev/console 2>&1