Концепция Base Linux

Алексей Федорчук
2005.11.28

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

Содержание

Введение

Из чего состоит Linux как операционная система? Во взглядах на этот вопрос бытует две крайние точки зрения. С одной стороны, Linux рассматривается как ядро операционной системы. И это — правильно, так как именно разработанное им ядро назвал Linux’ом Линус Торвальдс, обладатель авторских прав на это имя и владелец соответствующей торговой марки. Однако никакое ядро, сколь бы совершенно оно ни было, само по себе не способно обеспечить решение самой простой пользовательской задачи.

С другой стороны, в статьях и книгах про Linux в него часто включается все, что можно обнаружить на многодисковых наборах, продаваемых под этим именем, вплоть до системы оконной системы X, интегрированных сред типа KDE и GNOME, иразнообразных пользовательских приложений. Однако сама по себе система X не имеет никакого отношения не только к Linux, но, в сущности, и к Unix-системам вообще (за исключением того, что способна работать под управлением любой из них). А интегрированные среды и оконные менеджеры — лишь дополнительные (хотя и необходимые) атрибуты оконной графической системы. Что же касается включаемых в дистрибутивы приложений — более чем на 90 процентов они суть общее достояние всех свободных операционных систем.

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

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

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

С ядром Linux все ясно — это именно то, что делает Линус Торвальдс сотоварищи. Все же прочие компоненты, хотя теоретически и могут варьировать по составу, давно определены традицией: это так называемые средства, разработанные в рамках проекта GNU (из всех возможных переводов этого акронима адекватным мне кажется такой: «Гну — это вам не хрен собачий») и ему соплеменных. И слагаются они из:

  • библиотек — общесистемной glibc и терминальной ncurses;
  • компилятора gcc и средств обеспечения его работы (именуемых binutils и bin86), а также таких дополнительных (но практически необходимых) компонентов, как make, automake, autocomfig;
  • утилит разного назначения — fileutils, findutils, textutils, архиватора и компрессоров, программ типа grep, awk, sed и т.д., — всего того, что охватывается понятием классических утилит Unix или GNU-утилит (справедливости ради нужно заметить, что некоторые из них в проекту GNU ни малейшего отношения не имеют);
  • командной оболочки bash, выполняющей в Linux роль системной — помимо всего прочего, именно она ответственна за интерпретацию стартовых скриптов.

Теоретически рассуждая, реализации перечисленных компонентов могут быть различными. Так, существовали (а возможно, и существуют) дистрибутивы Linux, в которых в качестве базового компилятора использовался не gcc, а egc или pgcc. Терминальная библиотека ncurses может если не заменяться, то дополняться какой-либо другой. Командный интерпретатор bash можно заменить любым другим shell-совместимым (точнее говоря, любым, способным эмулировать мифический POSIX-shell). Однако в качестве канонического минимального набора для Linux можно рассматривать то, что Герард Бикманс включил в свой набор Linux from Scratch (LFS).

Нужно заметить, что все компоненты этого набора, с одной стороны, настолько тесно связаны взаимозависимостями, что их него практически ничего нельзя удалить. С другой же стороны, включающая их система способна не только загрузиться и работать, но и выполнять пользовательские задачи, причем не только элементарные. Особенно если дополнить ее буквально двумя-тремя прикладными программами. Кроме того, эта система (за счет включения средств разработки) обладает потенциалом к практически неограниченному наращиванию функциональности. И потому набор LFS (плюс несколько программ, о которых я скажу ниже) можно рассматривать как Base Linux. Он включает:

  • ядро системы;
  • средства поддержки — загрузчики и файловые системы;
  • средства боевого обеспечения — утилиты GNU и некоторые другие;
  • средства тылового обеспечения — системные библиотеки;
  • абсолютно необходимые приложения;
  • средства локализации;
  • средства сборки всего перечисленного хозяйства (компиляторы и сопутствующие программы).

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

Ядро

Бытует мнение, что ядро Linux — одно-единственное. Это правда, но не вся правда. Действительно, ядро Линуса — каноническое. Однако существуют еще т.н. ядра майнтайнеров (наиболее известные из них — ядра Алана Кокса, Эндрю Мортона, Кона Коливаса) и ядра различных дистрибьюторов. Разумеется, в основе всех их — каноническое ядро, но — с патчами, ответственными за реализацию дополнительных функций.

Локация канонического ядра Linux, как нетрудно догадаться, не где-нибудь, а на kernel.org. На современном этапе имеет смысл рассматривать ядра версии 2.6.X — причем имеет смысл запастись несколькими из числа последних, и методом проб и ошибок выбрать наиболее подходящее.

Средства поддержки

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

GRUB имеет все шансы стать стандартом для свободных ОС. В отличие от большинства мультисистемных загрузчиков, он не просто передает управление «по цепочке» на загрузочный сектор соответствующего раздела, но работает с несмонтированными файловыми системами (незагруженных ОС!), обеспечивая запуск с них ядра соответствующей системы. Впрочем, при невозможности этого — способен и к загрузке «по цепочке».

Основное средство инициализации — канонический пакет sysvinit, обеспечивающий инициализацию системы в т.н. стиле System V. Он включает программу init, обеспечивающую запуск всех остальных процессов в системе, shutdown, halt, reboot, вызывающие останов и рестарт системы, killall — средство «убиения» процессов, и еще несколько.

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

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

Важнейшие утилиты поддержки Linux объединены в пакет, который так и называется — util-linux. В его составе — многие множества команд: agetty, arch, blockdev, cal, cfdisk, chkdupexe, col, colcrt, colrm, column, ctrlaltdel, cytune, ddate, dmesg, elvtune, fdformat, fdisk, getopt, hexdump, hwclock, ipcrm, ipcs, isosize, kill, line, logger, look, losetup, mcookie, mkfs, mkswap, more, mount, namei, pivot_root, raw, rdev, readprofile, rename, renice, rev, script, setfdprm, setsid, setterm, sfdisk, swapon, swapoff, tunelp, ul, umount, vidmode, whereis, write. Они предназначены для создания дисковых разделов (fdisk, cfdisk), создания (mkswap) и активации/дезактивации (swapon/swapoff) разделов подкачки, монтирования и размонтирования файловых систем (mount/umount) и многого другого. Очень желательно, чтобы версия комплекта util-linux соответствовала версии ядра.

Взаимодействие с модулями ядра обеспечивает пакет module-init-tools, жестко привязанный к версии ядра. Он включает команды (depmod, insmod, lsmod, modinfo, modprobe, rmmod), предназначенные для загрузки и выгрузки модулей, просмотра списка загруженных модулей, определения их зависимостей, и т.д.

Средства поддержки файловой системы (систем) включают в себя утилиты для создания их (сиречь форматирования, в терминах DOS/Windows), проверки на целостность, тюнинга, резервного копирования и т.д. Для классической файловой системы Linux, ext2fs, такой набор носит название ext2fsprogs. В него входят следующие утилиты:

  • badblocks для поиска испорченных блоков на дисковых устройствах;
  • chattr для смены атрибутов файлов;
  • dumpe2fs для создания дисковых дампов;
  • ext2fs, mke2fs и mkfs.ext2 для создания на дисковых разделах файловой системы (сиречь для форматирования разделов);
  • e2fsck, fsck и fsck.ext2, осуществляющие проверку целостности файловой системы;
  • e2image для создания образа файловой системы в виде файла;
  • e2label для создания таблицы разбиения диска;
  • tune2fs для настройки быстродействия файловой системы.

и еще несколько утилит (compile_et, debugfs, lsattr, mk_cmds, mklost+found, uuidgen). Ряд утилит из комплекта поддерживают также журналируемый вариант файловой системы Linux - ext3fs (mke2fs, fsck.ext3), а resize2fs - также и ReiserFS. Однако в принципе для нее, как и для остальных журналируемых файловых систем - XFS и JFS, требуются собственные средства.

В первом случае это будет пакет reiserfsprogs/, включающий

  • mkreiserfs для создания файловой системы ReiserFS;
  • reiserfsck для проверки ее целостности;
  • resize_reiserfs для изменения размера и размонтирования;

Для поддержки XFS требуется целый комплекс пакетов:

  • acl для дополнительных средств управления доступом к файлам;
  • attr для использования расширенных возможностей атрибутирования файлов;
  • dmapi;
  • xfsdump для резервного копирования;
  • xfsprogs собственно для создания и управления файловой системой XFS.

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

Кроме этого, требуются средства для поддержки виртуальной файловой системы proc, обеспечивающей отображение процессов — procinfo, procps и, возможно, средство для трансляции файловой системы устройств — devfs, буде возникнет желание таковую использовать, devfsd. Хотя ныне devfs быстро вытесняется другим механизмом управления устройствами — пакетом udev, который, таким образом, вместе с тесно связанным с ним пакетом hotplug, становится необходимым компонентом системы.

Для управления системными журналами служит комплект sysklogd, включающий klogd — системный демон для журналирования сообщений ядра, и syslogd.

К этой же группе примыкает комплект psmisc, предназначенный для отслеживания процессов в системе. В его составе — команды:

  • fuser, выводящая на экран идентификаторы процессов,
  • killall, предназначенная для отправки сигналов им,
  • pstree, показывающая запущенные процессы в виде дерева.

Далее, к средствам поддержки можно отнести программы для работы с консольным драйвером Linux. Таковых ныне используется две — kbd и console-tools . Первая включает в себя множество утилит, из которых для начала важнейшими являются:

  • loadkeys, предназначенная для загрузки клавиатурных раскладок;
  • setfont для загрузки экранных шрифтов;
  • mapscrn для задания карты соответствия кодировки клавиатурного ввода таковой экранного вывода.

Набор console-tools имеет соответствующие средства — loadkeys и consolechars для управления вводом/выводом. Очевидно, что пакеты kbd и console-tools не то чтобы исключают друг друга — просто при наличии одного второй делается ненужным. Пакет console-tools считается более современным, однако и текущие версии kbd обеспечивают, в частности, работу с кодировкой Unicode и прочие актуальные фичи, так что выбор между ними — дело вкуса. Тем более, что поминаемый ниже комплект console-tools-cyrillic успешно работает и с тем, и с другим набором.

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

Средства боевого обеспечения

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

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

Традиционно такой, как бы общесистемной, командной оболочкой в Linux является bash. Хотя обычно стартовыми сценариями в явном виде вызывается некая оболочка /bin/sh, это — не более чем ссылка на bash: при этом под /bin/sh понимается некий виртуальный Posix-shell, в природе не существующий. Однако любая Posix-shell оболочка, будучи запущен таким образом, более или менее его эмулирует.

Оболочка bash обладает многими достоинствами, но ныне не является наиболее совершенной. Последний титул (в семействе shell-совместимых интерпретаторов, по крайней мере), я отдало бы оболочке Z-Shell (она же zsh). Каковая также способна (и причем очень точно) эмулировать POSIX-shell и потому вполне подходит в качестве общесистемной. Однако на первых порах почти неизбежно потребуется и bash. Тем более, что текущие версии дополнительного пакета bash-completion делают ее вполне сопоставимой с zsh по возможностям.

Исходники всех программ, перечисленных выше (да и всех прочих, о некоторых их них будет говориться ниже) доступны в сети в архивированном (да ещё и компрессированном) виде, и потому первое, что понадобится для их установки — это архиваторы и компрессоры. Список первых ограничивается программой tar, тогда как компрессоров потребуется не менее двух: gzip и bzip2, поскольку форматы их несовместимы (иногда встречающиеся архивы вида *.tar.Z могут быть распакованы программой gzip).

Далее следует базовый пакет пользовательских утилит для манипуляций с файлами и их содержимым, в первую очередь текстовым — coreutils. Он включает огромное количество отдельных команд, которые можно разделить на три блока — средств для работы с файлами, средств навигации по файловой системе и средств работы с текстовым контентом. Ранее они составляли три отдельных пакета — fileutils, sh-utils и textutills, соответственно.

Средства манипуляции файлами — следующие:

  • chgrp, chmod и chown для управления атрибутами файлов;
  • cp, dd и ln для простого копирования файлов, копирования с преобразованием и создания ссылок, а также install для копирования с установкой атрибутов;
  • touch, mkdir, mkfifo и mknod — средства создания регулярных файлов, каталогов, специальных файлов и файлов устройств, соответственно;
  • mv, rm, rmdir для переименования/перемещения файлов, их удаления, удаления каталогов;
  • ls, dir и vdir для просмотра списков файлов в каталогах;
  • dircolors для установки цветовой схемы;
  • df и du для вывода информации о дисковом пространстве;
  • shred;
  • sync — для синхронизации файловых операций и состояния файловой системы.

Среди средств навигации, служащих также некоторым иным целям, — такие команды, как basename, chroot, date, dirname, echo, env, expr, factor, false, groups, hostid, hostname, id, logname, nice, nohup, pathchk, pinky, printenv, printf, pwd, seq, sleep, stty, su, tee, test, true, tty, uname, uptime, users, who, whoami и yes.

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

  • cat — многофункциональная команда для создания, просмотра и объединения файлов;
  • cksum — средство проверки контрольных сумм;
  • comm — средство построчного сравнения двух сортированных файлов;
  • csplit — команда для разделения файлов на части, в качестве разделителя будет выступать строка, заданная как шаблон;
  • cut — «вытягивание» из заданного файла фрагменты строк;
  • expand — преобразование символов табуляции внутри текстового файла в пробелы;
  • fmt — нечто вроде форматирования абзацев текстового файла;
  • fold — разбиение файла на строки заданной длины;
  • head — вывод первых (10-ти по умолчанию) строк файла;
  • join — слияние строк двух файлов в общее поле;
  • md5sum — из области контрольных сумм;
  • nl — нумерация строк заданного файла;
  • od — просмотр файла в виде восьмеричных (по умолчанию) или иных других кодов;
  • paste — построчное объединение файлов;
  • pr — разбиение файлов на страницы и колонки;
  • ptx — генерация индекса содержимого файла;
  • sort — построчная сортировка содержимого файла;
  • split — разбиение файла на части заданного размера или количества линий;
  • sum — подсчет контрольной суммы и количества блоков в файле;
  • tac вывод содержимого файла сзаду наперед (обратно cat);
  • tail — вывод нескольких (десяти по умолчанию) последних строк файла (обратно head);
  • uniq — удаление повторяющихся строк в сортированном файле);
  • wc — подсчет количества строк, слов или символов в файле.

К coreutils по смыслу тесно примыкает пакет для поиска файлов — findutils. В его составе:

  • find — практически универсальное средство для поиска файлов и выполнения над найденным разнообразнейших операций;
  • xargs, используемая обычно в паре с командой find, позволяет применить некие команды к списку файлов;
  • locate — средство сканирования базы данных файловой системы с целью определения локации заданных файлов;
  • updatedb — средство обновления базы данных файловой системы, используемой командой locate.

Кроме этого, в пакет findutils входят также команды bigram, code и frcode.

К тому же блоку пакетов можно отнести file. Эта команда позволяет детализовать тип регулярного файла (исполнимого, текстового и т.д) по т.н. «магической последовательности» байтов в его начале.

Далее — пакет less, включающий единственную одноименную утилиту — постраничного просмотра файлов.

Два взаимодополняющих набора — diffutils и patch . Первый включает в себя:

  • cmp и diff — утилиты сравнения двух файлов;
  • diff3 — то же, но в отношении трех файлов;
  • sdiff — сравнение двух файлов с записью различий в новом.

А команда patch предназначена для внесения изменений, выявленных командой diff, в исходный файл.

Совершенно незаменим набор grep. В его состав входят программы grep, fgrep и egrep), предназначенные для поиска заданного текстового фрагмента (шаблона) в файлах.

Пакеты ed, gawk и sed предназначены для весьма сложной обработки текста, представляя собой, в сущности, потоковые (неинтерактивные) текстовые редакторы. Теоретически, располагая мощным редактором интерактивным (типа упомянутых emacs или vim) без них можно было бы обойтись, но они столь широко используются во всякого рода установочных сценариях, так что практически оказываются необходимыми.

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

Сетевые возможности базовой системы обеспечиваются двумя наборами — netkit-base () и net-tools (). В первом — демон inetd, отвечающий за службы Интернет вообще, и команда ping, для отправки пакетов, определяющих доступ к узлам сети. Команды набора net-tools определяют конфигурацию сети (ifconfig), доменные имена, имена хостов и т.д.

Наконец, группа наборов, последняя по счету, но не по значению, — системы документации. Таковых в Linux широко используется две — традиционные для Unix man-страницы разработанная в рамках GNU система info. Они — взаимодополняющие, хотя по содержанию и существенно перекрывают друг друга.

Средства тылового обеспечения

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

Главной общесистемной библиотекой в Linux является glibc. Кроме нее, для сборки (и работы) большинства консольных приложений требуется терминальная библиотека ncurses. Наконец, требуется также инструментарий для связывания программ с библиотечными функциями — libtool.

Все это — необходимый минимум, отдельные приложения могут потребовать и других библиотек, которые, впрочем, к Base Linux уже не относятся.

Абсолютно необходимые приложения

Пользовательские утилиты GNU (такие, как textutils, awk или sed) не только выполняют функции поддержки системы, но и позволяют решать достаточно сложные пользовательские задачи. Однако для полноценной работы они явно недостаточны и потому должны быть дополнены еще несколькими приложениями. И первым из них идет текстовый редактор — без него трудно было бы хотя бы поправить конфигурационные файлы. В выборе такового возможно три подхода: минималистский, максималистский и промежуточный.

Для обеспечения минимальных возможностей редактирования подойдет любой максимально простой редактор — если не выходить за рамки проекта GNU, в этой роли может выступить редактор nano. Он очень прост в освоении, не требует запоминания многочисленных команд и обладает базовым набором функций редактирования.

При максималистском подходе предоставляется выбор среди двух монстров мира консольных редакторов — vim и emacs. На котором остановиться — дело вкуса, вступать в священную войну vim vs. emacs здесь было бы неуместно.

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

Многие из перечисляемых здесь программ сопровождаются документацией в формате html. И для ее чтения потребуется какой-никакой браузер, способный работать в консольном режиме. Оптимальный выбор здесь — links.

Кроме браузера, необходимыми средствами для работы с сетью видится ftp-клиент — без него невозможно было бы скачивание необходимых программ. В качестве же кандидата на эту вакансию можно рассмотреть wget.

Средства локализации

Поскольку мир отнюдь не ограничивается Америкой, и множество людей говорит на языках, отличных от американского, в Base Linux должны входить средства интернационализации. Сама по себе интернациональная поддержка (т.н. NLS — National Languages Support) программ обеспечивается за счет системы gettext.

Нас, разумеется, в первую очередь интересует поддержка не какого другого языка, а непосредственно русского. Русская локаль (по крайней мере, ru_RU.KOI8-R) — давно уже неотъемлемый компонент системной библиотеки. При необходимости в локали 1251 — ее можно добавить самостоятельно. Для получения базового набора кириллических экранных шрифтов, клавиатурных раскладок и карт соответствия одного другому необходимым и достаточным видится комплект console-tools-cyrillic, в котором есть все необходимое (и кое-что из роскошного). Он предназначен для работы с набором управления консолью console-tools, однако прекрасно вписывается и в современные версии kkb. Ну а для реализации проверки русской орфографии в дополнение к оригинальному ispell предлагается известный словарь Лебедева — rus-ispell .

Средства сборки

Наконец, последнее (или, строго говоря, первое), необходимое для того, чтобы собрать все перечисленное выше воедино — это средства сборки. В первую голову это компилятор языка C, на котором написана большая часть ОС Linux и программ для нее gcc. Для него имеет значение правильный выбор версии, но здесь этот вопрос мы обсуждать не будем.

Далее — средства обеспечения компиляции (линкер, ассемблер и т.д.), объединенные в два пакета bin86 и binutils.

Затем — программа управления компиляцией, make и тесно с ней связанные утилиты autoconf для построения средств автоматического конфигурирования при сборке, и automake для автоматизации создания make-файлов, описывающих процесс компиляции.

Кроме этого, практически необходимыми оказываются также лексический анализатор flex, синтаксический анализатор bison (используется также и его прототип yacc — для сборки некоторых программ требуется именно он) и макропроцессор m4. И, наконец, в ряде случаев для сборки программ требуется интерпретатор языка perl.

Набор приложений, объединенный понятием Base Linux, может показаться несколько аскетичным. Однако именно базовую функциональность системы он обеспечивает с успехом. И примерно такой набор программ предлагается в качестве базового (то есть обязательного к установке) в любом Linux-дистрибутиве, претендующем на полнофункциональность. Конечно, набор пакетов (и особенно конкретные представители отдельных групп) варьируют, но можно быть уверенным: 90% всего перечисленного с гарантией обнаружится в любой Linux-системе.