Сборка собственного ядра


Тонировка штраф http://www.vipton.ru/ новый закон 2016.

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

Ядро, поставляемое по умолчанию, называется GENERIC. Это ядро предназначено для работы с широким спектром аппаратных средств, но оно не обязательно будет работать хорошо или оптимально. GENERIC прекрасно запускается на системах, выпущенных в последнее десятилетие или около того. Однако новейшие устройства обладают возможностями оптимизации своей работы, которые не поддерживаются ядром GENERIC, ориентированном на «наименьший общий знаменатель». Даже в этом случае оно прекрасно подходит для повседневного использования. При настройке ядра можно подключить необходимые функции оптимизации, добавить поддержку новых устройств, удалить поддержку устройств, которые не используются, или активировать какие-либо новые возможности.

Процесс сборки ядра нередко считают неким таинственным ритуалом, но сообщество поддержки FreeBSD не будет долго думать над вопросом — собирать или не собирать новое ядро, чтобы включить или исключить какую-либо особенность. Не надо думать, что пересборка ядра способна решить любую проблему; тем не менее этим умением должен обладать любой системный администратор.

Подготовка

Для сборки ядра необходим его исходный код. Если читатель последовал совету, данному в главе 2, то все уже готово. Если нет, надо вернуться в программу установки и загрузить исходный код ядра или перейти к главе 13 и использовать команду cvsup(8). Если неизвестно, инсталлирован ли исходный код ядра, поищите каталог /sys. Если он существует, и в нем имеются файлы и подкаталоги, значит, искомый код у вас есть.

Перед созданием нового ядра выясните, какие аппаратные средства присутствуют в системе. Порой это нелегко, поскольку торговая марка на компоненте необязательно имеет хоть какое-то отношение к возможностям и отличительным чертам устройства. Многие компании занимаются ребрэндингом универсальных компонентов — я помню одного производителя, который выпускал четыре разных типа сетевых карт с одним и тем же названием и не утруждал себя необходимостью указывать номер версии на первых трех из них. Единственный способ отличить их состоял в том, чтобы пробовать использовать разные драйверы устройств, пока не будет найден тот, который работает. Похожим образом многие компании производят сетевые карты, совместимые с NE2000. Даже если на коробке написано другое название, данное производителем, микросхемы чипа могут сообщать о себе как об устройствах NE2000. К счастью, некоторые производители используют стандартную архитектуру для своих устройств и драйверов. Так, вы всегда можете быть уверены, что сетевые карты компании Intel будут распознаваться драйверами устройств Intel.

Чтобы узнать, какие аппаратные средства обнаружила система FreeBSD, лучше всего обратиться к /var/run/dmesg.boot, о чем уже говорилось в главе 3. Каждая запись в этом файле представляет либо аппаратное устройство, либо программную особенность ядра. Приступая к сборке нового ядра, всегда держите под рукой файл dmesg.boot.

Шины и подключения

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

Первое устройство в данной системе — это acpi0 (1). Скорее всего, вы не знаете, что это за устройство, но вы всегда можете воспользоваться командой man асpi, чтобы ликвидировать этот недостаток. (Или прочитать оставшуюся часть главы.) Следующее устройство в системе — acpi_ec (2), и оно подключено к устройству acpi0 (3). Микропроцессоры (4) также подключены к acpi0, как и мост PCI (5). Наконец, имеется первая шина PCI, pci0 (6), подключенная к мосту PCI (7), а не к acpi0. Обычно устройства PCI подключаются к иерархии шин PCI, которая в свою очередь подключается к мосту PCI, чтобы иметь возможность обмениваться данными с остальными компонентами компьютера. Можно было бы ознакомиться со всем содержимым файла dmesg.boot и нарисовать дерево подключения всех устройств в системе — хотя это и не является необходимым условием, тем не менее знание схемы включения устройств увеличивает вероятность успешной сборки нового ядра.

Если у вас что-то вызывает сомнения, воспользуйтесь утилитой pciconf(8), чтобы увидеть, что в действительности имеется в вашей системе. Команда pciconf -lv перечислит все подключенные устройства PCI, имеющиеся в системе, независимо от того, были они обнаружены ядром или нет.

Сохранение рабочего ядра

Из-за плохого ядра система может перестать загружаться, поэтому абсолютно необходимо всегда иметь под рукой хорошее ядро. В процессе установки нового ядра старое сохраняется на всякий случай в виде файла /boot/kernel.old. Это замечательно — иметь возможность вернуться к рабочему ядру в случае ошибки, но я рекомендую двинуться дальше.

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

Обычное место для хранения хорошо зарекомендовавшего себя ядра — /boot/kernel.good. Перед настройкой ядра сохраните надежное работающее ядро:

# ср -Rp /boot/kernel /boot/kernel.good

Не бойтесь хранить несколько ядер. Дисковое пространство в наше время очень дешево. Некоторые администраторы даже размещают ядра в каталогах, названных по дате ядра. Благодаря этому они всегда могут вернуться к более ранней версии ядра. Кроме того, многие хранят копию ядра GENERIC в виде файла /boot/kernel.GENERIC для нужд тестирования и отладки. Ядер слишком много бывает лишь в том случае, если они совершенно заполнили корневой раздел.

Формат конфигурационного файла

Ядро FreeBSD конфигурируется через текстовый файл. Для конфигурирования ядра отсутствуют какие-либо графические утилиты, управляемые системой меню, — процесс конфигурирования ядра не изменился со времен 4.4 BSD. Если вы чувствуете дискомфорт при работе с текстовыми конфигурационными файлами, тогда сборка нового ядра — не для вас.

Каждая конфигурационная запись располагается на отдельной строке. Каждая запись начинается с идентификационной метки, указывающей тип записи, за которой следует описание функции. Среди записей можно встретить множество комментариев, которые начинаются с символа решетки (#), как в следующей записи, соответствующей поддержке файловой системе FFS:

options FFS # Berkeley Fast Filesystem

В каждом конфигурационном файле ядра присутствуют записи пяти типов: cpu, ident, makeoptions, options и devices. Наличие или отсутствие этих записей определяет наличие поддержки аппаратных устройств или функциональных возможностей.

  • cpu Данная метка указывает, какие типы процессоров поддерживаются ядром. Конфигурационный файл ядра, предназначенного для устаревших персональных компьютеров, включал в себя несколько записей с указанием типа процессора, такие как 486 (I486_CPU), Pentium (I586_CPU) и для серии процессоров от Pentium Pro до современных Pentium 4 (I686_CPU). Конфигурация ядра для аппаратной платформы amd64/EM64T включает в себя единственную запись с указанием типа процессора. Конфигурация ядра может включать несколько типов процессоров при условии, что они принадлежат одной и той же архитектуре, — можно собрать ядро, которое будет работать и на процессорах 486, и на процессорах Pentium, но невозможно получить ядро, которое могло бы работать как на Intel-совместимых процессорах, так и на процессорах Sparc.
  • ident Строка, начинающаяся с метки ident, содержит имя ядра. Именно таким образом ядро GENERIC получает свое имя. Это может быть любая произвольная строка.
  • makeoptions Данная строка содержит инструкции для программного обеспечения, выполняющего сборку ядра. Наиболее распространенный параметр — DEBUG=-g, который сообщает компилятору о необходимости включения в ядро отладочной информации. Отладочная информация помогает разработчикам в разрешении возникающих проблем.
  • options Записи этого типа описывают функции ядра, которые непосредственно не связаны с аппаратным обеспечением. Сюда входят файловые системы, сетевые протоколы и отладчики, встроенные в ядро.
  • devices Записи этого типа описывают устройства или драйверы устройств, они содержат инструкции, которые описывают, как ядро должно взаимодействовать с определенными устройствами. Если вам необходимо, чтобы система осуществляла поддержку некоторого аппаратного обеспечения, ядро должно включать драйвер этого аппаратного устройства. Некоторые записи этого типа соответствуют так называемым псевдоустройствам, которые в действительности не являются аппаратными устройствами, а обеспечивают поддержку целых категорий аппаратных устройств, таких как сетевые карты, генераторы случайных чисел или электронные диски. Здесь вполне может появиться вопрос — чем псевдоустройства отличаются от записей типа options. Дело в том, что псевдоустройства тем или иным способом отображаются в системе как устройства, тогда как функциональные возможности типа options не имеют отличительных особенностей, присущих устройствам. Например, петлевое (loopback) псевдоустройство — это сетевой интерфейс, который позволяет подключаться только к локальному компьютеру. В данном случае отсутствует какое-либо аппаратное обеспечение, тем не менее программы могут подключаться через петлевой интерфейс и обмениваться данными с программами, исполняемыми на том же самом компьютере.

Конфигурационные файлы

К счастью, обычно не требуется создавать конфигурационные файлы на пустом месте — вместо этого достаточно скопировать существующий файл и отредактировать его. Начнем с ядра GENERIC, предназначенного для вашей аппаратной архитектуры. Найти этот конфигурационный файл можно в каталоге /sys/<arch>/conf — например, конфигурационные файлы ядра для архитектуры i386 находятся в каталоге /sys/i386/conf, для архитектуры amd64 — в каталоге /sys/amd64/conf и т. д. В каталоге находятся несколько файлов, из которых наиболее важными являются DEFAULTS, GENERIC, GENERIC.hints, MAC и NOTES:

  • DEFAULTS Это список параметров и устройств, поддержка которых включена по умолчанию для данной архитектуры. Наличие этого файла совершенно не означает, что можно скомпилировать и запустить ядро DEFAULTS, — это лишь отправная точка, позволяющая собрать ядро с минимальными возможностями.
  • GENERIC Этот файл содержит конфигурацию стандартного ядра. В нем присутствуют настройки, обеспечивающие поддержку стандартного аппаратного окружения, необходимую для запуска ядра на данной архитектуре — этот конфигурационный файл используется инсталлятором системы.
  • GENERIC.hints Это файл с указаниями, который впоследствии устанавливается как /boot/device.hints. В данном файле содержится конфигурационная информация, необходимая для настройки устаревших аппаратных устройств.
  • MAC Этот конфигурационный файл ядра обеспечивает поддержку обязательного контроля доступа (Mandatory Access Controls) — системы многоуровневого управления доступом, используемой в средах с высокой степенью защиты. Этот конфигурационный файл требуется только в случае использования MAC.
  • NOTES Это комплексная конфигурация ядра для заданной аппаратной архитектуры. В файл NOTES включены все особенности, характерные для той или иной платформы. Платформонезависимые особенности можно найти в файле /usr/src/sys/conf/NOTES.

Не редактируйте эти файлы непосредственно в каталоге с конфигурациями. Вместо этого скопируйте файл GENERIC в файл, содержащий имя компьютера, и редактируйте копию. Например, мой ноутбук имеет имя humvee.blackhelicopters.org: я мог бы скопировать файл GENERIC в файл HUMVEE и открыть файл HUMVEE в своем любимом текстовом редакторе. Ниже приводится отрывок из конфигурационного файла, точнее, та его часть, которая описывает устройства АТА:

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

Сравните эти записи с парой записей в /var/run/dmesg.boot, которые соответствуют устройствам ATA:

ata1: <АТА channel 1> on atapci1
acd0: DVDR <PIONEER DVD-RW DVR-K16/1.33> at ata1-master UDMA33

Конфигурационный файл ядра описывает шину ATA, устройство ata, и в файле dmesg.boot присутствует упоминание о канале ATA — ata1. Привод DVD-RW подключен к ata1. Без наличия устройства ata в конфигурационном файле ядро не смогло бы определить наличие шины АТА. Даже если бы системе удалось определить наличие устройства DVD, она все равно не знала бы, как производить обмен данными с ним. Ваша конфигурация ядра должна включать в себя все промежуточные устройства для драйверов, которые предполагают их наличие. С другой стороны, если в системе отсутствуют устройства ATA RAID, накопители на гибких магнитных дисках или ленточные приводы, вы можете удалить эти устройства из своего ядра.

Комментарии запрещены.