Документация по FreeBSD.

Иван Паскаль pascal@tsu.ru

Перегенерация ядра системы (kernel), Работа администратора с user account, Администрирование групп (пользователей), консоль.

Оригинал: http://www.tsu.ru/~pascal/.

" Перегенерация ядра системы (kernel).

o 1. Зачем нужно перегенерировать ядро (kernel)?

o 2. Как перегенерировать ядро системы?

" 2.1 Разворачивание исходников.

" 2.2 Составление конфигурационного файла.

" 2.3 Подготовка к генерированию

" 2.4 Трансляция (собственно само генерирование) ядра

" 2.5-2.6 Установка нового ядра и Перезагрузка

o Замечание по поводу драйверов устройств.

" "Комментарии к config файлу".

o Общие определения.

o COMPATIBILITY OPTIONS

o DEBUGGING OPTIONS

o NETWORKING OPTIONS

o FILESYSTEM OPTIONS

o SCSI DEVICES

o MISCELLANEOUS DEVICES AND OPTIONS

o HARDWARE DEVICE CONFIGURATION

o More undocumented options for linting.

" Добавление компонент из дистрибутива.

o Добавление из дистрибутива с помощью программы sysinstall.

o Добавление компонент из дистрибутива "вручную".

o Содержание дистрибутива FreeBSD.

o Содержимое раздела src.

o Установка дополнительных программ из "пакетов" (packages).

o Установка "портов" (ports).

" Работа администратора с user account.

o Что такое "учетная карточка" (user account)?

o Какие данные хранятся в учетной карточке?

o Для чего используется учетная карточка?

o Где хранятся учетные карточки?

o Как добавить юзера?

o Как поменять данные в учетной карточке?

o Как удалить юзера?

o Что может поменять сам юзер в своей учетной карточке?

o Как временно убрать юзера (не удалить, но запретить вход)?

o Что еще почитать?

" Администрирование групп (пользователей)

o Что такое группа?

o Где хранится информация о группах?

o Сколько может быть групп, юзеров в группе, групп у юзера?

o Как создать или удалить группу?

o Как поменять принадлежность юзера к группе (группам)?

" Файлы и "права доступа" к ним.

o Какие атрибуты файла определяют "право доступа".

" Владелец файла и группа "допущенных".

" Собственно "права доступа" (permissions).

" Основные биты доступа (чтение/запись/выполнение)

" Дополнительные биты доступа

" "Странные" сочетания битов доступа.

" Флаги.

o С какими правами файл "рождается"

o И с какими правами он "перерождается" (после копирования или перемещения).

o Как поменять...

" Владельца и группу.

" Права доступа (permissions)

" Флаги.

o Что делать если этого не хватает?

" Драйвер "системной консоли" - syscons.

o Основные возможности syscons

" Виртуальные терминалы.

" Буфер экрана (history buffer).

" Команды терминала syscons.

" Управление драйвером syscons.

" Работа с "мышью".

o Дисплей

" Шрифты

" Дополнительные таблицы перекодировки (screenmap)

" Режим отображения (колличество строк и символов на экране)

" Screen saver

o Клавиатура

" Модификаторы.

" Обычные клавиши.

" "Функциональные" клавиши.

" Переключатели виртуальных терминалов.

" Специальные клавиши.

o Несколько примеров изменения назначения клавиш.

" Переключатель "альтернативной клавиатуры" (Рус/Лат).

" Клавиша Meta.

" "Комбинация из трех пальцев" - Ctrl+Alt+Del.

o Программа vidcontrol

o Программа kbdcontrol

o Русификация syscons

o Как достигается "взаимопонимание" программ с терминалом (termcap, terminfo и переменная TERM).

o Одно важное замечание: Какое отношение это имеет к X-Window?

o Приложение 1. Команды (esc-последовательности) syscons

o Приложение 2. Управляющие ("контроловые") символы

o Приложение 3. "Функциональные" клавиши

o Приложение 4. Несколько мелких полезных программок.

Продолжение следует...

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Администрирование пользователей (юзеров).

" Что такое "учетная карточка" (user account)?

" Какие данные хранятся в учетной карточке?

" Для чего используется учетная карточка?

" Где хранятся учетные карточки?

" Как добавить юзера?

" Как поменять данные в учетной карточке?

" Как удалить юзера?

" Что может поменять сам юзер в своей учетной карточке?

" Как временно убрать юзера (не удалить, но запретить вход)?

" Что еще почитать?

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Что такое "учетная карточка" (user account)?

Unix - система многопользовательская.

Значит, для нормальной работы нужно...

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

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

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

Итак. В Unix такая запись в соответствующей БД, содержащая сведения об юзере называется user account. Для того, чтобы допустить нового пользователя в систему, необходимо создать для него этот account.

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Какие данные хранятся в учетной карточке?

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

Каждому юзеру присваивается уникальный номер (user ID), именно этот цифровой номер и используется внутри операционной системы при проверке прав доступа, сборе и хранении статистики и т.д. Однако, для человека оперировать все время номерами юзеров не удобно. Поэтому, каждому юзеру кроме номера присваивается еще уникальное имя (login name).

Если в какой-нибудь команде требуется в качестве аргумента указать юзера, обычно используется это "login name". И, наоборот, если какая-либо программа в своем выводе как-нибудь упоминает конкретных юзеров, она обычно называете их этим именем, а не просто печатает номер юзера.

То есть, между user ID и name должно быть всегда однозначное соответствие. Просто user ID используется во внутренних данных системы, а name при общеннии человек-компьютер.

Итак. В учетной карточке юзера хранится

" Name

" Password

" user ID

" group ID

" General information

" Home dir

" Shell

кроме того есть еще поля, которые часто не используются (кстати, в карточке они располагаются между group ID и General Information)

" Class

" Password change time

" Account expiration time

Назначение этих полей.

Name

Это уникальное имя юзера. Его спрашивают при входе в компьютер. Оно используется в командах администрирования.

Password

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

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

user ID

Уникальный номер юзера. Он однозначно соответствует имени (Name) и используется внутри системы.

group ID

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

General information

Это просто некоторые "анкетные данные" того реального человека, который скрывается под Name. Это поле можно и не заполнять. Обычно там пишут просто реальное имя/фамилию юзера (например John Doe).

Однако, полностью это поле может состоять из

" Full Name - Имя Фамилия,

" Location - адрес (имеется в виду рабочее место),

" Office Phone - рабочий телефон,

" Home Phone - домашний телефон

Home dir

Домашний каталог юзера. Именно в этом каталоге помещаются настроечные файлы для различных программ с настройками под конкретного юзера. Здесь же юзеру дается полная свобода создавать/удалять свои файлы.

Shell

Программа, которая запускается для юзера, когда он входит в систему. Обычно это "исполнитель комманд" (типа command.com в DOS'е), который принимает комманды с терминала и, в свою очередь, запускает программы, необходимые юзеру.

В современных Unix'ах обычно есть несколько таких "исполнителей" (sh, csh, tcsh, bash ...) из которых можно выбрать наиболее подходящий.

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

Подробнее об этом сказано в разделе "Для чего используется учетная карточка".

Class

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

Password change time

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

Account expiration time

А здесь администратор задает дату, после которой доступ юзеру в систему будет запрещен. То есть, account юзера сохраняется (и все его файлы тоже), но войти в систему он не сможет (пока не договорится с администратором :-).

Подробнее обо всем этом можно прочитать в соответствующем man'уале.

man 5 passwd.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Администрирование групп (пользователей)

" Что такое группа?

" Где хранится информация о группах?

" Сколько может быть групп, юзеров в группе, групп у юзера?

" Как создать или удалить группу?

" Как поменять принадлежность юзера к группе (группам)?

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Что такое группа?

Группа - это группа (из юзеров). :-)

В Unix все юзеры объединяются в группы. Причем,

" каждый юзер входит по крайней мере в одну группу, но

" может быть "членом" нескольких различных групп.

Как и индивидуальные юзеры, каждая группа имеет свое имя (group name) и числовой номер (groupID). Естественно, они однозначно соответствуют друг другу. Также, как и для индивидуальных юзеров, groupID используется внутри системы, а имя (group name) при вводе и выводе сообщений для пользователей (хотя, в большинстве команд, можно указывать вместо имени и groupID).

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

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Где хранится информация о группах?

Здесь есть маленькая тонкость. На самом деле надо рассмотреть два вопроса:

" Где хранится имя и номер группы?

" Как определяется список "членов" группы?

Где хранится имя и номер группы?

В файле /etc/group. Это просто текстовый файл, в котором каждая строчка описывает одну группу. Отдельные поля разделяются двоеточием. Назначение полей:

" имя группы (group name)

" пароль группы (group passwd)

" номер группы (group ID)

" список (через запятую) юзеров, входящих в группу (group members).

Поле "пароль группы" пока никакими программами не используется (по крайней мере в FreeBSD) и там обычно ставится знак "*".

Таким образом, файл /etc/group определяет - какие группы существуют в данной системе и устанавливает соответствие между именем и номером группы.

А, что касается "членства" юзеров в группе, этот вопрос немного сложнее.

Как определяется список "членов" группы?

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

А, чтобы тот же юзер стал "членом" еще какой-нибудь группы, его можно записать (его login name) непосредственно в файл /etc/group, в поле "group members" (см. выше), соответствующей группы.

Таким образом, "членами" какой-либо группы являются

" юзеры, которые перечисленные в файле /etc/group в "списке юзеров" этой группы

" и юзеры, в учетной карточке которых, стоит groupID этой группы.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Сколько может быть групп, юзеров в группе, групп у юзера?

Ответ на этот вопрос может быть разным для различных "ветвей" и версий Unix'а.

Поэтому, то, что здесь написано (далее) справедливо только для FreeBSD текущих версий (2.*.*).

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

Членов группы, которые перечисляются в самом файле /etc/group, должно быть не больше 200, но при этом вся строчка, описывающая группу, не должна быть длиннее 1024 символа.

Однако, это ограничение не распространяется на тех юзеров, "членство" которых задается полем "group" в их личных учетных карточках.

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как создать или удалить группу?

Это достаточно просто сделать "вручную". Файл /etc/group, хранящий информацию о группах имеет простой формат и его можно менять любым текстовым редактором.

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

Для удаления группы, просто удалите соответствующую строчку.

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

" Программы addgroup и rmgroup.

" Программа pw.

" Важное замечание о безопасности.

Программы addgroup и rmgroup.

Назначение этих программ понятно из названия.

addgroup добавляет группу в список групп. Достоинство этого способа (в отличии от добавления группы "вручную") заключается только в том, что эта программа может сама подобрать для вновь создаваемой группы groupID, который пока не используется другими группами. Ну и, естественно, не сделает никаких ошибок в /etc/group. Хотя формат /etc/group настолько простой, что там трудно ошибиться :-)

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

rmgroup - удаляет заданную группу из /etc/group. Достоинство этого способа (по сравнению с "ручным") в том, что вам не придется искать нужную строчку в файле /etc/group :-). Кроме того, она не даст вам удалить те группы, которые "жизненно важны" для системы.

Естественно, более подробно об этих программах можно почитать в соответствующих man'уалах

man addgroup

man rmgroup

Программа pw.

Программа pw - универсальная утилита для администрирования (создания, удаления, изменения, просмотра) и юзеров и групп.

Для "ведения" групп ее нужно вызывать с параметрами

pw group add группа- добавить группу

pw group del группа - удалить группу

pw group mod группа - "модифицировать" группу

(параметр группа может быть как именем группы, так и номером - groupID).

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

pw group mod группа -m юзер1,юзер2,...

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

pw group mod группа -M юзер1,юзер2,...

Подробнее об этой команде (утилите) можно почитать в соответствующем man'уале (man pw). Ну, а чтобы не лазить в man каждый раз, когда захотите воспользоваться этой командой, можно вызвать ее с параметром help, например

pw group mod help она выдаст вам список допустимых для данной операции ключей, с кратким пояснением.

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

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

Важное замечание о безопасности.

Файл /etc/group "по умолчанию" может читаться всеми юзерами, а изменять его может только root (администратор системы). Не надо менять эти условия.

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

Так вот, даже если есть реальная необходимость некоторым юзерам (не имеющим прав администратора) время от времени создавать новые группы или менять "список членов" какой-либо группы, не надо давать им право менять содержимое /etc/group. Это сильно ослабит безопасность системы.

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как поменять принадлежность юзера к группе (группам)?

Это зависит от того, о какой группе идет речь.

Если вы хотите поменять ему основную группу (первичную), то надо исправить соответствующее поле (group ID) в его "учетной карточке" (user account). Как это сделать подробно описано в Как поменять данные в учетной карточке.

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

Как это сделать описано в *****.

Если же вы хотите добавить юзера еще в какую-нибудь группу или, наоборот, исключить его из "членов группы" (не первичной для этого юзера), то исправления надо делать в файле /etc/group в поле "group members" соответствующей группы.

Как и в случае создания группы это можно сделать либо "вручную",просто отредактировав файл /etc/group вашим любимым редактором, либо воспользоваться специальными утилитами, теми же, что и для создания групп.

addgroup

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

addgroup games vasia

добавит юзера vasia в группу games.

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

pw groupmod

Также, вам может помочь "универсальная утилита" pw. Только, в отличии от предыдущей команды, для указания юзера (или сразу нескольких юзеров) надо использовать специальный ключ

pw groupmod games -m vasia

(добавить юзера vasia в группу games).

Надо заметить, что описанные команды хорошо добавляют юзеров в группы, но не приспособлены для удаления определенного юзера из определенной группы. Правда, у команды pw groupmod есть ключ -M, который, в отличии от ключа -m означает - не "дописать" указанных юзеров в список членов группы, а полностью заменить список членов на тех юзеров, которых вы и укажете (через запятую) после ключа -M. Однако, понятно, что удалять одного конкретного юзера из длинного "списка членов" таким способом - не очень удачное решение.

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как поменять данные в учетной карточке?

Во-первых, для изменения секретного пароля юзера (поле Password) надо использовать специальную команду

passwd "имя юзера"

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

Все остальные поля можно поменять с помощью утилиты vipw или chpass. Можно, также, использовать "универсальную" утилиту pw, хотя в данном случае, это, пожалуй, самый неудобный инструмент.

Программа vipw (можете посмотреть о ней также в разделе "Как добавить юзера") позволяет редактировать запись непосредственно в файле master.passwd. Естественно, вы должны представлять себе формат этой записи (об этом можно прочитать в man 5 passwd).

Несколько более удобной является утилита chpass (она же chsh и chfn). Она дает возможность редактировать конкретную учетную карточку юзера, имя которого вы укажете при запуске этой программы. Но, при этом, она выводит какждое поле какрточки в отдельной строке с подсказкой - что какое поле означает.

Login: vasia

Password: .....

Uid [#]: 1000

Gid [#]: 1000

... и т.д.

Особенно, программа chpass полезна, если вы захотите изменить Password change time (дату, когда система предложит юзеру поменять пароль) или Account expiration time (дату, после которой не пускать юзера в систему). Дело в том, что в самой учетной карточке эти даты хранятся в цифровом формате, понятном только самой системе, а chpass показывает и воспринимает их в "человеческом" виде (месяц, день, год).

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

pw usermod vasia -s /bin/csh

запишет в учетную карточку юзера vasia Shell - /bin/csh.

Список всех возможных ключей можно "спросить" у самой программы

pw usermod help

(и, конечно, хорошо бы почитать man pw).

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

pw usershow vasia.

Конечно, в данном случае pw usermod менее удобна, чем "полноэкранные" утилиты. Ее использование может быть оправдано только в случае, когда надо сделать много однотипных изменений для нескольких юзеров. Ну, или если вы привыкли ей пользоваться (pw - утилита универсальная для регистрации/просмотра/изменения/удаления юзеров, и во многих случаях может оказаться более удобной, чем остальные).

Заметьте, что vipw вообще не проверяет корректность данных. А chpass и pw usermod проверяют только отдельные поля (и то, иногда отделываются предупреждениями). Ни одна из них не проверяет на уникальность Name и user ID. Поэтому, пользуйтесь ими с осторожностью.

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Для чего используется учетная карточка?

А вот это - очень не простой вопрос.

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

" Обычные юзеры

" Псевдо-юзеры

" Почтовые юзеры

" "Гостевой вход"

" Автоматический запуск коммуникационных программ

Обычные юзеры

Когда обычный юзер заходит в систему (с физического терминала или по сети), он должен сказать свое имя (Login Name) и пароль (Password). Соответствующая программа сверяет эти данные с теми, что записаны в учетной карточке и, если они сопадают, "пускает" юзера в систему. То есть запускается программа, которая указана как Shell в учетной карточке. Юзер с помощью этой программы может запускать другие. При этом ему можно создавать/удалять/писать/читать файлы, которые находятся в его Home dir (которая тоже указана в учетной карточке).

Псевдо-юзеры.

Часто бывает полезно ограничить некоторым программам (которые запускаются автоматически - ftp-сервер, www-сервер и т.п.) доступ к файлам и директориям.

Например, вы создаете на своей машине WWW-сервер. Естественно, его назначение - выдавать в сеть какие-то документы (файлы *.html), специально предназначенные для публичного обозрения. В то же время, не хотелось бы, чтобы он (из-за возможных ошибок или злонамеренных "закладок" в программе) мог выдавать наружу другие файлы находящиеся в системе.

В Unix предусмотренно, что права на чтение каждого файла можно связать с определенным пользователем. Юзер может читать файлы, для которых он является "хозяином" или "владельцем" (на самом деле разграничение прав несколько более сложное, но в данном объяснении это не важно). Все остальные файлы можно сделать для него недоступными.

Таким образом, для решения задачи нужно

- зарегистрировать фиктивного пользователя - например www;

- все файлы, к которым должна иметь доступ программа WWW-сервера, объявить "собственностью" юзера www (естественно, что ваши секретные файлы должны быть недоступны этому самому www);

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

Все остальное сделается автоматически средствами Unix.

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

Следовательно, в учетной карточке такого фиктивного юзера не нужен реальный пароль (вместо пароля ставится какая-нибудь абракадабра, так, чтобы никто не мог даже подобрать его. Точнее, ставится знак "*", поскольку в настоящих шифрованных паролях такой знак никогда не встречается), никакой General information, не нужна также Home dir (хотя, иногда имеет смысл объявить его домашней директорией ту, где лежат его данные) и Shell.

Особым случаем псевдо-юзера является юзер ftp. Дело в том, что у ftp-сервера могут быть две задачи. Первая - дать возможность реальным пользователям этой машины перекачивать свои файлы из этого компьютера (или, наоборот, "вкачивать") по сети. Вторая - предоставить некую "свалку" файлов всем желающим (то, что обычно называют "анонимный ftp"). В первом случае каждый реальный юзер говорит серверу свое имя и пароль и получает доступ к файлам такой же, как если бы он вошел в систему. Во втором случае, если вы не зарегистрированы в качестве юзера на этой машине, вы можете сказать, что вы - юзер anonimous или юзер ftp. В этом случае, программа ftp-сервер проверяет - зарегистрирован ли в БД учетных карточек псевдо-юзер ftp (именно ftp, а не anonimous) и, если такой юзер зарегистрирован, то пускает вас в домашнюю директорию (Home dir) этого юзера, там и должна лежать "свалка" файлов для всех желающих.

Таким образом, в учетной карточке псевдо-юзера ftp существенным являются в основном поля Name и Home dir. Остальные, обычно, значения не имеют.

Таких псевдо-юзеров в любой системе существует несколько. Вы можете сами убедиться, заглянув в /etc/passwd.

Почтовые юзеры.

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

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

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

Следовательно, в учетной карточке такого юзера нет домашней директории, или ставится какя-нибудь "левая" директория, одна на всех таких юзеров.

А, самое главное, не должно быть реальной программы Shell. Вместо нее лучше всего подставить какую-нибудь программу, которя просто напечатает сообщение типа: "Sorry, вам сюда нельзя" и завершит работу. В качестве такой программы можно использовать /bin/date - она напечатает текущую дату и завершится.

Кстати, если поле Shell в учетной карточке просто оставить пустым, то система все равно впустит юзера и даст ему "исполнителя комманд" /bin/sh.

"Гостевой вход".

Поскольку, вместо Shell (программы, которая автоматически запускается для вошедшего юзера) можно использовать любую программу, можно сделать небольшую информационную систему для публичного просмотра. Для этого регистрируется пользователь, например, guest (гость). В качестве Shell у этого юзера должна быть программа, которая позволяет просмотреть документы, предназначенные для публики (какя-нибудь BBS, www-browser или другая, специально для этого написанная программа). Естественно, надо принять меры предосторожности, чтобы эта программа не могла прочитать другие файлы из вашего компьютера и не могла записать ничего лишнего на диск.

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

Автоматический запуск коммуникационных программ.

Если к компьютеру подкючен модем, он может оказывать различные услуги через телефонные линии (BBS, прием/передачу e-mail, IP-доступ и т.п.). Если один и тот же телефонный вход используется для различных услуг, то возникает проблема - как обеспечить запуск различных коммуникационных программ для разных клиентов.

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

Например, можно зарегистрировать пользователей:

UUCPuser - для которого запускается программа uucico (из пакета uucp),

PPPuser - для которого запускается драйвер, для связи по протоколу PPP,

SLIPuser - для которого запускается драйвер, для связи по протоколу SLIP.

Теперь, если клиент, позвонивший на модем, введет в качестве Login name PPPuser (например), то для него на этом конце модемной линии включится драйвер PPP и он получит IP доступ по этому протоколу.

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

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Где хранятся учетные карточки?

В FreeBSD существует четыре файла, которые имеют отношение к БД учетных карточек. Все они находятся в директории /etc.

В общем-то, все они содержат одну и ту же информацию, и при всех добавлениях (изменениях) в учетных карточках юзеров изменяются одновременно.

/etc/spwd.db - основная БД, именно отсюда соответствующие программы берут нужные им данные. Данные хранятся в двоичном виде, то есть простым редактором там ничего не сделаешь.

/etc/master.passwd - та же БД, но в текстовом виде. Этот файл можно читать и изменять обычным текстовым редактором. Но, если вы будете его менять, потом нужно будет запустить соответствующую утилиту, которая сделает изменения и в остальных трех файлах.

/etc/pwd.db - то же, что и spwd.db, но без паролей (в поле password просто стоит знак *)

/etc/passwd - то же, что и master.passwd, но без паролей.

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

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

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как добавить юзера?

Ответ на этот вопрос не такой простой, как может показаться. Все зависит от того - какого юзера вы хотите зарегистрировать. (О том, какие типы юзеров могут встретиться смотри - "Для чего используется учетная карточка" ).

Заметьте, что, для того, чтобы пустить в свою систему реального юзера, надо не только добавить новую учетную карточку для него. Еще надо создать ему домашнюю директорию и, желательно, положить туда некоторые стартовые файлы (типа config.sys и autoexec.bat в DOS'е). При этом надо правильно установить права нового юзера на эти файлы.

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

Итак. Программы для регистрации (и не только) нового пользователя.

" pwd_mkdb

" vipw

" adduser

" pw useradd

" Еще что-нибудь

pwd_mkdb

Собственно, эта утилита только преобразует файл master.passwd в три остальных файла (см. "Где хранятся учетные карточки").

Вы можете любым текстовым редактором добавить строчку в master.passwd, взяв за образец любую из тех строчек, которые там уже есть (желательно, перед этим внимательно прочитать man 5 passwd). Если, после этого запустить команду

pwd_mkdb -p /etc/master.passwd

то она сделает соответствующие изменения в spwd.db, pwd.db, passwd.

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

passwd <имя юзера>

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

vipw

Эта программа слегка :-) автоматизирует процесс описанный выше. Она сама запускает текстовый редактор, а, по выходу из редактора, pwd_mkdb.

Облегчение состоит в том, что вам не надо помнить - какой файл вы редактируете и как правильно вызвать pwd_mkdb.

Запись в master.passwd вам все равно придется составить самостоятельно. При этом не забудьте, что Name и userID должны быть уникальными для каждого юзера.

Важное замечание по поводу текстового редактора. Программа vipw сама редактором не является. Она запускает текстовый редактор, который задан переменной окружения EDITOR, а если таковой не найдет, то редактор vi. Причем, обычно, при установке FreeBSD в стартовых файлах для root эта переменная устанавливается, но это тот же vi.

Дело в том, что работать с этим редактором без подготовки достаточно сложно. Поэтому, установите переменную EDITOR, выбрав свой любимый редактор. Если любимого редактора у вас пока нет, можно воспользоваться редактором /bin/ee.

adduser

Это самая "продвинутая" программа для добавления нового юзера. Она задает вопросы касающиеся нового юзера, сама проверяет имя и user ID на уникальность (причем, для user ID она сама предложит подходящее значение), создает домашнюю директорию для юзера и копирует туда заготовки настроечных файлов, и даже может послать приветственное письмо вновь зарегистрированному юзеру. Естественно, она же делает запись в БД учетных карточек.

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

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

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

pw useradd

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

pw useradd .....

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

Но, с другой стороны она имеет и ряд достоинств:

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

pw useradd vasia

(программа сама подберет подходящий userID, и заполнит поля group, Home dir, Shell и т.п., взяв их из своего конфигурационного файла)

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

pw useradd -D ...

или отредактировав напрямую конфигурационный файл /etc/pw.conf

(если у вас в /etc такого файла нет, то просто наберите команду pw useradd -D и он сам создастся).

" при этом можно иметь несколько различных конфигурационных файлов, для разных типов юзеров, и явно указывать в команде - какие "умолчания" использовать для создания данного юзера. Например, у вас есть юзеры трех различных типов (отличающися своими group, Home dir, Shell и т.п.). Сделайте три разных конфигурационных файла (просто "растиражируйте" /etc/pw.conf и подправьте в каждом то, что нужно.) Теперь, чтобы создать юзера с "умолчаниями" из файла /etc/pw1.conf, наберите команду

pw useradd vasia -C/etc/pw1.conf

Подробнее о всех параметрах (ключах) этой программы можно посмотреть в соответствующем man'уале (man pw), краткий список ключей можно "спросить" у самой программы, командой

pw useradd help

(но man pw все равно лучше прочитать, хотя бы раз :-)

Здесь я хочу только обратить внимание на ключь -m. Дело в том, что pw useradd "по умолчанию" делает только запись в учетной карточке. А с этим ключем

pw useradd vasia -m

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

Еще что-нибудь

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

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

Ниже приводится пример программы, написанной на языке "интерпретатора комманд" sh, для регистрации "почтового юзера". Естественно, это не столько рабочая программа, сколько пример, который должен вдохновить вас на самостоятельное творчество. :-)

Некоторые пояснения. Программа использует системную утилиту id, которая выводит некоторую информацию о заданном юзере (причем, в качестве аргумента этой утилиты может использоваться как name юзера, так и его user ID). В данном случае она используется только для проверки - зарегистрирован ли уже такой юзер в системе.

Форма - id ... >/dev/null 2>&1

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

________________________________________

#!/bin/sh

# Эти переменные вынесены в начало, чтобы их можно было легко поменять

# при необходимости

shell=/bin/date # имя Shell для регистртруемого юзера

group=2000 # group ID для регистрируемого юзера

uid=2000 # user ID, начиная с которого программа ищет

# ближайший свободный

# найти ближайший не занятый user ID

while (true) ; do

if (id $uid >/dev/null 2>&1)

then uid=$(($uid+1))

else break

fi

done

# Запросить Name для нового юзера и проверить его на уникальность,

# если юзер с таким Name уже зарегистрирован в системе, сообщить

# об этом и повторить вопрос

while (true) ; do

read -p 'User Name: ' name

if (id $name >/dev/null 2>&1)

then echo 'user "'$name'" already exists'

else break

fi

done

# Запросить "реальное имя" юзера (чтобы записать его в General information)

read -p 'Real name of "'$name'" : ' rname

# Сформировать учетную карточку и вписать ее в master.passwd

echo $name'::'$uid':'$group'::0:0:Postbox for '$rname'::'$shell >> /etc/master.passwd

# Запустить pwd_mkdb, чтобы сделать изменения во всех файлах

# БД учетных карточек

pwd_mkdb -p /etc/master.passwd

# Запросить секретный пароль для нового юзера

passwd $name

# Если необходимы еще какие-то действия - создать директорию или внести

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

# Но, в данном случае, больше ничего делать не нужно.

________________________________________

________________________________________

Как удалить юзера?

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

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

Что надо удалить?

Найти все эти файлы можно с помощью...

Где еще могут остаться упоминания об этом юзере?

Самый простой способ удалить юзера (программы rmuser и pw).

Что надо удалить?

Во-первых, домашнюю директорию юзера. Кстати, если администратор не предпринимал никаких действий, чтобы дать юзеру возможность писать в другие директории, то все файлы, которые мог "наплодить" юзер должны лежать в его Home dir. Если же вы дали юзеру права создавать файлы в других диркториях (в публичном ftp архиве или в директории www сервера, например), то, возможно, надо "почистить" и там.

Во-вторых, "почтовый ящик" юзера в директории /var/mail. Сделайте это обязательно, даже если юзер просил "пока не удалять почту" (или хотя бы уберите этот файл из /var/mail). Дело в том, что название этого файла совпадает с Name юзера, а права на чтение/запись определяются его user ID, и, естественно, должны соответствовать друг-другу.

Не вдаваясь в подробности, могу сказать, что если вы вскоре зарегистрируете нового пользователя с тем же user ID (он же освобождается), но с другим именем, или наоборот - с таким же именем, как у старого юзера, но с другим user ID, то у этого нового юзера возникнут серьезные проблемы с получением почты.

В-третьих. Могут быть еще где-то раскиданы файлы, владельцем которых был этот юзер. Например, в директории /tmp, /usr/tmp, /var/tmp.

Найти все эти файлы можно с помощью программы find. Например, так

find / -user vasia

(Обратите внимание, первый аргумент - директория, начиная с которой искать. В данном примере это корневая, то есть будут просмотрены все файлы в системе. С одной стороны это хорошо - ничего не пропустите, но, с другой стороны, если у вас стоит ньюс-сервер или огоромный ftp-архив, то ждать придется долго).

С помощью этой же команды можно и удалить все найденные файлы

find / -user vasia -delete

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

find / -user vasia -exec rm -i {} ;

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

" в файлах /etc/group, /etc/login.access, /etc/ftpusers

" в таблицах программы sendmail: /etc/aliases и т.п. (virtusertable, genericstable и др.)

" если у вас отдельным юзерам разрешается запускать задачи с помощью cron, то юзер может упоминаться в /etc/crontab или в /var/cron/allow, /var/cron/deny, а, также, может быть его индивидуальная crontab в /var/cron/tabs/

" если юзерам разрешается пользоваться "пакетным" выполнением программ, то юзер может упоминаться в /var/at/at.allow, /var/at/at.deny

" если у вас ведется "квотирование" дискового пространства, то должна быть quote для этого юзера

" если юзер пользуется IP связью через модем, то он может упоминаться в файлах, лежащих в /etc/sliphome или /etc/ppp

" от имени юзера могут запускаться какие-нибудь демоны (особенно это касается псевдо-юзеров), тогда имя юзера может быть в /etc/inetd.conf или /etc/rc.local.

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

Однако, в большинстве случаев все гораздо проще.

Самый простой способ удалить юзера (программы rmuser и pw).

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

rmuser <имя юзера>

Во всяком случае, кроме удаления учетной карточки, она удаляет

" его домашнюю директорию;

" его "почтовый ящик" в /var/mail;

" упоминания о юзере в /etc/group;

" персональную crontab юзера;

" "пакетные" задания юзера в /var/at/jobs.

Как я уже сказал, в большинстве случаев этого вполне достаточно.

Те же действия выполняет "универсальная" утилита pw. Для этого ее нужно запустить в виде

pw userdel <имя юзера> -r

(без ключа -r она только удалит учетную карточку из базы)

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Что может поменять сам юзер в своей учетной карточке?

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

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

Кроме того, юзер, как и администратор, может воспользоваться программой chpass. Естественно, он может редактировать только свою учетную карточку. При этом, он сможет поменять в ней только поля Shell и General information (свое реальное имя, адрес, телефон).

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как временно убрать юзера (не удалить, но запретить вход)?

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

- почта на несуществующего юзера будет возвращаться отправителю,

- user ID этого юзера может достаться другому (новому юзеру),

- при возвращении юзера в систему надо будет воспроизвести в точности ту же учетную карточку,

- и т.п.

Поэтому, этот способ - самый неудачный и его даже не стоит рассматривать. Лучше рассмотрим другие возможности:

" Первый способ

" Второй способ

" Так как же все таки надо поступить?

" Возможно, еще один способ

Первый способ

Этот способ (пожалуй, наиболее "цивилизованный") заключается в том, что в учетную карточку надо вписать"Account expiration time" (с помощью программы chpass), естественно, поставив там уже прошедшую дату. В этом случае, юзер как бы существует в системе - письма к нему идут, файлы сохраняются, во всех диагностиках, где может встретиться его имя, оно отображается правильно. Но, в то же время, если юзер попытается войти в систему, ему просто выдастся сообщение, что "ваш account истек".

Однако, это способ тоже не лишен недостатков. Чтобы понять - почему, надо рассмотреть подробнее, что значит "доступ в систему" юзера.

Обычный юзер может войти в систему (и пользоваться ее ресурсами) через терминал или по сети, с помощью telnet. При этом должна проработать программа login (которая проверит имя и пароль юзера и, если все правильно, запустит для него Shell). Эта же программа обычно вызывается для тех, кто заходит через модем и устанавливает IP соединение по модемной линии (PPP или SLIP). (Кстати, login'у можно запретить пропускать юзера, если прописать правильную строчку (запрещающую вход конкретному юзеру) в файле /etc/login.access. Как это правильно сделать, можно посмотреть в man login.access). Но, кроме того, юзер может (если, конечно, ваша система предоставляет такой сервис):

" иметь доступ к своим файлам через FTP, тогда проверкой имени/пароля занимается ftpd (программа-сервер FTP);

" читать свою почту через POP-сервер, тогда проверкой имени/пароля занимается программа popper;

" иметь доступ к своей домашней директории через сервер "samba", тогда проверкой имени/пароля занимается программа smbd;

" пользоваться RPC-сервисами - "удаленным запуском программ" (rlogin, rsh и т.п.), тогда проверкой имени/пароля занимаются соответствующие демоны (rlogind, rshd и т.д.);

Так вот. Проблема в том, что не все перечисленные демоны (программы-серверы), ответственные за допуск юзера к ресурсам, могут обращать внимание на "Account expiration time". И, следовательно, все равно дадут юзеру возможность воспользоваться своими услугами.

Второй способ

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

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

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

Кроме того, есть случаи, когда этот способ не работает. Дело в том, что RPC-сервисы могут не проверять пароль, если у юзера в домашней директории в соответствующем файле (.rhosts) записаны адреса машин "пользующихся доверием" и он осуществляет доступ именно с этих машин. В этом случае, проверяется только адрес машины (и имя юзера под которым он зарегистрирован там), а пароль не запрашивается, следовательно, описанный метод не сработает. (Кстати, предыдущий метод ("account expiration") в этом случае должен работать.)

Так как же все таки надо поступить?

Способ с "испорченным" паролем более универсальный, но неправильный :-).

Самый правильный путь - подбирать всех демонов таких, которые правильно отрабатывают запрет входа (например, через "account expiration"). Кстати, те демоны, которые у вас "с раздачи" (то есть, из "родного" дистрибутива), должны правильно обрабатывать такой запрет. Проблемы могут возникнуть только с программами от других разработчиков.

Кроме того, для юзеров, запускающих "IP по модему", обычно, другой способ входа недоступен. Поэтому можно смело пользоваться "account expiration" или запретом в /etc/login.access.

Возможно, еще один способ

И, наконец, следует отметить, что в FreeBSD версии 2.2.2 появилась "база данных login-классов" (login class capability database), /etc/login.conf. Она предоставляет более гибкие возможности по ограничению входа. Можно не только полностью запретить вход юзеру, но разрешить только в определенное время суток или ограничить длительность сессии и т.п.

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

Скорее всего, о ней можно сказать все то же, что относится к методу "account expiration".

(Когда я познакомлюсь с ней поближе, я, возможно, полностью перепишу этот текст :-).

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Что еще почитать?

Естественно, man'уалы, имеющие отношение к теме.

man 5 passwd - описывает структуру учетной карточки (user account)

man adding_user - общие слова о добавлении юзера. Кстати, там есть рекомендации - каким должно быть Login name

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

man pwd_mkdb

man vipw

man adduser

man pw

Утилиты для внесения изменений.

man passwd - изменение пароля

man chpass - другие изменения в учетной карточке

man pw - тоже делает изменения в учетной карточке

Утилиты для удаления юзера.

man rmuser

man pw

К вопросу о временной блокировке входа юзеру.

man login.access

man login.conf

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Драйвер "системной консоли" - syscons.

Какое место занимает этот драйвер в работе FreeBSD?

Как любой Юникс, FreeBSD дает возможность пользователю общаться с компьютером через различные типы терминалов. Это может быть и "железный" терминал, подключенный, например, через COM-порт и другой компьютер, соединяющийся по сети (программой telnet). Но основным терминалом конечно же является дисплей и клавиатура той "писишки", на которой и запущена FreeBSD.

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

Конечно, и в других операционных системах (даже таких простых, как MS DOS) обычная программа не "лезет в железо", а пользуется библиотечными функциями (getchar, print и т.п.) или функциями BIOS. Но, в данном случае, речь идет о том, что даже между самой системой FreeBSD (системными библиотеками) и "железными" устройствами, стоят соответствующие "драйверы терминалов", которые и обеспечивают "однообразие" при работе с очень разными терминалами.

Так вот, syscons - как раз такая программа, которая с одной стороны общается непосредственно с регистрами контроллеров (видео и клавиатуры) вашей "писишки", а с другой стороны изображает для операционной системы некоторое законченное устройство, наподобие внешнего терминала.

Надо заметить, что в FreeBSD есть еще один "альтернативный" драйвер консоли - pcvt. Для того, чтобы заменит на него syscons надо персобрать ядро системы с соответствующими опциями.

Но, поскольку, в "стандартной поставке" FreeBSD "встроен" именно syscons, он же и используется в большинстве случаев.

Поэтому я ограничусь только описанием syscons (тем более, что pcvt я практически не знаю :-)

Что полезного вы можете здесь прочитать?

" Во-первых, о всех (или почти всех) возможностях syscons. Возможно, вы найдете здесь для себя что-то новое.

" Во-вторых, о русификации своего терминала. Конечно, полная "русификация" системы не ограничивается установкой русских шрифтов для дисплея и русской "раскладки клавиатуры", но, по крайней мере, начинается с нее.

Хочу предупредить, что если вам надо "по быстрому" решить проблему русификации, то совсем не обязательно читать все что я написал далее.

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

" В-третьих, о переназначении некоторых клавиш - "переключатель РУС/ЛАТ", Meta-клавиша, "комбинация из трех пальцев" (Control+Alt+Del) и т.п.

" И кроме того, немного справочной информации, которую я собрал из разных man'ов и исходников программ, мелкие, но полезные программки (которыми я пользовался при этом) и некоторые полезные (надеюсь) советы.

Итак...

" Основные возможности syscons

" Дисплей

" Клавиатура

" Несколько примеров изменения назначения клавиш.

" Программа vidcontrol

" Программа kbdcontrol

" Русификация syscons

" Как достигается "взаимопонимание" программ с терминалом (termcap, terminfo и переменная TERM).

" Одно важное замечание: Какое отношение это имеет к X-Window?

" Приложение 1. Команды (esc-последовательности) syscons

" Приложение 2. Управляющие ("контроловые") символы

" Приложение 3. "Функциональные" клавиши

" Приложение 4. Несколько мелких полезных программок.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Основные возможности syscons

Итак, syscons с одной стороны работает непосредственно с "железом" (видео-контроллером и контроллером клавиатуры), а для ОС выглядит как некий аппарат, который и является терминалом.

" Виртуальные терминалы.

" Буфер экрана (history buffer).

" Команды терминала syscons.

" Управление драйвером syscons.

" Работа с "мышью".

Виртуальные терминалы.

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

Каждый такой виртуальный терминал является как бы независимым устройством. То есть, вывод на один из виртуальных терминалов никак не влияет на другие, некоторые атрибуты экрана (например цвета символов) могут быть установлены на одном конкретном терминале и не отражаться на других, "модификаторы клавиатуры" (CapsLock, NumLock и т.п.) могут находится в разных положениях на различных терминалах и т.п. Естественно, если пользователь переключится в другой виртуальный терминал, а потом вернется обратно, syscons восстановит и изображение на экране, и аттрибуты, и состояние модификаторов.

Однако, надо сразу оговориться, что некоторые настройки syscons (шрифты, "раскладка клавиатуры" и некоторые другие) действуют сразу на все виртуальные терминалы, независимо от того, в каком из них вы находились в момент изменения этих настроек.

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

Обычно syscons поддерживает 16 виртуальных терминалов. Это число определяется при сборке ядра системы и может быть изменено при перегенерации ядра (option MAXCONS). Правда, для того, чтобы можно было их все задействовать, в директории /dev должно быть создано соответствующее количество "точек входа" ("устройства" ttyv0 - ttyv9, ttyva-ttyvf). Дело в том, что в "свеже-инсталлированной" системе таких устройств только 4 (ttyv0-ttyv3).

Для того, чтобы "доделать" остальные надо выполнить команду

/dev/MAKEDEV vty*

где * означает количество устройств, которое вам нужно (для чисел больше 9 используются буквы a-f, как для шестнадцатеричных цифр).

Кроме того, чтобы реально переключиться на какой-нибудь из виртуальных терминалов, он должен быть активным. То есть на нем должна быть запущена хоть какая-нибудь задача. Для того, чтобы при старте системы каждый терминал получил свою задачу, на каждом из них запускается программка getty, которая дает возможность открыть сессию на этом терминале. Это задание (запустить getty на каждом терминале) записывается в файле /etc/ttys. Опять же, в "свеже-поставленной" системе в этом файле "охвачены" только три терминала. Поэтому, если вы хотите пользоваться и остальными, то в этом файле придется добавить "задания" для всех виртуальных терминалов. Только, если вы собираетесь запускать систему X-Window, не забудьте оставить для нее хотя бы один свободный терминал.

Буфер экрана (history buffer).

Каждый виртуальный терминал имеет буфер экрана, больший, чем размер физического экрана. Обычно физический размер экрана 25 строчек, хотя, при желании, вы можете переключить syscons в режим при котором на экране отображаются 43, 50 или 60 строчек, если, конечно, видеокарта поддерживает такие режимы (подробнее об этом в "Режим отображения")

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

Эти 100 строчек хранятся в буфере экрана и вы можете их "пролистать", переключив syscons в специальный режим - "просмотра буфера" (подробнее в "Специальные клавиши: slock").

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

Команды терминала syscons.

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

Список этих команд можно посмотреть в "Приложение 1. Команды (esc-последовательности) syscons"(он в основном соответствует командам стандартного "ANSI-терминала").

Но хочу напомнить, что программа, если она претендует на то, чтобы работать на разных типах терминалов, и не должна знать команды конкретного дисплея. Для обеспечения такой независимости от типа терминала, в любом Юниксе существуют стандартные механизмы - "базы данных свойств терминалов" (termcap и terminfo) и библиотеки ввода/вывода (ncurses, slang и т.п.), которые сами адаптируются к "системе команд" конкретного типа терминала.

Управление драйвером syscons.

Для изменения настроек syscons в системе существуют две утилиты - vidcontrol и kbdcontrol. Как понятно из их названий, первая меняет параметры, относящиеся к изображению на дисплее, а вторая - настройки клавиатуры.

Описание этих утилит можно найти в соответствующих man'уалах. Я только кратко опишу их основные возможности (в разделах "Программа vidcontrol" и "Программа kbdcontrol").

Надо заметить, что обычно основные настройки syscons (русификация, тип курсора, "скринсейвер" и т.п.) делаются во время загрузки системы в соответствующем "стартовом скрипте" (/etc/rc.i386), а параметры, которые им требуются, прописываются в /etc/rc.conf.

Поэтому, вы можете поэкспериментировать с настройками, запуская эти утилиты вручную, но "глобальные" изменения лучше делать редактированием соответствующих строчек в /etc/rc.conf.

Работа с "мышью".

К сожалению, на эту часть мне не хватило сил и времени. В свое оправдание скажу только, что

" во-первых, это вопрос выходит за рамки собственно драйвера syscons (надо рассказать про драйвер "мыши", правильную настройку X-Window, взаимодействие с другими программами)

" во-вторых, эта часть syscons появилась сравнительно недавно, все еще совершенствуется, и, поэтому, ее описание может существенно отличаться для разных версий FreeBSD.

Надеюсь, что со временем я восполню этот пробел. Пока могу лишь посоветовать почитать на эту тему man moused и man sysmouse.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Клавиатура

Теперь рассмотрим ту часть syscons, которая работает с клавиатурой.

Начнем с самого "низа" - "железного" контроллера клавиатуры. При нажатии на любую клавишу он выдает ее скан-код - некий номер кнопки на клавиатуре. Сразу замечу, что этот скан-код не имеет ничего общего с ASCII-кодами тех символов, которые "нарисованы на кнопках".

Более того, для каждой кнопки контроллер выдает по крайней мере два разных кода - один, когда вы нажимаете кнопку, другой - когда отпускаете ее. Эти коды всегда отличаются на величину 128 (старший бит в байте кода), хотя в данном случае это не так уж и важно. Кроме этого, при нажимании некоторых кнопок (и отпускании) контроллер генерирует скан-коды состоящие из двух байт - "префикса" (обычно это E0) и собственно кода кнопки. Обычно такие скан-коды называют "расширенными".

Основная задача syscons - преобразовать эти скан-коды в соответствующие коды символов. Причем, он делает это в два этапа.

Сначала "сырые" скан-коды (которые считываются из контроллера) преобразуются во внутренние коды syscons. В основном это касается "расширенных" кодов. Для обычных клавиш в качестве внутреннего кода берется просто скан-код, а вот "расширенные" коды заменяются на однобайтные коды (естественно, те, которые не заняты обычными клавишами). Кстати, в документации они обычно тоже называются скан-кодами, но учтите, что это "немного не те" скан-коды.

На втором этапе уже внутренние коды по специальной таблице "раскладки клавиатуры" (keyboard map) преобразуются в обычные ASCII коды символов. Надо заметить, что при этом используется только скан-код "нажатия клавиши".

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

То есть, при нажатии таких клавиш, получаются опять как бы "расширенные" коды. Естественно, это уже не те "расширенные" скан-коды, которые выдает контроллер клавиатуры (да и клавиши другие).

Надо отметить, что первый этап (преобразование "сырых" скан-кодов во "внутренние") жестко "зашит" в программе syscons. То есть, изменить соответствие между каким-нибудь "расширенным" скан-кодом и внутренним кодом, в который его превратит syscons, нельзя.

А вот преобразованием в ASCII-коды, напротив, можно управлять. Таблица раскладки клавиатуры может быть загружена в syscons с помощью соответствующей утилиты (kbdcontrol). Естественно, если вы не будете загружать никакую таблицу, это не значит, что syscons не сможет перевести скан-коды в символы ASCII. В нем есть "встроенная" таблица раскладки "по умолчанию". Но, как я уже сказал, в любой момент можно поменять все соответствия кодов.

Также можно менять и последовательности, которые "навешиваются" на "функциональные" клавиши на третьем этапе.

Прежде чем перейти к более подробному рассмотрению "раскладки клавиатуры", надо отметить, что syscons можно переключить в режим, когда он будет отдавать в систему просто "сырые" скан-коды (RAW) или в режим выдачи "внутренних" скан-кодов (CODE). (В "нормальном" режиме выдаются "транслированные" (XLATE) коды.)

Если вам захочется посмотреть скан-коды вашей клавиатуры, можете воспользоваться моими программками ("Приложение 4. Несколько мелких полезных программок.), которые используют эти режимы. Только хочу еще раз подчеркнуть, что наиболее интересными являются не "сырые" (RAW) скан-коды, а "внутренние" коды syscons (CODE), поскольку в таблице раскладки клавиатуры указываются именно они (причем, только "код нажатия").

Итак, что собой представляет таблица раскладки клавиатуры (keyboard map)?

Во-первых, напомню, что есть несколько вспомогательных клавиш - "модификаторов" (Shift, Ctrl и Alt), которые меняют код выдаваемый другими клавишами.

Поэтому, каждая строчка в "таблице раскладки" состоит из скан-кода клавиши ("внутреннего", не "сырого") и нескольких значений для этой клавиши. (В зависимости от комбинации "модификаторов" syscons выберет одно из них.)

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

" модификаторы - клавиши, которые изменяют значения для других клавиш

" обычные "знаковые" клавиши

" "функциональные" клавиши

" переключатели виртуальных терминалов

" специальные клавиши (рестарт компьютера, переход в отладчик и т.п.)

Модификаторы.

Это клавиши, которые меняют значения выдаваемые другими клавишами.

Рассмотрим подробнее - какие модификаторы использует syscons и каким образом они влияют на коды других клавиш.

shift, ctrl и alt

В таблице раскладки клавиатуры (keyboard map) каждому скан-коду соответствует восемь значений. Как я уже сказал, какое из этих значений будет выбрано при нажатии клавиши, определяется "состоянием модификаторов".

Так вот, это "состояние" задается тремя модификаторами - shift, ctrl и alt.

Состояние модификаторов (номер кода в таблице) syscons вычисляет по формуле:

1 (если shift) + 2 (если ctrl) + 4 (если alt)

В общем-то, если вы заглянете в какой-нибудь файл "раскладки клавиатуры", то увидите, что все колонки значений сверху подписаны - какая колонка, при какой комбинации модификаторов выбирается. Так что, высчитывать номер колонки по приведенной формуле вам не придется. Однако, эту формулу полезно знать, чтобы правильно понимать действие двух других модификаторов (CapsLock и NumLock) о которых речь пойдет ниже.

Говоря о модификаторах shift, ctrl и alt надо отметить, что ...

" Строго говоря, поскольку на современных клавиатурах каждая такая клавиша присутствует в двух экземплярах (слева и справа основной клавиатуры), и значений тоже не три, а шесть - lshift, rshift, lctrl, rctrl, lalt, ralt. Буквы l и r в названиях означают левый (left) и правый (right) соответственно. Но для выбора одного из восьми состояний syscons не делает различий для левой и правой клавиши. То есть, в любом случае - нажмете ли вы клавишу, которой "прикреплено" значение lalt или клавишу со значением ralt или обе вместе, syscons будет считать, что активен модификатор alt.

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

" По умолчанию, все эти шесть значений "навешены" на привычные клавиши - lshift на левую кнопку [Shift], rshift - на правую кнопку [Shift] и т.д. Однако, еще раз замечу, что речь идет о не о физических кнопках на клавиатуре, а о значениях, которые драйвер им присваивает. То есть, при желании, можно клавишу [Alt] заставить действовать как Shift, например, хотя в этом ничего полезного нет. Более полезным может оказаться одну из парных клавиш [Shift], [Ctrl] или [Alt] (например, левую) использовать по ее прямому назначению, а на правую "повесить" какую-нибудь другую функцию.

clock и nlock

Следующие два модификатора - clock (CapsLock) и nlock (NumLock). Их влияние на другие клавиши по сути одинаково. Отличаются они только "областью действия". Как вы можете заметить, в файлах "раскладки клавиатуры", кроме восьми колонок с кодами, есть еще одна колонка, озаглавленная "lock state". Она и определяет - подвержена ли соответствующая кнопка действию clock или nlock.

" Если в этой колонке стоит буква "O", то клавиша никак не реагирует ни на нажатие clock, ни на nlock. Обычно, это клавиши с цифрами на основной клавиатуре, функциональные клавиши и сами клавиши модификаторов.

" Если в "lock state" стоит "C", значит выбор значения зависит от состояния модификатора clock. Обычно, это клавиши с буквами.

" Буква "N" помечает клавиши, зависимые от состояния nlock. Традиционно - это клавиши на дополнительной цифровой клавиатуре.

" Наконец, в последней колонке может стоять буква "B" (от слова both - оба). Это должно означать, что клавиша реагирует и на clock и на nlock. Однако, ни в одной "раскладке клавиатуры" из дистрибутива FreeBSD такие клавиши не предусмотрены.

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

То есть, в таблице раскладки меняются местами колонки "с shift'ом" и "без shift'а". Обратите внимание, что в соответствии с формулой, определяющей номер колонки, меняются местами не только первые две, но и все четные с нечетными (то есть, "просто ctrl" и "ctrl+shift", "просто alt" и "alt+shift" и т.д.).

Обе клавиши - clock и nlock, являются "фиксирующимися". То есть, после нажатия и отпускания clock (например) клавиатура переходит в состояние clock. А при повторном нажатии/отпускании возвращается в исходное состояние (что тоже всем известно).

По умолчанию, значение nlock "навешено" на клавишу [Num Lock]. А вот с clock все немного сложнее. Вообще-то, оно изначально соответствует клавише [Caps Lock], но если у вас загружена раскладка для русской клавиатуры (что бывает чаще всего), то на эту клавишу "навешивается" еще и другой модификатор - alock (Alt Group Lock), который служит для переключения на русский алфавит (о нем поговорим немного позднее). Для того, чтобы получить именно clock вам придется нажимать клавишу [Caps Lock] вместе с одним из основных модификаторов (не важно - shift, ctrl или alt).

alock и ashift

Следующие два модификатора - alock (Alt Group Lock) и ashift (Alt Group Shift). Они действуют на другие клавиши одинаково, причем, на все клавиши. Разница только в том, что alock "фиксирующаяся" (как clock и nlock), а ashift - "не фиксирующаяся" (как и обычный shift).

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

То есть каждая клавиша имеет как бы два разных скан-кода, один в обычном состоянии и другой скан-код (на 128 больше) в состоянии AltGroup. Таким образом получается для того же набора физических кнопок еще одна раскладка - "альтернативная".

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

Таким образом, руссифицированная раскладка отличается от обычной тем, что в нее дописывается еще столько же строчек (сколько в обычной) с номерами скан-кодов больше на 128. При этом, для "небуквенных" клавиш все значения обычно такие же, как и в первой части таблицы, а для "буквенных" подставляются соответствующие коды русских букв. (Надо отметить, что в дистрибутиве FreeBSD есть раскладки для кодировок koi8 и cp866. Если вам захочется иметь раскладку для cp1251 ее можно изготовить самостоятельно).

Естественно, что по умолчанию эти два модификатора не назначены ни на какие клавиши. Но если загружается одна из русских раскладок, то alock присвоена клавише [Caps Lock], но только в первой колонке. То есть в таком качестве [Caps Lock] выступает только тогда, когда не нажат ни один из основных модификаторов (shift, ctrl или alt). Если вас это не устраивает и вы хотели бы, чтобы [Caps Lock] была именно CapsLock'ом, можно "подвесить" alock на любую другую клавишу или комбинацию клавиш (например "два Shift'а" или "Ctrl+Shift"). Подробнее можете посмотреть в "Несколько примеров изменения назначения клавиш"..

Значение ashift в стандартных раскладках отсутствует (даже в русских). Если она вам нужна, выберите подходящую для нее клавишу и отредактируйте соответствующий файл "раскладки клавиатуры".

meta

Наконец, последняя клавиша, которую можно отнести к модификаторам - клавиша meta.

Клавиша эта не фиксируется, то есть она активна только пока вы ее удерживаете в нажатом состоянии.

Когда она активна, syscons при выдаче кода другой нажатой клавиши, сначала вставляет код Esc (27). То есть обычные клавиши (алфавитноцифровые) начинают выдавать последовательность из двух кодов (например, клавиша [A] - EscA). Дело в том, что некоторые программы (Midnight Comander, emacs и т.д) широко используют такие комбинации в качестве "горячих клавиш". Без модификатора meta их можно получать, последовательно нажимая [Esc] и нужную клавишу.

По умолчанию эта клавиша на клавиатуре отсутствует. Если вы считаете, что с ней вам будет удобнее, можно назначить ее на одну из парных кнопок модификаторов (Shift, Ctrl или Alt), а вторую оставить для ее "прямого назначения". Если же у вас имеется клавиатура "от Microsoft", с дополнительными кнопками (два "окошка" - слева и справа и "меню") то под meta можно задействовать одну из этих кнопок (или даже все три :-).

Подробнее можете посмотреть в "Несколько примеров изменения назначения клавиш"..

Обычные клавиши.

Это клавиши, при нажатии которых выдается просто одиночный код (в отличии от "функциональных" клавиш). Кроме обычных символов (буквы, цифры, знаки препинания и т.п.) к ним относятся "управляющие" коды, которые генерируют клавиши [Esc], [Enter], [Tab] и [Backspace].

Кроме того, в зависимости от состояния модификаторов (обычно, модификатора ctrl), "символьные" клавиши тоже могут выдавать "управляющие" коды (CtrlA - 1, CtrlB - 2 и т.д.).

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

Кроме того, в таблице раскладки клавиатуры можно встретить код nop.

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

Обычно этим словом помечаются не клавиши, а только некоторые "состояния" клавиш (например, клавиша [&] при нажатом [Ctrl]). А также, скан-коды, которые не соответствуют никаким физическим кнопкам на клавиатуре.

"Функциональные" клавиши.

Эти клавиши отличаются от "нормальных" знаковых клавиш тем, что при нажатии выдают не просто одиночный код, а последовательность кодов (обычно это последовательности типа Esc [ 'буква'). Причем эти последовательности при желании можно "перепрограммировать" с помощью, например, утилиты kbdcontrol.

Вообще-то, правильнее сказать "могут выдавать последовательности", поскольку, по умолчанию, некоторые из этих "последовательностей" состоят из одного знака или вообще пустые. Важно только то, что при желании вы можете их "удлинить", в то время как для обычных знаковых клавиш это сделать невозможно. Максиммальная длина последовательности - 16 байт.

Называются эти клавиши в таблицах "раскладки клавиатуры" fkey01 - fkey96. Так много их потому, что к таким клавишам (порождающим целую "пачку" кодов) относятся не только клавиши F1 - F12, но и "стрелки", Home, End, Delete и т.п. Кроме того, несколько fkey оставлено "про запас", для будущих возможных кнопок.

На всякий случай я привожу список соответствий - какие fkey'и каким физическим клавишам соответствуют. Естественно, речь идет о значениях "по умолчанию". При желании их можно "перевесить" на другие кнопки. Первые 48 fkey распределены между клавишами [F1] - [F12]. Из них первые двенадцать (fkey01 - fkey12) получаются просто при нажатии соответствующих физических клавиш ([F1] - [F12]), следующие двенадцать (fkey13 - fkey24) при нажатии тех же клавиш с модификатором Shift (то есть, по умолчанию - [F1]+[Shift] - [F12]+[Shift]), следующая "пачка" (fkey25 - fkey36) - то же самое, но с модификатором Ctrl, и, наконец, последние (fkey37 - fkey48) получатся когда будут активны оба модификатора - и Shift, и Ctrl. Следующие fkey'и "достались" физическим клавишам

fkey49 - [Home]

fkey50 - [стрелка вверх]

fkey51 - [Page Up]

fkey53 - [стрелка влево]

fkey55 - [стрелка вправо]

fkey57 - [End]

fkey58 - [стрелка вниз]

fkey59 - [Page Down]

fkey60 - [Insert]

fkey61 - [Delete]

Эти же значения (кроме fkey61 - [Delete]) могут выдавать клавиши дополнительной цифровой клавиатуры (keypad), когда она находится не в "режиме цифр" (неактивный Num Lock).

А несколько fkey (пропущенных выше) можно получить только с кнопок этой дополнительной клавиатуры (опять же в "нецифровом режиме")

fkey52 - [-]

fkey54 - [5]

fkey56 - [+]

И, наконец, "микрософтовская" клавиатура имеет еще три дополнительные кнопки, на которые по умолчанию тоже назначены fkey'и

fkey62 - ["окошко" слева]

fkey63 - ["окошко" справа]

fkey64 - ["меню"]

Остальные fkey'и fkey65 - fkey96 зарезервированы для дальнейших расширений клавиатуры. То есть, они не назначены ни на какие клавиши, и не генерируют никаких последовательностей.

Можно отметить, что существует еще одна клавиша, которая выдает последовательность кодов, и которую можно также отнести к "функциональным".

Обозначается она btab (back tab) и назначена по умолчанию на [Tab]+[Shift]. Однако, в отличии от fkey он всегда выдает цепочку "Esc[Z", которую изменить нельзя (разве что, подправив "исходники").

Ну и, наконец, сами последовательности, которые по умолчанию соответствуют fkey'ям, можно посмотреть в "Приложение 3. Функциональные клавиши".

Переключатели виртуальных терминалов.

Эти клавиши вызывают немедленное переключение на другой "виртуальный терминал".

В таблице "раскладки клавиатуры" они называются scr01, scr02 ... scr16 (от слова screen). Понятно, что цифры в конце названия обозначают номер "виртуального терминала".

Кроме того существует еще одна клавиша - nscr (next screen) которая переключает syscons просто на следующий терминал.

По умолчанию, переключатели scr01 - scr10 назначены на комбинации клавиш [F1]+[Alt] - [F10]+[Alt], а оставшиеся scr11 - scr16 на комбинации [F1]+[Alt]+[Shift] - [F6]+[Alt]+[Shift]. Точнее, на клавиши [F1]-[F10] "при активном модификаторе alt" и "активном модификаторе shift", поскольку модификаторы alt и shift только "по умолчанию" находятся на одноименных клавишах и могут быть "переназначены" на любые другие.

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

Клавиша nscr по умолчанию находится на физической клавише [Print Screen].

Специальные клавиши.

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

slock

Прежде всего, клавиша, которая имеет смысл только для самого syscons. Это slock (scroll lock). Она переводит syscons в особый режим - просмотра буфера "истории" (history buffer). Как уже говорилось (в "Основные возможности syscons: Буфер экрана (history buffer)") каждый "виртуальный терминал" имеет буфер экрана, который больше чем физический экран (по умолчанию - 100 строчек или 4 обычных 25-строчных экрана). То есть, он помнит 100 строчек (если, конечно, вы не меняли этот размер) из которых мы видим только последние 25. В режиме просмотра буфера вы можете посмотреть остальные предыдущие строчки.

В этом режиме работают только клавиши [стрелка вниз], [стрелка вверх], [Page up], [Page Down], [Home] и [End]. Естественно, при этом ваш экран как бы "отсоединяется" от машины, то есть, если какая-то программа в это время что-нибудь выводит, весь ее вывод копится внутри системы и не попадает на экран.

А вот клавиши (кроме перечисленных выше) обрабатываются в обычном порядке.

Эта клавиша "фиксирующаяся" (как и другие Lock'и), то есть, чтобы попасть обратно в нормальный режим, надо нажать ее повторно.

По умолчанию находится на физической клавише [Scroll Lock].

boot

Клавиша boot вызывает немедленную перезагрузку системы (как при вводе команды reboot).

Изначально находится на комбинации - [Ctrl]+[Alt]+[Delete].

debug

Клавиша debug включает "ядерный" отладчик (встроенный в ядро). Естественно, для того, чтобы он включился у вас должно быть ядро с встроенным отладчиком (то ядро, которое ставится при инсталляции, отладчика в себе не имеет), иначе вы просто получите сообщение на самом первом "виртуальном терминале" - "No debugger in kernel".

По умолчанию эта команда "повешена" на две комбинации - [Ctrl]+[Alt]+[Esc] и [Ctrl]+[Print Screen].

susp

Клавиша susp имеет значения только для "лаптопов". Она дает команду устройству apm (Advanced Power Management) "пригасить" компьютер.

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

Compose

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

Особенность этой клавиши в том, что это именно физическая клавиша (со скан-кодом 56 - левый [Alt]) и она не может быть "переприсвоена" через таблицу раскладки. Кстати, и цифры с "дополнительной цифровой клавиатуры" "снимаются" на уровне скан-кодов. То есть, если вы даже поменяете их значения в таблице раскладки, для Compose они останутся обычными цифрами, причем независимо от состояния каких-либо модификаторов.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Программа kbdcontrol

" Загрузка таблицы раскладки клавиатуры.

" Изменение последовательностей, которые выдают клавиши fkey.

" Изменение размера буфера терминала.

" Другие команды

" Общие замечания.

Программа kbdcontrol служит для управления параметрами syscons, которые относятся к клавиатуре.

Полное ее описание можно посмотреть в соответствующем man'уале (man kbdcontrol).

Я только опишу ее основные функции.

Загрузка таблицы раскладки клавиатуры.

Для загрузки раскладки клавиатуры служит ключ -l (наверное,load)

kbdcontrol -l "имя файла раскладки"

Если вы не укажете полный путь для имени файла, а просто короткое имя (напрмер - mykbd), то kbdcontrol будет искать

" файл mykbd в текущей директории

" файл mykbd.kbd в текущей директории

" файл mykbd.kbd в директории /usr/share/syscons/keymaps

естественно, загрузит первый, который найдет.

Кстати, kbdcontrol может выполнить и обратную операцию - напечатать вам ту раскладку, которая в данный момент загружена в syscons. Для этого есть ключ -d (dump).

Изменение последовательностей, которые выдают клавиши fkey.

Программа kbdkontrol позволяет изменит последовательность кодов, связанных с "функциональными клавишами". Для этого предназначен ключ -f (function key)

kbdcontrol -f "номер fkey'я" "строка"

Поскольку эта команда (точнее, этот ключ) "связывает" только одну конкретную "функциональную клавишу" с соответствующей последовательностью кодов, то для изменения нескольких fkey, можно несколько раз использовать ключ -f в одной строке, например

kbdcontrol -f 1 ^[[M -f 2 ^[[N

Замечу, что обычно последовательности, "навешиваемые" на fkey'и начинаются с кода Esc (27). Если вы попытаетесь ввести этот код в командной строке, у вас, скорее всего, ничего не получится. Система попытается сразу обработать этот код, а не ждать пока вы введете все команду.

Поэтому выполнять такую "перезагрузку" кодов лучше всего из какого-нибудь командного файла. Только не забудьте, что вы должны вписать в команду именно код 27, а не два знака - "^" и "[" (а уж как он будет выглядеть, зависит от вашего редактора).

Существует также ключ (-F), с который "сбрасывает" все последовательности в их "стандартное" значение. То есть, устанавливает те последовательности, котрые были "зашиты" в syscons при сборке.

Изменение размера буфера терминала.

По-моему, было бы логично, чтобы это изменение делала программа vidcontrol. Но так уж определил автор - размер буфера терминала делается программой kbdcontrol с ключем -h (history buffer)

kbdcontrol -h "размер буфера в строках"

Заметьте, что если указать размер буфера меньше чем размер самого экрана, то просто не будет никакого буфера. То есть, все выводимые строчки будут нормально отображаться на экране, но запоминать syscons ничего не будет.

Другие команды

Кроме описанных выше действий, kbdkontrol можно использовать для изменения параметров "автоповтора" клавиатуры и для изменения параметров "пищалки" (звука, который издает терминал при выводе кода Bell - 7).

Подробнее о ключах и параметрах для этих команд смотрите man kbdcontrol.

Общие замечания.

Большинство параметров, которые меняет kbdcontrol влияет сразу на все "виртуальные терминалы". Исключение составляют только параметры "пищалки" и "размер буфера терминала".

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Несколько мелких полезных программок.

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

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

Программа scancode.c

Показывает скан-коды клавиш, именно в таком виде, в каком они указываются в таблице раскладки клавиатуры.

Ее надо "собрать" с библиотекой ncurses

сс scancode.c -lncurses -o scancode

Если вы хотите, чтобы она показывала и "код отпускания" клавиши, уберите проверку if (c > 0) или объявите c как unsigned char.

Если вас интересуют "сырые" скан-коды, то замените K_CODE на K_RAW

Программа fkey.c

Просто "вычитывает" из syscons последовательности, генерируемые "функциональными" клавишами.

Никаких специальных библиотек не требует.

Программа reset_kbd.c

Это программка очень специфического назначения.

Иногда, при "кривом" завершении программы X-сервер, клавиатура остается в режиме "сырых" скан-кодов. При этом, естественно, переключится в другой "виртуальный терминал" невозможно. Но, если к этой машине есть доступ телнетом, то можно исправить положение, вернув клавиатуру в нормальный режим.

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

Так вот, эта моя программка сама определяет текущий виртуальный терминал и "исправляет" клавиатуру именно на нем.

Для исполнения требуются привелегии root'а.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Несколько примеров изменения назначения клавиш.

" Переключатель "альтернативной клавиатуры" (Рус/Лат).

" Клавиша Meta.

" "Комбинация из трех пальцев" - Ctrl+Alt+Del.

Переключатель "альтернативной клавиатуры" (Рус/Лат).

Как я уже говорил, при загруженной (или встроенной) русской раскладке клавиатуры клавиша [CapsLock] начинает работать как "переключатель языка" - русский/латинский.

Если вам это не нравится, можно изменить раскладку так, чтобы [CapsLock] всегда оставалась CapsLock'ом. А "переключатель языка" присвоить какой-нибудь другой клавише или комбинации клавиш.

Первым делом вернем CapsLock на место. Для этого надо в файле раскладки найти строчки, в которых содержится значение alock.

058 alock clock clock clock clock clock clock clock O

084 alock alock alock alock alock alock alock alock O

186 alock clock clock clock clock clock clock clock O

212 alock alock alock alock alock alock alock alock O

Строчки со скан-кодами 84 и 212 нас мало интересуют. (Честно говоря, я не знаю - что это за клавиша.) А вот строчки 58 и 186 - это как раз клавиша [CapsLock] в "нормальной" и "альтернативной" (русской) клавиатурах.

Как видите, без модификаторов (shift, ctrl или alt) она действует как alock (alt group), а с любым из модификаторов - как clock (caps lock).

Просто исправьте alock на clock.

058 clock clock clock clock clock clock clock clock O

186 clock clock clock clock clock clock clock clock O

Теперь надо придумать - чем мы будем переключаться на русскую клавиатуру и обратно.

Если у вас есть незадействованные клавиши, например, "окошки" на "микрософтовской" клавиатуре, то можно занять одну из них. Это достаточно просто и я не буду подробно рассматривать этот случай. Можете посмотреть пример с клавишей Meta - это делается практически так же.

Если же свободных клавиш нет, то можно переключатель alock "подвесить" на какую-нибудь комбинацию клавиш. Например - "два шифта". То есть, каждая кнопка [Shift] должна работать как shift, а если их нажать одновременно, должен получится alock.

Для начала, найдем строчки в которых есть слово shift

042 lshift lshift lshift lshift lshift lshift lshift lshift O

054 rshift rshift rshift rshift rshift rshift rshift rshift O

170 lshift lshift lshift lshift lshift lshift lshift lshift O

182 rshift rshift rshift rshift rshift rshift rshift rshift O

Учтем, что даже при "одновременном" нажатии этих кнопок, все равно одна из них будет нажата чуть-чуть раньше. Поэтому, та кнопка которая будет нажата раньше, переведет клавиатуру в состояние shift, при котором выбирается вторая колонка значений (точнее, все четные), а уже вторая - должна выполнить нужное нам действие.

Если мы хотим, чтобы последовательность нажатия была не важна, нам надо исправить значение и для клавиши lshift во второй колонке (считаем, что правый shift мы нажали чуть раньше) и для клавиши rshift (на тот случай, если первым будет нажат левый shift).

042 lshift alock lshift lshift lshift lshift lshift lshift O

054 rshift alock rshift rshift rshift rshift rshift rshift O

170 lshift alock lshift lshift lshift lshift lshift lshift O

182 rshift alock rshift rshift rshift rshift rshift rshift O

Дело сделано.

Клавиша Meta.

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

Если у вас "микрософтовская" клавиатура, то под met'у можно задействовать одну из кнопок с "окошками", напрмер - левую. Если вы не знаете ее скан-код (вообще-то, это 105), можно найти ее по значению - "по умолчанию" она имеет значение fkey62

105 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 O

Просто замените значения во всех колонках на meta

105 meta meta meta meta meta meta meta meta O

Если у вас русская раскладка клавиатуры, то не забудьте ту же операцию проделать для той же кнопки в "альтернативной" части раскладки

233 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 O

Если же "микрософтовских" кнопок у вас нет, то можно под met'у выделить одну из "парных" кнопок ([Shift], [Ctrl] или [Alt]). Поскольку, для syscons нет разницы - какую из них вы нажмете для получения нужного эффекта, можно, напрмер, в качестве alt оставить только левую кнопку (та строчка, где значения - lalt), а правую кнопку (значения - ralt) изменить на meta.

"Комбинация из трех пальцев" - Ctrl+Alt+Del.

Если вам не нравится, что ваш компьютер можно перегрузить в любой момент, нажав "магическую комбинацию" Ctrl+Alt+Del, найдите в раскладке все строчки со словом boot (учтите, что клавиш Del две - одна над стрелками, а другая на "дополнительной цифровой клавиатуре").

083 del '.' '.' '.' 174 174 boot boot N

103 fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot fkey61 O

211 del '.' '.' '.' 174 174 boot boot N

231 fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot fkey61 O

Просто замените слово boot на что-нибудь другое - nop ("пустая" клавиша) или bel ("писк").

Кстати, если вы боитесь, что враги могут восстановить эту клавишу и все-таки "отправить в перезагрузку" вашу машину, в последних версиях syscons появилось более радикальное средство.

Надо пересобрать ядро с "option SC_DISABLE_REBOOT", и куда бы вы (или злоумышленники) ни назначили значение boot, оно просто не окажет никакого действия на машину.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Управляющие ("контроловые") символы

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

код название клавиша "по умолчанию"

0 nul [Ctrl]+[@]

1 soh [Ctrl]+[A]

2 stx [Ctrl]+[B]

3 etx [Ctrl]+[C]

4 eot [Ctrl]+[D]

5 enq [Ctrl]+[E]

6 acq [Ctrl]+[F]

7 bel [Ctrl]+[G]

8 bs [Ctrl]+[H] или [Backspace]

9 ht [Ctrl]+[I] или [Tab]

10 lf или nl [Ctrl]+[J] или [Ctrl]+[Enter]

11 vt [Ctrl]+[K]

12 nf или np [Ctrl]+[L]

13 cr [Ctrl]+[M] или [Enter]

14 so [Ctrl]+[N]

15 si [Ctrl]+[O]

16 dle [Ctrl]+[P]

17 dc1 [Ctrl]+[Q]

18 dc2 [Ctrl]+[R]

19 dc3 [Ctrl]+[S]

20 dc4 [Ctrl]+[T]

21 nak [Ctrl]+[U]

22 syn [Ctrl]+[V]

23 etb [Ctrl]+[W]

24 can [Ctrl]+[X]

25 em [Ctrl]+[Y]

26 sub [Ctrl]+[Z]

27 esc [Ctrl]+[[] или [Esc]

28 fs [Ctrl]+[]

29 gs [Ctrl]+[]]

30 rs [Ctrl]+[^]

31 ns [Ctrl]+[-]

32 sp [пробел]

127 del [Ctrl]+[Backspace] или [Del] на доп. цифровой клавиатуре

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

"Функциональные" клавиши

Эту таблицу я получил с помощью программки, которая "вычитывает" определения клавиш непосредственно из самого syscons.

Примерно такую же таблицу можно найти в "исходниках" системы (в конце файла /usr/src/sys/i386/isa/kbdtables.h)

Последовательности кодов, которые по умолчанию присвоены "функциональным" клавишам (fkey01 - fkey96)

fkey 1 033[M fkey 2 033[N fkey 3 033[O fkey 4 033[P

fkey 5 033[Q fkey 6 033[R fkey 7 033[S fkey 8 033[T

fkey 9 033[U fkey10 033[V fkey11 033[W fkey12 033[X

fkey13 033[Y fkey14 033[Z fkey15 033[a fkey16 033[b

fkey17 033[c fkey18 033[d fkey19 033[e fkey20 033[f

fkey21 033[g fkey22 033[h fkey23 033[i fkey24 033[j

fkey25 033[k fkey26 033[l fkey27 033[m fkey28 033[n

fkey29 033[o fkey30 033[p fkey31 033[q fkey32 033[r

fkey33 033[s fkey34 033[t fkey35 033[u fkey36 033[v

fkey37 033[w fkey38 033[x fkey39 033[y fkey40 033[z

fkey41 033[@ fkey42 033[[ fkey43 033[ fkey44 033[]

fkey45 033[^ fkey46 033[_ fkey47 033[` fkey48 033[{

fkey49 033[H fkey50 033[A fkey51 033[I fkey52 -

fkey53 033[D fkey54 033[E fkey55 033[C fkey56 +

fkey57 033[F fkey58 033[B fkey59 033[G fkey60 033[L

fkey61 0177 fkey62 033[J fkey63 033[~ fkey64 033[}

fkey65 fkey66 fkey67 fkey68

fkey69 fkey70 fkey71 fkey72

fkey73 fkey74 fkey75 fkey76

fkey77 fkey78 fkey79 fkey80

fkey81 fkey82 fkey83 fkey84

fkey85 fkey86 fkey87 fkey88

fkey89 fkey90 fkey91 fkey92

fkey93 fkey94 fkey95 fkey96

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Дисплей

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

" Шрифты

" Дополнительные таблицы перекодировки (screenmap)

" Режим отображения (колличество строк и символов на экране)

" Screen saver

Шрифты

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

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

Готовые файлы шрифтов находятся в системе в директории /usr/share/syscons/fonts. Там же есть и файл с кратким описанием шрифтов.

Обратите внимание, что для каждого набора символов существует по крайней мере три разных файла, с разными размерами (в пикселах) символов - 8x8, 8x14, 8x16.

Дело в том, что видеокарта имеет несколько режимов отображения, отличающихся "плотностью" знаков (об этом немного ниже). Если в стандартном режиме, на экране изображается 25 строчек по 80 знаков каждая, то в других режимах на экране может быть 30, 43, 50 или даже 60 строк (естественно, это зависит от модели видеокарты). В одних режимах размер одиночного знака складывается из матрицы 8x16 точек, в других - 8x14 или 8x8. Соответственно, syscons может помнить три разных шрифта, отличающихся размером матрицы, и в нужный момент (при изменении режима отображения) загрузить в видеокарту подходящий шрифт.

В стандартном режиме (80x25) используются шрифты 8x16, но на всякий случай рекомендуется загружать все три типа шрифтов. Замечу, что обычно шрифты загружаются при старте системы, а какие именно - записано в соответствующих строчках /etc/rc.conf. Поэтому "рекомендуется загружать" означает, просто подправить нужные строчки в rc.conf, а если вы уже выполнили все необходимые действия по русификации системы, то у вас и так уже загружается "все, что нужно". (Подробности о русификации в главе "Русификация syscons")

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

Дополнительные таблицы перекодировки (screenmap)

Выше я сказал, что при выводе символа, syscons просто отправляет его код в видео-контроллер. Это не совсем верно.

Перед этим syscons "прогоняет" символ через внутреннюю таблицу перекодировки. Эта "таблица перекодировки" (screenmap) представляет из себя просто табличку из 256 байт, то есть каждый выводимый код символа может быть заменен на код какого-нибудь другого символа. Понятно, что если вам ничего заменять не нужно, эта таблица заполняется такими значениями, которые не меняют исходный код.

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

Но, с другой стороны, если у вас нет под рукой нужного шрифта (например, русские буквы в кодировке cp1251), то составить таблицу перекодировки очень легко с помощью подходящей программы-"перекодировщика". А нарисовать новый шрифт, или хотя бы "перекроить" один из существующих - более трудоемкая задача. Кроме того, "таблица перекодировки" помогает решать и некоторые другие проблемы (например, смотри "Русификация: Зачем так сложно?").

Как и шрифты, screenmap можно заменить с помощью программы vidcontrol (подробности в описании vidcontrol).

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

Режим отображения (колличество строк и символов на экране)

Как я уже упоминал выше, видео-контроллер может строить изображение на экране с разной "плотностью символов". В стандартном режиме изображение состоит и 25 строк по 80 знаков в каждой. Такой режим называется (в тех терминах, которые понимает vidcontrol) VGA_80x25. В зависимости от типа видеокарты, вы можете получить также режимы - 40x25, 80x30, 80x43, 80x50 и 80x60.

Для переключения режимов можно воспользоваться опять же программой vidcontrol.

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

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

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

Если для стандартного режима тип терминала должен быть cons25 или cons25r (r - русифицированный, он же pc3r), то для других режимов надо выбрать - cons30 (cons30r), cons43 (cons43r) и т.п.

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

Screen saver

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

Собственно, эта программа не является частью syscons.

Каждый такая программа (а их в FreeBSD предлагается несколько на выбор) представляет собой "загружаемый модуль ядра" (loadabe kernel module) и может быть загружена во время работы системы с помощью стандартной утилиты для загрузки всех подобных модулей - modload.

При загрузке screen saver сам сообщает syscons - как его запустить.

Естественно, вы можете регулировать "время простоя", после истечении которого syscons должен запустить screen saver.

Так же как и другие настройки syscons, загрузка screen saver'а обычно выполняется при старте системы. Параметры - тип saver'а и "время простоя" указываются в /etc/rc.conf. Только хочу еще раз обратить внимание на то, что "время простоя" (как и другие параметры syscons) устанавливается с помощью утилиты vidcontrol, а вот "тип saver'а" выбирается просто загрузкой соответствующего модуля командой modload.

Кстати, если вас интересует полный список saver'ов, которые вы можете использовать, не доверяйте тому перечню, который дан в комментариях в файле rc.conf, он может быть неполным. Просто загляните в директорию /lkm. Файлы, которые имеют в названии слово "saver" и есть то, что вас интересует.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Программа vidcontrol

Программа vidcontrol служит для управления параметрами syscons, которые относятся к отображению на дисплее выводимой информации.

Полное ее описание можно посмотреть в соответствующем man'уале (man vidcontrol), а "краткую сводку" команд вы получите, если запустите ее без каких-либо аргументов.

Я только опишу ее основные функции.

" Установка "режима отображения".

" Загрузка шрифтов.

" Загрузка "таблицы перекодировки" (screenmap)

" Изменение цветов

" Другие параметры.

" Несколько общих замечаний.

Установка "режима отображения".

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

Для смены режима надо просто выполнить команду

vidcontrol "название режима"

например

vidcontrol VGA_80x30

Загрузка шрифтов.

Для загрузки шрифтов используется ключ -f (от слова font). Поскольку, видеокарта может использовать три разных типа шрифтов (необходимых для разных "режимов отображения"), то ключ -f требует два аргумента

vidcontrol -f "тип шрифта" "имя файла со шрифтом"

Тип шрифта может быть 8x8, 8x14 и 8x16.

Файл со шрифтом может быть просто двоичным файлом, или содержать в себе те же данные но в формате uuencode. Если вы не укажете полный путь для имени файла, а просто короткое имя (напрмер - myfont), то vidcontrol будет искать

" файл myfont в текущей директории

" файл myfont.fnt в текущей директории

" файл myfont в директории /usr/share/syscons/fonts

" файл myfont.fnt в директории /usr/share/syscons/fonts

естественно, загрузит первый, который найдет.

Загрузка "таблицы перекодировки" (screenmap)

Для загрузки screenmap используется ключ -l (от слова load ?).

vidcontrol -l "имя файла с таблицей"

Как и для шрифтов, файл screenmap может быть просто двоичной таблицей (из 256 байт) или содержать в себе те же данные но в формате uuencode. Если вы не укажете полный путь для имени файла, а просто короткое имя (напрмер - mymap), то vidcontrol будет искать

" файл mymap в текущей директории

" файл mymap.scm в текущей директории

" файл mymap в директории /usr/share/syscons/scrnmaps

" файл mymap.scm в директории /usr/share/syscons/scrnmaps

естественно, загрузит первый, который найдет.

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

vidcontrol -L

по этой команде, vidcontrol сам сделает таблицу, которая ничего не меняет.

Изменение цветов

Во-первых, надо заметить, что syscons позволяет задавать две пары цветов (символ/фон) - для символов с "нормальными" атрибутами и для символов с атрибутом "реверс" (светлый фон, темный символ).

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

vidcontrol "цвет символа" "цвет фона"

например

vidcontrol white black

Для цветов "реверсного" атрибута используется ключ -r (от слова reverse), например

vidcontrol -r black white

Вы можете также поменять цвет "бордюра" (полоски по краям экрана), с помощью ключа -b (border), например

vidcontrol -b gray

Список названий цветов можно посмотреть с помощью команды vidcontrol show

Однако, хочу заметить, что если вы используете какие-нибудь "коммандеры" (Deco, Midnight Commander и т.п.), то установки цветов, скорее всего работать не будут. Эти программы любят перекрашивать экран по своему усмотрению и при первой же "перерисовке" своих панелей "собьют" все ваши цвета.

Другие параметры.

С помощью vidcontrol можно поменять "тип курсора". Для этого служит ключ -c (cursor)

vidcontrol -c "тип курсора"

Тип курсора может быть только - normal, blink и destructive.

Замечу, что esc-последовательности (см Команды syscons) предоставляют несколько более гибкие возможности по изменению курсора.

Также vidcontrol поможет вам изменить "время простоя", по истечению которого syscons запустит screen saver. Для этого служит ключ -t (timeout)

vidcontrol -t "время в секундах"

Кстати, если поставить время - 0, то saver вообще не будет запускаться.

Напомню, что поменять тип screen saver'а программа vidcontrol, не может. Если вы хотите поменять screen saver, вам придется

" сначала "выгрузить" текущий модуль screen saver'а командой modunload

" Если вы не знаете - как называется модуль, который вам надо выгрузить, воспользуйтесь командой modstat.

" загрузить новый модуль из тех, которые имеются в директории /lkm, командой modload.

Несколько общих замечаний.

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

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

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

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

Установку "режима отображения" vidcontrol выполняет для того терминала, который является для него stdin ("входной поток"). А вот цвета меняются с помощью вывода соответствующих команд в stderr ("выходной поток для сообщений об ошибках").

В обычном случае и stdin'ом, и stderr'ом является текущий терминал. Но и тот и другой "поток" можно перенаправить.

Например, для изменения "режима отображения" на терминале /dev/ttyv0 (если вы находитесь в другом терминале), можно выполнить команду

vidcontrol VGA_80x30 < /dev/ttyv0

а для изменения цветов на том же терминале

vidcontrol green red > /dev/ttyv0 2>&1

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Команды (esc-последовательности) syscons

Во всех командах Esc означает символ Escape - 27.

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

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

Esc7 или Esc[s запомнить положение курсора

Esc8 или Esc[u восстановить запомненное положение курсора

Escc очистить экран и установить курсор в левый верхний угол

Перемещение курсора

Esc[nA вверх на n строк

Esc[nB или Esc[ne вниз на n строк

Esc[nC или Esc[na вправо на n позиций

Esc[nD влево на n позиций

Esc[nE в начало строки и на n строк вниз

Esc[nF в начало строки и на n строк вверх

Esc[n1;n2f или Esc[n1;n2H переместить в позицию n1 и строку n2

Esc[nZ на n табуляций назад (как Tab, но в обратную сторону)

Esc[n` в той же строке в позицию n

Esc[nd в той же позиции в строку n

EscM сдвинуть курсор на строчку вверх, если он был в самой верхней строке, то сдвинуть содержимое экрана на строчку вниз (то же самое, что делает NewLine, только "вверх ногами")

Очистка части экрана

Esc[0J от курсора до конца экрана

Esc[1J от начала экрана до курсора

Esc[2J весь экран

Esc[0K от курсора до конца строки

Esc[1K от начала строки до курсора

Esc[2K всю строку

Esc[nX очистить n знаков от позиции курсора

"Раздвижка", "сдвижка", "прокрутка"

Esc[nL вставить n пустых строк (те, что были - раздвинуть)

Esc[nM удалить n строк (те, что остались - "схлопнуть")

Esc[nP удалить n знаков в строке (те, что остались - "схлопнуть")

Esc[n@ вставить n знаков в строку (те, что были - раздвинуть)

Esc[nS "прокрутить" содержимое экрана на n строк вверх

Esc[nT "прокрутить" содержимое экрана на n строк вниз

Изменение атрибутов и цветов

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

Esc[nm установить атрибуты

n = 0 сброс всех атрибутов, цвет фона и символов устанавливается в "базовый" (смотри Esc=nF и Esc=nG ниже)

n = 1 повышенная яркость

n = 4 подчеркнутые символы (не все видеокарты это могут)

n = 5 мигание

n = 7 "реверс" (темные буквы на белом фоне)

n = 30+n1 установить цвет фона n1

n = 40+n1 установить цвет символов n1

Escn1;n2;...m установить сразу несколько атрибутов

Esc[x или Esc[0x сбросить все атрибуты и цвета, в том числе "базовые"

Esc[1;nx n = цвет фона

Esc[2;nx n = цвет символов

Esc[3;nx n = (цвет фона)*16 + цвет символов

Esc[5;nx n = цвет фона для "реверса"

Esc[6;nx n = цвет символов для "реверса"

Esc[7;nx n = (цвет фона)*16 + цвет символов, для "реверса"

Esc[=nF n = цвет фона и "базовый" цвет фона

Esc[=nG n = цвет символов и "базовый" цвет символов

Esc[=nH n = цвет фона для "реверса" (то же, что и Esc[5;nx)

Esc[=nI n = цвет символов для "реверса" (то же, что и Esc[6;nx)

Esc[=nA n = цвет "бордюра" (по краям экрана).

Другие команды

Esc[nz переключится в виртуальный терминал n

Esc[=n1;n2B установить параметры "пищалки"

n1 = частота (точнее, делитель для частоты)

n2 = длительность

(стандартные значения - 800;1)

влияет на "писк", который получается при выводе символа Bell - 7,

параметры свои для каждого "виртуального терминала"

Esc[=nC тип курсора (действует на все "виртуальные терминалы")

в n младший бит определяет "мерцание" (1 - да, 0 - нет)

следующий бит - тип курсора ("аппаратный" - 0/"символьный" - 1)

Esc[=n1;n2C форма "символьного" курсора (для каждого "виртуального терминала"своя)

"закрашиваются" строчки с n1 по n2 (начиная сверху) в матрице знака, которым рисуется курсор

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Русификация syscons

Рассмотрим подробнее в чем заключается процесс русификации syscons. Еще раз напомню, что все основные настройки syscons делаются автоматически при старте системы. Вам необходимо только правильно указать параметры в файле /etc/rc.conf.

Итак, инструкция (FreeBSD Handbook) предлагает добавить в rc.conf строчки:

keymap=ru.koi8-r

keychange="61 ^[[K"

scrnmap=koi8-r2cp866

font8x16=cp866b-8x16

font8x14=cp866-8x14

font8x8=cp866-8x8

" Русификация дисплея

" Зачем так сложно?

" Русификация клавиатуры.

" Русификация для других кодировок

Русификация дисплея

Начнем с последних строчек:

font8x16=cp866b-8x16

font8x14=cp866-8x14

font8x8=cp866-8x8

Они определяют аргументы для утилиты vidcontrol, которая должна будет загрузить в видео-контроллер новый набор шрифтов (подробнее в описании vidcontrol). Почему рекомендуют шрифты cp866, хотя русификация FreeBSD подразумевает кодировку koi8-r, немного позднее.

Напомню, что для стандартного режима "режима отображения" (25 строк) необходим только шрифт с матрицей 8x16. Остальные два понадобятся только в том случае, если вы будете использовать другие режимы (30, 43, 50 строк).

Кстати, если вы заглянете в /usr/share/syscons/fonts, то обнаружите, что шрифты в кодировке cp866 для матрицы 8x16 имеют три варианта - cp866, cp866b и cp866c (такой же набор имеется и для кодировки koi8-r). Причем, cp866 и cp866c немного отличается набором символов - в cp866c часть символов "псевдографики" заменена "экзотическими" буквами. А вот cp866b сильно отличается внешним видом символов, причем и программа инсталляции и большинство руководств по русификации усиленно навязывают именно его. (Мне, например, он не нравится, но это дело вкуса).

Строчка - "scrnmap=koi8-r2cp866" опять же задает аргумент для vidcontrol, но уже не для установки шрифтов, а для загрузки в syscons таблицы перекодировки (screenmap). Поскольку, шрифты рекомендуется поставить для кодировки cp866, то для того, чтобы тексты в кодировке koi8-r отображались правильно, необходима эта таблица - "из koi8-r в cp866".

Зачем так сложно?

Возникает вопрос - почему нельзя поставить шрифты сразу для кодов koi8-r и обойтись без какой-либо screenmap?

На самом деле - можно. Можно поставить шрифты для koi8-r, тем более, что в наборе шрифтов они есть и для всех трех матриц (а для 8x16, даже в нескольких вариантах - koi8-r, koi8-rb, koi8-rc).

Тогда соответствующие строчки в rc.conf будут выглядеть

scrnmap="NO"

font8x16=koi8-r-8x16

font8x14=koi8-r-8x14

font8x8=koi8-r-8x8

Однако, не торопитесь это делать. Дело в том, что шрифты cp866 лучше подходят для видеокарты "писишки".

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

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

Проблема в том, что видео-контроллер имеет свое мнение о том, какие символы являются псевдографическими (и, следовательно, должны сливаться в сплошную линию), а какие - нет. Псевдографическими он считает символы с кодами в диапазоне C0 - DF.

Так вот, в шрифтах cp866 "псевдографика" действительно попадает в этот диапазон (и горизонтальные линии рисуются слитно), а в koi8-r - нет (и те же линии рисуются пунктиром).

Другая проблема при использовании шрифтов koi8-r может возникнуть, если вы захотите включить поддержку "мыши" в syscons.

Дело в том, что для отрисовки графического курсора syscons перепрограммирует шрифты для четырех символов (коды D0 - D3). В шрифтах cp866 эти коды попадают на псевдографические символы (причем, редко используемые), а в koi8-r - на буквы "п я р с". Естественно, если вы используете шрифты koi8-r, при "мышевождении" эти буквы на экране портятся.

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

Поэтому, тот же "FreeBSD Handbook" советует для русификации первым делом пересобрать ядро, добавив в файл конфигурации

option "SC_MOUSE_CHAR=0x03"

Хороший совет, если не обращать внимание на то, что сама по себе пересборка ядра - задача более сложная (и требует значительно больше времени), чем правка пары строк в rc.conf. (Кстати, и 0x03 - не очень удачная замена).

Вот эти причины и делают более предпочтительными шрифты cp866, хотя эффект от них чисто косметический.

Русификация клавиатуры.

Первая строчка - "keymap=ru.koi8-r" служит аргументом для утилиты kbdcontrol, которая при старте системы загрузит в syscons "раскладку клавиатуры" ru.koi8-r.

Это раскладка с "альтернативной клавиатурой", в которой "буквенные" клавиши генерируют коды русских букв в соответствии с кодировкой koi8-r.

Естественно, в этой раскладке предусмотрен модификатор для переключения между основной и "альтернативной" клавиатурами. Он "подвешивается" на клавишу [CapsLock]. Если вам это не нравится, вы можете подправить сам файл "раскладки клавиатуры" (смотри пример Переключатель "альтернативной клавиатуры" (Рус/Лат).).

Кстати, если пересобрать ядро с "option RUKEYMAP", то эта раскладка будет "встроена" в syscons "по умолчанию". В этом случае, ее можно не загружать при старте системы.

А вот следующая строчка

keychange="61 ^[[K"

имеет к русификации косвенное отношение.

Дело в том, что загружая новые шрифты, мы меняем свойства терминала. По крайней мере, символы псевдографики перемещаются другой диапазон кодов. Следовательно, описание терминала cons25 в termcap уже не будет полностью соответствовать реальным свойствам syscons. Поэтому, для русифицированного syscons в том же termcap предусмотрено другое описание и, соответственно, другой тип терминала - cons25r. Именно поэтому, те же инструкции по русификации рекомендуют подправить файл /etc/ttys (исправить все cons25 на cons25r) чтобы на каждом виртуальном терминале при старте очередной сессии переменная окружения TERM (которая и сообщает программам тип терминала) по умолчанию получала значение cons25r.

Но описание терминала cons25r отличается от cons25 не только символами псевдографики. Согласно этому описанию, клавиша fkey61 (кнопка [Delete]) должна при нажатии выдавать последовательность кодов "Esc [ K", а не код 177, как это делает syscons (и как указано в описании терминала cons25).

Поэтому, нам рекомендуется "подрегулировать" сам syscons, чтобы его поведение соответствовало описанию в termcap. (Почему нельзя исправить termcap и оставить syscons в покое, я не знаю).

Итак, эта строчка служит только для "подгонки" syscons к его новому описанию в termcap. Она представляет из себя аргумент для программы kbdcontrol, которая заменит для клавиши fkey61 ([Delete]) выдаваемый код.

Русификация для других кодировок

Рассмотренные рекомендации подразумевают, что вы будете использовать русскую кодировку koi8-r.

Как вы наверное знаете, существует по крайней мере еще две не менее популярные кодировки для русских букв cp866 и cp1251.

Можно ли заставить syscons (и дисплей, и клавиатуру) правильно работать с такими кодировками? Конечно, можно.

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

Кстати, для cp866 в системе уже есть все необходимое. То, что есть шрифты cp866 вы уже знаете (только надо убрать дополнительную перекодировку через screenmap), подходящая "раскладка клавиатуры" - ru.cp866, также имеется в /usr/share/syscons/keymaps.

А вот если вы хотите cp1251, то кое-что придется изготовить самостоятельно (или попросить у тех, кто уже сделал). Надо составить "раскладку клавиатуры" (назвать ее, например - ru.cp1251), а для дисплея проще всего делать не новые шрифты, а screenmap. Если у вас используются шрифты cp866, то надо просто изготовить табличку из 256 байт, которая будет транслировать коды из cp1251 в cp866 (пусть она называется - cp1251-cp866) и "подсунуть" ее syscons.

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

Например, если не трогать шрифты (пусть это будут шрифты для cp866) и "перенастройку" дисплея делать с помощью screenmap, то эти файлы могут выглядеть так:

" для cp866

" kbdcontrol -l ru.cp866

" vidcontrol -L

" для koi8-r

" kbdcontrol -l ru.koi8-r

" vidcontrol -l koi8-r2cp866

" для cp1251

" kbdcontrol -l ru.cp1251

" vidcontrol -l cp1251-cp866

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

И, наконец, надо заметить, что русификация драйвера терминала, хотя и важная часть русификации всей системы, но не единственная.

Если вы хотите, чтобы все программы нормально понимали русский язык в кодировках отличных от koi8-r, вам придется еще менять переменную окружения LANG (а возможно и некоторые другие). А для cp1251 еще и изготовить "locale" (набор таблиц, описывающих особенности национального языка). Кроме того, некоторые программы (например, чтения/писания почты) возможно придется "отконфигурировать" индивидуально.

Но, для того, чтобы "по быстрому" просмотреть или подправить какой-нибудь документ в "нестандартной" кодировке, скорее всего "сойдет" и описанное решение.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как достигается "взаимопонимание" программ с терминалом (termcap, terminfo и переменная TERM).

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

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

" termcap

" Переменная окружения TERM

" "Баги" в termcap

" terminfo

termcap

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

Для этого в Юниксе существует специальная "база данных свойств терминалов" - termcap. Каждый тип терминала в этой "базе данных" имеет свое название и перечень его "свойств".

Свойствами терминала могут быть

" общие характеристики терминала, например

o co#80 - количество колонок (в данном случае - 80)

o li#25 - количество строк (в данном случае - 25)

o pt - терминал сам отрабатывает код Tab

o ...

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

o up=E[A - как сдвинуть курсор вверх

o cl=E[HE[J - как очистить экран

o mb=E[5m - как включить "мерцание"

o ...

" коды, которые выдают "специальные" клавиши терминала, например

o k1=E[M - код от клавиши F1

o kD=177 - код от клавиши Delete

o ku=E[A - код от клавиши "стрелка вверх"

o ...

Естественно, названия "свойств" (co, li, up, cl, k1, kD ...) являются стандартом, а вот их значения как раз зависят от конкретного типа терминала.

Программа должна

" при старте выяснить - как называется терминал, на котором ее запустили,

" считать из базы данных все свойства этого терминала

" и в дальнейшей работе "сверяться" с этими данными.

Если ей, например, нужно очистить экран, она должна найти "свойство" cl и вывести на терминал соответствующую последовательность кодов. А если на ввод от терминала пришла последовательность кодов "Esc[M", она должна найти - какому из "свойств" соответствует эта строчка и, обнаружив, что это - k1, сделать вывод, что пользователь нажал клавишу F1.

Надо сразу заметить, что для выполнения всех этих действий существуют различные библиотеки (ncurses, slang и т.п.). Поэтому, если вы возьметесь писать свою программу (типа редактора), то совсем не обязательно самому делать подробный разбор "свойств" терминала и поиск в них различных клавиш.

Главное, что вам нужно знать - чтобы программы (ваши и чужие) правильно работали с терминалом

" нужно "сообщить" программам - как называется ваш терминал в "базе данных"

" описание "свойств" этого терминала должно точно соответствовать реальным свойствам вашего терминала.

Переменная окружения TERM

Для "сообщения" программам названия вашего терминала служит "переменная окружения" TERM. Если вы работаете с syscons в стандартном "режиме отображения" (25 строчек), эта переменная должна иметь значение cons25 или cons25r (если syscons русифицирован).

Вообще-то, переменная TERM автоматически устанавливается при входе в систему. FreeBSD берет ее значение из файла /etc/ttys или она явно устанавливается в ваших "стартовых командных файлах" (.login, .profile, .cshrc и т.п.).

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

Напомню, что кроме cons25, в termcap имеются описания для того же syscons, но с большим количеством строк (cons30, cons50, cons60) или с другим набором "псевдографики" (cons25r).

В конце концов, если вы не сможете подобрать подходящий терминал из имеющихся в базе, можно подправить какое-нибудь описание из уже имеющихся или (что, пожалуй, лучше) сочинить новое имя и составить для него описание. При этом учтите, что вам совсем не обязательно делать полное описание всех свойств. Существует специальное "свойство" в termcap - tc="имя терминала". Оно означает - "остальные свойства взять из описания указанного терминала". Поэтому, вам достаточно "до-определить" или "пере-определить" только несколько параметров, а в конце указать - tc=cons25 ("остальное взять из описания cons25"). Естественно, если вы опишете в вашем новом терминале какой-нибудь параметр, который и так уже описан в cons25, то использоваться будет именно ваше определение.

"Баги" в termcap

Не могу не сказать несколько слов о проблеме соответствия между реальными свойствами терминалов и их описанием в termcap. К сожалению, расхождения случаются довольно часто. И речь не только о клавише Delete в syscons.

Я сталкивался с несоответствием кодов клавиш у программы xterm и ее описания терминала xterm, а уж всевозможные телнеты из других ОС (MS DOS, MS Windows), хотя и берутся изображать из себя ANSI-терминал или VT100, очень редко делают это полностью в соответствии с termcap.

Что делать в таких случаях? Понятно, что для полного соответствия надо либо исправлять описание в termcap, либо "подправлять" саму программу, эмулирующую терминал. Другой вопрос - что лучше?

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

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

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

И, наконец, ответ на вопрос - "что лучше" может отличаться в зависимости от конкретных условий.

Если речь идет о вашем персональном компьютере, куда посторонние не заглядывают, то - "без разницы" как вы добьетесь соответствия.

Если это машина, на которую многие ходят телнетом (или xterm'ом), да еще и с разных платформ, то исправление termcap под одних клиентов может оказаться "багом" для других. Понятно, что в этом случае лучше его не трогать.

А вот если речь идет об организации, в которой всем пользователям ставится одна и та же программа для доступа к Юникс-серверу (да еще и выяснится, что программу уже поставили на многие рабочие станции, а она не "подстроена"), то может оказаться проще все-таки изменить termcap.

Короче, решайте сами :)

terminfo

Кроме termcap существует еще одна "база данных свойств терминала" terminfo. Ее назначение точно такое же как и у termcap (просто они "зародились" в разных ветвях Юникса). Отличается она только названиями "свойств" и форматом (termcap содержит все описания в одном большом текстовом файле, а terminfo хранит каждый тип терминала в отдельном файлике и в двоичном формате).

В стандартной поставке FreeBSD она отсутствует и, как правило, необходимости в ней нет.

Но, если вам придется работать с другими платформами Юникса или какая-нибудь программа пожелает брать данные именно из terminfo (а не удовлетворится termcap'ом), то воспользуйтесь утилитой tconv (смотри man tconv). Она выполняет "конвертирование" из termcap в terminfo и обратно.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Одно важное замечание: Какое отношение это имеет к X-Window?

Никакого!

Очевидно, что система X Window, которая работает в графическом режиме и сама отрисовывает "в графике" все символы, никак не пользуется шрифтами, загруженными в видеокарту и "таблицей перекодировки" (screen map) драйвера syscons.

Менее очевидно другое - что она, также, не использует и ту часть syscons, которая работает с клавиатурой. Для особенно любознательных, могу сказать, что X-сервер переключает syscons в режим выдачи "сырых" скан-кодов (RAW) и сам переводит их в коды символов по своим правилам.

Поэтому, никакие назначения клавиш, сделанные в таблице раскладки клавиатуры syscons, в X Window не действуют.

Для изменения "раскладки клавиатуры" в X Window пользуйтесь программой xmodmap или модулем xkb.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Перегенерация ядра.

" 1. Зачем нужно перегенерировать ядро (kernel)?

" 2. Как перегенерировать ядро системы?

o 2.1 Разворачивание исходников.

o 2.2 Составление конфигурационного файла.

o 2.3 Подготовка к генерированию

o 2.4 Трансляция (собственно само генерирование) ядра

o 2.5-2.6 Установка нового ядра и Перезагрузка

o Замечание по поводу драйверов устройств.

1. Зачем нужно перегенерировать ядро (kernel)?

При инсталяции FreeBSD у вас появится в системе ядро, которое вполне работоспособно. Зачем его переделывать?

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

В эту конфигурацию встроена поддержка ВСЕХ типов накопителей (HDD и CD) и ВСЕХ сетевых карт, которые на данный момент поддерживаются FreeBSD. Это вполне логично - вы должны иметь возможность поставить свой Unix и дополнительные программы на тот HDD, который имеется у вас в машине и суметь войти в сеть, какой бы сетевой карточкой вы ни пользовались.

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

Итак. Перегенерировать ядро стоит для того чтобы -

- убрать все лишнее (драйверы устройств, которых у вас нет);

- добавить то, чего не хватает.

Первое позволит вам ускорить загрузку (так как система не будет тратить время на поиск и тестирование несуществующих в вашей машине устройств) и сэкономить место в ОЗУ, занимаемое ядром.

Ну, а без второго, скорее всего, вы не сможете решить свои задачи :).

2. Как перегенерировать ядро системы?

В общем виде этот процесс выглядит так:

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

- составить свою конфигурацию (конфигурационный файл);

- запустить программу config, которая создаст необходимые файлы *.h и *.c в соответствии с вашей конфигурацией;

- скомпилировать новое ядро с помощью программы make;

- установить новое ядро на место;

- перезагрузиться. Теперь более подробно.

2.1 Разворачивание исходников.

Прежде всего посмотрите в директорию

/usr/src/sys

если она не пустая, то все что вам нужно уже на месте. И вы можете спокойно перейти к следующему пункту.

В противном случае, вам надо взять из дистрибутива нужные файлы и установить их. Как это сделать описано в "Добавление компонент из дистрибутива".

Не забудьте, что вам в данном случае необходима только та их часть, которая называется sys.

2.2 Составление конфигурационного файла.

Перейдите в директорию /usr/src/sys/i386/conf.

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

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

Вам необходимо составить свой файл. Его название значения не имеет. Можете назвать его MyConfig или MyComputer. Я обычно даю ему то же название, что и доменное имя машины.

В качестве основы для нового файла вы можете использовать один из уже имеющихся файлов - GENERIC или LINT.

Если вы возьмете за основу GENERIC, то вам придется убрать оттуда описания всех лишних устройств и дописать необходимые вам options.

Если же вы возьмете за основу LINT, то все редактирование будет заключаться в удалении всего ненужного. Однако, это может оказаться весьма утомительным занятием.

Итак. Скопируйте один из имеющихся конфигов

cp GENERIC MyConfig

или

cp LINT MyConfig

И подправьте его любым текстовым редактором.

Hint: Если вы не успели еще поставить никакого текстового редактора "с человеческим лицом", можно использовать редактор ee, который у вас наверняка уже стоит. Он довольно простой, но вполне полноценный экранный редактор.

Как я уже сказал, основным "мануалом" по составлению новой конфигурации служит файл LINT. Причем, там должны быть описаны самые "свежие" options, которые появились в той версии, которую вы ставите, и еще не описаны в других "мануалах". (К сожалению, "должны быть" и "есть" - не одно и то же.)

На всякий случай я попытался написать свои "Комментарии к config файлу".

2.3 Подготовка к генерированию

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

config MyConfig

Она создаст в директории /usr/src/sys директорию compile/MyConfig (о чем и сообщит вам в конце своей работы) и поместит туда файлы, необходимые для компиляции ядра.

2.4 Трансляция (собственно само генерирование) ядра

Перейдите в директорию /usr/src/sys/compile/MyConfig и наберите команды

make depend

make all

они сделают все, что нужно.

(Вообще-то, в большинстве случаев, достаточно одной короткой команды

make

но так, как написано выше - более правильно).

Учтите, что kernel - достаточно сложная программа, поэтому ее компиляция потребует довольно много времени. От 15-20 минут на Pentium'е до часа, на 386 процессоре.

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

(У меня такие случаи были, когда я попросил некоторые опции, возможные только для Pentium, забыв указать в начале файла, что хочу поддержку процессора i586)

2.5-2.6 Установка нового ядра и Перезагрузка

После того, как компиляция ядра успешно завершилась наберите комманду

make install

она переименует старое ядро в kernel.old и поместит в корневую директорию ваш новый kernel.

После этого можно (и нужно) перегрузить компьютер.

Если загрузка нового ядра не получилась (такое тоже возможно), вы можете загрузится со старым ядром. Для этого, в начале загрузки на подсказку Boot: надо быстро сказать kernel.old.

Естественно, после этого надо снова вернуться к редактированию вашей конфигурации и повторить все последующие пункты.

Только не торопитесь. Если новое ядро опять окажется неработоспособным, вы можете попасть в неприятную ситуацию, так как после очередного "make install" -

kernel.old - предыдущая неработающая версия kernel

kernel - новая, столь же бесполезная.

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

А чтобы при этом не попасть в вышеописаную ситуацию, можно переименовать пока еще работающий kernel.old в kernel.work или kernel.original и продолжать свои эксперименты. Во всяком случае, у вас всегда останется по крайней мере один "загружабельный" вариант ядра.

Важное замечание по поводу драйверов устройств.

Если вы добавили в конфигурации ядра устройства (реальные или pseudo-device), возможно потребуется создать для них файлы-устройства в директории /dev.

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

Во всяком случае, если вы знаете какого файла (в /dev) не хватает, его можно создать с помощью программки MAKEDEV, которая лежит в той же /dev. Это даже не программа, а командный файл, в начале которого есть коментарии, в которых более-менее подробно описаны возможные аргументы (имена устройств) для MAKEDEV.

И еще, поскольку, /dev наверняка не прописана в вашем PATH, запускать ее нужно /dev/MAKEDEV ... , или, если вы находитесь в самой директории /dev, то ./MAKEDEV ...

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Файл конфигурации

Это мои комментарии к файлу LINT из исходников FreeBSD 2.2.1. Я выкинул из него наиболее экзотические опции. Которые, обычно, сопровождаются комментариями типа - "не работает и оставлено только для тех, кому будет интересно там покопаться и пофиксить баги" или просто "пока не работает". Я, также, выкинул те строчки, смысл которых не знаю и, следовательно, ничего умного сказать о них не могу. Если вам интересно - читайте оригинальный LINT или ищите разъяснения на http://www.freebsd.org/

" Общие определения.

" COMPATIBILITY OPTIONS

" DEBUGGING OPTIONS

" NETWORKING OPTIONS

" FILESYSTEM OPTIONS

" SCSI DEVICES

" MISCELLANEOUS DEVICES AND OPTIONS

" HARDWARE DEVICE CONFIGURATION

" More undocumented options for linting.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Общие определения.

" machine "i386"

" cpu "I386_CPU"

cpu "I486_CPU"

cpu "I586_CPU"

cpu "I686_CPU"

" ident LINT

" maxusers 10

" options "CHILD_MAX=128"

" options "OPEN_MAX=128"

" options MATH_EMULATE

options GPL_MATH_EMULATE

" options FAILSAFE

" options INCLUDE_CONFIG_FILE

" config kernel root on wd0 dumps on wd0

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

Из раздела HARDWARE:

" options "MAXMEM=(128*1024)"

из раздела DEBUGGING:

" options USERCONFIG

" options USERCONFIG_BOOT

" options VISUAL_USERCONFIG

________________________________________

machine "i386"

Говорит о том, что архитектура процессора из семейства Intel 386.

Обязательный параметр.

cpu "I386_CPU"

cpu "I486_CPU"

cpu "I586_CPU" # aka Pentium(tm)

cpu "I686_CPU" # aka Pentium Pro(tm)

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

Обязательно должна быть хотя бы одна из этих строчек.

ident LINT

Это собственно имя конкретной конфигурации ядра. Можно поставить такое же, как название конфигурационного файла (MyConfig - например).

Но строчка должна быть обязательно.

maxusers 10

Вообще-то по смыслу - это максимальное количество юзеров, одновременно работающих на машине. Однако, исходя из этого количества вычисляется размер некоторых таблиц в ядре (количество одновременно работающих процессов, количество открытых файлов, количество буферов памяти и т.п.). Подробнее можно посмотреть в файле /usr/src/sys/conf/param.c Поэтому, даже если на вашей машине и не планируется много юзеров, но вы собираетесь запускать одновременно много приложений (сервер ftp, http, mail'овый, базы данных и т.п.), лучше сделать это число побольше.

Естественно, этот параметр - обязательный.

options "CHILD_MAX=128"

Максимальное число "порожденных" процессов, которых может создать "родительский" процесс.

По умолчанию - 40. Некоторые программы могут захотеть больше. (В оригинальном LINT в качестве примера приводится news-сервер, который открывает "процесс-потомок" для каждого клиента, который "прийдет" почитать ньюсы. Если таких пользователей прийдет достаточно много одновременно, то "процессов-потомков" может не хватить).

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

options "OPEN_MAX=128"

Максимальное число файлов, которых может открыть одновременно один процесс.

По умолчанию - 64. Некоторые программы могут захотеть больше.

Если какая-либо программа сообщает, что у нее "слишком много файлов" открыто - имеет смысл поменят этот параметр.

options MATH_EMULATE #Support for x87 emulation

options GPL_MATH_EMULATE #new math emulator

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

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

options FAILSAFE

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

Реально эта опция используется сейчас только в одном месте (по-моему) - в драйвере PCI-SCSI-контроллера. Но, возможно, в дальнейшем она может встретиться в других частях ядра.

Короче, скорее всего, не нужна.

options INCLUDE_CONFIG_FILE # Include this file in kernel

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

Скорее всего, это лишнее.

config kernel root on wd0 dumps on wd0

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

" файл ядра называется kernel

" при загрузке искать корневую директорию на wd0

" при "падении" системы, писать дамп на wd0

Последнюю часть (dumps on ...) рекомендуют здесь не задавать, а пользоваться командой dumpon (см man dumpon).

Кроме того, заметьте, что wd0 - драйвер IDE-винчестеров. Если у вас SCSI-винчестер, то это слово нужно поменять на sd0. Ну и, возможно, номер винчестера у вас будет не 0.

Но строчка должна быть обязательно.

options "MAXMEM=(128*1024)"

Размер оперативной памяти машины.

Вообще-то, этот параметр читается при загрузке из BIOS, однако стандартная функция, считывающая из BIOS этот параметр ограничивает возможное значение числом 64M (а "расширенный" вариант этой функции разработчики не используют для экономии места в коде загрузчика).

Поэтому, если у вас размер ОЗУ больше 64M, то его надо указать явно в конфиге.

options USERCONFIG #boot -c editor

Включить в ядро "-editor" - редактор конфигурации "железа". Этот редактор можно вызвать при загрузке, введя на приглашение "Boot:" ключ -с. Редактор позволяет поменять для устройств базовый адрес, номер прерывания (irq) и флаги (если они есть). Кроме того, можно вообще исключить устройство из списка поддерживаемых ядром (естественно, код соответствующего драйвера в ядре останется, но устройство не будет проверяться при старте и, соответственно, не будет доступно при работе). Если вы не собираетесь менять "железную" конфигурацию машины, то этот редактор вам не очень-то нужен. Если вы правильно зададите все параметры в разделе HARDWARE, то все будет работать. Включать его в ядро имеет смысл, если вы собираетесь в ближайшем будущем добавлять новые "карточки" в машину. Только не забудьте включить все соответствующие драйвера в ядро (в разделе HARDWARE), так как этот редактор сам поддержку в код ядра, естественно, не добавляет.

options USERCONFIG_BOOT #imply -c and parse info area

Если в ядро включен "-c editor" (предыдущая опция), то эта строчка заставляет его запускаться всегда при загрузке, не не дожидаясь от вас соответствующего ключа. (Если вы сами инсталлировали систему, то, наверняка, уже видели - как это выглядит :-).

В нормальной работе - совершенно лишнее.

options VISUAL_USERCONFIG #visual boot -c editor

Если включен "-c editor", эта строчка добавляет его "visual" версию, которая намного приятнее и удобнее, чем старый вариант "командной строки".

Если уж вы решили включить в ядро "-с редактор", то с этой опцией конечно будет лучше.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

NETWORKING OPTIONS

Здесь все, что относится к поддержке сети (кроме драйверов самих "железных" сетевых карт).

" NETWORKING OPTIONS

o options INET

o options IPX

" options "IPXPRINTFS=0"

" options "IPX_ERRPRINTFS=0"

o options NETATALK

o [Здесь в оригинальном LINT еще идут опции для других сетевых протоколов (X.25, Xerox NS и т.п.), но с пометкой, что они не работают и не поддерживаются командой разработчиков. Поэтому, я их пропускаю.]

" Network interfaces:

o pseudo-device loop

o pseudo-device ether

o pseudo-device fddi

o pseudo-device sl

o pseudo-device ppp

o pseudo-device sppp

o pseudo-device bpfilter

o pseudo-device disc

o pseudo-device tun

" Internet family options:

o options "TCP_COMPAT_42"

o options MROUTING

o options IPFIREWALL

" options IPFIREWALL_VERBOSE

" options "IPFIREWALL_VERBOSE_LIMIT=100"

o options IPDIVERT

o options TCPDEBUG

options INET #Internet communications protocols

Включает в ядро поддержку TCP/IP.

Скорее всего, вам это необходимо.

options IPX #IPX/SPX communications protocols

Поддержка IPX.

Насколько вам это нужно решайте сами. В настоящее время в FreeBSD есть только маршрутизатор IPX. Ни серверной, ни клиентской программы для сетей Novell NetWare (где в основном и используется IPX) в FreeBSD нет.

(Вообще-то, "софт" для сетей Novell NetWare под FreeBSD существует в виде коммерческого продукта - http://www.netcon.com/. Но он "родной" поддержкой IPX не пользуется и, соответственно, эта опция к нему отношения не имеет.)

Не забудьте, что FreeBSD понимает (на ethernet) только фреймы Ethernet_II.

options "IPXPRINTFS=0" #IPX/SPX Console Debugging Information

При включенной поддержке IPX определяет - выводить ли сообщения (через syslogd) о каждом "отфорварденом" IPX пакете (1 - выводить, 0 - нет).

По умолчанию этот параметр - 1. Так что, для подавления лишней диагностики желательно эту опцию включить.

options "IPX_ERRPRINTFS=0" #IPX/SPX Console Debugging Information

При включенной поддержке IPX определяет - выводить ли сообщения об ошибках при работе с IPX пакетами (1 - выводить, 0 - нет).

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

options NETATALK #Appletalk communications protocols

Ничего, кроме того, что в комментарии, сказать не могу.

Network interfaces:

pseudo-device loop #Network loopback device

"Драйвер" loopback интерфейса. Используется во многих ситуациях.

Поэтому, это устройство должно быть обязательно.

pseudo-device ether #Generic Ethernet

Общие подпрограммы для всех ethernet'овских драйверов (независимо, какая карточка у вас стоит).

Количество "псевдо-девайсов" значения не имеет (даже если у вас несколько ethernet'ов).

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

pseudo-device fddi #Generic FDDI

Общие подпрограммы для всех fddi драйверов.

Если у вас какая-либо fddi карта, эта строчка обязательна.

pseudo-device sl 2 #Serial Line IP

Драйвер SLIP (протокол для передачи IP через COM-порт и, соответственно, через модем).

Естественно, у вас должны быть включены драйверы для COM-портов (в разделе hardware). Эта строчка только определяет - сможете ли вы на них использовать SLIP.

Количество "псевдо-девайсов" в данном случае важно, именно столько SLIP-коннектов вы сможете поддерживать одновременно (лучше всего их иметь столько, сколько у вас COM-портов).

Подробнее - man sl.

pseudo-device ppp 2 #Point-to-point protocol

Драйвер PPP (как и SLIP это протокол для передачи IP через COM-порт).

Комментарии те же, что и для "pseudo-device sl" (заменяя SLIP на PPP :-).

Подробнее - man 4 ppp.

pseudo-device sppp #Generic Synchronous PPP

Драйвер PPP для синхронных последовательных каналов.

Нужен в том случае если у вас есть специальная карточка (ar,cx,sr).

pseudo-device bpfilter 4 #Berkeley packet filter

Это драйвер для программ, которые "подсматривают" траффик через какой-нибудь сетевой интерфейс (tcpdump и т.п.). Кстати, этот драйвер может потребоваться и другим программам (например, DHCP-серверу).

Подробнее - man bpf.

Полезно их иметь (и побольше :-).

Важное замечание!

Поскольку через этот "девайс" соответствующие программы могут просматривать содержимое пакетов, "пробегающих" по сети, юзер, запустивщий программу, может подсмотреть чужие пароли, содержимое "пролетающих" писем, файлов и т.п. Поэтому, bpfilter может оказаться не только полезной "фичей", но и опасной. К счастью, по умолчанию, соответствующие устройства /dev/bpf* доступны для чтения только root'у.

Так вот. Не надо менять права доступа к этим устройствам. Будет лучше, если "рядовые юзеры" не смогут ими воспользоваться.

pseudo-device disc #Discard device

Это устройство аналогично устройству null для файлов. То есть в него можно посылать пакеты "в никуда". Включено в систему для тестов.

В реальной работе вещь практически бесполезная. Можно выкинуть.

pseudo-device tun 1 #Tunnel driver(user process ppp)

Это устройство используется только программой ppp (смотри man 8 ppp).

Если вы этой программой не пользуетесь (не путайте ее с pppd), то и устройство вам не нужно.

Internet family options:

options "TCP_COMPAT_42" #emulate 4.2BSD TCP bugs

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

Скорее всего, вам она не нужна.

options MROUTING # Multicast routing

Вставляет в ядро поддержку маршрутизации пакетов с multicast адресами.

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

Короче, вам она врядли понадобится.

options IPFIREWALL #firewall

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

Сами правила (кого куда пускать/не пускать) задаются с помощью программы ipfw (можете почитать man ipfw).

Важное замечание: в последних версиях FreeBSD, если FireWall включен в ядро, по умолчанию все пакеты запрещаются. Поэтому, не забудьте сразу же настроить этот firewall в файле /etc/rc.firewall и указать, что он у вас есть, в файле /etc/sysconf (или /etc/rc.conf).

options IPFIREWALL_VERBOSE #print information about dropped packets

Добавляет в модуль FireWall вывод сообщений (через syslogd) о каждом "загубленном" пакете.

Скорее всего, это лишнее.

options "IPFIREWALL_VERBOSE_LIMIT=100" #limit verbosity

Если вы включили опцию IPFIREWALL_VERBOSE, то эта строчка ограничивает количество сообщений. Будут выводится только первые 100 (в данном примере). После этого сообщения прекратятся.

Наверное, с этой опцией будет лучше.

options IPDIVERT #divert sockets

Эта опция добавляет к FireWall еще возможность некоторые IP-пакеты "заворачивать" на дополнительную обработку в прикладные программы (основные проверки делаются в ядре). С помощью этого механизма вы можете писать свои программы, которые смогут выполнить более сложную фильтрацию пакетов или даже их преобразование (NAT, тунель IP в IP, и т.п.). Кстати, NAT-демон, использующий этот механизм уже существует.

Подпробнее man divert.

Вещь полезная, если, конечно, вы знаете, что с ней делать :-).

options TCPDEBUG

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

FILESYSTEM OPTIONS

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

Обратите внимание, если вы не включите поддержку какой-либо FS, это еще не означает, что вы не сможете ей воспользоваться. Некоторые из модулей поддержки FS оформлены в виде lkm(загружаемые модули ядра) и могут "подстыковываться" к ядру по мере необходимости во время работы.

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

И, кроме того, обязательно встраивать в ядро поддержку той FS, с которой будет грузиться ваша система (где находятся /, /usr и /tmp). Обычно, это FFS. Но, если вы, например, собираетесь делать систему загружаемую по сети (типа discless station), то необходимо включить в ядро поддержку NFS (Network File System), хотя в других случаях она может подгружаться во время работы.

" "Реальные" FS

o options FFS

o options "CD9660"

o options MSDOSFS

o options MFS

" options "MFS_ROOT=10"

" options MFS_AUTOLOAD

o options LFS

o options NFS

" options NQNFS

" options NFS_NOSERVER

o options "EXT2FS"

" "Специальные" FS.

o options PROCFS

o options KERNFS

o options FDESC

o options PORTAL

o options DEVFS

" "Вспомогательные" FS.

o options UNION

o options UMAPFS

o options NULLFS

" Некоторые опции, имеющие отношение к файловым системам.

o options "NSWAPDEV=20"

o options QUOTA

o options NULLFS_DIAGNOSTIC

options KERNFS_DIAGNOSTIC

options UMAPFS_DIAGNOSTIC

options UNION_DIAGNOSTIC

"Реальные" FS

Это обычные файловые системы, предназначенные для хранения файлов.

options FFS #Fast filesystem

Основная FS для FreeBSD. Должна быть обязательно.

options "CD9660" #ISO 9660 filesystem

Наиболее распространенная FS для CD-ROM. Существует в виде lkm, поэтому, в ядро можно не включать.

options MSDOSFS #MS DOS File System

FS для MS DOS. Существует в виде lkm, поэтому, в ядро можно не включать.

options MFS #Memory File System

FS для построения "виртуального диска" в ОЗУ машины. Модуля lkm нет, поэтому, если хотите ее использовать, то необходимо включить в ядро.

(Я слабо представляю себе - когда ее использование оправдано. Не забывайте, что под этот "виртуальный диск" отдается часть оперативной памяти, которой, обычно, не бывает в избытке).

options "MFS_ROOT=10"

Размер (в килобайтах) памяти, зарезервированой внутри ядра для MFS

options MFS_AUTOLOAD

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

options LFS #Log filesystem

Еще одна (продвинутая) FS для UNIX. Пока в стадии экспериментальной. Модуля lkm нет, поэтому, если хотите ее использовать, то необходимо включить в ядро.

options NFS #Network File System

Сетевая FS. В UNIX это основной механизм, позволяющий работать с дисками других машин через сеть.

Существует в виде lkm, поэтому, в ядро можно не включать (если, конечно, система грузится не по сети).

options NQNFS #Enable NQNFS lease checking

Некоторое расширение функций NFS.

options NFS_NOSERVER #Disable the NFS-server code.

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

Кстати, интересно - с какими опциями скомпилирован lkm для NFS?

options "EXT2FS"

Еще одна FS для UNIX. В оригинальном LINT эта опция стоит в разделе "еще некоторые недокументированные опции". Поэтому, я не знаю - насколько она работоспособна. Модуля lkm нет, поэтому, если хотите ее использовать, то необходимо включить в ядро.

"Специальные" FS.

Эти "псевдо-" файловые системы предназначены для того, чтобы обращаться (считывать/изменять) к различным объектам операционной системы и их некоторым параметрам как к файлам, то есть обычными операциями чтения/записи файлов.

Какие из них вам нужны - это определяется теми прикладными программами, которые захотят их использовать.

Во всяком случае, все они существуют в виде lkm (кроме DEVFS) и, следовательно, включать их в ядро нет необходимости.

options PROCFS #Process filesystem

Отображает параметры текущих процессов в виде файлов.

Подробности - man procfs.

options KERNFS #Kernel filesystem

Отображает некоторые параметры системы в виде файлов.

Подробности - man kernfs.

options FDESC #File descriptor filesystem

Отображает дескрипторы открытых в данный момент файлов в виде файлов.

Подробности - man fdesc.

options PORTAL #Portal filesystem

Отображает параметры некоторых объектов (например, сокетов) в виде файлов.

Подробности - man mount_portal.

Находится в стадии экспериментальной (то есть - не работает :-).

options DEVFS #devices filesystem

Эмулирует "device special files" (которые обычно лежат в /dev) для всех устройств, поддержка которых включена в ядро.

Подробности - man devfs. :-)

Находится в стадии экспериментальной (но, говорят, что работает).

Модуля lkm нет, поэтому, если хотите ее использовать, то необходимо включить в ядро.

"Вспомогательные" FS.

Это модули, которые используются "поверх" (или "между") реальных FS для некоторых дополнительных действий.

Все эти модули существуют в виде lkm и, следовательно, включать их в ядро нет необходимости.

options UNION #Union filesystem

Позволяет монтировать в одну директорию несколько "реальных" FS.

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

Подробности - man mount_union.

Находится в стадии экспериментальной.

options UMAPFS #UID map filesystem

Позволяет иметь кроме "реальной" FS ее копию, но с измененными UID и GID на файлах. (Естественно, при монтировании указывается таблица соответствий реальных/подмененных UID'ов и GID'ов).

Подробности - man mount_umap.

options NULLFS #NULL filesystem

Ничего не делает с "реальной" FS. :-) С ее помощью можно просто сделать копию уже смонтированной FS.

Подробности - man mount_null.

Некоторые опции, имеющие отношение к файловым системам.

options "NSWAPDEV=20"

Для swap можно использовать одновременно несколько устройств/разделов диска (см. man swapon). Этот параметр задает их максимальное количество.

Если этот параметр не задавать, то, по умолчанию, их будет 4.

А этого, как правило, вполне достаточно.

options QUOTA #enable disk quotas

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

Подробности о quota - man quota (и те man'ы, на которые он ссылается).

options NULLFS_DIAGNOSTIC

options KERNFS_DIAGNOSTIC

options UMAPFS_DIAGNOSTIC

options UNION_DIAGNOSTIC

Включение в соответствующих FS дополнительной диагностики.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

MISCELLANEOUS DEVICES AND OPTIONS

В этом разделе определяется какие псевдо-устройства (и в каком количестве) включить в систему.

" pseudo-device pty

" pseudo-device speaker

" pseudo-device log

" pseudo-device gzip

" pseudo-device vn

" pseudo-device snp

" pseudo-device ccd

pseudo-device pty 16 #Pseudo ttys - can go as high as 256

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

Подробнее - man 4 pty.

Естественно, их желательно иметь несколько (16 - вполне нормально).

Нельзя сказать, что должен быть обязательно, но "очень полезно".

pseudo-device speaker #Play IBM BASIC-style noises out your speaker

Играет музыку на спикер компьютера. Заметьте, это не для воспроизведения звуковых файлов (типа wav или au), а для проигрывания простеньких мелодий, задаваемых как в функции play в BASIC'е. Примеры можно посмотреть в /usr/sbin/spkrtest.

Подробнее - man speaker, man spkrtest.

Естественно, вещь забавная, но не обязательная.

pseudo-device log #Kernel syslog interface (/dev/klog)

Через это "устройство" поступают сообщения от ядра к программе syslogd (которая ведет все основные логи в системе).

Несколько слов об этом можно найти в man syslogd. Поскольку, вы, скорее всего, не собираетесь отказываться от syslogd, это устройство должно быть обязательно.

pseudo-device gzip #Exec gzipped a.out's

Это "устройство" позволяет хранить некоторые бинарники в "зазипованном" виде (сжатыми gzip'ом), но запускать их как обычные программы. В общем-то, это даже не драйвер. При указании этого параметра, в ядро включается соответствующий модуль, который распознает такие файлы и распаковывает их "на лету" при запуске.

(Кстати, существует другой способ хранить исполняемые файлы в сжатом виде (смотри man gzexe), однако он хуже, так как для распаковки вызывается обычный "распаковщик" gunzip и создается временный файл, который и запускается.)

Устройство полезное, но необязательное.

pseudo-device vn #Vnode driver (turns a file into a device)

Этот драйвер может "превращать" файл в "устройство".

Может быть полезным если, например, какой-то файл представляет собой "образ дискеты", а вам захочется его посмотреть как обычную дискету. Другое полезное применение - увеличить swap. Поскольку, в FreeBSD swap можно делать только на "сырое" устройство (диск или раздел диска), можно создать файл подходящего размера, "превратить" его в "диск" с помощью драйвера vn, и добавить к swap-устройствам.

Подробнее - man vn, man vnconfig.

Таких драйверов лучше иметь несколько (смотря сколько вам захочется их задействовать одновременно).

Не обязательное, но полезное.

pseudo-device snp 3 #Snoop device - to look at pty/vty/etc..

Позволяет "подглядывать" - что делает другой юзер на своем терминале и даже вмешиваться в его работу (естественно, делать это может только root). Программа, которая это делает называется watch, но для ее работы необходимо наличие этих драйверов snp. Количество snp-устройств определяет - сколько чужих терминалов можно смотреть одновременно.

Подробнее - man snp, man watch.

Естественно, это устройство не обязательно.

pseudo-device ccd 4 #Concatenated disk driver

Позволяет объединять несколько дисков (разделов дисков) в один логический.

С его помощью можно создавать "зеркальные" диски.

Соответственно, количество определяет - сколько можно создать таких "логических дисков" одновременно.

Подробнее - man ccd, man ccdconfig.

Естественно, это устройство не обязательно.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Файлы и "права доступа" к ним.

Поскольку Unix - система многопользовательская, в ней предусмотрен механизм ограничивающий доступ юзеров к файлам и директориям.

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

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

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

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

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

Не вдаваясь в подробности, можно сказать, что

" каждый процесс имеет идентификатор юзера (userID). Обычно он совпадает с userID'ом того юзера, который запустил этот процесс.

" процессы, которые запустились автоматически, тоже имеют userID, как будто их запустил реальный юзер. Чей именно userID получают эти программы обычно определяется теми программами, которые их стартуют (программа-загрузчик, cron, inetd и т.д.). В простейших случаях программы-"потомки" просто "наследуют" userID от программы-"родителя", но некоторые "родители" могут запускать программы с другим userID'ом (не совпадающим с собственным).

" некоторые программы в процессе выполнения могут поменять свой userID и, соответственно, получить права, которые сам юзер не имел. Естественно, для того, чтобы программа могла это сделать, администратор должен "разрешить" ей такое поведение (подробнее об этом будет сказано ниже). Кстати, изменение userID'а делается не только, когда нужно "расширить" права программы, но и наоборот - "сузить" до прав какого-нибудь конкретного юзера.

" если процесс может изменять свой userID, то различают "реальный userID" и "эффективный userID" (есть еще "сохраненный userID"). Реальный userID - это идентификатор юзера, который запустил процесс (или userID процесса-"родителя"). А эффективный - это новый userID, который задача получила во время выполнения.

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

Итак.

" Какие атрибуты файла определяют "право доступа".

o Владелец файла и группа "допущенных".

o Собственно "права доступа" (permissions).

" Основные биты доступа (чтение/запись/выполнение)

" Дополнительные биты доступа

" "Странные" сочетания битов доступа.

o Флаги.

" С какими правами файл "рождается"

" И с какими правами он "перерождается" (после копирования или перемещения).

" Как поменять...

o Владельца и группу.

o Права доступа (permissions)

o Флаги.

" Что делать если этого не хватает?

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Какие атрибуты файла определяют "право доступа".

" Владелец файла и группа "допущенных".

" Собственно "права доступа".

Владелец файла и группа "допущенных".

Все юзеры для каждого файла (или директории) делятся на три категории

" владелец (или хозяин) этого файла

" группа "особо допущенных" к этому файлу

" все остальные.

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

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

Итак.

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

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

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

Самое время, рассмотреть конкретный пример.

Если у вас уже есть под рукой какой-нибудь Unix, наберите команду

ls -l

(аналог команда dir в MS DOS)

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

-rw-r--r-- 1 pascal users 4297 13 мар 21:45 file1

-rw-r--r-- 1 pascal users 1502 13 мар 22:09 file2

-rw-r--r-- 1 pascal users 5354 12 мар 20:11 filt3

\________/ \____/ \___/ \__/ \__________/ \___/

"права" владелец группа длина дата имя файла

В третьей колонке вы видите имя (login name) юзера - "хозяина" этих файлов (в данном случае это - pascal). В четвертой колонке - название группы, приписанной также к этим файлам (в данном случае - users). И, наконец, в самой первой колонке (набор знаков типа "r", "w" и "-") сами permissions для всех трех категорий пользователей.

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

Просто команда ls изображает их в более "человеческом" виде.

Далее...Собственно "права доступа".

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Основные биты доступа (чтение/запись/выполнение)

Рассмотрим подробнее - что представляют собой "права доступа".

Еще раз вернемся к примеру. При распечатке содержимого директории (например, командой ls) каждая строчка имеет вид

-rw-r--r-- 1 pascal users 4297 13 мар 21:45 files1

причем нас интересует в данном случае только первая колонка.

Она состоит из десяти знаков. Однако, самый первый знак не имеет отношения к permissions, а обозначает "тип этого объекта". Поскольку, в директории кроме файлов могут находится поддиректории и, кроме того, в Юниксе, кроме обычных файлов существуют другие объекты ("линки", "очереди", "сокеты" и т.п.), которые также находятся в директориях и имеют атрибуты как и у обычных файлов. Так вот, первый символ как раз и показывает - что за объект мы видим, обычный файл (значок "-"), поддиректорию (значок "d") или еще какой-нибудь специфический Юниксовый объект ("l", "s", "p"...).

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

" первая группа - права "хозяина"

" вторая группа - права "группы особо допущенных"

" третья группа - права для "всех остальных"

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

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

" Для файлов.

" Для директорий.

Для файлов.

Первый бит, обозначается буквой "r" (read), и означает, что юзеру, подпадающему под соответствующую категорию, разрешается читать содержимое этого файла. То есть он может посмотреть содержимое файла, а также скопировать этот файл. Кстати, это не означает, что юзер сможет запустить его на выполнение (если это программа). Второй бит, обозначается буквой "w" (write) и разрешает писать в файл. То есть юзер сможет изменить содержимое файла (например, каким-нибудь редактором), дописать что-нибудь в конец или стереть все содержимое. Обратите внимание, этот бит еще не дает право удалить сам файл из директории или изменить ему название (это определяется правами на саму директорию), но дает возможность сделать этот файл пустым (нулевой длины) или скопировать в него содержимое другого файла (и тем самым "подменить" его). И, наконец, третий бит, обозначается буквой "x" (eXecute), позволяет запустить на выполнение этот файл, если он представляет собой программу или командный файл. Обратите внимание, что это также основной признак, по которому система догадывается о "запускаемости" этого файла. Часто начинающие пользователи составив какой-нибудь командный файл, забываю установить на него бит "исполнения" хотя бы для себя - владельца этого файла. В результате, при попытке запустить его, система сообщает, что "вы не имеете права" (выполнять этот файл). Естественно, что в данном случае причина не в том, что "злобный" администратор существенно "урезал" права этого юзера, а в том, что он сам забыл "наделить себя правом" (вполне законным).

Для директорий.

Первый бит ("r") разрешает читать оглавление этой директории, то есть список файлов и поддиректорий, находящихся в ней. Однако, этот бит еще не дает возможность зайти в эту директорию (командой cd) или получить доступ к содержимому, то есть читать/запускать/изменять файлы, даже если "права доступа" установленные на самих файлах это позволяют. Поэтому, само по себе "право чтения" директории практически бесполезно и этот бит, как правило ставиться только вместе с битом "x". Немного забегая вперед, рассмотрим сразу третий бит - "x". Для директорий он как раз означает, что юзер может получит доступ к "компонентам", то есть отдельным файлам и поддиректориям. Только при наличии это бита, система разрешит войти в эту директорию и выполнить какое-нибудь действие с файлом, если сами файлы ("права доступа" на них) это позволят. Кстати, обратите внимание, что если даже внутренние поддиректории имеют "нормальные" права для какой-то категории юзеров, а вышестоящая директория - нет (отсутствует бит "x"), то этим юзерам не удастся "занырнуть" в поддиректории, минуя вышестоящую. Система проверяет полный "путь" до конечной директории или файла (например, /usr/share/misc/fonts) и, если хотя бы один из компонентов этого пути не имеет соответствующего бита, то юзеру будет отказано в доступе. Наконец, бит "w", установленный на директории, позволяет изменять оглавление директории. То есть, разрешает создавать новые файлы (или копировать другие файлы в эту директорию), менять названия файлов и удалять файлы.

Обратите внимание на "разделение полномочий" между теми permissions, которые стоят на файле и теми, которые на директории.

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

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

(Правда, тут есть некоторые нюансы, смортри "Флаги")

И еще на что следует обратить внимание. Никакие из перечисленных здесь прав не имеют отношения к изменениям самих "атрибутов доступа", то есть - владельца файла, группы и permissions. Их изменение подчиняется другим законам, о которых будет сказано ниже (смотри "Как поменять...").

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

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

Далее...Дополнительные биты доступа

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Флаги.

Кроме уже рассмотренных атрибутов (владелец, группа, "права доступа"), существует еще один атрибут, который ограничивает возможные действия с файлом - "набор флагов".

Кстати, по умолчанию команда ls флаги не показывает (и большинство "коммандеров"/"файлменеджеров" - тоже). Для того, чтобы она их показала, надо указать ключ -lo.

С помощью флагов можно запретить изменять содержимое файла, его название или и то и другое.

Флаги являются более "сильнодействующим средством" чем permissions. Они действуют одинаково для всех юзеров, не разделяя их на категории. Более того, их действие не может игнорировать и владелец файла и даже root. Единственное отличие владельца и root'а от прочих пользователей в том, что они могут убрать флаги с файла (и то не всегда) и только потом уже делать то, что им хочется.

Рассмотрим их подробнее.

Флаги делятся на две группы "юзерские" флаги и "суперюзерские". Разница в том, что "юзерские" может поставить и убрать как root, так и владелец файла, а ставить/убирать "суперюзерские" может только root.

На самом деле, "снятие" флагов - вопрос более сложный. Он зависит от того, в каком "режиме безопасности" находится система. Но об этом немного позднее.

По своему назначению флаги делятся на

" append - разрешается только "дописывать" файл (естественно, файл должен также иметь permssion "w"). Без этого флага, если юзеру из соответствующей категории разрешается писать в файл, он может как добавить что-либо к содержимому файла, так и "убавить", то есть стереть часть содержимого. При установленном флаге append, любой юзер (даже root) сможет только добавить что-нибудь в конец файла, но не сможет ничего изменить в уже имеющемся содержимом.

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

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

" immutable или change - "ничего нельзя" :-). То есть, файл (директорию) нельзя ни удалить, ни переименовать, ни изменить содержимое. Опять же, если это флаг стоит на директории, то на файлы (в ней содержащиеся) его действие не распространяется. То есть, вы не сможете ни добавить, ни убрать файл в директории, но менять содержимое самих файлов это флаг не запретит.

Как уже говорилось, эти три флага существуют в двух вариантах - "юзерские" и "суперюзерские". То есть, на самом деле их шесть

" три "юзерских" - uappend, uunlink и uimmutable

" и три "суперюзерских" - sappend, sunlink и simmutable.

Вообще-то, существует еще два "непарных" флага. Это флаги

" archived (архивный файл) - это файл "суперюзерский", то есть его может поставить только root, а аналогичного "юзерского" не существует;

" nodump (файл не надо "дампировать") - а это "юзерский" флаг, его может поставить не только root, но и владелец файла.

Эти флаги проверяются только некоторыми конкретными программами. Флаг nodump сообщает программе dump, что этот файл не надо сохранять в архиве. (Подробнее о программе dump вы можете прочитать в соответствующем man'уале - man dump).

Кем и для чего проверяется флаг archived, я, к сожалению, не знаю.

И, наконец, несколько слов о "режиме безопасности".

Дело в том, что в FreeBSD система может находится на разных "уровнях безопасности". Существует четыре уровня

" -1 - система безопасности выключена

" 0 - система безопасности включена, но никаких ограничений нет

" 1 - "режим безопасности", установлен ряд ограничений на работу с внешними устройствами и операции с флагами

" 2 - "повышенная безопасность", еще больше ограничений, чем на уровне 1.

Подробнее о том, в чем заключаются ограничения и как меняются "уровни безопасности", можно прочитать в man init (отмечу только, что "по умолчанию" система стартует с уровнем -1, то есть "безопасность" выключена).

Для нас в данный момент важно только, что на уровне 1 и 2, даже суперюзеру (root'у) запрещено снимать флаги sappend и simmutable.

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

А вот "взломщик", проникший в систему, даже если каким-то образом и получит root'овские права, не сможет изменить "жизненно важные файлы" (если, конечно, они защищены флагом simmutable) или "почистить логи" (если они защищены флагом sappend), чтобы "замести следы" своего пребывания в системе.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как поменять...

" Владельца и группу.

o Команда chown

o Команда chgrp

" Права доступа (permissions)

" Флаги.

Владельца и группу.

Во-первых, надо отметить - кто может поменять для файла (директории) владельца и группу.

Безусловно, это может сделать root.

Поменять владельца файла не может никто, кроме root'а.

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

Для изменения владельца файла служит команда chown ("change owner"). С ее помощью можно заодно заменить и группу, хотя для изменения этого атрибута есть специальная команда chgrp ("change group").

Подробно об этих командах можно прочитать в соответствующих man'уалах (man chown и man chgrp). Поэтому, рассмотрим только их краткое описание.

Команда chown

Команда chown выглядит очень просто

chown "новый владелец" "имя файла"

если же вы хотите поменять не только владелец, но и группу, то

chown "новый владелец":"новая группа" "имя файла"

Кстати, никто не мешает указать в команде "старого" владельца, тогда изменится только группа.

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

Если же вы хотите, чтобы аналогичная операция была проделана не только в текущей директории, но и во всех "нижележащих" поддиректориях, вам поможет ключ -R (recursively).

Например, команда

chown -R vasia:users *

заменит владельца на vasia, а группу на users для всех файлов и поддиректорий, находящихся в текущей директории и "ниже", то есть в самих поддиректориях.

Команда chgrp

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

chgrp "новая группа" "имя файла"

Естественно, все что было сказано о команде chown относительно выполнения ее над несколькими файлами и о ключе -R, также относится и к команде chgrp.

Права доступа (permissions)

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

Итак, для изменения прав доступа (permissions) служит команда chmod ("change mode"). В целом эта команда выглядит как и предыдущие (которые меняют владельца и группу)

chmod "что сделать" "имя файла"

Но, в отличии от предыдущих команд, второй аргумент ("что сделать") имеет несколько более сложный вид.

В нем можно выделить три части

"категория юзеров" "операция" "биты прав доступа"

u (user) владелец

g (group) группа

o (other) все остальные

a (all) все три категории -

+

= r

w

x

s или t

Как понятно из таблицы, первой задается категория юзеров (владелец, группа или "все остальные"). Причем, можно поставить сразу несколько букв, обозначив тем самым сразу несколько категорий. Например, go будет означать, что права меняются сразу и для группы и для "всех остальных". Если надо изменить права сразу для трех категорий, можно написать три буквы - ugo или одну букву a (все три категории).

Следом указывается "операция" (добавить права или наоборот - убрать). И, наконец, после "операции" один или несколько битов доступа, которые требуется изменить. Значение этих битов подробно рассматривалось выше, поэтому здесь не будем на них останавливаться.

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

А знак "=" означает сразу и то и другое. Дело в том, что если вы укажете, например o+x это будет означать - добавить бит x для категории "остальные", но никак не повлияет на биты r и w для этой же категории. А указав действие как o=rx, вы тем самым скажете системе - "установить биты r и x, и убрать бит w, если он там был".

Бит s имеет разный смысл (suid или sgid) в зависимости от того, в какой части permissions он находится. Поэтому, если вы хотите поставить именно suid бит, то "что сделать" должно выглядеть как u+s, а если вам нужен sgid, то - g+s. Sticky бит ставится командой chmod a+t ... .

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

Например, можно задать команду

chmod a=rx,u+w mydir

это будет означать - "для всех категорий права r-x, а для владельца еще и w (право записи)".

Кроме того, команда chmod (точнее - ее первый аргумент) имеет еще одну форму.

Поскольку, все биты доступа это действительно двоичные биты из одной ячейки, "продвинутый" пользователь может указать сразу число (в восьмеричном виде) которое должно получится после изменения прав.

Восьмеричное представление выбрано потому, что при переводе в него двоичного числа, каждая группа из трех бит "сворачивается" в одну цифру. Таким образом, вам надо просто указать три цифры, каждая из которых описывает отдельную категорию юзеров (точнее - права для этой категории). Например, permissions rwxr-xr-x можно представить в восьмеричном виде как 755. И, следовательно, такие права могут быть выставлены командой

chmod 755 myfile

Что касается выполнения этой операций над несколькими файлами или "рекурсивного" обхода всех поддиректорий, здесь все так же, как для команд chown, chgrp. В качестве имени файла может быть задан "шаблон", а для обхода всех поддиректорий используйте ключ -R.

И, конечно, я советую все таки прочитать man chmod.

Флаги.

Кто может менять флаги (и какие) подробно описывалось в разделе о флагах.

Команда, которая их ставит/убирает - chflags ("change flags"). Формат ее достаточно простой

chflags "флаги" "имя файла"

Аргумент "флаги" - это название флага или нескольких флагов через запятую. Названия флагов описаны в разделе о флагах. Кроме того, эта команда понимает и сокращенные названия.

" sappend - sappnd

" uappend - uappnd

" sunlink - sunlnk

" uunlink - uunlnk

" simmutable - schange или schg

" uimmutable - uchange или uchg

" arcived - arch

" (флаг nodump не сокращается :-)

Для того, чтобы убрать флаг, надо указать его название с префиксом no - nosappnd, nosunlnk, noschg и т.п.

Исключение составляет флаг nodump. Чтобы его убрать нужно сказать не nonodump, а просто dump. :-)

Естественно, как и предыдущие команды chflags может применяться к нескольким файлам и "рекурсивно" обходить поддиректории (ключ тот же - -R).

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Дополнительные биты доступа

" Бит suid.

" Бит sgid

" Бит sticky

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

Бит suid.

Бит suid. Расшифровывается как Set user ID, переводится как "установить идентификатор юзера". Поскольку подходящего русскоязычного термина не существует, его обычно называют "суидный" бит, а файлы, на которых он установлен - "суидными".

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

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

Понятно, что такая программа является "потенциально опасной". В "нормальном" случае она не позволит обычному юзеру сделать то, что выходит за пределы его полномочий (например, программа passwd разрешит юзеру изменить только собственный пароль, но не пароли других юзеров). Но, даже незначительная ошибка в такой программе может привести к тому, что "злоумышленник" сможет заставит ее выполнить еще какие-нибудь действия, не предусмотренные автором программы. Кстати, большинство известных способов "взлома" системы заключаются не в том, чтобы узнать пароль root'а, а как раз в том, чтобы заставить какую-нибудь из "суидных" программ выполнять действия необходимые "взломщику".

Вообще говоря, использование "суидных" программ (когда они нужны и для чего) - достаточно обширная тема выходящая за рамки разговора о permissions. Замечу только, что это не единственный путь сменить "эффективный userID". Это можно сделать из самой программы, вызвав специальную системную функцию, но для этого программы должна уже иметь права root'а. То есть, ее должен запустить юзер root, или она должна быть "суидной", как сказано выше.

Возвращаясь к разговору о "правах доступа", надо сказать, что у такого файла permissions выглядят как **s****** (если еще и установлен бит x для владельца файла) или как **S****** (если бит x не установлен). Однако, ставить suid бит на неисполняемые файлы обычно не имеет смысла (по крайней мере в FreeBSD). Хотя, мне попадались программы, которые проверяли этот бит даже для текстовых файлов.

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

Бит sgid

Бит sgid. Расшифровывается как Set group ID, переводится как "установить идентификатор группы".

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

Permissions такого файла выглядят как *****s*** (если установлен бит x для группы) или *****S** (если соответствующего бита x нет). Также как и в предыдущем случае, бит sgid для неисполняемых файлов никакого смысла не имеет.

А вот что касается бита sgid на директории...

Для FreeBSD (и других ветвей BSD) этот бит, опять же, не оказывает никакого действия. Но в некоторых других Юниксах он означает, что, когда файлы создаются в такой директории, в их атрибутах проставляется группа та же, что и у директории. Другими словами, файлы, создаваемые в такой директории "наследуют" группу от директории.

Бит sticky

Бит sticky. Никак не расшифровывается, переводится как "липкий". :-)

Выглядит в permissions как ********t (если вместе с битом x для "всех остальных") или ********T (если соответствующего бита x нет).

Для директорий его смысл заключается в том, что удалить файл из такой директории (или переименовать) может только владелец файла. Напомню, что в обычном случае (без такого бита) возможность удалять файлы (как и создавать) определяется правом записи (бит w) на директории. То есть, если какой-либо юзер принадлежит к категории, для которой разрешена запись в директорию, он может удалить в ней любой файл, независимо от атрибутов (владельца, группы, permissions) самого файла.

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

Этот бит может ставиться также на исполняемые файлы. В этом случае он означает, что файл, даже после завершения работы, должен оставаться в памяти (конечно, не в ОЗУ, а в swap'е).

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

"Странные" сочетания битов доступа.

" Для файлов

" Для директорий

Для файлов

Обычно права на файл (например, для "всех остальных") устанавливаются

" --- никаких прав (нельзя ни читать, ни изменять содержимое)

" r-- только чтение

" rw- и чтение и запись (изменение) файла.

Если файл является "исполняемым", то права могут выглядеть

" --- опять же, никаких прав (читать нельзя, запускать нельзя)

" r-x можно запустить файл-задачу на выполнение

" rwx можно не только запустить, но и что-нибудь в нем поменять

Остальные сочетания (например -w- или --x) кажутся бессмысленными.

Однако, это не всегда так. Рассмотрим подробнее.

Права -w- означают, что юзер из соответствующей категории не может прочитать этот файл, но может в него писать.

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

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

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

Теперь посмотрим на исполняемые файлы.

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

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

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

Для директорий

Для директорий обычно права доступа устанавливаются

" --- никаких прав

" r-x нормальные права для "посещения" директории, но без права изменения (создавать/удалять/переименовывать файлы)

" rwx полный доступ (делай там что хочешь)

Имеет ли смысл устанавливать какие-либо другие сочетания?

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

Комбинация r-- даст возможность получить список файлов в этой директории, например командой ls, и не более того. Причем посмотреть можно будет только имена файлов, а такие подробности, как владелец/группа/permissions будут недоступны. В такую директорию нельзя "войти" командой cd. И, даже если внутри нее поддиректории имеют вполне нормальные права доступа (например r-x), попасть в них будет невозможно.

Комбинации -w- и rw- имеют еще меньше смысла. Все равно, изменить что-нибудь в директории с такими правами доступа не удастся.

А вот сочетания --x и -wx на самом деле вполне осмысленны.

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

Аналогично и с поддиректориями. Если вы не хотите, чтобы кто-нибудь просто "бродя" по вашим директориям наткнулся на директорию с "секретным" содержанием (например sex-pictures :-), но, в тоже время, не против чтобы некоторые близкие друзья могли туда "захаживать" и знакомится с новыми пополнениями, "спрячьте" свои "приватные" директории в директорию (например private) с доступом --x. Тогда ваши друзья смогут попасть в нужную поддиректорию, указав полный путь (cd private/sex-pictures), а случайные посетители ее просто не найдут (если, конечно, этот посетитель не root).

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

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

И, напоследок, еще один нестандартный случай, который касается распределения прав по категориям юзеров. Обычный порядок назначения прав различным категориям на файл или директорию

" владелец - полные права (rwx)

" группе доверенных лиц - тоже самое, но без права изменения (r-x)

" всем остальным - никаких прав (---)

Вообще-то, обычно права назначаются даже еще проще. Поскольку, группы составляет root и рядовые юзеры, как правило, не выбирают себе соседей по группе, то их файлы и директории имеют одинаковые "допуски" для группы и "всех остальных". Например, для "несекретных" файлов (директорий) - rwxr-xr-x, а те, которые владелец хочет оградить от посторонних rwx------.

Но в данном случае речь не об этом. Что будет, если "всем остальным" дать доступ, пусть и ограниченный, а для группы "особо приближенных" - наоборот убрать (выглядеть это будет примерно так - rwx---r-x)?

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

Я не берусь судить - можно ли извлечь из этого какую-то пользу. Тем более, что составить "черный список" может только root. И, кроме того, не забудьте, что количество групп, в которые может входить юзер, ограничено, поэтому не стоит без особой надобность "плодить" дополнительные списки. Но, во всяком случае, возможность поступить таким образом есть.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

С какими правами файл "рождается"

На самом деле вопрос поставлен не совсем корректно.

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

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

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

Итак. Какие же у только что созданного файла будут владелец, группа и права доступа?

" Владелец

" Группа

" Права доступа

Владелец

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

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

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

Группа

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

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

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

В других разновидностях Юникса группа файлу, обычно, присваивается та, которая является "первичной" группой юзера, создающего файл (то есть, та, которая записана в его учетной карточке). А для того, чтобы группа как и в FreeBSD "наследовалась" от директории, на самой директории должен стоять бит sgid.

Права доступа

Права доступа, которые будут у "свежеиспеченного" файла определяются параметром umask. Он задает - какие биты прав доступа НЕ НАДО выставлять в permissions.

Если это параметр равен нулю, то у всех создаваемых файлов права доступа будут одинаковые для всех категорий и выглядеть как rw-rw-rw. Директории (созданные, например, командой mkdir) будут иметь права доступа rwxrwxrwx. Такие же права доступа получатся и у исполняемых файлов, которые создают различные трансляторы (они, естественно, ставят биты "исполняемости" на результат своей работы).

Параметр umask можно посмотреть или изменить "одноименной" командой umask. Команда umask без аргументов просто показывает текущее значение этого параметра. А для того, чтобы поменять его, надо этой команде в качестве аргумента указать число, которое система "развернет" в соответствующие биты.

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

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

В FreeBSD по умолчанию в командных файлах, которые выполняются при входе в систему, у всех юзеров (включая root'а) вставлена команда, которая задает umask равной 022. То есть отменяются только биты разрешения записи для группы и "всех остальных". Если вас это не устраивает, вы можете изменить аргумент в соответствующем файле (обычно это файл .login в домашней директории юзера) или поменять параметр umask в любой момент "вручную".

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как изменяются права доступа при копировании и перемещении файла.

Этот вопрос на самом деле более сложный, чем может показаться.

Дело в том, что ответ на него зависит от многих условий

" кто копирует (перемещает) файлы, root или обычный юзер

" какие программы и с какими ключами при этом используются

" копируется файл "на пустое место" или там уже существует файл с таким именем

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

Во-первых, при копировании (например, командой cp) создается новый файл, а при перемещении (например, командой mv) меняется только место расположения файла (и, возможно, имя).

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

Строго говоря, если копирование делает root, то эти правила действуют и для него (то есть, владельцем полученной копии будет root, группа будет взята от директории, а права выставятся в соответствии с umask). Однако, root может изменить поведение команды cp. У этой команды есть ключ (-p - сохранять permissions) который означает, что надо сохранить все атрибуты (владельца, группу и permissions) при копировании.

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

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

А вот при перемещении файла все атрибуты сохраняются (даже "опасные" биты suid и sgid). Однако, не забудьте, что для того, чтобы обычный юзер смог переместить чужой файл, он должен иметь право записи и в ту директорию, куда файл переносится и в ту, откуда он переносится (поскольку, там запись о файле должна быть удалена). Такие ситуации в нормальной системе, как правило, не встречаются.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Что делать если этого не хватает?

"

o Проблема первая

o Проблема вторая

" Итак. Что же делать, если "нужно что-то большее"?

" Как же добавить к файлу еще одну группу-категорию?

o Решение первое

o Решение второе

o Так что же делать?

" ACL

Рассмотренная система ограничения доступа к файлам и директориям, конечно, имеет свои недостатки.

Проблема первая

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

Первая категория состоит только из одного юзера - владельца, и ее права не так-то просто "размазать" на группу юзеров.

Третья же категория состоит вообще из всех юзеров, зарегистрированных на данной машине, то есть границ не имеет.

Если возникнет задача - наделить разными правами (по отношению к конкретному файлу) разные группы юзеров, причем это именно группы, а не "отдельный юзер" и не "все зарегистрированные юзеры", то возникнут проблемы даже у root'а.

Проблема вторая

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

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

Итак. Что же делать, если "нужно что-то большее"?

Ну, первый круг проблем, на самом деле - не проблема :-).

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

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

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

Как же добавить к файлу еще одну группу-категорию?

Есть по крайней мере два решения.

Решение первое

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

Так вот. Если для изменения файла можно использовать только одну определенную программу, то надо сделать эту программу (или ее копию) "суидной", то есть такой, которая при выполнении меняет свой "эффективный userID" на ID владельца. Естественно, владельцем такой программы должен быть тот же юзер, что и владелец файла, который мы хотим модифицировать, а права на запуск этого файла надо дать только той группе, которой мы хотим дать права на модификацию. Кстати, "владелец" файла может быть и фиктивным юзером, то есть зарегистрированным в системе только для этой цели и не соответствовать никакому реальному человеку.

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

Сам файл должен быть открыт для записи только владельцу (это может быть кто-нибудь из группы writers или вообще фиктивный юзер), для чтения - "группе допущенных" и это должна быть группа readers, и, наконец, для "всех остальных" можно смело убирать любые права. Ну, а та программа, которая предназначена для модификации, должна иметь того же владельца, что и исходный файл, группу - writers, быть "суидной" и права на запуск должны быть только у группы и владельца (хотя, если он фиктивный, то ему не обязательно).

Решение второе

Второе решение заключается в том, что файл надо "спрятать" в директорию, с соответствующими правами доступа.

Пусть у нас так же существуют две группы readers и writers, причем все члены группы writers входят также и в readers (но не наоборот :-).

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

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

Что можно сказать о втором круге проблем (невозможность самим владельцам файлов определять круг допущенных к файлу)?

Здесь все несколько хуже. Проблема даже не в том, что рядовой юзер не может сам менять состав групп. Эту то проблему можно решить достаточно просто. Можно было бы для каждого юзера завести отдельную группу (кстати, программа для добавления юзера adduser, так и предлагает делать) и написать специальную программу (естественно, "суидную"), которая исполнялась бы с правами root'а и позволяла юзеру менять состав группы, но не любой, а только его личной.

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

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

Так что же делать?

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

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

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

ACL

Речь идет о "Списках управления доступом" (Access Control Lists).

Например, в AIX (клон Юникса фирмы IBM) владелец файла может для любого файла составить такой список (acl). По умолчанию, у файла такой список отсутствует. Но, при желании, владелец файла может с помощью специальной утилиты (acledit) "включить" файлу acl и занести туда отдельных юзеров и/или группы, для которых он хочет задать особые права на файл. Естественно, он может как "расширить" права отдельным юзерам (например, дать право записи), так и "сузить" (то есть, наоборот - убрать все права доступа для отдельных юзеров).

Права задаются так же, как для отдельной категории юзеров в обычных файлах, то есть - тройка битов rwx.

При наличии acl'я система определяет права конкретного юзера по отношению к файлу в следующем порядке

" если юзер есть в списке, то права берутся оттуда

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

" и, наконец, если ни юзера, ни группы в списке нет, то проверяются обычные permissions для этого файла.

Итак. Если описанные выше решения проблем вас никак не удовлетворяют, то могу дать еще один совет - смените Юникс, на такой, который поддерживает acl. Или ждите, пока эта поддержка появится в вашем любимом клоне Юникса. :-)

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Как добавить из дистрибутива то, что вы не поставили в процессе инсталляции системы?

Ну, основные бинарники и конфиги у вас уже стоят. В том числе и ненужные :-).

При инсталляции можно отказатся от установки исходных текстов (src), системы X-Window, игрушек (games), и различной документации (manpages, doc, info, dict).

Кроме того, существует большое колличество дополнительных программ в виде пакетов (packages) и портов (ports). Но о них разговор отдельный. Смотри:

Установка "пакетов" (packages).

Установка "портов" (ports).

Итак. Добавление из дистрибутива ...

1. С помощью программы sysinstall.

Это самый легкий способ. Но...

Sysinstall все еще в процессе совершенствования :-), и я не уверен, что эти рекомендации подойдут к любой версии. Кроме того, ему не хватает гибкости.

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

2. Установка "вручную".

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Установка дополнительных программ из "пакетов" (packages).

" Что такое package?

" В чем заключается регистрация пакета?

" Как установить пакет?

" Как удалить пакет?

" Что об этом еще почитать?

Что такое package?

"Пакеты" - это архивы типа *.tgz (tar-архив, сжатый GNU zip'ом), в которых лежат уже собранные бинарники. А, также, мануалы к ним, необходимые конфиги и т.п.

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

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

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

Кроме того:

Некоторые пакеты "опираются" на другие. То есть для нормальной работы пакета необходимо, чтобы у вас уже был установлен какой-то другой пакет или пакеты (обычно это библиотеки). Естественно, в таких случаях программа установки проверяет наличие всего необходимого.

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

В чем заключается регистрация пакета?

В директории /var/db/pkg создается директория с тем же названием, что и пакет, в которую помещаются несколько файлов. В этих файлах находится

" краткое описание пакета;

" список всех файлов из пакета, с указанием - где какой лежит;

" дополнительные скрипты, исполняемые при инсталляции пакета и при удалении (если, конечно, таковые имеются);

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

Вся эти данные используются соответствующими утилитами, которые

" добавляют пакеты

" удаляют пакеты

" показывают всевозможную информацию об установленных пакетах

Однако, все эти файлы просто текстовые и их легко можно посмотреть любым редактором/просмотрщиком.

Как установить пакет?

Очень просто

pkg_add <имя архива>

Дальше все сделается автоматически. Хотя, если в пакете есть "инсталляционный скрипт", он, возможно, захочет задать вам несколько вопросов.

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

Как удалить пакет?

pkg_delete <имя пакета>

Точное имя пакета можно подсмотреть в /var/db/pkg. (Даже если вы каждый день пользуетесь программой elm, например, - это еще не значит, что вы безошибочно назовете имя пакета, откуда его поставили - elm-2.4ME+8 :-)

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

Во-первых, если пакет используется другими пакетами, утилита откажется его удалять. Однако ее можно заставить это сделать с помощью ключа -f.

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

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

Что об этом еще почитать?

man pkg_add - установка пакетов

man pkg_delete - удаление пакетов

man pkg_info - вывод информации об установленных пакетах

Ну, и те, которые будут указаны в этих мануалах в разделе See Also (смотри также...).

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Установка "портов" (ports).

Вообще-то, установка ports подробно описана в /usr/share/doc/handbook/.

Поэтому, я пока эту часть не описываю.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Добавление из дистрибутива с помощью программы sysinstall.

Надеюсь, что вы уже точно знаете - что именно из дистрибутива вам нужно и откуда его (дистрибутив) можно взять. Итак...

1. Запустите программу

/stand/sysinstall

2. В главном меню выберите пункт

Configure - Do post-install configuration of FreeBSD

3. В меню "FreeBSD Configuration Menu" выберите пункт

Distributions - Install additional distribution sets

4. В меню "Choose Distributions" выберите (пробелом) пункт

> > Custom - Specify your own distribution set

5. Теперь можно пометить (пробелом) то, что вам нужно. Если вы отметите src или XFree86 появятся дополнительные меню для уточнения - что вам из этого надо. Естественно, не надо просить то, что у вас уже стоит.

6. Нажимая <Enter> возвращайтесь из меню. В конце концов программа спросит вас - откуда брать дистрибутив. Здесь вариантов много. Надеюсь, вы знаете - что выбрать. :-)

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

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Добавление компонент из дистрибутива "вручную".

Будем считать, что дистрибутив вам доступен для просмотра и копирования. Если он находится на CD, отдельной партиции винчестера или доступен по NFS - смонтируйте его в любую подходящую директорию.

Если вы можете скопировать его через FTP или через флопики - выберите ту часть, которая вас интересует (можете посмотреть "Содержание дистрибутива FreeBSD") и скопируйте в подходящую директорию.

Что именно нужно копировать?

Если речь идет о "монолитных" частях дистрибутива (info, games, manpages и т.п), то забирайте все, что лежит в соответствующей директории дистрибутива. Если вам нужны исходники (директория src), то выберите - какой из архивов вас интересует и берите все файлы с таким названием. Например, если вам нужны исходники ядра, берите все файлы с именем ssys (ssys.aa, ssys.ab и т.д.). Кроме того, очень полезно взять еще файл install.sh из этой же директории.

Несколько слов о том, что это за файлы. На самом деле это архив *.tgz (tar-архив сжатый GNU zip'ом), только порезанный на кусочки программой split. Эти кусочки можно "склеить" обратно в единый файл командой cat после чего обращаться с ним как и с другими файлами типа tgz.

Однако, вам этого делать не обязательно.

"Извлечение"

Просто запустите командный файл install.sh из этой директории:

sh install.sh

он сам выполнит последовательно команды cat, которая "сольет" кусочки в единый файл и tar (с соответствующими ключами), которая развернет получившийся архив в нужную директорию. Если вы хотите развернуть какой-либо архив из исходников, то install.sh нужно указать в качестве аргумента имя архива (без начальной буквы "s") или all, если вы хотите развернуть все исходники. Например, для тех же исходников ядра:

sh install.sh sys

Более "тонкая" работа.

Все вышеописаные действия можно сделать и с помощью программы sysinstall. Однако, вручную можно сделать и более "тонкую" работу. Например, "вытащить" исходники только одной конкретной программы. Или "достать" из дистрибутива сдержимое директории /etc, какой она была в оригинале (если вы вдруг безнадежно испортили какой-нибудь файл при настройке).

Прежде всего, определите - в каком из дистрибутивных архивов лежит то, что вам нужно. Если речь идет об исходниках какой-то программы, найдите саму программ в своей развернутой системе (например, с помощью команды locate). По названию директории, в которой она находится, можно определить в каком из архивов искать ее исходники (см. "Содержание дистрибутива FreeBSD"). Естественно, если вам надо саму программу в бинарном виде или файлы из /etc, то их надо искать в той части дистрибутива, которая называется bin.

Теперь просмотрите соответствующий архив.

cat file.?? | tar tzvf - | more

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

Если вы не обнаружили в архиве то, что искали - попробуйте просмотреть другие архивы (например, часть исходников лежит в архивах scontrib и sgnu).

Если вы нашли, то что искали, можно приступать к "извлечению" из архива. Решите, в какую директорию вы хотите положить извлеченное и запускайте команду

cat file.?? | tar xzf - -C "куда положить" "что взять"

Например:

cat sgnu.?? | tar xzf - -C /home/vasia */uucp

Обратите внимание, что в архиве может быть большое дерево из директорий, и, те файлы, которые вам нужны, могут иметь длинный "префикс" из названий поддиректорий (так файлы-исходники uucp в архиве sgnu, выглядят как gnu/libexec/uucp/...). Поэтому в команде, в том месте, где "что взять", надо либо прописать начало имени полностью - gnu/libexec/uucp, либо начать со звездочки - */uucp. Кстати, в директории, куда вы извлекаете файлы, в этом случае создастся соответствующий кусочек дерева из архива. То есть, директория gnu, в ней - libexec, а в ней - uucp со всем своим содержимым.

Подробности о других возможностях программы tar можно почитать в соответствующем man'уале

man tar.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Содержание дистрибутива FreeBSD.

В дереве каталогов дистрибутива FreeBSD все разложено по "полочкам"- директориям:

bin

- основная часть FreeBSD (скорее всего, она у вас уже стоит)

commerce

- коммерческие продукты для FreeBSD, естественно, там или demo, или shareware

compat*

- этих может быть несколько, с разными цифрами на конце. Это дополнительные библиотеки, позволяющие запускать бинарники, странслированные в более старых версиях FreeBSD. Цифры на конце как раз указывают номер этой версии. Если у вас таких программ (именно в бинарном виде) нет, то и эти библиотеки вам не нужны.

dict

- словарь для программы проверки грамматики.

doc

- понятно по названию. Установленное оно лежит в /usr/share/doc. Там есть Handbook и FAQ в формате html и просто текстовом. И некоторые другие статьи и книги по юниксу.

floppies

- образы загрузочных дискет. Если FreeBSD у вас уже стоит, туда можно не заглядывать.

games

- понятно по названию.

info

- еще одна документация. Она в особом гипертекстовом формате "GNU info". Учтите, что для ее чтения требуется специальная программа. Хотя, при большом желании, можно почитать и любым текстовым редактором/просмотрщиком.

manpages

- основные man'уалы по системным утилитам и конфигам. Поскольку программа sysinstall настоятельно рекомендует их поставить при инсталляции, скорее всего, они у вас уже стоят в /usr/share/man.

packages

- дополнительные приложения и библиотеки в бинарном формате. Смотри "Установка packages".

ports

- "портированые" дополнительные приложения. Смотри "Установка ports"

proflibs

- дополнительные библиотеки.

src

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

tools

- это программки под DOS, нужные для того, чтобы создать загрузочные дискеты и почитать документацию из дистрибутива, пока у вас еще не развернут unix. Если FreeBSD у вас уже стоит, они вам не нужны.

xperimnt

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

XF86**

- это X-Window. Это не часть FreeBSD, а отдельная надстройка над unix. Поэтому, об их развертывании - разговор отдельный.

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

Исключение могут составлять commerce и xperimnt - там внутри свое деление на поддиректории для каждого продукта в отдельности.

И, также, разделы src (исходные тексты всей ОС) и XF86... (система X-Window) остоят из нескольких архивов, так что вы можете выбрать там только те части, которые вам необходимы.

Содержимое раздела src.

Как я уже сказал, в этом разделе лежит целая пачка архивов (разбитых на отдельные кусочки). Название каждого начинается на букву "s" (очевидно, от слова source), а по остальным буквам можно догадаться - что именно находится в этом архиве.

Исходные тексты программ, которые лежат в

sbin

- /bin

ssbin

- /sbin

subin

- /usr/bin

susbin

- /usr/sbin

slibexec

- /usr/libexec (это, как правило, демоны)

sgames

- это и так понятно

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

scontrib и sgnu

(я так и не понял - по каким критериям их разделили, GNU'шные программы встречаются и в scontrib)

Другие исходники:

slib

- /usr/lib - библиотеки

sinclude

- /usr/include - header файлы для языка C.

ssys

- исходники ядра (kernel)

slkm

- /lkm - дополнительные модули ядра, которые могут подгружаться в процессе работы системы, по необходимости.

sbase

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

setc

- некоторые примеры для файлов из etc

sshare

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

smailcf

- это исходники для построения файла /etc/sendmail.cf (конфиг для sendmail). Зачастую, это вещь очень полезная. Но, если вы никогда раньше этого не делали (в смысле - собрать из них sendmail.cf), задача может оказаться весьма не простой.

________________________________________

Иван Паскаль mailto:pascal@tsu.ru

________________________________________

Обновлено: 12.03.2015