Рекурсивное правоведение, или Как стать POSIX’ивистом

Автор: Алексей Федорчук
2001-2004 гг

Актуализация: первая версия этой заметки сочинялась для Софтерры где-то весной 2001-го, если память не изменяет, года. Ныне — чуть модернизированная и стилистически подправленная версия.

Остается общим местом, что Linux (и прочие POSIX-системы, в первую очередь FreeBSD) — штука, в изучении очень сложная. По крайней мере, такое мнение бытует в кругах пользователей Windows, даже весьма опытных. Почему они и избегают Linux’а сотоварищи даже в тех случаях, когда POSIX-инструменты были бы адекватны их задачам, к коим Windows-софт подчас приходится прикручивать с помощью шанцевого инструмента и чьей-то матери.

Попробуем разобраться — в чем же главная сложность изучения Linux’а (или, если угодно, обучения Linux’у — говорю так для краткости, но на самом деле подразумеваются все представители POSIX-семейства)? Первый напрашивающийся ответ — в командах и интерфейсе командной строки. Не могу с этим согласиться. Потому что команды Linux (и вообще классические Unix-команды), как правило, а) коротки и мнемонически прозрачны, б) на элементарном уровне просты в использовании и в) хорошо документированы help‘ами, man‘ами и прочими info.

Кроме того, любому, не забывшему еще, как страшный сон, командной строки DOS, работа в командных средах Linux покажется просто райским наслаждением: не нужно помнить длинных путей — всегда к услугам клавиша Tab для автодополнения, не приходится мучительно вспоминать, какие опции использовались вчера — в вашем распоряжении история команд, всегда можно пролистать экранный буфер на предмет ранее выведенного help’а, в ожидании вывода результатов поиска можно на другой консоли поиграться в тетрис. А безнадежно зависшую (или просто осточертевшую) программу можно безжалостно истребить командой kill. Словом, не жизнь, а сказка.

Да и, строго говоря, никто не неволит сразу учить команды, особенно если из DOS забыл даже то, чего никогда не знал. Есть интегрированные среды универсального назначения, приемы работы в которых такие же, как в Windows. И которые, как пятиборцы, умеют делать все. Правда, как и пятиборцы, плохо — вернее, менее эффективно, чем прямыми командами, специально предназначенными для (и только для) решения данной задачи. Но и команды-то можно изучить в процессе осознания этого факта…

Нет, основная сложность Linux’а для мигранта с DOS или Windows — в резком топологическом отличии модели мироустройства. Действительно, DOS — строго линейна: из пункта А можно достигнуть пункта Б посредством команды В. Более того, линейна она однонаправленно: вернуться назад можно в лучшем случае на один шаг. Из чего и проистекает ограниченность DOS, как на узкой тропе: шаг в сторону — побег (ошибка), прыжок на месте — провокация (зависание).

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

Модель мира Windows (а также классово близких к ней MacOS и BeOS) аппроксимируется понятием плоскости — не зря же пресловутая метафора рабочего стола стала в этих системах столь популярной. Конечно, по плоскости можно двигаться не только вперед и назад, но также влево и вправо. Однако — не более, что также накладывает ограничения. И к тому же резко возрастает вероятность выбора неправильного направления…

Естественный путь преодоления ограничений двухмерной модели — придание плоскости глубины, что время от времени и проделывается в системах из рода Windows и ее идеологических собратьев. Однако ни один из экспериментов по созданию 3D-интерфейсов пока успехом не увенчался. Хотя начались они сразу вслед за появлением Windows 3.1 — помните метафору рабочей комнаты Hewlett-Packard образца 93 года?

Linux же не испытывает потребности в третьем измерении. Поскольку изначально унаследовал от первозданного Unix принципиально иную концепцию мироздания — циклическую, или, если хотите, рекурсивную. Именно рекурсией обусловлена его мощь. Но она же и создает наибольшие трудности в изучении, так как аналогичных понятий нет ни в DOS, ни в Windows, ни в MacOS. Да и в реальной жизни человек с понятием рекурсии практически не сталкивается…

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

Однако и сам пользователь порождается процессом — вернее, цепочкой процессов, в первооснове которых — первый процесс системы, init. Свойства которого определяются его конфигурационным файлом /etc/inittab, возникшим следствии процесса и в силу этого принадлежащий пользователю. Который в ряде случаев и сам является не столько г-ном ***, нажимающим на клавиши терминала, сколько процессом, инициированным процессом init.

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

Тем не менее, осознание проблемы рекурсивности Linux — уже половина ее решения. Ведь можно поступить, подобно Александру Филипповичу (Македонскому) и просто разорвать круг в любой точке. Начав, скажем, с понятия файла и с верой, что со временем заклинания типа UID, GID etc. обретут смысл.

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

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

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

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

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