База данных login-классов - login.conf.

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

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

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

Общее устройство login.conf.

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

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

Кстати, обратите внимание - хотя файл и называется login.conf, данные из него могут использоваться (и используются) многими программами - ftp-сервером, "диспетчером Интернет сервисов" inetd и т.п. Он даже используется когда система только стартует и автоматически запускает основные программы daemon'ы.

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

default:\
    :copyright=/etc/COPYRIGHT:\
    :welcome=/etc/motd:\
    :nologin=/var/run/nologin:\
    :cputime=unlimited:\
    :datasize=unlimited:\
    :stacksize=unlimited:\
    :memorylocked=unlimited:
  Но этот файл отличается от файла "учетных карточек" (passwd) тем, что
число полей в нем никак не ограничено. А главное отличие в том, что в passwd
за каждым полем (по его порядковому номеру) закреплено определенное
назначение - первое поле содержит name, второе password и т.д.
  А в login.conf самое по себе поле ничего не значит и может содержать любую
информацию.

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

  имя = значение
Вот по этим именам и определяется смысл (или назначение) каждого поля. Таким образом достигается гибкость - вы можете указать ровно столько полей, сколько вам реально нужно (причем - в любом порядке). Если со временем появляется какая-то другая информация, которую хотелось бы связать с юзером (точнее - с его login классом), достаточно только придумать для нее новое имя. Конечно, надо еще программы научить использовать это новое поле, но переделывать что-то в формате login.conf и процедурах обращения к ней не потребуется.

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

students:\
    :cputime=1h:\
    :datasize=8M:\
    :stacksize=2M:
для студентов, и вы хотите сделать для преподавателей другой класс, но который отличается от студенов только одним полем (например, cputime для них должно быть больше), то вам не надо писать все поля для нового класса. Вы можете описать новый класс как
teachers:\
    :cputime=2h:\
    :tc=students:
Как я уже сказал, последнее поле означает - "а все остальные поля возьмем из students". (Естественно, если даже в students уже есть cputime, для вновьописаных teachers будет использоваться то значение, которое явно задано в записи teachers, а не то, что в "продолжении"). В свою очередь запись students тоже может содержать запись "продолжение" (например - ts=common), и так далее.

И наконец, надо заметить, что login.conf - это просто частный случай так называемых capability database, которые используются в FreeBSD (и других Unix'ах) для различных целей. Более подробно о всех возможностях этих database и "языке", который в них используется, можно прочитать в man getcap.

И еще одно уточнение. Хотя я выше говорил о том, что любое поле содержит запись вида "имя=значение", это, строго говоря не всегда так. И вы сами можете в этом убедиться, заглянув в ваш /etc/login.conf.
Исключением из этого правила явлются "логические переменные", то есть те поля, которые просто разрешают или запрещают что-либо. Например - requirehome. Это просто логическая переменная, которая говорит программе login - надо ли проверить, что у данного юзера есть "законная" домашняя директория. Такие переменные записываются без значения, в виде

:requirehome:   - означает, что эта переменная имеет значение "да",
:requirehome@:  - а это означает - "нет".
Но знак '@' после имени вместо "=значение" может использоваться и для других "имен", которые вообще-то могут иметь (или должны иметь) "значения". Для таких переменных эта запись означает, что мы как раз не хотим объявлять явно никаких значений и предоставляем программе (login или любой другой, которая использует данные из login.conf) использовать для этой переменной значение по умолчанию. На первый взгляд эта запись может показаться беcсмысленной. Если мы не хотим ничего сообщать программе, то почему бы просто не писать поле с таким именем? Это верно, но если только в своей записи мы не используем в качестве "продолжения" другую запись из login.conf (вспомните о tc=). В последнем случае такая форма может быть полезна и означает - "что бы там не было указано в продолжении, в этой записи такой параметр неопределен (и должен иметь значение по умолчанию)".

Какие сведения содержатся в login.conf.

Итак, какие дополнительные данные хранятся в этом файле. Вообще-то надо заметить, что описывать эти поля - задача неблагодарная. Как я уже сказал, эта база данных легко дополняется и любое ее описание может устареть с выходом новой версии FreeBSD. Поэтому я опишу кратко те возможности, которые существуют в моей версии. А "весь список" с подробным описанием лучше смотреть в вашей системе в man login.conf.

Ограничения ( limits ).

Подробнее об ограничениях лучше почитать в man getrlimit, а здесь я только перечислю - как они задаются в login.conf.

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

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

Для обозначения времени используются единицы измерения Например - 9600s, 160m, 2h40m.

Переменные окружения и другие параметры, имеющие к ним отношение.

Параметры, влияющие на аутентификацию (проверку пароля) юзера.

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

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

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

Итак.

И напоследок хочу еще раз напомнить, что список всевозможных параметров может меняться от версии к версии. Поэтому, полнй перечень надо смотреть в своей системе, в man login.conf

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

Несколько классов в login.conf имеют специальное значение и могут быть не связаны ни с какими реальными или фиктивными юзерами.

default
Как понятно из названия, в этой записи вы может указать значения по умолчанию для любых полей. Использоваться эта запись будет в том случае, если вы для какого-нибудь юзера вообще не укажете ни какого класса.
root
А эта запись будет использоваться для юзера root (и для программ, которые выполняются с привилегиями root). Конечно, для root'а, как и для любого пользователя можно указать login-класс в его "учетной карточке". Но если вы этого не сделаете, то к нему будут применяться данные из записи root, а не default, как для всех остальных пользователей (естественно, имеются ввиду те юзеры у которых явно не указан login-класс).
daemon
А это "самая особенная" запись. Ее использует не login, а программа init, которая при старте системы должна запустить другие программы - демоны. Вот для этих daemon'ов используется класс не default, а daemon.

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