О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

16.08.2008

Рекурсивное правоведение, или Как стать 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 - посчитаю цель этой заметки выполненной. Если же этот кто-то еще и поделится своими представлениями с народом - задача будет выполнена вдвойне.