Организация UNIX-систем и ОС Solaris

         

Части страницы руководства


В страницах руководства всегда есть несколько частей. Обычно присутствуют все стандартные части, перечисленные ниже, и в некоторых случаях - дополнительные, специфичные для данного описания.

NAME сообщает имя описываемой команды. В разделе NAME представлено еще и краткое описание программы.

SYNOPSIS описывает перечень доступных ключей командной строки при вызове команды и список возможных аргументов. Этого раздела может быть достаточно для того, чтобы освежить свою память и вспомнить ключ, который раньше помогал вам получить требуемый результат.

DESCRIPTION кратко описывает программу. Содержимое этого раздела зависит от темы, которая представлена на рассматриваемой странице руководства - к страницам о программах, файлах и базовых интерфейсах предъявляются совершенно разные требования.

OPTIONS (ключи) описывает ключи программы, их воздействие и, в зависимости от ключа, дополнительные аргументы, которые необходимо указать при использовании ключа.

SEE ALSO ("см. также") традиционно является последним разделом страницы, но зачастую - самым интересным.

Нелишне еще раз вспомнить, что для просмотра заголовков всех страниц, относящихся к определенной теме, нужно набрать man -k тема. В этом случае будет выполнен поиск по ключевому слову во всех заголовках страниц руководства. Для этой же цели можно воспользоваться командой apropos(1) - это легче запомнить, если не забыли, что означает "apropos"1).

Для поиска какого-нибудь слова в странице руководства (когда вы ее уже смотрите с помощью man) следует набрать "/" и затем само слово. После этого на экране можно будет увидеть первое употребление этого слова на странице. Последовательно вводя одиночный слэш (/), можно будет переходить к следующему вхождению этого слова.



The grep utility searches text


Name grep - search a file for a pattern

Synopsis /usr/bin/grep [-bchilnsvw] limited-regular-expression [filename...] /usr/xpg4/bin/grep [-E | -F] [-c | -l | -q] [-bhinsvwx] -e pattern_list... [-f pattern_file]... [file...] /usr/xpg4/bin/grep [-E | -F] [-c | -l | -q] [-bhinsvwx] [-e pattern_list...] -f pattern_file... [file...] /usr/xpg4/bin/grep [-E | -F] [-c | -l | -q] [-bhinsvwx] pattern [file...]

Description

The grep utility searches text files for a pattern and prints all lines that contain that pattern. It uses a compact non-deterministic algorithm.

Be careful using the characters $, *, [, ^, |, (, ), and \ in the pattern_list because they are also meaningful to the shell. It is safest to enclose the entire pattern_list in single quotes `... `.

If no files are specified, grep assumes standard input. Normally, each line found is copied to standard output. The file name is printed before each line found if there is more than one input file.

/usr/bin/grep

The /usr/bin/grep utility uses limited regular expressions like those described on the regexp(5) manual page to match the patterns.

/usr/xpg4/bin/grep

The options -E and -F affect the way /usr/xpg4/bin/grep interprets pattern_list. If -E is specified, /usr/xpg4/bin/grep interprets pattern_list as a full

regular expression (see -E for description). If -F is specified, grep interprets pattern_list as a fixed string. If neither are specified, grep interprets pattern_list

as a basic regular expression as described on regex(5) manual page.

Options

The following options are supported for both /usr/bin/grep and /usr/xpg4/bin/grep:

-b

Precede each line by the block number on which it was found. This can be useful in locating block numbers by context (first block is 0).

-c

Print only a count of the lines that contain the pattern.

-h

Prevents the name of the file containing the matching line from being appended to that line. Used when searching multiple files.

-i

Large File Behavior

See largefile(5) for the description of the behavior of grep when encountering files greater than or equal to 2 Gbyte ( 2 **31 bytes).

Examples Example 1: Finding all uses of a word To find all uses of the word "Posix" (in any case) in the file text.mm, and write with line numbers: example% /usr/bin/grep -i -n posix text.mm

Example 2: Finding all empty lines To find all empty lines in the standard input: example% /usr/bin/grep ^$ or example% /usr/bin/grep -v .

Example 3: Finding lines containing strings Both of the following commands print all lines containing strings abc or def or both: example% /usr/xpg4/bin/grep -E `abc def' example% /usr/xpg4/bin/grep -F `abc def'

Example 4: Finding lines with matching strings Both of the following commands print all lines matching exactly abc or def: example% /usr/xpg4/bin/grep -E `^abc$ ^def$' example% /usr/xpg4/bin/grep -F -x `abc def'

Environment Variables

See environ(5) for descriptions of the following environment variables that affect the execution of grep: LC_COLLATE, LC_CTYPE, LC_MESSAGES, and NLSPATH.

Exit Status The following exit values are returned: 0 One or more matches were found. 1 No matches were found. 2 Syntax errors or inaccessible files (even if matches were found).

See Also egrep(1) , fgrep(1) , sed(1) , sh(1) , attributes(5) , environ(5) , largefile(5) , regex(5) , regexp(5) , XPG4(5)

Notes /usr/bin/grep

Lines are limited only by the size of the available virtual memory. If there is a line with embedded nulls, grep will only match up to the first null; if it matches, it will print the entire line.

/usr/xpg4/bin/grep

The results are unspecified if input files contain lines longer than LINE_MAX bytes or contain binary data. LINE_MAX is defined in /usr/include/limits.h.
Пример 8.1. Результат работы команды man grep
Закрыть окно


See largefile(5) for the description of the behavior of grep when

encountering files greater than or equal to 2 Gbyte ( 2 **31 bytes).

Examples

Example 1: Finding all uses of a word

To find all uses of the word "Posix" (in any case) in the file text.mm,

and write with line numbers:

example% /usr/bin/grep -i -n posix text.mm

Example 2: Finding all empty lines

To find all empty lines in the standard input:

example% /usr/bin/grep ^$

or

example% /usr/bin/grep -v .

Example 3: Finding lines containing strings

Both of the following commands print all lines containing strings abc or def or both:

example% /usr/xpg4/bin/grep -E `abc def'

example% /usr/xpg4/bin/grep -F `abc def'

Example 4: Finding lines with matching strings

Both of the following commands print all lines matching exactly abc or def:

example% /usr/xpg4/bin/grep -E `^abc$ ^def$'

example% /usr/xpg4/bin/grep -F -x `abc def'

Environment Variables

See environ(5) for descriptions of the following environment

variables that affect the execution of grep: LC_COLLATE, LC_CTYPE,

LC_MESSAGES, and NLSPATH.

Exit Status

The following exit values are returned:

0

One or more matches were found.

1

No matches were found.

2

Syntax errors or inaccessible files (even if matches were found).

See Also

egrep(1) , fgrep(1) , sed(1) , sh(1) , attributes(5) , environ(5) ,

largefile(5) , regex(5) , regexp(5) , XPG4(5)

Notes

/usr/bin/grep

Lines are limited only by the size of the available virtual memory.

If there is a line with embedded nulls, grep will only match up to

the first null; if it matches, it will print the entire line.

/usr/xpg4/bin/grep

The results are unspecified if input files contain lines longer than

LINE_MAX bytes or contain binary data. LINE_MAX is defined in

/usr/include/limits.h.


FAQ


В Сети есть разнообразные сборники часто задаваемых вопросов и ответов, связанных с администрированием Solaris. Надо начать поиск в них с sun.com (bigadmin.sun.com, docs.sun.com и т.п.). Довольно часто в FAQ собраны простые вопросы - много проще, чем тот, который вы хотите задать. Следует понимать, что в FAQ вряд ли есть ответы на вопросы о самой последней версии системы: списки вопросов и ответов составляются по материалам обсуждений в сети и проблем, обнаруженных компанией-производителем системы по прошествии некоторого времени после выпуска очередной версии ОС.



Форум Opennet


Русскоязычный сайт для администраторов Solaris расположен по адресу solaris.opennet.ru. Кроме статей, посвященных различным аспектам администрирования системы, здесь имеется форум, в котором можно встретить письма как новичков, так и опытных системных администраторов. Поиск по форуму выдает массу результатов; к сожалению, на момент написания книги автор не нашел, как разделить эти результаты на относящиеся исключительно к Solaris и касающиеся других систем UNIX: подобной функциональностью форум еще не снабдили.

Вот что рассказывает Максим Чирков, глава проекта Opennet, об истории solaris.opennet.ru: "Примерно в 1998 году Евгений Бобин создал сайт gene.chat.ru (сайт сохранился до сих пор), и я предложил ему предоставить поддомен solaris.opennet.ru и качественный хостинг. На solaris.opennet.ru планировалось создать переработанный вариант gene.chat.ru, вначале работа пошла активно, но потом развитие прекратилось, Евгению перестало хватать времени для поддержки сайта и в конце концов информация там устарела, половина ссылок и страниц не работали. В 2001 году на сервере сгорел жесткий диск и сайты пришлось переносить на другой сервер. Было решено не воссоздавать мертвый проект, и я просто создал страницу, на которой обобщил в одном месте ссылки на уже существующие разделы opennet.ru, посвященные Solaris, вынес отдельно блок новостей и статей. Вариант Евгения Бобина можно посмотреть в архиве: http://web.archive.org/web/19990901211748/http://solaris.opennet.ru/

В 2004 году появился еще один, автоматически компонуемый, вариант этой страницы - http://solaris.opennet.ru/mp/solaris/".



Форумы и документация на Sun.com


Компания Sun Microsystems предоставляет обширную базу данных для поиска требуемой информации на своем сайте. Вполне реально найти как оригинальную документацию на систему и руководства администратора, так и живое обсуждение проблем на форуме bigadmin.sun.com.



Конференции Fido


Конференции Fido доступны по протоколу nntp в формате сети Usenet, подробности можно выяснить по адресу www.fido7.ru, а специфическая телеконференция по Solaris доступна по адресу http://groups.google.com/groups?group=fido7.ru.unix.solaris.

Конференции сети Fidonet (сокращенно - Fido) возникли задолго до форумов в Интернете, и многие давно работающие с компьютерными системами специалисты предпочитают именно их для общения. Несмотря на то, что популярность Fido в России несравнима с популярностью сети Интернет, пренебрегать этим источником обмена опытом было бы неразумно.

Возможно, для участия в конференциях, для получения права писать письма в конференцию, вам придется зарегистрироваться и (или) установить новое программное обеспечение для чтения телеконференций в формате Usenet. Не волнуйтесь: затраты времени окупятся сторицей.



Крик о помощи - письмо в форум или список рассылки


Если вы отчаялись найти решение самостоятельно, читая архивы форумов в Сети и документацию на всевозможных сайтах, и решили обратиться в форум или список рассылки за помощью, стоит помнить о некоторых правилах.

В письме о помощи следует привести всю информацию, которая имеется в вашем распоряжении. Если в письме не будет чего-то важного для решения проблемы, то либо ваш вопрос проигнорируют, либо вместо ответа вы получите массу сообщений, в которых вас попросят уточнить детали.

Поэтому в письмо о помощи надо включить, как минимум, следующее:

Завершенное описание проблемы. Вопрос "Как увидеть сеть?" вызовет встречные вопросы. Что значит "увидеть"? О какой системе идет речь? О какой сети? Какие настройки сделаны?Вывод команды uname -a. Так можно узнать версию вашей операционной системы и аппаратную платформу.Все сообщения об ошибках, которые вы наблюдали в связи с проблемой. Не забудьте о сообщениях из файла протокола /var/log/messages и других файлов протоколов, если они связаны с проблемой.

Постарайтесь также, чтобы ваше письмо было удобно читать: не пишите длинных вступлений и заключений общего характера ("Я работаю системным администратором в компании Газпром"), отправляйте письмо в формате plain text (ваши корреспонденты вряд ли любят читать письма в формате HTML, попробуйте сами с помощью программы mail, например), отправляйте письмо по тому адресу, с которого вправе ожидать помощь, и помните - письмо, возможно, придется писать по-английски1).



Поиск в Интернете


Интернет велик, информации в нем много, и для понимания Solaris мы можем воспользоваться в Сети : списками часто задаваемых вопросов, документацией на сайте Sun Microsystems, архивами форумов (более или менее специализированных, официальных и неофициальных), почтовыми рассылками, телеконференциями сети Fidonet, поисковыми системами и знаниями гуру.



Поисковые машины


Для поиска информации в Сети есть прекрасные поисковые машины, такие как google.com, metacrawler.com, yahoo.com и многие другие. Как заставить эти творения ума человеческого искать нужные вам страницы?

Прежде всего, надо четко представить себе, какого рода информацию вы хотите найти.

Предположим, вы ищете смысл сообщения об ошибке, которое вы получили от системы. Тогда следует рассчитывать только на форумы. Довольно редко на сайтах можно встретить документацию по конкретным ошибкам, зато на форумах информации о том, что делать, если возникла ошибка, предостаточно. Можно искать письма коллег с таким же, как у вас, сообщением об ошибке на специализированных форумах (о них рассказано ниже), а можно в поисковой машине. Для этого в строке поиска следует привести сообщение об ошибке и запустить поиск.

Сообщение об ошибке следует очистить от всяких особенностей, специфических для вашей системы: от имени системы, возможно, от имени интерфейса, с которым связана ошибка. Например, сообщение

/dev/rdsk/c0d0t3s1: can't check file system

содержит указание на конкретный диск (c0d0t3s1); очевидно, что сообщение может встречаться в Сети в письмах о помощи на форумах, но имя диска у других страдальцев может оказаться иным. Поэтому, удалив имя диска, можно быстрее добраться до ссылки на форум с обсуждением произошедшей ошибки.

Кстати, перечень сообщений об ошибках в Solaris (с объяснением их возможных причин) можно найти в Сети, например, по адресам http://www.antioffline.com/solerrors.html и http://docs.sun.com/db/doc/802-2022. Помните, что достоверность ссылок проверена автором на момент написания книги; возможно, вы найдете эти списки в других местах.

Если ваша цель - отыскать документацию для выполнения конкретной задачи или получения информации о программе, следует как можно лучше представить себе, какими словами эта проблема описывается. Обычно в Сети нет толковых документов, которые найдутся по ключевой фразе "как прибиндить nameserver к интерфейсу".

Например, для поиска информации о том, как переключать язык ввода текста с клавиатуры в Solaris, следует догадаться, что ключевыми словами должны быть "keyboard layout" или "language layout", а не "keyboard switcher".

Для администрирования Solaris и любого другого варианта UNIX не обязательно знать язык С или С++ в совершенстве, можно не знать perl и язык командного процессора, но понимать английский текст надо обязательно. Если вы еще не знаете английского языка, выучите его.

Иногда можно найти в Сети обсуждение нужной вам темы по-русски или переведенную на русский язык документацию. В последнем случае качество переводов часто бывает настолько плохим, что перевод только запутывает и без того сложную проблему. Вероятность найти толковое, свежее, актуальное и русскоязычное решение проблемы с Solaris в Сети намного ниже, чем найти то же самое по-английски, хотя бы потому, что основная масса администраторов Solаris во всем мире говорит по-английски, а не по-русски.

Если не удается найти информацию на привычных вам поисковых серверах, попробуйте metacrawler.com - иногда мне удавалось с его помощью выудить жемчужину из навозной кучи.



Практический поиск информации: реальный случай


Теперь возьмем относительно простую (казалось бы!) задачу и воспользуемся описанной методикой для ее решения. Часть этой книги набрана в пакете Open Office под Solaris 9. Для создания иллюстраций было необходимо делать "снимки" экрана, чтобы показать, как выглядят графические элементы CDE. Как сделать такие "снимки"?

Во-первых, я попробовал найти это в man. Попытки получить что-нибудь про print screen или screenshot с помощью man -k не удались.

Во-вторых, я попробовал найти эту информацию в Сети. Поскольку делать "снимки" графических окон - не самая частая необходимость администратора, поиск такой информации в FAQ и на форумах казался бесполезным. Для поиска в google требовалось придумать, как назвать эту функцию. Попробуем давно знакомый термин screenshot. Итак, ищем

Solaris 9 screenshot

Находятся ссылки на уже готовые "снимки"... смотрим дальше... вот! "to easily and quickly capture a screenshot" значится в описании страницы с docs.sun.com. Смотрим... "SDTImage Enhancements: The SDTImage screen snapshot feature now enables users to easily and quickly capture a screenshot image from the command line."

Похоже, это именно то, что мы ищем! Интересно, что найденный документ описывает расширения среды CDE, появившиеся в Solaris 8. А что такое SDTImage?

Попробуем man -k sdtimage:

bash-2.05# man -k sdtimage sdtimage sdtimage (1) - Image viewer for CDE bash-2.05#

О, да это средство для просмотра картинок... Запускаем

sdtimage&

и оказывается, что в меню File имеется функция Snapshot... Задача решена! Удалось даже обойтись без помощи гуру...



Руководство по Solaris


Руководство по Solaris разделено на несколько разделов. Номер раздела может быть цифрой, за которой, возможно, следует одна или несколько букв, в зависимости от названия раздела. Кроме того, раздел может называться одним словом, например, local, new или public. Каждая страница руководства представлена только в одном разделе. Однако в разных разделах могут быть таблицы с одним заголовком, например, passwd (1) и passwd (4), рассказывающие о связанных понятиях, файлах и программах. Так, страница passwd в разделе 1 рассказывает о программе passwd, а страница passwd в разделе 4 рассказывает о формате и назначении файла /etc/passwd. Разделы man делятся на подразделы, например, в разделе 1 есть подразделы 1m, 1b, 1c, 1f, 1s. Объяснение того, какие страницы содержатся в каждом из подразделов, дано в man intro. Страница intro есть в каждом разделе, от intro (1) до intro (9). Это - введение в справочный раздел. Если потребуется более подробное описание того, что содержится в нем, можно вызвать

man -s N intro

Поставьте вместо N номер того раздела, который вас заинтересовал (от 1 до 9). В таблице 8.1 перечислены основные разделы справочного руководства по Solaris. Многие системы UNIX содержат раздел 8, в котором находятся описания программ обслуживания системы. в Solaris все страницы, описывающие программы, собраны в разделе 1. Поэтому раздела 8 в руководстве по Solaris нет.

Таблица 8.1. Основные разделы справочного руководства по Solaris

1Основные команды
2Системные вызовы и коды ошибок
3Библиотеки С
4Устройства и драйверы устройств
5Форматы файлов
6Инструкции к играм и демо-версиям программ
7Специальные файлы, описания протоколов, драйверы и интерфейсы к ним
9Интерфейсы системных функций ядра

В страницах руководства номер раздела указывается в круглых скобках после команды, например halt(1M). Такая запись представляет как имя команды (halt), так и страницу руководства (1M). При поиске подробной информации о чем-либо нужно обратиться к соответствующей странице документации. (Просмотреть страницу документации можно с помощью команды man(1)).

Страница документации есть почти по каждой теме. Например, для просмотра страницы руководства по программе поиска подстрок grep нужно ввести следующую команду:

man grep

В ответ система выдаст следующую информацию:

Пример 8.1. Результат работы команды man grep (html, txt)

Вывод man grep сильно сокращен, так как здесь нам требуется не детальный обзор grep, а общий вид какой-нибудь страницы руководства.

Первый блок информации, представленный в верхней строке, сообщает заголовок страницы руководства и номер раздела.

Обратите внимание на то, что в Solaris 9 поддерживается две версии grep - классическая (/usr/bin/grep) и расширенная (/usr/xpg4/bin/grep).

Ниже рассмотрены элементы страницы руководства, которые могут помочь вам не только разобраться в предмете, но и получить направление для нового поиска.


man grep

В ответ система выдаст следующую информацию:

Name grep - search a file for a pattern

Synopsis /usr/bin/grep [-bchilnsvw] limited-regular-expression [filename...] /usr/xpg4/bin/grep [-E | -F] [-c | -l | -q] [-bhinsvwx] -e pattern_list... [-f pattern_file]... [file...] /usr/xpg4/bin/grep [-E | -F] [-c | -l | -q] [-bhinsvwx] [-e pattern_list...] -f pattern_file... [file...] /usr/xpg4/bin/grep [-E | -F] [-c | -l | -q] [-bhinsvwx] pattern [file...]

Description

The grep utility searches text files for a pattern and prints all lines that contain that pattern. It uses a compact non-deterministic algorithm.

Be careful using the characters $, *, [, ^, |, (, ), and \ in the pattern_list because they are also meaningful to the shell. It is safest to enclose the entire pattern_list in single quotes `... `.

If no files are specified, grep assumes standard input. Normally, each line found is copied to standard output. The file name is printed before each line found if there is more than one input file.

/usr/bin/grep

The /usr/bin/grep utility uses limited regular expressions like those described on the regexp(5) manual page to match the patterns.

/usr/xpg4/bin/grep

The options -E and -F affect the way /usr/xpg4/bin/grep interprets pattern_list. If -E is specified, /usr/xpg4/bin/grep interprets pattern_list as a full

regular expression (see -E for description). If -F is specified, grep interprets pattern_list as a fixed string. If neither are specified, grep interprets pattern_list

as a basic regular expression as described on regex(5) manual page.

Options

The following options are supported for both /usr/bin/grep and /usr/xpg4/bin/grep:

-b

Precede each line by the block number on which it was found. This can be useful in locating block numbers by context (first block is 0).

-c

Print only a count of the lines that contain the pattern.

-h

Prevents the name of the file containing the matching line from being appended to that line. Used when searching multiple files.



-i

Large File Behavior

See largefile(5) for the description of the behavior of grep when encountering files greater than or equal to 2 Gbyte ( 2 **31 bytes).

Examples Example 1: Finding all uses of a word To find all uses of the word "Posix" (in any case) in the file text.mm, and write with line numbers: example% /usr/bin/grep -i -n posix text.mm

Example 2: Finding all empty lines To find all empty lines in the standard input: example% /usr/bin/grep ^$ or example% /usr/bin/grep -v .

Example 3: Finding lines containing strings Both of the following commands print all lines containing strings abc or def or both: example% /usr/xpg4/bin/grep -E `abc def' example% /usr/xpg4/bin/grep -F `abc def'

Example 4: Finding lines with matching strings Both of the following commands print all lines matching exactly abc or def: example% /usr/xpg4/bin/grep -E `^abc$ ^def$' example% /usr/xpg4/bin/grep -F -x `abc def'

Environment Variables

See environ(5) for descriptions of the following environment variables that affect the execution of grep: LC_COLLATE, LC_CTYPE, LC_MESSAGES, and NLSPATH.

Exit Status The following exit values are returned: 0 One or more matches were found. 1 No matches were found. 2 Syntax errors or inaccessible files (even if matches were found).

See Also egrep(1) , fgrep(1) , sed(1) , sh(1) , attributes(5) , environ(5) , largefile(5) , regex(5) , regexp(5) , XPG4(5)

Notes /usr/bin/grep

Lines are limited only by the size of the available virtual memory. If there is a line with embedded nulls, grep will only match up to the first null; if it matches, it will print the entire line.

/usr/xpg4/bin/grep

The results are unspecified if input files contain lines longer than LINE_MAX bytes or contain binary data. LINE_MAX is defined in /usr/include/limits.h.

Пример 8.1. Результат работы команды man grep

Вывод man grep сильно сокращен, так как здесь нам требуется не детальный обзор grep, а общий вид какой-нибудь страницы руководства.

Первый блок информации, представленный в верхней строке, сообщает заголовок страницы руководства и номер раздела.

Обратите внимание на то, что в Solaris 9 поддерживается две версии grep - классическая (/usr/bin/grep) и расширенная (/usr/xpg4/bin/grep).

Ниже рассмотрены элементы страницы руководства, которые могут помочь вам не только разобраться в предмете, но и получить направление для нового поиска.


Страницы руководства


Главная и основная документация любой системы UNIX - это страницы руководства. Руководство по Solaris хранится в подкаталогах каталога /usr/share/man/ и выдается постранично по команде man. Любители читать руководство в отдельном окне могут использовать xman для доступа к руководству.

Это руководство писали одновременно с написанием самой системы и системных программ, поэтому стиль изложения руководства вышел очень программистским. Если вы мыслите как программист, то читать это руководство будет очень легко. Поскольку с выходом новых версий Solaris руководство обновляется, стиль современного варианта уже достаточно адаптирован к нынешним задачам системного администрирования. Если вы мыслите как системный администратор, то страницы, объясняющие, как настроить программу или как ее запускать, вы найдете столь же полезными и понятными, сколь понятными покажутся описания системных функций программисту.

В Solaris, как и в любом другом UNIX, руководство освещает все мелочи, касающиеся системы. Единственное, на что руководство не дает ответа - это на вопрос "Как мне быть?" Если вы попали в затруднительную ситуацию и не понимаете, где искать информацию в руководстве, поможет следующее:

поискать нужные страницы руководства с помощью apropos термин или man -k термин;попробовать изучить man по смежной тематике и выудить что-нибудь, относящееся к теме, из раздела SEE ALSO в конце страницы руководства.



Аварийная остановка системы


В некоторых случаях операционная система перестает отвечать на запросы и не откликается даже на команду reboot. В таком случае говорят, что система "зависла". Это явление, надо признать, более знакомо пользователям Windows 98, нежели администраторам Solaris, но тем не менее и с последним такое случается.

Рекомендуют такую "зависшую" систему перезапустить, нажав Stop+A или L1+A (для платформы SPARC). Это должно вызвать передачу управления к firmware. На физических терминалах, подключенных к последовательным портам, для этой цели возможно использовать клавишу Break.

Некоторые версии OpenBoot поддерживают ряд клавиатурных команд (они вводятся нажатием комбинаций клавиш), которые изменяют поведение OpenBoot при загрузке. Эти клавиши надо нажимать сразу после включения системного блока и держать их несколько секунд до того, как мигнет светодиод на клавиатуре.

К этим клавиатурным командам (keyboard chords) относятся:

Stop - пропустить исполнение процедуры начальной инициализации компьютера POST (Power-on self test); некоторые системы SPARC по умолчанию и так пропускают исполнение POST, тогда для того, чтобы выполнить POST, следует нажать Stop+D;Stop+A - прерывание всех запущенных в настоящее время процессов и предоставление командной строки в среде OpenBoot;Stop+D - включение режима диагностики (эквивалентно установке переменной diag-switch среды OpenBoot в значение true);Stop+F - включение интерпретатора Forth на первом последовательном порту; для продолжения инициализации системы дайте команду exit; используется при нарушениях работы оборудования;Stop+N - переустановка всех переменных NVRAM в значения по умолчанию.

Для изменения комбинаций клавиш, назначенных клавиатурным командам, надо отредактировать файл /etc/default/kbd. В нем также можно разрешить или запретить клавиатурные команды. После модификации файла следует дать команду kbd -i для замены стандартных назначений на новые.

Следует отметить, что в зависимости от установок безопасности компьютера, изменение клавиатурных команд и доступ к командной строке OpenBoot могут быть запрещены, либо доступ к командной строке может предоставляться по паролю.



Set the search path for


* Set the search path for modules. This has a format *similar to the csh path variable. If the module isn't *found in the first directory it tries the second and *so on. The default is /kernel /usr/kernel * *Example: *moddir: /kernel /usr/kernel /other/modules * root device and root filesystem configuration: * *The following may be used to override the defaults *provided by the boot program: * *rootfs: Set the filesystem type of the root. * *rootdev: Set the root device. This should be a fully * expanded physical pathname. The default is the * physical pathname of the device where the boot * program resides. The physical pathname is * highly platform and configuration dependent. * *Example: * rootfs:ufs * rootdev:/sbus@1,f8000000/esp@0,800000/sd@3,0:a * *(Swap device configuration should be specified in */etc/vfstab.) * exclude: * *Modules appearing in the moddir path which are NOT to be *loaded, even if referenced. Note that ?exclude' accepts *either a module name, or a filename which includes the *directory. * *Examples: * exclude: win * exclude: sys/shmsys * forceload: * *Cause these modules to be loaded at boot time, (just *before mounting the root filesystem) rather than at *first reference. Note that forceload expects a filename *which includes the directory. Also note that loading a *module does not necessarily imply that it will be *installed. * *Example: * forceload: drv/foo * set: * *Set an integer variable in the kernel or a module to *a new value. *This facility should be used with caution. *See system(4). * *Examples: * *To set variables in 'unix': * * set nautopush=32 * set maxusers=40 * *To set a variable named 'debug' in the module named *'test_module' * * set test_module:debug = 0x13
Листинг 9.1. Стандартный файл /etc/system
Закрыть окно


* * Hostid * 0284521a * * i86pc Configuration * * * Devices * * +boot (driver not attached) memory (driver not attached) aliases (driver not attached) chosen (driver not attached) i86pc-memory (driver not attached) i86pc-mmu (driver not attached) openprom ( driver not attached) options, instance #0 packages (driver not attached) delayed-writes (driver not attached) itu-props (driver not attached) isa, instance #0 motherboard (driver not attached) PNP0501 (driver not attached) lp (driver not attached) fdc, instance #0 fd, instance #0 fd, instance #1 (driver not attached) i8042, instance #0 keyboard, instance #0 mouse, instance #0 bios (driver not attached) bios (driver not attached) pci, instance #0 pci8086,7190 (driver not attached) pci8086,7191, instance #0 display, instance #0 pci20c,d041 (driver not attached) pci8086,7110 (driver not attached) pci-ide, instance #0 ide, instance #0 cmdk, instance #0 ide, instance #1 sd, instance #0 pci8086,7112, instance #0 pci8086,7113 (driver not attached) pci1014,138, instance #0 pci1014,138, instance #1 pci1436,440 (driver not attached) pci1014,136 (driver not attached) pci10c,d041 (driver not attached) used-resources (driver not attached) objmgr, instance #0 cpus (driver not attached) cpu, instance #0 (driver not attached) pseudo, instance #0 clone, instance #0 ip, instance #0 ip6, instance #0 tcp, instance #0 tcp6, instance #0 udp, instance #0 udp6, instance #0 icmp, instance #0 icmp6, instance #0 sad, instance #0 conskbd, instance #0 wc, instance #0 iwscn, instance #0 rts, instance #0 tl, instance #0 keysock, instance #0 spdsock, instance #0 sysmsg, instance #0 cn, instance #0 mm, instance #0 kstat, instance #0 log, instance #0 sy, instance #0 vol, instance #0 random, instance #0 ptm, instance #0 pts, instance #0 ksyms, instance #0 devinfo, instance #0 * * Loadable Objects * * Loadable Object Path = /platform/i86pc/kernel * drv/cpc hard link: sys/cpc strmod/vuid2ps2 strmod/vuid3ps2 strmod/vuidm3p strmod/vuidm4p strmod/vuidm5p drv/cadp160 drv/smartii drv/elx drv/fd drv/fdc drv/logi drv/lp drv/msm drv/ata drv/dpt drv/mscsi drv/pci-ide drv/sbpro drv/mlx drv/eisa drv/isa drv/kb8042 drv/pci drv/rootnex mach/uppc misc/bootdev misc/emul_80387 misc/pci_autoconfig mmu/mmu32 mmu/mmu36 unix * * Loadable Object Path = /kernel * drv/arp hard link: strmod/arp mach/pcplusmp mach/corollary mach/compaq drv/bofi drv/nca drv/clone drv/cn drv/conskbd drv/consms drv/devinfo drv/i2o_bs drv/i2o_scsi drv/icmp hard link: strmod/icmp drv/icmp6 hard link: strmod/icmp6 drv/ip hard link: strmod/ip drv/ip6 hard link: strmod/ip6 drv/ippctl drv/ipsecah hard link: strmod/ipsecah drv/ipsecesp hard link: strmod/ipsecesp drv/iwscn drv/keysock hard link: strmod/keysock drv/llc1 drv/lofi drv/log drv/mm drv/openeepr drv/options drv/pci_to_i2o drv/poll drv/pseudo drv/ptc drv/ptsl drv/random drv/rts hard link: strmod/rts drv/sad hard link: strmod/sad drv/sgen drv/spdsock drv/st drv/sy drv/sysmsg drv/tcp hard link: strmod/tcp drv/tcp6 hard link: strmod/tcp6 drv/tl drv/udp hard link: strmod/udp drv/udp6 hard link: strmod/udp6 drv/wc genunix misc/busra misc/consconfig misc/des misc/fssnap_if misc/gld misc/hpcsvc misc/i2o_msg misc/ipc misc/kbtrans misc/krtld misc/md5 misc/pcicfg misc/pcihp misc/rpcsec misc/scsi misc/seg_drv misc/seg_mapdev misc/sha1 misc/strplumb misc/swapgeneric misc/terminal-emulator misc/tlimod misc/ufs_log drv/chs drv/dnet drv/elxl drv/ieef drv/iprb drv/ncrs drv/pcn drv/pcscsi drv/sd drv/spwr drv/pcmem drv/mega drv/pcic drv/pcs drv/pem drv/pcelx drv/xsvc drv/cpqncr drv/pcram drv/md misc/md_hotspares misc/md_mirror misc/md_notify misc/md_raid misc/md_sp misc/md_stripe misc/md_trans misc/kgss/gl_kmech_krb5 drv/pcser drv/hpfc drv/pe drv/asy drv/cmdk drv/objmgr misc/dadk misc/gda misc/snlb misc/strategy misc/sysinit drv/sk98sol drv/pcata drv/skfp misc/klmmod misc/klmops misc/nfs_dlboot misc/kgssapi misc/rpcsec_gss drv/adp drv/audioens misc/amsrc1 misc/audiosup misc/diaudio misc/mixer drv/cadp drv/cpqhpc drv/hid drv/hubd drv/scsa2usb drv/uhci drv/usb_ac drv/usb_as drv/usb_mid drv/usbprn misc/hidparser misc/usba exec/elfexec exec/intpexec fs/cachefs fs/fifofs fs/hsfs fs/lofs fs/mntfs fs/procfs fs/sockfs fs/specfs fs/tmpfs fs/ufs ipp/ipgpc sched/TS sched/TS_DPTBL strmod/atun strmod/authmd5h strmod/authsha1 strmod/bufmod strmod/connld strmod/dedump strmod/encr3des strmod/encrdes strmod/ldterm strmod/pckt strmod/pfmod strmod/pipemod strmod/ptem strmod/redirmod strmod/rpcmod hard link: sys/rpcmod strmod/timod strmod/tirdwr strmod/ttcompat strmod/tun sys/c2audit sys/doorfs sys/inst_sync sys/kaio sys/msgsys sys/pipe sys/pset sys/semsys sys/shmsys fs/nfs hard link: sys/nfs fs/autofs fs/udfs strmod/usb_ah strmod/usbkbm strmod/usbms strmod/hwc dacf/consconfig_dacf drv/i8042 drv/mouse8042 drv/symhisl drv/pci_pci drv/vgatext misc/nfssrv misc/acpi_intp misc/pcmcia ipp/dlcosmk ipp/dscpmk ipp/flowacct ipp/tokenmt ipp/tswtclmt misc/rsmops exec/coffexec * * Loadable Object Path = /usr/kernel * drv/rsm sched/FSS drv/winlock drv/pm drv/tnf strmod/u8koi8 strmod/u8lat1 strmod/u8lat2 drv/vol drv/dump drv/fssnap drv/kstat drv/ksyms drv/lockstat drv/logindmux drv/ptm drv/pts exec/javaexec fs/fdfs fs/namefs fs/pcfs fs/xmemfs sched/FX sched/FX_DPTBL sched/IA sched/RT sched/RT_DPTBL strmod/rlmod strmod/telmod sys/acctctl sys/exacctsys sys/sysacct drv/llc2 drv/sppp drv/sppptun hard link: strmod/sppptun strmod/spppasyn strmod/spppcomp * * System Configuration * swap files swapfile dev swaplo blocks free /dev/dsk/c0d0s1 102,1 8 1048936 1048936 * * Tunable Parameters * 3866624 maximum memory allowed in buffer cache (bufhwm) 2954 maximum number of processes (v.v_proc) 99 maximum global priority in sys class (MAXCLSYSPRI) 2949 maximum processes per user id (v.v_maxup) 30 auto update time limit in seconds (NAUTOUP) 25 page stealing low water mark (GPGSLO) 5 fsflush run rate (FSFLUSHR) 25 minimum resident memory for avoiding deadlock (MINARMEM) 25 minimum swapable memory for avoiding deadlock (MINASMEM) * * Utsname Tunables * 5.9 release (REL) sola node name (NODE) SunOS system name (SYS) Generic_112234-03 version (VER) * * Process Resource Limit Tunables (Current:Maximum) * 0x0000000000000100:0x0000000000010000 file descriptors * * Streams Tunables * 9 maximum number of pushes allowed (NSTRPUSH) 65536 maximum stream message size (STRMSGSZ) 1024 max size of ctl part of message (STRCTLSZ) * * IPC Messages module is not loaded * * * IPC Semaphores module is not loaded * * * IPC Shared Memory module is not loaded * * * Time Sharing Scheduler Tunables * 60 maximum time sharing user priority (TSMAXUPRI) SYS system class name (SYS_NAME)
Листинг 9.2. Файл sysdef
Закрыть окно


ap::sysinit:/sbin/autopush -f /etc/iu.ap ap::sysinit:/sbin/soconfig -f /etc/sock2path fs::sysinit:/sbin/ rcS sysinit >/dev/msglog 2<>/dev/msglog </dev/console is:3:initdefault: p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/msglog 2<>/dev/msglog sS:s:wait:/sbin/rcS >/dev/msglog 2<>/dev/msglog </dev/console s0:0:wait:/sbin/rc0 >/dev/msglog 2<>/dev/msglog </dev/console s1:1:respawn:/sbin/rc1 >/dev/msglog 2<>/dev/msglog </dev/console s2:23:wait:/sbin/rc2 >/dev/msglog 2<>/dev/msglog </dev/console s3:3:wait:/sbin/rc3 >/dev/msglog 2<>/dev/msglog </dev/console s5:5:wait:/sbin/rc5 >/dev/msglog 2<>/dev/msglog </dev/console s6:6:wait:/sbin/rc6 >/dev/msglog 2<>/dev/msglog </dev/console fw:0:wait:/sbin/uadmin 2 0 >/dev/msglog 2<>/dev/msglog </dev/console of:5:wait:/sbin/uadmin 2 6 >/dev/msglog 2<>/dev/msglog </dev/console rb:6:wait:/sbin/uadmin 2 1 >/dev/msglog 2<>/dev/msglog </dev/console sc:234:respawn:/usr/lib/saf/sac -t 300
Листинг 9.3. Файл /etc/inittab
Закрыть окно

Файлы и каталоги, используемые при загрузке


Для загрузки в специфическом режиме следует указывать команде boot соответствующие аргументы:

для x86 платформ в ответ на приглашение > вводится команда

b kernel/unix -as - загрузка ядра, используемого по умолчанию, в однопользовательском режиме.



Инициализация ядра


После того как ядро загружено в память и ему передано управление, оно начинает загрузку модулей. В этот момент ядро еще не умеет читать файлы из файловой системы UFS, так как драйвер файловой системы еще не загружен. Поэтому для чтения модулей ядро использует ufsboot. После того как загружено достаточно модулей для монтирования корневой файловой системы и самостоятельного продолжения загрузки, ядро выгружает ufsboot и выполняет остаток загрузки. Ядро монтирует указанные в /etc/vfstab файловые системы и запускает процесс /sbin/init для перехода к режиму работы системы, который в /etc/inittab обозначен как initdefault. Процесс /sbin/init, в свою очередь, запускает те программы и скрипты, которые перечислены в /etc/inittab.

В Solaris 9 ядро настраивается динамически, т.е. изменить параметры ядра можно как при перезагрузке системы (изменив заранее файл конфигурации /etc/system), так и во время работы, на лету. Поэтому ядро называется динамическим. Оно состоит из небольшой статической части и множества модулей, которые загружаются динамически, по мере необходимости. Многие модули загружаются автоматически при старте системы, в то время как другие, например драйверы устройств, загружаются тогда, когда они понадобятся ядру, т.е. в момент первого обращения к ним. Когда модуль уже не нужен, он может быть выгружен из памяти. Фактически, ядро выгружает модуль тогда, когда он не нужен, а память, которую он занимает, наоборот, нужна.

Чтобы узнать, какие модули загружены в настоящий момент, следует выполнить команду

modinfo

Модули ядра хранятся в каталогах /kernel и /usr/kernel, специфичные для аппаратной платформы модули лежат в каталогах /platform/`uname -m`/kernel и /platform/` uname -i`/kernel (если такие есть).

Специфические указания того, какие модули загружать при старте системы, следует разместить в файле /etc/system, который считывается ядром при загрузке. В этом файле можно также указать дополнительные параметры, которые надо передать модулям при загрузке.

В частности, /etc/system используют, чтобы указать:

путь к каталогу, где следует искать модули, загружаемые при старте системы;модули, которые надо загрузить сразу, а не ждать, пока они потребуются;тип и имя устройства, с которого производится загрузка (корневое устройство);параметры ядра, которые следует установить в значения, отличные от принятых по умолчанию.


Стандартный файл /etc/system выглядит примерно так:

Листинг 9.1. Стандартный файл /etc/system (html, txt) Всегда делайте резервную копию любого файла конфигурации перед внесением изменений! Дать команду cp /etc/system /etc/system.bak - дело двух секунд, зато это действие сохранит вам нервы и время - проверено поколениями сисадминов!Никогда не вносите в файлы конфигурации изменений, если не уверены, что это надо делать, или сомневаетесь в том, что должно получиться в результате.

Если правилом (2) вы пренебрегли вопреки голосу разума, то неверный файл /etc/system может вызвать ошибку при загрузке и система не загрузится. Если это случилось, то:

используйте команду загрузчика boot -a для интерактивной загрузки;когда загрузчик спросит имя файла system, укажите имя резервной копии (например, /etc/system.bak); если правило (1) вы тоже проигнорировали (похоже, в этом случае сегодня не ваш день!) и никакой резервной копии не имеете, то в качестве имени файла system указывайте /dev/null - тогда все значения будут приняты по умолчанию.

Как видно из приведенного примера, большинство строк в /etc/system выглядят так:

set параметр=значение

Например, параметр ядра MAXUSERS устанавливается в значение 50 следующей командой:

set maxusers = 50

Обратите внимание на то, что параметры статической части ядра (фактически, файла unix) устанавливаются без ссылки на модуль, а параметры, применимые к модулям, - с указанием имени модуля:

set модуль:параметр=значение

Длина команды в файле /etc/system не должна превышать 80 символов, строки, начинающиеся со знака звездочки "*" или решетки "#" интерпретируются как комментарии.

Чтобы проверить, какие значения имеют настраиваемые параметры ядра, следует использовать команду sysdef, которая показывает список обнаруженных устройств, системных устройств, загруженных модулей и значения настраиваемых параметров ядра:

Листинг 9.2. Файл sysdef (html, txt)



Если правилом (2) вы пренебрегли вопреки голосу разума, то неверный файл /etc/system может вызвать ошибку при загрузке и система не загрузится. Если это случилось, то:

используйте команду загрузчика boot -a для интерактивной загрузки;когда загрузчик спросит имя файла system, укажите имя резервной копии (например, /etc/system.bak); если правило (1) вы тоже проигнорировали (похоже, в этом случае сегодня не ваш день!) и никакой резервной копии не имеете, то в качестве имени файла system указывайте /dev/null - тогда все значения будут приняты по умолчанию.

Как видно из приведенного примера, большинство строк в /etc/system выглядят так:

set параметр=значение

Например, параметр ядра MAXUSERS устанавливается в значение 50 следующей командой:

set maxusers = 50

Обратите внимание на то, что параметры статической части ядра (фактически, файла unix) устанавливаются без ссылки на модуль, а параметры, применимые к модулям, - с указанием имени модуля:

set модуль:параметр=значение

Длина команды в файле /etc/system не должна превышать 80 символов, строки, начинающиеся со знака звездочки "*" или решетки "#" интерпретируются как комментарии.

Чтобы проверить, какие значения имеют настраиваемые параметры ядра, следует использовать команду sysdef, которая показывает список обнаруженных устройств, системных устройств, загруженных модулей и значения настраиваемых параметров ядра:

* * Hostid * 0284521a * * i86pc Configuration * * * Devices * * +boot (driver not attached) memory (driver not attached) aliases (driver not attached) chosen (driver not attached) i86pc-memory (driver not attached) i86pc-mmu (driver not attached) openprom (driver not attached) options, instance #0 packages (driver not attached) delayed-writes (driver not attached) itu-props (driver not attached) isa, instance #0 motherboard (driver not attached) PNP0501 (driver not attached) lp (driver not attached) fdc, instance #0 fd, instance #0 fd, instance #1 (driver not attached) i8042, instance #0 keyboard, instance #0 mouse, instance #0 bios (driver not attached) bios (driver not attached) pci, instance #0 pci8086,7190 (driver not attached) pci8086,7191, instance #0 display, instance #0 pci20c,d041 (driver not attached) pci8086,7110 (driver not attached) pci-ide, instance #0 ide, instance #0 cmdk, instance #0 ide, instance #1 sd, instance #0 pci8086,7112, instance #0 pci8086,7113 (driver not attached) pci1014,138, instance #0 pci1014,138, instance #1 pci1436,440 (driver not attached) pci1014,136 (driver not attached) pci10c,d041 (driver not attached) used-resources (driver not attached) objmgr, instance #0 cpus (driver not attached) cpu, instance #0 (driver not attached) pseudo, instance #0 clone, instance #0 ip, instance #0 ip6, instance #0 tcp, instance #0 tcp6, instance #0 udp, instance #0 udp6, instance #0 icmp, instance #0 icmp6, instance #0 sad, instance #0 conskbd, instance #0 wc, instance #0 iwscn, instance #0 rts, instance #0 tl, instance #0 keysock, instance #0 spdsock, instance #0 sysmsg, instance #0 cn, instance #0 mm, instance #0 kstat, instance #0 log, instance #0 sy, instance #0 vol, instance #0 random, instance #0 ptm, instance #0 pts, instance #0 ksyms, instance #0 devinfo, instance #0 * * Loadable Objects * * Loadable Object Path = /platform/i86pc/kernel * drv/cpc hard link: sys/cpc strmod/vuid2ps2 strmod/vuid3ps2 strmod/vuidm3p strmod/vuidm4p strmod/vuidm5p drv/cadp160 drv/smartii drv/elx drv/fd drv/fdc drv/logi drv/lp drv/msm drv/ata drv/dpt drv/mscsi drv/pci-ide drv/sbpro drv/mlx drv/eisa drv/isa drv/kb8042 drv/pci drv/rootnex mach/uppc misc/bootdev misc/emul_80387 misc/pci_autoconfig mmu/mmu32 mmu/mmu36 unix * * Loadable Object Path = /kernel * drv/arp hard link: strmod/arp mach/pcplusmp mach/corollary mach/compaq drv/bofi drv/nca drv/clone drv/cn drv/conskbd drv/consms drv/devinfo drv/i2o_bs drv/i2o_scsi drv/icmp hard link: strmod/icmp drv/icmp6 hard link: strmod/icmp6 drv/ip hard link: strmod/ip drv/ip6 hard link: strmod/ip6 drv/ippctl drv/ipsecah hard link: strmod/ipsecah drv/ipsecesp hard link: strmod/ipsecesp drv/iwscn drv/keysock hard link: strmod/keysock drv/llc1 drv/lofi drv/log drv/mm drv/openeepr drv/options drv/pci_to_i2o drv/poll drv/pseudo drv/ptc drv/ptsl drv/random drv/rts hard link: strmod/rts drv/sad hard link: strmod/sad drv/sgen drv/spdsock drv/st drv/sy drv/sysmsg drv/tcp hard link: strmod/tcp drv/tcp6 hard link: strmod/tcp6 drv/tl drv/udp hard link: strmod/udp drv/udp6 hard link: strmod/udp6 drv/wc genunix misc/busra misc/consconfig misc/des misc/fssnap_if misc/gld misc/hpcsvc misc/i2o_msg misc/ipc misc/kbtrans misc/krtld misc/md5 misc/pcicfg misc/pcihp misc/rpcsec misc/scsi misc/seg_drv misc/seg_mapdev misc/sha1 misc/strplumb misc/swapgeneric misc/terminal-emulator misc/tlimod misc/ufs_log drv/chs drv/dnet drv/elxl drv/ieef drv/iprb drv/ncrs drv/pcn drv/pcscsi drv/sd drv/spwr drv/pcmem drv/mega drv/pcic drv/pcs drv/pem drv/pcelx drv/xsvc drv/cpqncr drv/pcram drv/md misc/md_hotspares misc/md_mirror misc/md_notify misc/md_raid misc/md_sp misc/md_stripe misc/md_trans misc/kgss/gl_kmech_krb5 drv/pcser drv/hpfc drv/pe drv/asy drv/cmdk drv/objmgr misc/dadk misc/gda misc/snlb misc/strategy misc/sysinit drv/sk98sol drv/pcata drv/skfp misc/klmmod misc/klmops misc/nfs_dlboot misc/kgssapi misc/rpcsec_gss drv/adp drv/audioens misc/amsrc1 misc/audiosup misc/diaudio misc/mixer drv/cadp drv/cpqhpc drv/hid drv/hubd drv/scsa2usb drv/uhci drv/usb_ac drv/usb_as drv/usb_mid drv/usbprn misc/hidparser misc/usba exec/elfexec exec/intpexec fs/cachefs fs/fifofs fs/hsfs fs/lofs fs/mntfs fs/procfs fs/sockfs fs/specfs fs/tmpfs fs/ufs ipp/ipgpc sched/TS sched/TS_DPTBL strmod/atun strmod/authmd5h strmod/authsha1 strmod/bufmod strmod/connld strmod/dedump strmod/encr3des strmod/encrdes strmod/ldterm strmod/pckt strmod/pfmod strmod/pipemod strmod/ptem strmod/redirmod strmod/rpcmod hard link: sys/rpcmod strmod/timod strmod/tirdwr strmod/ttcompat strmod/tun sys/c2audit sys/doorfs sys/inst_sync sys/kaio sys/msgsys sys/pipe sys/pset sys/semsys sys/shmsys fs/nfs hard link: sys/nfs fs/autofs fs/udfs strmod/usb_ah strmod/usbkbm strmod/usbms strmod/hwc dacf/consconfig_dacf drv/i8042 drv/mouse8042 drv/symhisl drv/pci_pci drv/vgatext misc/nfssrv misc/acpi_intp misc/pcmcia ipp/dlcosmk ipp/dscpmk ipp/flowacct ipp/tokenmt ipp/tswtclmt misc/rsmops exec/coffexec * * Loadable Object Path = /usr/kernel * drv/rsm sched/FSS drv/winlock drv/pm drv/tnf strmod/u8koi8 strmod/u8lat1 strmod/u8lat2 drv/vol drv/dump drv/fssnap drv/kstat drv/ksyms drv/lockstat drv/logindmux drv/ptm drv/pts exec/javaexec fs/fdfs fs/namefs fs/pcfs fs/xmemfs sched/FX sched/FX_DPTBL sched/IA sched/RT sched/RT_DPTBL strmod/rlmod strmod/telmod sys/acctctl sys/exacctsys sys/sysacct drv/llc2 drv/sppp drv/sppptun hard link: strmod/sppptun strmod/spppasyn strmod/spppcomp * * System Configuration * swap files swapfile dev swaplo blocks free /dev/dsk/c0d0s1 102,1 8 1048936 1048936 * * Tunable Parameters * 3866624 maximum memory allowed in buffer cache (bufhwm) 2954 maximum number of processes (v.v_proc) 99 maximum global priority in sys class (MAXCLSYSPRI) 2949 maximum processes per user id (v.v_maxup) 30 auto update time limit in seconds (NAUTOUP) 25 page stealing low water mark (GPGSLO) 5 fsflush run rate (FSFLUSHR) 25 minimum resident memory for avoiding deadlock (MINARMEM) 25 minimum swapable memory for avoiding deadlock (MINASMEM) * * Utsname Tunables * 5.9 release (REL) sola node name (NODE) SunOS system name (SYS) Generic_112234-03 version (VER) * * Process Resource Limit Tunables (Current:Maximum) * 0x0000000000000100:0x0000000000010000 file descriptors * * Streams Tunables * 9 maximum number of pushes allowed (NSTRPUSH) 65536 maximum stream message size (STRMSGSZ) 1024 max size of ctl part of message (STRCTLSZ) * * IPC Messages module is not loaded * * * IPC Semaphores module is not loaded * * * IPC Shared Memory module is not loaded * * * Time Sharing Scheduler Tunables * 60 maximum time sharing user priority (TSMAXUPRI) SYS system class name (SYS_NAME)

Листинг 9.2. Файл sysdef


Как перезапустить зависшую систему


Если система безнадежно зависла, следует:

нажать Stop+A или L1+A (или другую комбинацию клавиш, если вы переопределили стандартные установки в /etc/default/kbd);дождавшись приглашения ok, дать команду sync для синхронизации файловых систем (записи кэшированных данных на диски);дождавшись сообщения syncing file systems... done, нажать Stop+A или L1+A еще раз;дать команду reset в ответ на приглашение ok;после перезагрузки нелишне проверить, в какой режим работы загрузилась система:

# who -r run-level 3 May 9 05:29 3 0 S

Если ответ вас удовлетворил, можно начинать работу.



Команда halt


Для немедленной остановки системы (подобно shutdown -y -g0) можно использовать команду1) halt. От shutdown она отличается тем, что не предупреждает интерактивно работающих пользователей о скорой остановке системы. Эту команду можно смело давать в однопользовательском режиме или для остановки сервера, на котором никто, кроме администратора, не работает интерактивно.

Команда halt перед остановкой выполняет запись кэшируемых данных на диск.



Команда poweroff


Команда poweroff переводит систему в режим выполнения 5 и эквивалентна init 5. Пользователи не оповещаются об изменении режима работы, скрипты завершения K* не выполняются, и в случае, если аппаратура компьютера поддерживает программное выключение питания, питание компьютера выключается.

Последняя функция на компьютерах x86 доступна не всегда (или недоступна вовсе), по крайней мере, ноутбук IBM ThinkPad 390X, который я использовал для эксперимента, без проблем выключался, работая под Windows XP и, даже не пытаясь выключаться под Solaris 9, выдавал такие же надписи об останове, что и по команде halt:

... syncing file systems... done Type any key to continue



Команда reboot


Команда reboot обычно используется для завершения работы в однопользовательском режиме и перехода к многопользовательскому. Эта команда выполняется быстрее, чем shutdown, потому что она не выполняет скрипты останова (/etc/rcN.d/K*) и не посылает никаких сообщений пользователям. Команда reboot выполняет запись кэшируемых данных на диск, так же, как и halt.

С помощью reboot можно передать ключи загрузчику среды OpenBoot, например, для изменения конфигурации таблицы устройств следует дать команду

reboot -- -rs

Как видно из примера, чтобы отделить ключи самой reboot от тех, что будут переданы загрузчику, перед ключами последнего ставятся два дефиса подряд.



Программа init


С помощью программы init систему можно перевести в любой режим работы, часто эта программа используется для перехода в однопользовательский режим или перехода из него в многопользовательский. Для этого дается команда

init режим_работы

Кроме описанных выше режимов работы, можно указать режимы a, b, c и q. Режимы a, b, c - это псевдорежимы, они существуют только для того, чтобы можно было с помощью init запустить отдельные программы, которые отмечены в /etc/inittab как соответствующие данным режимам. Команда

init q

вызывает перечитывание процессом init файла /etc/inittab. Следовательно, если вы изменили этот файл и хотите, чтобы изменения оказали немедленное влияние на систему, следует дать команду init q.

Программа telinit является символической ссылкой на init, и ее используют для передачи команд запущенной в данный момент программе init.

В ответ на команду init 1 вы увидите нечто вроде:

INIT: New run level: 1 Changing to state 1. Unmounting remote filesystems: /vol nfs done. System services are now being stopped. May 14 13:13:22 unknown /usr/sbin/vold[475]: problem unmounting /vol; Interrupted system call <тут что-то еще....> Killing user processes: done. Change to state 1 has been completed. Type control-d to proceed with normal startup, (or give root password for system maintenance):

Вывод, сопровождающий выполнение команды, приведен не полностью. Обратите внимание на последние две строки; здесь требуется либо указать пароль привилегированного пользователя root, либо нажать Ctrl-D, в последнем случае произойдет обычная загрузка в состояние initdefault.



Программа shutdown


Самый общий способ остановки системы - программа shutdown, она есть в любом варианте UNIX. В Solaris эта программа имеет следующий синтаксис вызова:

shutdown [-y] [-gпериод_ожидания] [-iрежим]

например

shutdown -y -g0

Эта команда выполняется только привилегированным пользователем для изменения режима работы системы. Обычно она применяется для перехода из многопользовательского режима (3) в другой режим.

По умолчанию, команда переводит систему в режим 0, то есть состояние, в котором безопасно отключать питание. Это состояние называется состоянием останова (shutdown state).

Команда посылает всем интерактивно работающим с системой пользователям предупреждающее сообщение о том, что система готовится к переходу в другой режим работы, и еще одно, окончательное сообщение, перед началом реальных действий по останову. Пользователи обязаны быстро завершить свои задачи после получения предупреждающего сообщения - на это у них по умолчанию есть одна минута. Если они проигнорируют предупреждение, их процессы будут принудительно завершены, а несохраненные данные потеряются. Программа shutdown берет стандартное значение периода ожидания после каждого из этих сообщений из файла /etc/default/shutdown, если он существует. Если shutdown не может найти файл или не может прочитать значение, она выдает предупреждение и устанавливает период ожидания в 60 секунд. По умолчанию, программа запрашивает подтверждение у запустившего ее администратора, прежде чем начинать остановку демонов и прекращение процессов. Ключи команды используются следующим образом:

-y - автоматически отвечает утвердительно на все запросы о желании перезагрузить систему, чтобы программа shutdown могла работать без вмешательства администратора;-gпериод_ожидания - позволяет администратору явно указать период_ожидания (в секундах);-iрежим - задает режим, в который будет переведена система после предупреждений, если они выдаются.

Файл /etc/default/shutdown используется для задания значений, специфичных для вашей системы.

Программа shutdown ведет себя по-разному в зависимости от количества интерактивно работающих пользователей. Если в системе работает несколько пользователей, выдаются предупреждающее и окончательное сообщение, а также запрос на подтверждение остановки системы тому, кто запустил программу shutdown. Если зарегистрирован только пользователь, запустивший команду shutdown, или если период ожидания задан равным нулю, предупреждающее сообщение не выдается.

Если указать ключ -y, то запрос на подтверждение не выводится, так как предполагается положительный ответ на него.

Помните, что систему всегда следует останавливать перед выключением компьютера, а пользователи должны завершить свои сеансы работы с файлами. В противном случае неизбежны потери данных.

При запуске Solaris автоматически начинают работать различные системные службы (демоны), и перед завершением работы системы они должны корректно закончить свою деятельность. Команда shutdown требует от демонов завершения, а также инициирует запись на диск всех данных из файлового кэша и демонтирование всех файловых систем.

Стоит отметить, что кроме неукоснительно корректного завершения работы системы с помощью shutdown или аналогичной по смыслу команды, есть еще один момент, о котором системный администратор должен помнить: стабильное электропитание. Если пьяный сантехник, ретивая уборщица или безмозглый помощник научены никогда не выдирать провода из розеток и всегда выполнять shutdown, это значит, что осталось установить надежную систему бесперебойного питания. При подключении UPS к компьютеру убедитесь, что он настроен так, чтобы выдавать сигнал бедствия компьютеру при отключении электропитания; получив такой сигнал, система немедленно запустит shutdown и ее работа завершится безболезненно. Конечно, для систем круглосуточной работы надо иметь UPS с запасом энергии батарей, достаточным для работы в течение всего времени восстановления питания.



Программы shutdown, init, poweroff, halt, reboot


Для перевода системы из одного режима в другой, в том числе и для ее остановки, следует использовать специально предназначенные для этого программы.

В Solaris есть несколько таких программ:

/usr/sbin/shutdown /sbin/init /usr/sbin/halt /usr/sbin/reboot /usr/sbin/poweroff Stop+A или L1+A

Программы /usr/sbin/shutdown, /sbin/init, /usr/sbin/halt выполняют завершение всех процессов в системе, записывают несохраненные данные на диск, и переводят систему в новый режим работы (в том числе и в состояние остановки).

Программа /usr/sbin/reboot выполняет все вышеперечисленное и затем переводит систему в режим, определенный как initdefault в /etc/inittab.

Команда /usr/sbin/poweroff обеспечивает переход в режим номер 5, т.е. она эквивалентна команде init 5.

Последняя команда (комбинация клавиш) доступна только в SPARC-системах, где соответствующие клавиши есть на клавиатуре, и посылаемый ими код отрабатывается как аварийный останов. Аварийный останов следует выполнять только в крайнем случае, так как при таком завершении работы системы все процессы прерываются немедленно, без всякой записи данных на диск, и последствия могут быть незавидными для тех, чьи данные не были сохранены.



Режимы работы системы


В одной и той же компьютерной системе может понадобиться выполнять совершенно разные типы задач. Например, на большом складе компании-поставщика бытовой техники центральный сервер управляет базой данных клиентов и их заказов. Эта работа ведется круглосуточно, за исключением короткой передышки в пятницу поздно вечером. В рабочее время на сервере запущены приложения, которые необходимы для обслуживания запросов: сервер базы данных, web-сервер, модули ядра, отвечающие за работу с сетью, и тому подобное. Во время короткой передышки в пятницу на сервере выполняется совершенно другая работа: полное резервное копирование базы данных и, если надо, установка нового ПО. Для этой работы важно, чтобы никто не обращался к серверу с запросами во время резервного копирования и модификации ПО, и такие приложения, как сервер базы данных, web-сервер, модули ядра, отвечающие за работу с сетью, следует выключить на время проведения еженедельного техобслуживания системы.

Для того чтобы системе было легче переключаться между разными наборами программ, которые используются для разных типов задач, была придумана концепция режимов работы системы. Любой UNIX ветви System V, в том числе и Solaris, может работать в одном из семи режимов (они нумеруются от 0 до 6). Каждый режим характеризуется своим назначением, которое определяет набор программ, выполняющихся в этом режиме. В Solaris, наряду с упомянутыми семью, используется и восьмой режим - s или S (режимы s и S - это одно и то же).

Режим работы системы (runlevel) иногда также называют состоянием (state) или уровнем выполнения. Набор программ, запускаемых в том или ином режиме, определяется содержимым файла /etc/inittab. В этом файле указываются стартовые скрипты, которые будут автоматически запускаться при переходе к каждому из уровней выполнения. Эти скрипты расположены в каталоге /etc, и из них вызываются другие скрипты, которые лежат в каталогах /etc/rcN.d. (N - число от 0 до 6 или символ S).

При переходе к режиму 0 выполняется /etc/rc0, к режиму 1 - /etc/rc1 и так далее. Ниже даны описания всех возможных режимов работы Solaris.

Режим 0.

Система останавливается, управление переходит к программе из ПЗУ (firmware) для компьютеров архитектуры SPARC, для компьютеров x86 - система останавливается и может быть перезагружена нажатием любой клавиши. В режиме 0 компьютер можно выключить без опасений за сохранность данных.

Режим 1.

Административный режим. Файловые системы, необходимые для многопользовательской работы, смонтированы, и можно использовать регистрационные имена, требующие доступа к многопользовательским файловым системам. Запущены некоторые демоны, однако пользователям не разрешено входить в систему. Режим 1 применяется для установки пакетов ПО.

Режим s, S.

Режим s (или S) называется однопользовательским. При переходе в это состояние все пользовательские процессы останавливаются, а файловые системы, необходимые для многопользовательской работы, демонтируются. После этого доступ к системе возможен только с консоли; регистрационные имена, требующие доступа к пользовательским файловым системам, употреблять нельзя. Этот режим применяется для установки или удаления программного обеспечения, резервного копирования, восстановления или проверки файловых систем. Система переходит в состояние s автоматически, когда файловая система /usr повреждена и не может быть восстановлена без вмешательства администратора. Набор файловых систем, смонтированных при работе системы в состоянии s, не всегда один и тот же; то, какие файловые системы смонтированы, зависит от метода перевода системы в состояние s и настроек системы.

Переход в режим s возможен даже при поврежденном или отсутствующем файле /etc/inittab, что невозможно для любого другого режима работы. При переходе в режим S из других режимов работы, файловые системы, уже смонтированные к этому моменту, остаются смонтированными, даже если предоставляются другими серверами в сети. Все процессы, запущенные ранее в многопользовательских режимах, завершаются. Завершаются также все процессы, имеющие записи в utmpx (т.е. запущенные от имени пользователей). Последнее означает, что процессы типа ttymon и других мониторов портов, запущенные системой SAC, тоже завершаются при переходе в режим S.

Режим 2.

Многопользовательский режим. Все процессы и демоны, необходимые для многопользовательской работы, запущены.

Режим 3.

Многопользовательский режим; кроме того, что разрешено в режиме 2, добавлен доступ к локальным ресурсам через сеть (поддерживается разделение каталогов с помощью NFS).

Режим 4.

Альтернативный многопользовательский режим. Предполагает иную, нежели в режимах 2 и 3, конфигурацию демонов и других программ для работы в многопользовательском режиме. Обычно не используется.

Режим 5.

Режим останова; операционная система останавливается, и, если это возможно, обеспечивается автоматическое выключение питания. Для автоматического выключения питания необходима аппаратная поддержка выполнения этой функции.

Режим 6.

Останавливает и перезагружает операционную систему в состояние, определяемое записью initdefault в файле /etc/inittab. При необходимости конфигурирует перед перезагрузкой новый загружаемый образ ядра операционной системы. Для пересборки ядра после модификации параметров ядра или добавления новых устройств следует выполнить команду

touch /reconfigure

перед перезагрузкой.



Сценарии запуска системы


В каталогах /etc/rcN.d лежат скрипты запуска системы, то есть те скрипты, которые запускают и останавливают отдельные приложения. Имена файлов в каталогах имеют вид KnnNAME или SnnNAME, где nn - это целое положительное число, а NAME - имя приложения (обычно - демона).

Файлы, начинающиеся с буквы S (start), - это скрипты для запуска приложения, файлы, начинающиеся с K (kill) - для завершения работы приложения. Номер nn определяет порядок запуска скриптов - вначале запускаются те, что имеют меньший порядковый номер.

При переходе в тот или иной режим работы системы сначала выполняются скрипты останова приложений, а затем - скрипты запуска приложений того режима, в который происходит переход. При старте системы, естественно, выполняются скрипты запуска приложений режима initdefault.

То, какие именно скрипты запускать, описано в файле /etc/rcN (N может принимать значения от 0 до 6 и s), который, собственно, и вызывается процессом init. Файлы /etc/rcN являются символическими ссылками на файлы /sbin/rcN (см. файл /etc/inittab выше).

Так, если initdefault =3, а каталог /etc/rc3.d содержит нижеуказанные скрипты, то первым выполнится S13kdc.master, затем S14kdc, и так все по порядку (последним будет S90samba):

README S13kdc.master S14kdc S15nfs.server S16boot.server S34dhcp S50apache S76snmpdx S77dmi S80mipagent S81volmgt S89sshd S90samba



Среда OpenBoot. Команда boot


В системах с архитектурой SPARC после процедуры самотестирования компьютера (POST), которую выполняет firmware, запускается загрузчик, предоставляющий интерфейс среды OpenBoot. В этой среде можно вводить команды в командной строке в ответ на приглашение среды. Приглашение среды представляет собой слово

ok

Здесь мы рассмотрим команду boot среды OpenBoot.

Синтаксис команды boot предполагает возможность указания загрузочного устройства и дополнительных аргументов:

boot [device] [arguments]

Если дать команду boot без параметров, то будет выполнена загрузка с устройства по умолчанию. По умолчанию загрузка производится с того устройства, которое указано в переменной boot-device или diag-device в ПЗУ (NVRAM variable). Если система запускается в режиме диагностики, вместо переменных boot-device и boot-file используются diag-device и diag-file.

Аргументы команды boot могут быть многострочными, они не анализируются загрузчиком OpenBoot, а передаются вторичному загрузчику как есть. Если команде boot переданы какие-нибудь аргументы, содержимое переменных boot-file и diag-file игнорируется. Например, если дана команда

boot -s

то подстрока -s расценивается как аргумент, а переменные boot-file и diag-file не принимаются во внимание.

Если команды

boot net

и

boot cdrom

если они даны без аргументов, то они будут использовать содержимое переменных boot-file и diag-file как путь к файлу ядра. Стало быть, если boot-file содержит имя 64-разрядного ядра, а вы пытаетесь загрузиться с CD-ROM командой boot cdrom, то загрузка не состоится, если на CD-диске имеется только 32-разрядное ядро.

Для загрузки в специфическом режиме следует указывать команде boot соответствующие аргументы, в ответ на приглашение ok вводится команда:

boot -as - загрузка ядра, используемого по умолчанию, в однопользовательском режиме;boot kernel/unix -as - принудительная загрузка 32-разрядного ядра в однопользовательском режиме (для принудительной загрузки указывается имя файла явным образом);boot kernel/sparcv9/unix -as - принудительная загрузка 64-разрядного ядра в однопользовательском режиме (для принудительной загрузки указывается имя файла явным образом).

Для более детального изучения команды boot в вашей системе следует использовать man boot; помните, что на некоторых платформах, в зависимости от firmware, могут наблюдаться отклонения от схемы, описанной здесь и в документации.



Включение и выключение оборудования


Помните, что выключать компьютер можно только после синхронизации файловых систем, иначе могут возникнуть потери данных и ошибки в файловой системе.

При включении компьютера следует соблюдать такой порядок действий:

вначале включить периферийные устройства (принтеры, внешние диски и т.п.);включить монитор;включить системный блок (бывает, что он включается одной кнопкой с монитором, это допустимо).



Загрузка через сеть с использованием DHCP


При загрузке по сети с использованием DHCP начальный загрузчик из ПЗУ посылает широковещательный запрос, в котором сообщает MAC-адрес своего компьютера и его архитектуру, запрашивая в ответ IP-адрес, параметры загрузки и настройки сети. После получения ответа (детали протокола DHCP см. в лекции 2 курса "Администрирование ОС Solaris") начальный загрузчик загружает inetboot через сеть, inetboot загружает ядро, которое, в свою очередь, загружает необходимые ему файлы через сеть, после чего выгружает inetboot. Стартовые скрипты запускают dhcpagent, который выполняет оставшуюся часть настроек по DHCP.



Загрузка через сеть с использованием RARP/bootparams


Начальный загрузчик из ПЗУ выполняет ARP-запрос (подробнее об ARP-запросах см. лекции 2 курса "Администрирование ОС Solaris") и, после получения ответа, посылает широковещательный запрос в локальную сеть по протоколу TFTP для загрузки программы inetboot из сети. Загрузив с ответившего TFTP-сервера программу inetboot, загрузчик передает ей управление, а она отправляет еще один ARP-запрос, после чего находит файловую систему в сети, с которой следует произвести загрузку ядра. Для этого inetboot использует протокол bootparams (см. man bootparams для получения детальной информации о протоколе). После того как файловая система найдена, с нее по протоколу NFS загружается ядро и ему передается управление.



Загрузка по сети


Загрузка по сети может идти с использованием DHCP или RARP/bootparams, в зависимости от настроек, записанных в ПЗУ, и реальной конфигурации сети (для настройки по DHCP в сети должен быть доступен DHCP-сервер).

Команду boot среды OpenBoot (иначе говоря, командной строки firmware) можно использовать для задания протокола загрузки явным образом:

boot net:rarp boot net:dhcp

или полагаясь на выбор сценария по умолчанию (тогда сценарий не указывается):

boot net

При этом загрузка осуществляется через тот интерфейс, для которого определен псевдоним net.



Загрузка с диска


При загрузке с диска разделяют два этапа: начальную загрузку и вторичную. Начальная загрузка заключается в том, что программа загрузки из ПЗУ считывает вторичный загрузчик с загрузочного раздела диска, из блоков с первого по пятнадцатый.

Если имя файла ядра указано не как полное имя файла (начинающееся с символа /), то такое имя расценивается как относительное и вторичный загрузчик ищет ядро в каталоге, соответствующем аппаратной платформе компьютера. Тогда путь к ядру точно будет лежать через каталог /platform/platform-name. Для многих компьютеров SPARC после этого выполняется поиск в каталоге /platform/hardware-class-name. Если указано полное имя файла, загрузчик будет пытаться загрузить в точности тот файл, что указан. После загрузки файла ядра в память загрузчик передает ему управление.

Если имя файла ядра не указано, и из других настороек непонятно, какое ядро следует загружать, загрузчик сам решает, какое ядро требуется, основываясь на том, какое ПО установлено в системе, на известных свойствах аппаратуры и firmware и на записях в файле политики загрузки boot.conf. О местоположении и содержимом этого файла будет сказано ниже, в разделе "Файлы и каталоги, используемые при загрузке".



Загрузка Solaris 9 на компьютерах SPARC


После включения компьютера записанное в ПЗУ программное обеспечение (firmware) запускает процедуру самотестирования компьютера (power-on self-test - POST). То, как проходит эта процедура, зависит от конфигурации и модели компьютера.

Если тест прошел нормально, то программа автозагрузки пытается загрузить систему, используя имя устройства и имя файла ядра, записанные в ПЗУ.

Эти параметры могут быть изменены программой eeprom при интерактивной работе с Solaris из командной строки или после остановки системы - из командной строки ok, которую выдаст firmware по завершении останова системы.

Программа, которая запускается после начального загрузчика, называется ufsboot, если загрузка происходит с диска, или inetboot, если выполняется загрузка по сети.




На компьютерах x86 загрузка состоит из двух разных этапов: начальной загрузки и вторичной загрузки. Начальная загрузка выполняется BIOS системной платы и BIOS контроллеров. После процедуры POST начальный загрузчик пытается прочесть первый сектор с дискеты, компакт-диска или жесткого диска, или, если эта функция поддерживается, загрузить вторичный загрузчик через сеть. После того как вторичный загрузчик записан в оперативную память, ему передается управление. Начальный загрузчик работает в режиме real mode процессора, а вторичный - в защищенном режиме (32-bit protected mode).

Вторичный загрузчик называется boot.bin и способен считать ядро с диска из файловой системы UFS, компакт-диска или через сеть с использованием NFS. Вторичный загрузчик запускает программу DCA (device configuration assistant), которая определяет физические устройства компьютера. При этом системный администратор может вмешаться в процесс определения устройств, если DCA их не может верно определить автоматически.

После возвращения управления от DCA вторичный загрузчик выполняет скрипт /etc/bootrc, который управляет дальнейшим процессом загрузки. Обычный /etc/bootrc предлагает администратору ввести символ b для загрузки с определенными ключами и аргументами, символ i для запуска интерактивного командного интерпретатора, и любой другой символ - для загрузки ядра с установками по умолчанию.


Замечание о загрузке систем UltraSPARC


Некоторые старые компьютеры SPARC технически способны работать с 64-битной версией Solaris, но им может требоваться обновление firmware для того, чтобы эта работа стала в действительности возможной. Если вы обладаете как раз такой системой и установили 64-битный Solaris, то при загрузке этот факт будет обнаружен и вы получите сообщение о том, что firmware следует обновить. вслед за этим загрузчик выберет 32-разрядное ядро, и загрузка продолжится.

Процессоры UltraSPARC-1 с частотой 200 MГц и меньше имеют ошибку в микрокоде, из-за которой при запуске на компьютерах с такими процессорами 64-битной программы может произойти останов процессора из-за выполнения определеной комбинации команд. Чтобы избежать этой неприятности, при работе на таких компьютерах Solaris при загрузке выбирает 32-битное ядро, так как 64-битное приложение не сможет запуститься при работе с 32-разрядным ядром.

Компания Sun утверждает, что комбинация команд, вызывающая нештатную остановку процессора, не может быть сгенерирована компилятором языка высокого уровня, и более того, даже практически не может встретиться в написанных на ассемблере программах, если только эта программа не написана специально для того, чтобы вызвать эту ошибку.

В тех системах, где вероятность запуска такой "зловредной" программы мала, а пользователи работают только с обычными приложениями, полученными из надежных источников или собранных из исходных текстов языка высокого уровня типа С, администратор может явным образом потребовать у загрузчика выполнять загрузку 64-разрядного ядра при старте системы. Для этого надо изменить файл политики загрузки /platform/platform-name/boot.conf:

ALLOW_64BIT_KERNEL_ON_UltraSPARC_1_CPU=true



Запуск и останов: различия между Solaris и другими UNIX


Прежде всего напомним, что Solaris относится к ветви System V, и поэтому процедуры его запуска и останова, а также файлы конфигурации и системные скрипты, используемые для этих процедур, в корне отличаются от таковых в системах BSD. Здесь не рассматриваются системы BSD, для изучения отличия между System V и BSD-системами имеет смысл обратиться к книге [1] или другой литературе, в том числе к источникам в Интернете.

Solaris отличается также от собратьев по ветви System V наличием специального режима работы системы, который называется s или S. Ниже этот режим описан подробнее. В большинстве систем System V остальные семь режимов работы (0-6) имеют такое же назначение, как и в Solaris. Некоторые системы, например, многие из систем Linux, имеют несколько иную структуру каталогов стартовых системных скриптов. Так, в Solaris скрипты находятся в /etc/rc0.d, /etc/rc1.d и т.д., а в Linux - в /etc/rc.d/rc0/, /etc/rc.d/rc1/ и т.д. Однако для того, чтобы уточнить местоположение этих скриптов в любой из систем System V, достаточно изучить man init.

Кроме того, Solaris обладает самой большой коллекцией программ для изменения режима работы системы: shutdown, reboot, halt, poweroff, init. В других системах не всегда есть полный набор этих программ, однако в системах System V обязательно присутствуют программы init и shutdown. Они всегда имеют одинаковое назначение, независимо от названия и поставщика ОС, хотя их ключи могут несколько отличатьсядруг от друга.

Повторим еще раз: общие принципы загрузки и останова системы очень схожи для всех систем UNIX ветви System V, об особенностях вашей системы всегда можно узнать из man init и man shutdown.



Запуск процесса init


Процесс init запускается ядром сразу после монтирования файловых систем из /etc/vfstab. После этого init осуществляет переход в тот режим выполнения, который ему указан как initdefault в файле /etc/inittab. Переход к этому режиму выполнения фактически означает запуск всех программ, которые перечислены в этом файле для указанного режима выполнения. Вот обычный файл /etc/inittab:

Листинг 9.3. Файл /etc/inittab (html, txt)



История команд


Все командные процессоры запоминают введенные пользователем команды (их список называется историей команд). Во время сеанса работы командный процессор хранит историю команд в памяти, а по окончании работы записывает их в файл на диск. Файл истории команд хранится в домашнем каталоге пользователя. В sh, csh, tcsh он называется ~/.history, в bash - ~/.bash_history, в ksh - ~/.shhistory, а в бесплатной версии Korn Shell (public domain Korn shell - pdksh) его по умолчанию нет вообще.

Многие командные процессоры позволяют повторить вызов ранее введенной команды по ее номеру или начальным буквам. О том, как это делать, подробнее сказано ниже в разделе "Повторение и модификация ранее введенных команд".

Имейте в виду, что по умолчанию файл истории команд может быть доступен для чтения не только тому, кто вводил команды, но и другим пользователям. Чтобы не сделать систему уязвимой, следует избегать ввода каких бы то ни было паролей в командной строке. Например, возможно вызвать браузер lynx или программу доступа к серверу баз данных mysql, указывая пароль в командной строке:

lynx ftp://user:password@URL mysql -u root -p password

Так как эти команды сохранятся в файле истории вместе с другими, кто-то потом сможет прочесть их и узнать какие-то из ваших паролей. Файл истории команд ограничен по размеру. По умолчанию, bash хранит 500 команд, tcsh - 1000, csh - 100, sh - в зависимости от версии. Часто sh не создает файл .history вовсе, и дает доступ только к командам, которые были введены в течение текущего сеанса работы с ним. Можно изменить число хранимых команд, указав иное значение переменной, в которой оно хранится.

Таблица 10.4.

shellпеременнаязначение по уполчанию
shHISTSIZEне определено
cshhistory100
kshHISTSIZE128
bashHISTFILESIZE500



Язык csh


В операторах циклов языка csh можно использовать команды break (прерывание цикла, управление передается за конец цикла) и continue (передача управления на начало цикла, переход к следующей итерации) так же, как и в языке sh.

Языки sh и csh отличаются синтаксисом операторов и некоторыми командами. Помните, что:

в csh имена системных переменных среды окружения пишутся буквами нижнего регистра;в csh нет оператора until; почти все операторы называются иначе, чем в sh.

В csh и tcsh есть свои правила вычисления логических выражений для того, чтобы выяснить истинность или ложность условия в операторах цикла и ветвления. Команда test есть в любом языке, независимо от типа командного процессора:

if (условие)команда

или if (условие) then команды else if (условие) then команды else команды endif

Допускается любое число вложенных операторов elseif, при этом нужен только один оператор endif.

Отступы в операторе ветвления не важны, но операторы else и endif должны начинаться с новой строки, оператор if должен следовать за else или начинаться с новой строки.

Оператор множественного ветвления в csh называется switch:

switch (строка) case строка1: команды breaksw case строка2: команды breaksw default: команды breaksw endsw

Опреатор switch в csh выполняется подобно оператору switch из языка С, команда breaksw передает управление за оператор endsw.

Оператор while действует так же, как while в sh, однако синтаксис у него немного иной:

while (условие) команды end

Оператор цикла for в csh назвали foreach, подобно одноименному оператору из Perl:

foreach имя_переменной (список) команды end

Если оператор foreach вводится в командной строке, то csh на каждой новой строке выводит приглашение "foreach?" Это означает, что ввод оператора еще не закончен и его можно продолжать, ввод завершается финальным словом end в начале строки.

Для ввода информации в скриптах на языке csh используют конструкцию $< (подстановка строки из входного потока):

echo " Enter your name:" setenv name $< echo "Name is $name"



Язык написания скриптов


В командных процессорах используются всего два типа языков. Это sh-подобный язык и csh-подобный язык. Первый тип поддерживается в sh, ksh, bash. Второй - в csh и tcsh. Язык sh более удобен и стандартен, на нем написаны практически все скрипты во всех системах UNIX, включая стартовые скрипты системы. Язык csh по синтаксису ближе к языку программирования С, но используется для скриптов реже. Однако в некоторых случаях программное обеспечение включает в себя скрипты на языке csh, поэтому здесь мы разберем вкратце конструкции обоих языков.

Первой строкой любого скрипта должна быть строка, содержащая управляющий комментарий специального вида:

#!полное_имя_командного процессора

например

#!/bin/sh

Этот комментарий требует выполнить скрипт с помощью указанного командного процессора. По умолчанию скрипт выполняется в среде /bin/sh, даже если он запущен в среде другого командного процессора. Если вы работаете в tcsh и хотите, чтобы ваши скрипты запускались в tcsh, следует обязательно указать полный путь к tcsh в управляющем комментарии.



Язык sh


В языке sh существуют операторы ветвления и циклов. Ниже дано описание этих операторов. В нем жирным шрифтом выделены ключевые слова. Конструкция "команды" подразумевает одну или несколько команд командного процессора или вызовов программ, которые отделяются друг от друга разделителями (точкой с запятой или переводом строки). При вводе многострочных операторов в командной строке, командный процессор начинает новую строку приглашением "продолжение команды" (его вид определяется значением переменной среды окружения PS2 или prompt2).

В операторах циклов допустимы команды break (прерывание цикла, управление передается за конец цикла) и continue (передача управления на начало цикла, переход к следующей итерации). Эти команды действуют одинаково в любых командных процессорах, так как они реализованы и в языке sh, и в языке csh.

Оператор ветвления if:

if условие then команды else команды fi

В bash, ksh и новых версиях sh возможна конструкция elseif (вложенное ветвление):

if условие then команды elseif условие then команды fi else команды fi

Оператор множественного ветвления case:

case значение_переменной in значение1) команды; break; значение2) команды; break; значение3) команды; break; *) команды; esac

Знак "звездочка" (*) означает "все остальные значения", т.е. если значение переменной не равно ни значению1, ни значению2, ни значению3.

Операторы цикла while (выполнять, пока условие истинно) и until (выполнять до тех пор, пока условие станет истинным):

while условие do команды done

until условие do команды done

Все эти операторы содержат неотъемлемый элемент, обозначенный нами как условие. Это - вызов любой команды (в том числе другой скрипт или конвейер), возвращающей код завершения.

Условие считается истинным, если код завершения равен нулю, и ложным - если код завершения не равен нулю. Любая программа в UNIX возвращает код завершения: нулевой - в случае успешного выполнения и ненулевой - в противном случае. Значения кодов завершения программ можно выяснить с помощью руководства к ним, например, man.

Для проверки условий, относящихся к объектам файловой системы, применяется программа test. В некоторых командных интерпретаторах есть встроенная команда test , иногда test - это отдельная программа. С помощью test часто проверяется наличие файла или каталога в файловой системе:


if test -e имя_файла then echo <файл существует!>

Язык sh допускает конструкцию [ ] вместо команды test:

if [ -e имя_файла ] then echo <файл существует!>

Эта конструкция эквивалентна вышеприведенной.

С помощью test и [ ] можно проверять различные условия, полный список которых содержится в man test или man sh, man bash.

Некоторые программы всегда возвращают код завершения ноль. Это легко использовать для организации бесконечных циклов. Такие циклы могут понадобиться для перезапуска процессов, имеющих тенденцию к неожиданному и ненужному завершению. Например, так можно запускать процесс pppd для соединения с провайдером по выделенной или коммутируемой линии:

while sleep 10 do /usr/sbin/pppd done

Программа sleep всегда будет возвращать ноль, так что цикл никогда не прервется и будет исправно запускать pppd всякий раз, как только он завершится, например, из-за ошибки связи. Десять секунд ожидания добавлены просто для того, чтобы было время переждать неблагоприятную ситуацию, из-за которой произошла ошибка.

В Solaris и других системах System V такое применение менее полезно, чем в BSD-системах, так как того же эффекта можно добиться, указывая вызов pppd в /etc/inittab с указанием режима запуска respawn (запустить, если завершится).

Оператор for (цикл повторяется для каждого значения из списка):

for имя_переменной in список do команды done

Оператор цикла for используется особенно часто, например, для однотипной модификации нескольких файлов сразу. Предположим, надо во всех файлах *.html в текущем каталоге изменить ссылку на файл с фотографией:

for i in *.html do sed 's/otello.gif/dezdemona.gif/g' $i >tmp mv -f tmp $i done

Поскольку sed не меняет файл, а лишь выдает измененный текст в свой выходной поток, приходится перенаправлять вывод во временный файл tmp (назовите ваш файл по вкусу, от названия ничего не зависит) и затем переименовать tmp в файл с тем же именем, что у исходного файла. В момент переименования старый файл, естественно, исчезнет.

При вызове sed: следует писать именно $i, а не просто i, чтобы командный процессор подставил в командную строку значение переменной i, а не символ i.

Сразу перенаправить вывод в файл, имя которого указывается как $i, нельзя, поскольку перенаправление вывода в существующий файл вызовет уничтожение его прежнего содержимого. Это значит, что одновременное перенаправление ввода и вывода из/в один и тот же файл недопустимо.

Программе mv дается ключ -f, который требует от нее выполнить работу, не задавая вопросов типа "а вы действительно хотите уничтожить файл?"

Для вывода информации в sh принято использовать команду echo. Эта команда печатает в стандартный выходной поток свои аргументы, а в конце вывода выполняет перевод строки.

Команда

echo -n строка

выводит строку и не добавляет перевод строки в конце.

Для ввода информации в скриптах на языке sh используют оператор read:

read name echo "Name is $name"

Язык, реализованный в вашем командном процессоре, может быть богаче, чем описанный здесь минимальный стандарт. Для получения дополнительной информации обратитесь к man по вашему командному процессору.


Кэширование имен выполняемых файлов


Командные процессоры csh и tcsh кэшируют сразу после начала работы список выполняемых файлов из каталогов, указанных в переменной path, поэтому при изменении значения этой переменной или при добавлении новых исполняемых файлов в указанные в ней каталоги следует выполнять команду rehash, чтобы командный процессор обнаружил новые каталоги и команды. Без этой команды новые программы будут недоступны, их придется вызывать по полному имени файла.



Перечень спецсимволов


Как уже говорилось, все командные процессоры воспринимают некоторые символы как служебные, придавая им специальное значение при разборе командной строки. Выше рассматривались спецсимволы, связанные с указанием конкретных конструкций. Как было показано, многие служебные символы интерпретируются разными командными процессорами одинаково, хотя бывают и исключения. Основные спецсимволы приведены в табл. 10.6.

Таблица 10.6. Специальные символы командных процессоров

командный процессоросновные спецсимволы
sh$ * ? \ ` ' " [ ] < > &
csh$ * ? \ ` ' " ! ^ { } [ ] ! % < > &
ksh$ * ? \ ` ' " ! ^ { } [ ] < > &
bash$ * ? \ ` ' " ! ^ { } [ ] % < > &

Для ввода специальных символов без учета их специального смысла (например, для вычисления произведения двух чисел выполняется команда expr 2 \* 2, надо передать программе expr просто звездочку, не расшифровывая ее специальное значение для командного процессора) в командной строке предваряйте их символом экранирования \ или заключайте в кавычки или апострофы. Кавычки отличаются от апострофов тем, что они экранируют от интерпретации все специальные символы, за исключением `, $ и \, а апострофы экранируют абсолютно все специальные символы.



Переменные среды окружения


Как отмечалось в лекции 7, каждый процесс имеет свою среду окружения - специальную область, в которой хранятся имена переменных и их значения. Если нужно использовать значение переменной в командной строке, применяется конструкция

$имя_переменной

Например, echo $TERM выведет на экран значение переменной TERM. Пользователь может определить свои собственные переменные. Новая переменная появляется, как только вы даете команду присвоить значение несуществующей переменной. Переменная не имеет типа, так как считается, что все переменные имеют тип "строка". При этом если попытаться выполнить арифметическую операцию с переменными, имеющими значение неких чисел, то такая строка будет преобразована в число, число использовано в операции и результат преобразован обратно в строку.

Попробуйте:

i=2 j=3 expr $i \* $j

Присвоение переменной значения во всех командных процессорах, кроме csh, выполняется командой

VAR=value

В csh команда иная:

set VAR=value

или

setenv VAR value

Переменные со специальными названиями типа DISPLAY, TERMINFO и т.п. используют программы, которые проверяют свою среду окружения на наличие таких переменных и их значений. Поведение таких программ может изменяться в зависимости от значения переменных.

Переменные могут экспортироваться, т.е. передаваться от процессов-родителей процессам-потомкам. Для экспорта переменной надо дать команду

export имя_переменной

Если надо удалить переменную среды окружения, можно присвоить ей пустое значение (это неравнозначно удалению, но иногда этого достаточно), а можно удалить ее вовсе командой unset.

В tsch есть возможность создавать переменные только для чтения, без права изменения значений, для этого служит команда

set -r имя=значение

Кроме того, в tcsh можно присвоить переменной значение в виде списка слов, к которым потом можно обращаться по номеру слова, начиная с 1:

set var=(hello world) echo {$var[1]} hello echo {$var[2]} world

Для вывода на экран списка всех переменных с их значениями надо дать команду set без параметров.



Подстановка имен файлов. Шаблоны


При запуске программ из командной строки часто требуется передать им в качестве аргументов одно или несколько имен файлов. Эти имена удобно задать шаблоном - например, /var/log/messages.?, что означает все файлы из каталога /var/log, имена которых начинаются на messages., а завершаются любым символом. Любой командный процессор умеет подставлять в командную строку имена файлов, соответствующие шаблону:

ls -l /var/log/messages.?

Символ "?" трактуется командным процессором как шаблон, которому соответствует один любой символ.

Обратите внимание на то, что командный процессор не понимает регулярных выражений. Его шаблоны похожи на регулярные выражения, но это - две совершенно разные вещи. Для обработки регулярных выражений в любом приложении используется стандартная функция regex, а шаблоны имен файлов командный процессор обрабатывает по-своему.

Командный процессор распознает и интерпретирует следующие символы в шаблонах (такие символы называются метасимволами, metasymbols или wildcards):

*любая подстрока, в том числе пустая.
?один любой символ.
[...]один любой символ из списка (например, [avgf]) или диапазона (например, [a-z]).

Порядок подстановки имен файлов по шаблону таков: вначале командный процессор находит все файлы, имена которых соответствуют шаблону, а затем подставляет имена всех этих файлов через пробел в строку в то место, где был написан шаблон.

Таким образом, если в текущем каталоге есть файлы money.c, money.bak, money.obj и wallet.x, то команда

ls -l mon*

будет раскрыта в

ls -l money.c money.bak money.obj



Подстановка результата выполнения


Иногда возникает необходимость отыскать в системе файлы по некоему признаку и со всеми этими файлами выполнить одинаковое действие. Например, во всех файлах *.html заменить подстроку Siemens на Nixdorf. Если это требуется сделать только для файлов, лежащих в одном каталоге, то задача решается достаточно просто. Здесь мы приведем пример скрипта для Bourne Shell, но аналогичный скрипт легко написать и для других командных процессоров:

for i in *.html do sed 's/Siemens/Nixdorf/g' <$i >tmp mv tmp $i done

Переменная i последовательно принимает значения из списка, т.е. на каждой итерации цикла она имеет разное значение, список будет содержать имена всех файлов текущего каталога, соответствующих шаблону *.html.

Команда sed обеспечивает замену всех вхождений Siemens на Nixdorf, причем во входной поток sed перенаправляется содержимое очередного файла, в зависимости от значения переменной i. Результат направляется в файл tmp, а команда mv обеспечивает переименование файла tmp в нужное имя, для замены старого файла из списка *.html новым.

Что делать, если такую процедуру надо проделать со всеми файлами *.html всего дерева каталогов, начиная с текущего каталога?

В UNIX есть уникальная возможность, которая реализована в любом командном процессоре : можно "вложить" одну команду в другую так, чтобы вначале выполнилась одна, а затем результат ее выполнения был подставлен в командную строку для вызова второй команды.

Итак, мы хотим найти все файлы *.html в поддереве файловой системы, начиная с текущего каталога.

Используем find для поиска:

find . -name "*.html"

Теперь воспользуемся конструкцией "подстановка результата выполнения" и перепишем наш скрипт для замены подстрок:

for i in ` find . -name "*.html" ` do sed 's/Siemens/Nixdorf/g' <$i >tmp mv tmp $i done

Команда, заключенная в ` ` (обратные апострофы), выполняется первой, а результат ее выполнения подставляется в командную строку. Затем командная строка запускается на выполнение.



Повторение и модификация ранее введенных команд


Иногда бывает удобно повторить команду, которую вы недавно уже вводили; особенно это помогает при вводе длинных команд с одинаковыми аргументами. В тех случаях, когда повторяемая команда должна немного отличаться от оригинала, следует модифицировать запись о ранее введенной команде и запустить на выполнение свежий вариант.

Например, введя

lyxn -p proxy.spb.edu:3128 www.macropulos.cam.ac.uk

вы получите в ответ "command not found", потому что, собираясь запустить lynx, вы допустили опечатку в имени программы. Не повторять же теперь ввод всей длинной строки! Если бы опечатка была в конце строки, можно было бы вызвать строку с предыдущей командой клавишей "стрелка вверх", но здесь опечатка в начале строки, и после вызова выполненной строчки придется еще двигать курсор в ее начало. Есть более короткий вариант, доступный в csh, tcsh и bash:

^xn^nx

Эта конструкция требует у командного процессора повторить предыдущую команду, заменив первой вхождение подстроки xn на nx. И это все!

В csh, tcsh, bash есть и другие средства модификации командной строки. Они перечислены ниже:

!n (n - число) повтор n-ной команды из истории команд1);!! повтор последней команды;!str выполнение последней команды, начинающейся на str.

Командные процессоры csh и tcsh по-разному интерпретируют конструкцию !nstr, например, `!67r'. Для csh это - команда номер 67, в конец которой добавляется r перед выполнением, а для tcsh это - последняя начинающаяся на 67r команда. Такой синтаксис введен в tsch для удобства повторения команд, имена которых начинаются с цифр. Чтобы заставить tcsh вести себя подобно csh, нужно перед числом поставить обратный слэш, экранирующий его специальное значение: `!\6\7r'.

В bash повторение команд выполняется так же, как и в csh. Дополнительно можно использовать клавиши "вверх" и "вниз" для переходов между командами, введенными раньше или позже.

В ksh для повторения команд используют встроенную команду r, а в sh - команду fc, при этом в sh можно вызвать только такую команду, которая была введена в текущем сеансе, потому что sh не ведет файл истории.



Предопределенные переменные


Предопределенные переменные содержатся в среде окружения командного процессора независимо от установок, которые может сделать пользователь в стартовых скриптах. Имена предопределенных переменных среды окружения во всех командных процессорах, кроме csh (и, в некоторых случаях, tcsh), пишутся символами верхнего регистра: PATH, USER, TERM, PS1, PS2.

В именах переменных среды окружения используются буквы латинского алфавита. пользовательские, добавленные по ходу работы переменные в скриптах принято называть именами из символов нижнего регистра для того, чтобы отличать переменные, введенные разработчиком системы, от тех, что вводит пользователь или требует прикладная программа.

В любых командных процессорах обязательно заранее определены переменные, указанные в таблице 10.5.

Таблица 10.5. Предопределенные переменные

ПеременнаяСмысл
HOMEдомашний каталог пользователя
SHELLтекущий shell
PS1вид приглашения shell'a
PS2вид приглашения "продолжение команды"
TERMтип терминала пользователя
USER или LOGNAMEимя пользователя
PATHсписок каталогов, в которых надо искать исполняемый файл, когда пользователь запускает программу, указывая только ее имя, но не путь. Каталоги разделяются двоеточиями

С другой стороны, многие другие переменные определяются не во всех командных процессорах. Посмотреть список всех переменных среды окружения обычно можно по команде

set

Любой скрипт может быть вызван с аргументами, которые в скрипте называются позиционными параметрами. К аргументам с первого по девятый следует обращаться как к $1..$9. Значение $0 - это имя самого скрипта, по которому его вызвали. Один и тот же скрипт может быть вызван с разными именами, например, если с ним установлены символические связи (symbolic links).

Команда shift n (n - положительное или отрицательное смещение) позволяет двигать "окошко" $1..$9 по всему массиву аргументов скрипта вперед и назад, если аргуменов больше девяти. Shift без параметров эквивалентен shift 1. В csh shift умеет сдвигать "окно" только на одну позицию вперед.

Кроме вышеописанных переменных обычно определены следующие:

ПеременнаяСмысл
$номер процесса текущего shell'a
*все позиционные параметры
_последняя вызванная команда
1,2,..9один позиционный параметр
?число позиционных параметров



Псевдонимы команд


Псевдонимы - это сокращения для часто используемых длинных команд или их последовательностей. Если вы часто делаете однотипные опечатки при вводе команд, можно создать такие псевдонимы, чтобы команда с опечаткой была псевдонимом правильной команды, например:

alias telent telnet

Создать псевдоним очень просто:

alias псевдоним команда

Команда может быть последовательностью команд с ключами и аргументами, тогда ее следует заключить в апострофы:

alias ll 'ls -l'

Такая команда приведет к тому, что каждый раз при вводе ll командный процессор будет фактически выполнять команду

ls -l

Синтаксис определения псевдонимов в разных командных процессорах разный. Псевдонимы обычно определяются в стартовых файлах.

Синтаксис команд alias:

командный процессор команда alias ключ для экспорта sh alias ll='ls -l' csh alias ll 'ls -l' ksh alias ll='ls -l' -x bash alias ll='ls -l'

Так же, как и переменные среды окружения, псевдонимы могут экспортироваться, т.е. передаваться "по наследству" запускаемым из данного сеанса работы другим командным процессорам. Для этого используются ключи команды alias. Команда alias является встроенной командой командного процессора.

Отмена назначенного псевдонима выполняется командой

unalias псевдоним



Работа с заданиями


Работая в режиме командной строки, вы можете запустить несколько программ одновременно, например, организовав конвейер. Совокупность таких одновременно запущенных из среды командного процессора процессов называется заданием.

Задание можно приостановить, потребовать его продолжения или завершить его. Задание может выполняться как в фоновом режиме, так и в интерактивном. Для управления заданиями большинство командных процессоров (точнее, все кроме Bourne Shell) имеют встроенные команды: jobs, fg, bg.

Посмотреть список запущенных ранее заданий можно с помощью команды jobs. Для вывода идентификаторов (PID) процессов, входящих в задание, следует использовать команду

jobs -l

Например, запускаем программу find для поиска файлов *.gif, список найденных файлов перенаправляем в ~/gifs (т.е. наш домашний каталог, файл gifs):

find / -name "*.gif" > ~/gifs & [1] 33151 jobs -l [1] + 33151 Running find / -name "*.gif" > ~/gifs &

То, что в квадратных скобках [ ], и есть номер задания. Задания имеют уникальные номера в пределах текущего сеанса работы с shell-ом. Задание можно перевести в интерактивный режим командой fg (foreground):

fg %1 # %1 - номер задания.

Теперь задание выполняется в интерактивном режиме. Можно остановить его, переведя в режим suspend (sleeping, спящий):

<Сtrl-z> [1] + Stopped find / -name "*.gif" > ~/gifs &

Теперь можно продолжить выполнение задания в фоне командой bg (background):

bg %1

С помощью команд управления заданиями можно переключать программы между интерактивным и фоновым режимом выполнения. Если вы случайно забыли поставить знак & в конце команды, но собирались запустить ее в фоновом режиме, еще не все потеряно! Следует нажать Ctrl-Z, чтобы "усыпить" программу, а затем запустить задание в фоновом режиме с помощью команды bg.

Команды bg и fg могут принимать разные аргументы, но знак %, за которым следует число, в любом командном процессоре интерпретируется как ссылка на номер задания.



Разбор командной строки


Каждый командный процессор выполняет разбор командной строки в строго определенном порядке:

определение команд и их аргументов;подстановка псевдонимов (определенных командой alias);подстановка имен файлов согласно шаблонам;подстановка результата выполнения команды, если есть конструкция ` `;запуск программ и передача им переменных среды окружения и аргументов.



Семейство командных процессоров


При интерактивной работе с системой пользователь постоянно сталкивается с необходимостью отдавать ей команды. В CDE это можно делать, выбирая мышью требуемые пункты меню. В текстовом окне или текстовом режиме команды набираются вручную в командной строке. После нажатия Enter производится интерпретация и синтаксический анализ команды (то есть определяется, где - имя программы, где - ключи, где - аргументы, где - спецсимволы). Затем будут запущены один или несколько процессов.

В UNIX эту работу выполняет программа, которая называется командным процессором (shell). Иногда командный процессор называют шеллом или интерпретатором команд (последнее неточно, потому что круг задач командного процессора шире, чем интерпретация команд).

Существует несколько широко распространенных командных процессоров и еще несколько малораспространенных, специфичных для конкретных вариантов UNIX. В Solaris принято использовать ksh, csh или bash.

Первый в мире UNIX командный интерпретатор в 1976 году написал Стив Баурн (Steve Bourne), когда он работал в Bell Laboratories в AT&T. По другим данным, Стив написал его в 1974 году. Через некоторое время в University of California Berkeley был написан C-shell (csh, произносится "си шелл"), а потом число разных командных процессоров стало быстро расти. Самые популярные из них сейчас - это Bourne again shell (bash), разработанный в рамках проекта GNU, и Korn shell (ksh) Дэвида Корна (David Korn).

С-shell был разработан студентом Университета в Беркли (University of California Berkeley) Биллом Джоем (Bill Joy), который по окончании Berkeley основал компанию Sun Microsystems. Еще Билл Джой написал самый известный в UNIX редактор vi и был одним из авторов первой версии BSD UNIX.

Таблица 10.1. Популярные командные процессоры в UNIX

НазваниеИмя в системеПлюсыМинусы
Bourne Shellshобладает легким и удобным языком скриптов, прост и понятенмало средств редактирования введенных ранее команд, нет возможности управления заданиями
C Shellcshесть управление заданиями и приемлемое редактирование введенных ранее командсложный язык скриптов, некоторые версии содержат много ошибок
Korn Shellkshсовместим с sh по командам и содержит ряд возможностей csh, имеет средства редактирования команд, введенных ранее (history)редактировать команды неудобно, язык скриптов так развит, что все трудно запомнить
Bourne Again Shellbashпохож на ksh по возможностям, имеет легкий удобный интерфейс, простое интуитивно ясное редактирование введенных ранее команд, стандарт де-факто в Linux, в Solaris 9 устанавливается по умолчанию, но не является командным процессором по умолчаниюпока не обнаружено


В конце 1970- х годов был написан tcsh - расширение csh, совместимое с ним по командам, макроопределениям и синтаксису языка скриптов. Кен Грир (Ken Greer) начал работу над tcsh в Университете Карнеги-Мелон (Carnegie-Mellon University), а продолжил ее Пол Плэйсвэй (Paul Placeway) в восьмидесятые годы в Университете Огайо (Ohio State). Основные отличия tcsh от csh сводятся к усовершенствованию редактирования командной строки и ряду дополнений в помощь создателям скриптов (например, переменные среды окружения, доступные только для чтения). В последних версиях UNIX csh обычно является символической ссылкой на tcsh, а оригинальный csh в поставку не включается, чтобы не шокировать пользователей пещерным уровнем редактирования командной строки.

В Solaris по умолчанию устанавливаются несколько командных процессоров, в том числе sh, csh, tcsh, bash и другие; командным процессором по умолчанию является sh.

Командный процессор призван выполнять в системе нижеперечисленные задачи:

интерпретация команд пользователя, в том числе разбор командной строки;запуск программ;организация перенаправлений потоков между процессами;интерпретация языка скриптов и их выполнение;управление заданиями;интерпретация шаблонов имен файлов;подстановка имен файлов в командную строку.

Некоторые командные процессоры поддерживают не все эти функции (см. табл. 10.2).

Таблица 10.2. Основные задачи shell'ов
Функцияshcshtcshkshbash
HistoryНетДаДаДаДа
ПсевдонимыНетДаДаДаДа
СкриптыДаДаДаДаДа
Подстановка и завершение имен файловНетДа*ДаДа*Да
Редактирование командной строкиНетНетДаДа*Да
Управление заданиямиНетДаДаДаДа
* - по умолчанию выключено


Средства редактирования командной строки


Редактировать командную строку приходится для того, чтобы исправить что-то в только что набранной строке. В sh нельзя передвинуть курсор в любую позицию в строке, в остальных командных процессорах - можно. Удобнее всего редактировать командную строку в bash.

В каждом командном процессоре реализована возможность стирания последнего символа клавишей "backspace" и стирания строки целиком комбинацией клавиш "Ctrl-U".

В самых первых реализациях командных процессоров средства редактирования были еще более примитивными (например, удаление всей строки целиком выполнялось вводом @ и последующим вводом строки заново, при этом все набранные символы все равно оставались на экране). Сейчас такие архаические приемы редактирования не применяются ни в одном командном процессоре.

В bash и tcsh можно перемещаться вперед и назад по уже введенным символам в строке с помощью "стрелок", переместить курсор в середину и в начало строки. Командный процессор bash после нажатия Enter принимает всю строку целиком, независимо от того, в какой позиции строки находился курсор при нажатии Enter. Например, можно вернуть курсор к середине строки, если ввод оказался неверным, исправить ошибку и тут же нажать Enter, чтобы запустить команду на выполнение. В некоторых старых версиях командных процессоров в этом случае следует исправить строку, перейти к ее концу для ввода команды и только после этого нажать Enter.

В ksh редактирование по умолчанию выключено, его надо включить нажанием клавиши Esc. После этого командная строка будет редактироваться средствами того редактора, имя которого задано в переменной среды окружения VISUAL или EDITOR. По умолчанию это редактор vi. Трудно найти такого системного администратора, которому такой громоздкий и неудобный способ исправления команд покажется удачным: ведь ко всему прочему ему придется помнить о переключении режимов редактирования строки ввода!

В csh и tcsh редактирование командной строки выполняется так же, как и в bash.



Установка приглашения shell


Командный интерпретатор имеет несколько вариантов приглашений на разные случаи жизни.

По умолчанию в sh - это $, в csh - %. Привилегированный пользователь (root) имеет другое приглашение - #.

В среде окружения каждого командного процессора есть переменные PS1 и PS2. Это - вид обычного приглашения и приглашения к продолжению ввода команды соответственно.

При вводе длинной команды можно набрать ее в две строки. для этого следует в конце первой строки набрать символ обратного слэша и нажать Enter - вот так:

\<Enter>

и продолжить ввод на следующей строке. Команда может быть многострочной, как правило, допустимая длина команды составляет 1024 символа. Обратный слэш экранирует следующий за ним символ перевода строки от интерпретации в качестве символа завершения команды. При переходе к новой строке появится символ >, так как именно это значение по умолчанию имеет PS2.

В csh и tcsh вместо PS1 и PS2 определены переменные prompt и prompt2. Некоторые командные процессоры, в частности, ksh, имеют дополнительные приглашения для специальных случаев. Они хранятся в переменных PS3, PS4 и т.д., а в csh - в prompt3 и prompt4.

Многие реализации командных процессоров (прежде всего, bash) умеют показывать приглашения, включающие в себя динамически подставляемые части (например, имя текущего каталога). В этих командных процессорах есть свои собственные макроопределения для таких подстановок. Например, имя текущего каталога в bash подставляется в приглашение командной строки с помощью макроса \w, а в csh - с помощью %/. Помните, что назначать желаемое значение переменной можно только, указывая макрос внутри апострофов, чтобы экранировать его от интерпретации командным процессором, например в bash:

$PS1='\w$'

Перечень макроопределений для приглашений командной строки обычно содержится в руководстве man по командному интерпретатору.



Запуск командного процессора


Командный процессор запускается либо при входе пользователя в систему, и в дальнейшем пользователь отдает команды в его командной строке, либо из какой-нибудь программы (по команде пользователя). Частным случаем является запуск командного процессора из другого командного процессора. Например, вы работаете в sh и хотите получить более удобные средства редактирования командной строки; для этого вызывается bash. Тогда вы просто набираете команду

bash

и оказываетесь в среде командного процессора bash, запущенного по этой команде. При этом обычно меняется вид приглашения командной строки.

Каждый командный процессор при запуске пытается выполнить свои стартовые файлы, вначале системные (общие для всех пользователей), а затем пользовательские. Общие файлы лежат в /etc, индивидуальные - в домашнем каталоге пользователя. Если командный процессор запускается при входе пользователя в систему (в таком случе он называется login shell - командный процессор, запущенный при входе в систему), то после стартовых файлов он выполняет еще и login-файлы в том же порядке: сначала общий login-файл из /etc, затем - индивидуальный, из домашнего каталога. Login-файлы - это тоже стартовые файлы командного процессора, все стартовые файлы фактически представляют собой скрипты на языке командного процессора и служат для инициализации среды окружения командного процессора для конкретного пользователя. Настройка командного процессора для пользователя позволяет, например, задать короткие псевдонимы для длинных часто используемых команд и т.п.

Некоторые командные процессоры при входе в систему выполняют сначала login-файлы, а затем - стартовые файлы, это зависит от того, как они были скомпилированы.

Таблица 10.3. Стартовые файлы командных процессоров

shellстартовые файлыlogin-файлы
sh/etc/profile, ~/.profile
csh/etc/csh.cshrc, ~/.cshrc/etc/csh.login, ~/.login
ksh/etc/profile, ~/.profile
bash~/.bashrc/etc/profile, ~/.bash_profile, ~/.profile

Другие командные процессоры принимаются за выполнение каких-либо стартовых файлов только при входе пользователя в систему. У командного процессора обычно есть ключ, который можно дать, чтобы сымитировать вход в систему и заставить его выполнить login-файлы.

Командный процессор bash, в отличие от других, использует более сложный алгоритм выполнения стартовых и login-файлов. Если он запущен как login shell, то он выполняет /etc/profile, если такой файл есть. Затем делается попытка выполнить ~/.bash_profile. Если такого файла нет, bash пытается выполнить файл ~/.bash_login, а если нет и такого файла, то выполняется ~/.profile. Если bash запущен не как login shell, то при старте он выполняет только файл ~/.bashrc. Если же bash был запущен как sh (т.е. sh является символьной ссылкой на bash), то при старте он ведет себя так же, как и sh.



Завершение имен файлов


Функция "подсказки" (можно сказать также - "завершения") имен файлов (file name completion) позволяет набрать только часть имени существующего файла и затем нажать клавишу "Tab". В ответ на это командный процессор "закончит" набор имени файла. Например, если надо обратиться к файлу /usr/sadm/admin/bin/printmgr, то достаточно набрать

/usr/sa<Tab>dm/a<Tab>dmin/b<Tab>in/pr<Tab>intmgr

Все, что в этом примере выделено жирным шрифтом, набираете вы, а все, что не выделено - подставляет командный процессор.

Завершение имен файлов реализовано только в bash и tcsh.

Тем, в чьей системе есть файлы с длинными уникальными именами, подсказка имен файлов отлично экономит время.

При двойном нажатии "Tab" выводятся все возможные варианты завершения имени файла.

Например, если в каталоге есть два файла, имена которых начинаются с букв msg: msg01.txt и msg02.txt и надо просмотреть один из них, можно набрать more msg<Tab><Tab>

Командный процессор bash (или tcsh) подскажет:

msg01.txt msg02.txt

Теперь достаточно набрать цифру 1 или 2, чтобы указать, какой именно файл требуется, и еще раз нажать "Tab" для окончательного завершения имени. Если после двойного нажатия "Tab" bash видит слишком много возможных вариантов имен, он спросит

There are 1102 possibilities. Do you really wish to see them all? (y or n)

Стоит ответить n: так много имен не уместится на экран.