9. Настройка среды


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

Что происходит при входе в систему?

Перед тем как приступить к конфигурированию начальной среды, пользователь должен понять, что происходит при входе в систему, поскольку расположение параметров, которые требуется задать, зависит от характера конфигурирования. Пользователю следует продумать следующие вопросы:
При входе в систему запускается начальный командный интерпретатор, который указан в записи пользователя в базе данных учетных записей (см. подразд. "Файл /etc/passwd" раздела 3). Как правило, начальным командным интерпретатором является sh, который обычно представляет собой ссылку на командный интерпретатор Korn ksh.

Когда ksh запускается как начальный командный интерпретатор, он исполняет следующие профили, если они существуют и являются исполняемыми:
Для чего нужны два профиля? Настройки, которые применяются ко всем пользователям, хранятся в профиле /etc/profile, а настройки, которые соответствуют конкретному пользователю — в его собственном профиле .profile. Редактировать файл /etc/profile может только пользователь root.

В действительности существует третий профиль, который предназначен для командного интерпретатора. Его особенность заключается в том, что он исполняется при каждом запуске командного интерпретатора (см. разд. "Файл запуска ksh" далее в этом разделе).

Настройка домашнего каталога

Домашний каталог (home directory) позволяет хранить все файлы и каталоги, которые относятся к конкретному пользователю. В домашнем каталоге удобно содержать пользовательские двоичные файлы и сценарии. Запись, которая соответствует пользователю в базе данных паролей, определяет домашний каталог (см. разд. "Файл /etc/passwd" раздела 3), а переменная окружения HOME содержит его имя.

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

Приложения графической оболочки Photon представляют собой особый случай. Приложения, которые выполняются в графической оболочке Photon, как правило, хранят свои конфигурации в каталоге $HOME/.ph. Если необходимо автоматически запускать какие-либо приложения вместе с графической оболочкой Photon, следует поместить соответствующие команды в файл $HOME/.ph/phapps.

Настройка командного интерпретатора

Существует множество конфигурационных файлов среды. В этом разделе описано несколько наиболее полезных из них:


Файл /etc/profile

Начальный командный интерпретатор исполняет файл
/etc/profile, если этот файл существует и является исполняемым. Файл /etc/profile задает настройки командного интерпретатора, которые применяются ко всем пользователям, поэтому его содержимое представляет интерес для системных администраторов. Чтобы отредактировать файл /etc/profile, необходимо войти в систему как пользователь root.

Файл
/etc/profile выполняет следующие задачи:
Если необходимо запускать определенный сценарий при каждом запуске начального командного интерпретатора любым пользователем системы, следует поместить этот сценарий в каталог /etc/profile.d. Чтобы добавить файл в этот каталог, требуются привилегии уровня root.

Например, если при входе любого пользователя в систему необходимо задавать глобальные переменные окружения или запускать определенные задачи, следует поместить в каталог /etc/profile.d сценарий, который выполняет эти действия. Если в качестве начального командного интерпретатора используется sh, то необходимо, чтобы сценарий имел расширение .sh.

Файл $HOME/.profile

Файл $HOME/.profile запускается при каждом входе пользователя в систему после выполнения файла /etc/profile. Если в файл .profile вносятся изменения, то они вступают в силу только при следующем входе пользователя в систему.

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

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

Не следует запускать приложения графической оболочки Photon из сценария .profile, поскольку при его выполнении графическая оболочка Photon не работает. Photon-приложения следует запускать из файла $HOME/.ph/phapps.

Пример файла .profile см. в приложении.

Файл запуска ksh

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

У этого профиля нет определенного имени; при запуске командного интерпретатора ksh он проверяет переменную окружения ENV. Если эта переменная существует, то командный интерпретатор ksh считывает из нее имя профиля. Чтобы задать значение переменной ENV, следует добавить в файл $HOME/.profile строку, подобную следующей:

export ENV=$HOME/.kshrc


Пользователи часто называют упомянутый профиль именем .kshrc, но ему можно присвоить любое другое имя. Этот файл не обязан быть исполняемым.

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

alias ls="ls -F"

Любые изменения, которые вносятся в профиль, применяются к новым командным интерпретаторам, но не к их существующим экземплярам.

Пример профиля .kshrc см. в приложении.

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

Многие приложения управляют своими действиями с помощью переменных окружения. Например, утилита less считывает ширину терминала или окна из переменной окружения COLUMNS, а многие утилиты записывают временные файлы в каталог, который определяется переменной окружения TMPDIR.

Запускаемый процесс наследует копию окружения своего родителя. Это означает, что если задать переменную окружения в файле .profile, то все командные интерпретаторы и процессы унаследуют ее при условии, что определение этой переменной не будет отменено каким-либо процессом в цепочке.

Например, если пользователю принадлежит каталог с именем bin, этот каталог можно включить в переменную окружения PATH, добавив в файл .profile следующую строку:

export PATH=$PATH:/home/имя_пользователя/bin

Если системный администратор захочет применить это изменение ко всем пользователям, ему будет необходимо экспортировать переменные окружения из файла /etc/profile или из сценария в каталог /etc/profile.d. Более подробную информацию см. в разд. "Файл /etc/profile" ранее в этом разделе.

Задание переменных PATH и LD_LIBRARY_PATH

Утилита login не сохраняет переменные окружения за исключением нескольких особых переменных, например PATH и TERM.

Переменная окружения PATH определяет пути для поиска команд, а переменная LD_LIBRARY_PATH — пути для поиска компоновщиком совместно используемых библиотек.

Начальные значения по умолчанию переменных окружения LD_LIBRARY_PATH и PATH заданы в файле построения образа до запуска модуля procnto. Две конфигурационные строки (см. разд. "Конфигурационные строки" далее в этом разделе), _CS_PATH и _CS_LIBPATH, принимают значения по умолчанию переменных PATH и LD_LIBRARY_PATH. Утилита login задает переменную окружения PATH с помощью строки _CS_PATH и передает переменную PATH, а также обе конфигурационные строки, своим дочерним процессам.

Если ввести команду set или env в командном интерпретаторе, который был запущен утилитой login, переменная окружения PATH будет отображена, а переменная LD_LIBRARY_PATH — нет. Строка _CS_LIBPATH используется для задания переменной LD_LIBRARY_PATH аналогичным образом.

Чтобы указать утилите login, какие переменные окружения следует сохранять, нужно воспользоваться файлом /etc/default/login. Этот файл можно отредактировать, добавив в него новые переменные, например LD_LIBRARY_PATH, но изменять существующие переменные, такие как PATH и TERM, нельзя.

Если в качестве начального командного интерпретатора используется ksh, можно переопределить существующие переменные и задать новые переменные, отредактировав профили /etc/profile и $HOME/.profile. Все переменные окружения, которые заданы в файле /etc/profile, заменяют определения файла /etc/default/login, а содержимое файла $HOME/.profile заменяет определения обоих файлов /etc/default/login и /etc/profile.

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

Конфигурационные строки

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

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

Примечание. Операционная система QNX Neutrino также поддерживает настройку конфигурационных лимитов (configurable limits) — переменных, которые хранят информацию о системе. Более подробные сведения см. в разделе 21.

Для того чтобы получить значение конфигурируемого лимита или конфигурационной строки, можно воспользоваться POSIX-утилитой getconf. Операционная система QNX Neutrino также определяет утилиту setconf, которая отсутствует в стандарте POSIX и позволяет задавать определенные конфигурационные строки пользователю root. Чтобы считать значение конфигурационной строки в программе, следует вызвать функцию confstr().

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

С помощью утилиты setconf можно задавать значения следующих конфигурационных строк:
При изменении конфигурационной строки _CS_HOSTNAME необходимо также изменять переменную окружения HOSTNAME. Утилита hostname всегда возвращает значение конфигурационной строки _CS_HOSTNAME.

_CS_LOCALE — название локали (набор региональных настроек, включающий в себя такие параметры, как часовой пояс, единицы измерения веса, наименование валюты и т. п.) (locale string);

Задание часового пояса

Самый простой способ задать часовой пояс в графической оболочке Photon — воспользоваться утилитой phlocale. Достаточно просто выбрать нужный часовой пояс, а программа phlocale выполнит все остальные действия.

Если графическая оболочка Photon не используется, то необходимо задать переменную TZ или конфигурационную строку _CS_TIMEZONE. Чтобы часовой пояс устанавливался при загрузке компьютера, требуется поместить эту же информацию в файл /etc/TIMEZONE (см. описание файла /etc/system/sysinit в разделе 8).

Примечание. Если переменная окружения TZ не установлена, система использует значение конфигурационной строки _CS_TIMEZONE. Переменная TZ включена в стандарты POSIX, а конфигурационная строка _CS_TIMEZONE реализована в операционной системе QNX Neutrino. Описание, которое приведено далее, относится и к переменной окружения TZ, и к конфигурационной строке _CS_TIMEZONE.

Различные функции, которые работают со временем, используют информацию о часовых поясах для вычисления времени относительно пояса UTC (Universal Time Coordinated, всеобщее скоординированное время, которое раньше называлось Greenwich Mean Time (GMT — время по Гринвичу)).

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

Переменную окружения TZ можно задать с помощью утилиты env или команды командного интерпретатора export. Конфигурационная строка _CS_TIMEZONE задается с помощью утилиты setconf. Пример:

env TZ=PST8PDT

export TZ=PST8PDT

setconf _CS_TIMEZONE PST8PDT

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

std offset dst offset, rule

Расширенный формат имеет вид:


stdoffset[dst[offset][,start[/time],end[/time]]]

Здесь:

hh[:mm[:ss]]


Минуты (mm) и секунды (ss) являются необязательными. Необходимо задавать лишь часы (hh), которые могут быть указаны в виде одной цифры.

Параметр offset, следующий за параметром std, является обязательным. Если параметр offset после параметра dst опущен, то считается, что летнее время находится на один час впереди поясного.

При задании элементов параметра offset можно использовать одну или несколько цифр. Значения всегда интерпретируются как десятичные числа. Часы могут находиться в пределах от 0 до 24, а минуты и секунды, если они указаны — от 0 до 59. Если перед часовым поясом указан символ "-", то часовой пояс находится восточнее нулевого меридиана, иначе — западнее (в этом случае можно указать необязательный символ "+").

date/time,date/time


где первый элемент date задает дату перехода с поясного времени на летнее, а второй элемент date — дату перехода с летнего времени на поясное. Поля time определяют время перехода с одного режима времени на другой по текущему местному времени.


Элемент date может иметь один из следующих форматов:
Форматы элементов time и offset совпадают за исключением того, что в элементе time не разрешается указывать первый знак ("+" или "-"). Если поле time опущено, то используется значение по умолчанию 02:00:00.

Ограничения

Утилита phlocale список часовых поясов берет из /etc/timezone/uc_tz_t, но его соответствие текущему делению планеты на часовые пояса не гарантируется; часовые пояса регулируются местным законодательством стран и могут отличаться от указанных в данном файле. Аббревиатуры, обозначающие часовые пояса в данном файле, так же не являются стандартными и могут неоднозначно идентифицировать часовой пояс.

Примеры

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

Московское время

Определение московского времени выглядит следующим образом:

MSK-4

Красноярское время

Определение часового пояса Красноярска выглядит следующим образом:

KRAT-8

Восточное время

Восточное время является часовым поясом по умолчанию. Его краткое определение имеет следующий вид:

EST5EDT

Полное определение выглядит следующим образом:

EST5EDT4,M4.1.0/02:00:00,M10.5.0/02:00:00

В этом определении явно указано, что летнее время начинается в 2 часа ночи первого (1) воскресенья (0) апреля (4) и заканчивается в 2 часа ночи последнего (5) воскресенья (0) октября (10).

Центральноевропейское время

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

Central Europe Time-2:00

Использование часовых поясов в программировании

В программе переменной окружения TZ можно присвоить значение, вызвав функцию setenv() или putenv():

setenv( "TZ", "PST08PDT07,M3.2.0/2,M11.1.0/2", 1 );

putenv( "TZ=PST08PDT07,M3.2.0/2,M11.1.0/2" );


Чтобы считать значение переменной TZ, следует воспользоваться функцией getenv():

char *tzvalue;

...

tzvalue = getenv( "TZ" );


Значение конфигурационной строки
_CS_TIMEZONE можно считать, вызвав функцию confstr():

confstr(_CS_TIMEZONE, buff, BUFF_SIZE);

или задать с помощью оператора

confstr(_CS_SET | _CS_TIMEZONE, "JST-9", 0);


Функция tzset() считывает текущее значение переменной окружения TZ или конфигурационной строки _CS_TIMEZONE, если значение переменной TZ не определено, и задает следующие глобальные переменные:
При вызове функции ctime(), ctime_r(), localtime() или mktime() библиотека присваивает значение переменной tzname так же, как и при вызове функции tzset(). Это же действие выполняется, если вызывается функция strftime() с директивой %Z.

Более подробные сведения о перечисленных функциях и переменных см. в руководстве по библиотекам Neutrino "Library Reference".

Настройка графической оболочки Photon

Автоматический запуск приложений

Если необходимо, чтобы при каждом запуске графической оболочки Photon запускалось какое-либо Photon-приложение, следует поместить его в файл $HOME/.ph/phapps. Каждая команда должна располагаться на отдельной строке. Например, для запуска редактора графической оболочки Photon вместе с графической оболочкой Photon следует ввести строку:

ped &

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

Настройка шрифтов

Графическая оболочка Photon поддерживает широкий набор типов шрифтов. В среде Photon должны работать любые шрифты стандарта Unicode.

Файлы шрифтов системы хранятся в каталоге /usr/photon/font_repository. Этот каталог содержит следующие файлы:
Чтобы установить в систему новый шрифт, следует поместить файлы шрифтов в каталог font_repository и запустить утилиту mkfontdir для создания нового файла fontdir. Затем нужно перезапустить менеджер шрифтов, который обычно представлен разделяемым объектом, загруженным в io-graphics. При использовании отдельного сервера phfont его так же следует перезапустить.

Возможности ввода текста

Графическая оболочка Photon позволяет вводить текст на китайском, японском и корейском языках. Чтобы воспользоваться этими возможностями, следует запустить утилиту cpim (ввод на китайском языке), vpim (ввод на японском языке) или kpim (ввод на корейском языке). Символы этих языков можно вводить с обычной клавиатуры в любое приложение, которое принимает обычный текст. Более подробные сведения см. в комплекте документации "Photon Multilingual Input".

Типы терминалов

Чтобы указать тип используемого терминала консоли или утилите pterm, следует задать переменную окружения TERM. Каталоги, которые содержат базу данных терминалов, расположены в каталоге /usr/lib/terminfo. Для изменения правил подстановки шрифтов в базе данных можно воспользоваться утилитами tic и infocmp.

Например, если запустить утилиту infocmp для /usr/lib/terminfo/q/qansi-m, то для этой базы данных будет сгенерирован файл в текстовой форме, доступный для чтения человеком. Затем этот файл можно модифицировать и снова скомпилировать с помощью утилиты tic в формат базы данных. Файл /etc/termcap обеспечивает совместимость с программами, которые используют более раннюю однофайловую модель базы данных, а не новую библиотечную модель.

Устранение неполадок

Далее рассмотрены некоторые распространенные проблемы, которые могут возникнуть при конфигурировании среды.
Следует убедиться в том, что:

#! /bin/sh

Если на одном разделе компьютера установлена операционная система Windows, а на другом — QNX Neutrino, то установка часов в одной операционной системе изменяет время в другой операционной системе.

В QNX Neutrino аппаратные часы обычно устанавливают по всеобщему скоординированному времени (Universal Time Coordinated, UTC), а затем задают часовой пояс. В Windows аппаратные часы устанавливаются по местному времени.

Чтобы задать время, которое является корректным для обеих операционных систем, следует установить на аппаратных часах местное время, находясь в QNX Neutrino. Более подробные сведения см. в описании файла /etc/system/sysinit в разделе 8.
Если параметр i задан, то файл .kshrc работает в интерактивном режиме. Следующий код проверяет, задан ли этот параметр:

case $- in

*i*)

set -o emacs

export EDITOR=vi

export VISUAL=vi

export PS1='`hostname -s`:`/bin/pwd` >'

bind ˆ[[z=list

bind ˆI=complete

...

esac

Параметр $- является объединением всех односимвольных параметров, которые переданы сценарию. Более подробные сведения см. в разделе "Параметры" к описанию ksh в «Описании программы. Часть 1. Справочник по утилитам» КПДА.10964-01 13 01.