Роман Химов
Chip Special Linux
2006-10-31
Критерием выбора дистрибутива для большинства пользователей становится обычно или программное наполнение, или система установки пакетов, или тот факт, что именно такая операционная система стоит у знакомого гуру. Но, в конце концов, решающим фактором при выборе системы становится ядро.
Что такое Linux? Внимательный читатель правильно (и наверняка с улыбкой) вспомнит, что на самом деле Linux — это ядро, и не более того. Важная, но все же лишь деталь в сложном механизме полноценной операционной системы. А уж дистрибутивы — это дело десятое. Нынешние пользователи дистрибутивов GNU/Linux редко задумываются о том, какое ядро установлено в их системе, а также что его можно и нужно обновлять, конфигурировать и компилировать. Это в целом хороший признак того, что Linux действительно честно отрабатывает слоган «Just works» в большинстве конфигураций, заботливо подобранных для пользователей разработчиками дистрибутивов.
Однако не всех и не всегда удовлетворяют стандартные конфигурации ядер. Например, нынче стало модно компилировать ядра для PC-платформы вообще без поддержки шины ISA. Кто-то предъявляет повышенные требования к безопасности, и ему нужны самые последние исправления. Ну а кто-то хочет проникнуться тем самым духом fun, окружающим Linux, и опробовать какие-либо новшества, которых нет ни в одном дистрибутиве и которые доступны только тем, кто не боится скомпилировать ядро со своей (что на самом деле еще более страшно) конфигурацией. Поэтому начнем мы, собственно, с описания процесса сборки и сопутствующих ему действий.
Принцип понятен, uname -r — команда, выдающая полную версию текущего ядра. Это значит, что ядро версии 2.6.12 будет логично поместить в каталог /usr/src/linux-2.6.12, поскольку многие сторонние скрипты-помощники ориентированы именно на такое расположение.
Теперь ядро необходимо сконфигурировать. Это делается командами make config, make menuconfig или make xconfig.
Все они, по сути, идентичны, только представлены в разных обличиях. Первую команду вводить не рекомендуем, иначе через час-другой у вас покраснеют и остекленеют глаза, а окружающие подумают, что вы сходите с ума (проверено на личном опыте). Все эти неприятности могут случиться из-за того, что опций конфигурирования у ядра тьма тьмущая, а make config работает очень просто — последовательно требует у вас вразумительного ответа по каждой опции в виде «да/нет/модуль». Это долгий, требующий внимания процесс, поэтому лучше пользоваться make menuconfig и make xconfig.
Первая программа состоит из текстовых меню, по которым можно гораздо проще ориентироваться и значительно быстрее сконфигурировать ядро, а последняя, соответственно, представляет собой полностью графический конфигуратор. По умолчанию он использует Qt, но можно набрать make gconfig, и конфигуратор будет собран для GTK. Полагаем, должно быть очевидно, что для этого потребуются заголовочные файлы Qt или GTK, впрочем, для ncurses (используемого в menuconfig) они тоже нужны (все конфигураторы собираются в системе при запуске).
Давать советы по конфигурации — дело неблагодарное, так что лучше будет найти информацию по этой теме в Сети и просто уяснить разницу между статической компиляцией, компиляцией модуля и некомпилированием модуля или функции вообще. Вся конфигурация ядра будет сохранена в один-единственный файл config в каталоге с ядром. Его полезно куда-нибудь скопировать, чтобы иметь впоследствии стартовую точку для любых дальнейших конфигураций: обычно его кладут в каталог /boot рядом с уже скомпилированным ядром в виде файла «config-версия-ядра». Кстати, позже, при обновлении ядра и наличии отлаженной конфигурации, вписать эту самую конфигурацию в новое ядро очень легко — копируете тот самый config и набираете «make oldconfig». Вас спросят только о новых опциях (если они будут), и вы будете готовы к компиляции.
Компиляция тривиальна — make, и все дела! В случае с веткой 2.4 чуть сложнее — make bzImage и make modules. Далее можно созерцать процесс компиляции. В нем красиво показывается сборка ядра, иногда некрасиво проскакивают многочисленные «warning» (в последних версиях их всего около 200 штук в конфигурации «yes» для всего, однако большей их части можно не придавать значения). По окончании этого процесса стоит установить модули ядра (если, конечно, они присутствуют в вашей конфигурации) по команде make modules_install. Все модули при этом аккуратно поместятся в директории /lib/modules/.
Наконец, следует установить само ядро с помощью make install или же скопировать его вместе с файлом System.map (его необходимо переименовать в «System.map-версия-ядра») вручную из директории arch/i386/boot/bzImage в /boot.
После этого конфигурируем загрузчик. Эта процедура зависит от того, что вы используете в вашей системе — GRUB или LILO, и ее мы описывать не будем (читайте — man grub, man lilo). Мы настоятельно рекомендуем GRUB, поскольку постоянно переустанавливать LILO просто-напросто неудобно, да и параметры командной строки у GRUB довольно мощные.
Хочется сказать пару слов о самих патчах. Как правило, это один файл, упакованный чем-нибудь наподобие bzip2, применяющийся с помощью команды patch -p1 в каталоге исходников. Обычно легко сделать что-то подобное:
bzcat bla-bla.patch.bz2 | patch -p1
После такого некраткого ликбеза мы переходим к самому интересному — рассмотрению конкретных версий ядра Linux. Так уж получается, что этот обзор во многом является парадом разработчиков Linux, поскольку у каждой ветки есть главный разработчик, и он же, как правило, является основным, если и не кодером, то, по крайней мере, «приемщиком» патчей для своей ветки.
Между ними есть одно важное различие: -pre — это ранние версии, еще не до конца протестированные, и в дальнейшем в них могут вноситься некие серьезные изменения. Версии -rc уже значительно стабильнее. Более того, начиная с первой версии идет чистая стабилизация ядра, то есть принимаются только исправления различных ошибок. Как правило, последний кандидат в релиз после некоторого тестирования становится финальным релизом без каких-либо изменений в коде.
2.4.х — это одна из основных веток, так что за ней тоже следует идти на http://kernel.org
В ветке -stable появляются только те патчи, которые помогают решать конкретные проблемы пользователей. В ней нет никаких обновлений, новой функциональности, и все изменения, помимо исправления какой-либо конкретной ошибки, должны удовлетворять еще одному важному требованию — простоте.
Фактически это тот же «must have», что и -hf для ветки 2.4.
Git — название нового инструмента управления исходниками (точнее, основы этого инструмента — хранилища) для Linux, пришедшего на смену BitKeeper. Git изначально был написан Линусом Торвальдсом, а затем в значительной степени доработан и облагорожен Петром Баудисом. Новые версии -git автоматом появляются каждый день, так что их очень удобно тестировать (особенно выяснять, какой патч вызвал проблему), однако использовать на постоянной основе не стоит, если, конечно, на это нет особых причин.
Кстати говоря, нынче очень многие ветки ведутся с помощью git, и особо заинтересованным будет полезно почитать документ Джеффа Гаржика о работе с git.
Эту ветку Линуса, равно как и 2.6.x.y, а также релизы -rc и -pre, тоже можно найти на http://kernel.org. Долго искать не придется — ссылка на эту ветку расположена прямо на первой странице сайта.
Впрочем, одна уже поддержка файловой системы Reiser4 и технологии FUSE (подробности см. в специальной врезке) — вполне достаточные причины.
Например, автор этой статьи использует эту ветку постоянно — как раз ради Reiser4 и FUSE, примеряя к своему будущему LFS (Linux from Scratch). Также в ней сегодня можно обнаружить массу других интересных вещей, но в основном они касаются удобств и новшеств для самих разработчиков (а как хорошо работать с inotify!). В целом эту ветку можно порекомендовать отчаянным гикам, не боящимся проблем, но желающим держаться действительно на острие прогресса, а также что-либо потестировать.
Патчи этой ветки доступны в двух видах: цельный «мегапатч» — один файл, где все лежит вместе; или россыпь патчей, входящих в -mm, в одном архиве. Последний удобен для индивидуального тестирования и/или применения. То есть, если вам нужна поддержка Reiser4, но не хочется экспериментировать с остальными -mm-патчами — пожалуйста, выкачивайте их либо отдельно (доступно для каждого релиза в отдельном каталоге) и применяйте, либо берите весь архив и доставайте необходимое. Скачать патчи можно по адресу http://kernel.org/patchtypes/mm.html.
Например, не так давно пришлось работать с ядром 2.6.12rc2-mm2-jedi1. Архив патчей находится на сервере ftp://ftp.c9x.org/pub/linux-kernel.
Основной «точкой сбора» подсистем на сегодня, наверное, можно назвать http://kernel.org/git/, однако некоторые подсистемы ведутся отдельно, например SCSI.
На наш взгляд, это прекрасный хакерский патч, которому место в официальной ветке (хотя бы частично, что касается структуры). Он открывает множество недоступных параметров конфигурации (хотя, конечно, никто не мешает править их в исходниках и без этого патча, но надо знать, где и как): поддержка AIO (асинхронный ввод/вывод), файловой системы sysfs (исключительно полезная вещь), системного вызова SYSENTER (аппаратная особенность процессоров Pentium II и старше, значительно ускоряющая вызов функций ядра), ptrace (контроль выполнения потока), утилиты dnotify (извещение пользователей об изменениях в файловой системе), vm86 (читайте — эмуляция DOS). А ведь если выключить поддержку режима vm86 для процессоров IA32, то можно сэкономить целых 6 кбайт памяти!!!
Еще в нем же представлено несколько инструментов, интересных разработчикам ядра. Мэтт Мэколл, который, собственно, и ведет эту ветку, утверждает, что минимальное ядро -tiny способно запуститься даже на машине с 2 Мбайт памяти.
Многие из открывающихся параметров экспериментальны, так что играться с ними надо аккуратнее, но у меня это ядро работало на машине assam, и делало это вполне неплохо. Чего-либо сверхъестественного не замечено, но, полагаю, для слабых компьютеров оно может быть полезно (кстати, такое ядро по умолчанию собирается с опцией -Os GCC). Данная ветка представлена в Интернете на странице http://selenic.com/tiny.
Подробную информацию об этой ветке можно найти на сайте http://janitor.kernelnewbies.org.
Например, с этими патчами работают те, кто профессионально связан со звуком (пользователям Jack настоятельно рекомендуется), потому что латентность, а точнее непредсказуемость, в обычном ядре Linux сильно мешает нормальной работе.
На сегодняшний день часть патчей из этой ветки уже интегрирована в официальное ядро — именно оттуда растет вытесняемое ядро (опция сборки ядра — CONFIG_PREEMPT) в текущих версиях ядра, а также огромное количество исправлений для многопроцессорных машин: введение вытесняемого ядра позволило обнаружить массу неявных гонок и блокировок в ядре. Для конечного пользователя в целом этот патч может быть интересен, поскольку снижение латентности и стабильность интересна всем, даже несмотря на то, что большая часть этих изменений не будет видна глазу. Я также пробовал это ядро на машине assam и не могу сказать, что обнаружил какую-то большую разницу в скорости реакции. Правда, с аудио- и видеоконтентом мне работать не приходится, и оценить все его прелести довольно трудно. Поэтому пришлось вернуть на место -ck с включенным CONFIG_PREEMPT.
Сейчас ведутся дискуссии о том, стоит ли включать этот патч в официальное ядро, и, вполне возможно, он войдет через некоторое время в ветвь Эндрю Мортона.
Патчи можно скачать на сайте http://redhat.com/~mingo/realtime-preempt.
Полагаю, впрочем, что после стабилизации этот патч довольно быстро войдет в -mm и далее в ветку Линуса.
Можно еще заглядывать на http://kerneltrap.org (там английский язык и периодически пропускаются релизы, хотя есть масса различной интересной информации), либо обратиться к странице http://osrc.info.
Ну а если вам стало интересно, что еще происходит вокруг и внутри ядра (а это иногда просто необходимо, чтобы понять, зачем существует тот или иной патч, что означает тот или иной новый пункт в конфигурации и какое новое оборудование поддерживается или будет поддерживаться), стоит начать изучение с сайта http://kernelnewbies.org/. Знакомьтесь с Linux!
На прощание можно порекомендовать поэкспериментировать с ядрами — получите массу удовольствия, узнаете много нового, сможете поддерживать ядро в актуальном состоянии (а это значит, что количество дырок в ядре будет стремиться к минимуму). Особенно же порекомендую тестировать различные -rc- и -pre-версии — этого сегодняшнему ядру действительно не хватает, размеры патчей все растут, и управляться с ними разработчикам все сложнее, так что вспоминайте дух братства свободного сообщества, тестируйте и не стесняйтесь писать разработчикам о проблемах. Файл MAINTAINERS в корне дерева исходников Linux предназначен именно для таких случаев. Успехов в ядерном синтезе!
Даже сам файл, как структура и каталог — всего лишь плагины в Reiser4. В подробности вдаваться не буду, так как все это заслуживает отдельной статьи.
Скажем еще и про FUSE. Эта технология реализует поддержку файловых систем в пользовательском пространстве и позволяет пользователю без проблем монтировать. Звучит, возможно, сложно, но на самом деле все довольно просто — файловая система, какая бы она ни была, в FUSE работает в пользовательском пространстве, то есть для ее работы не нужно накладывать патчи на ядро, монтировать от root или что-либо подобное. Именно поэтому с помощью FUSE сейчас реализуются самые разные и самые смелые проекты, касающееся ФС, например SSHFS — файловая система SSH. Не поняли, как это? А знаете про sftp? Вот это — то же самое, только все файлы вы будете видеть в своем привычном пространстве имен, где вам удобно. Точно так же можно работать с архивами.tar.gz и .tar.bz2 или с FTP-соединениями, а также шифровать файлы с помощью EncFS. Монтируем куда удобно и получаем доступ. Удобно? Конечно.