Ядро — нечто центральное и самое важное, часто круглое.
Линус Торвальдс (17 сентября 1991 года)

Ядра бывают разныеМногие из вас слышали, что линуксоиды часто собирают ядро. Прям забава какая-то... Давайте разберемся, что это такое, зачем его собирать, и попробуем собрать собственное ядро для Ubuntu. Начнем с определений.
В linux-системах ядро - это основная программа ОС, которая обеспечивает доступ к аппаратной части, распределяет ресурсы, управляет файловыми системами и памятью и т.д. и т.п. Т.е. ядро управлет абсолютно ВСЕМ в системе.
Наибольшее распространение в linux получили два типа ядер:

  • монолитное ядро
  • модульное ядро

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

Э́ндрю Стюарт Таненба́ум VS Линус Бенедикт Торвальдс

А мы очень кратко рассмотрим 2 вышеуказанных типа ядер.

В монолитном ядре все его компоненты являются единым целым и работают в одном адресном пространстве, используя одни структуры данных. Такие ядра хороши для повышения безопасности, но страдают в устойчивости и гибкости. В наши дни монолитные ядра практически не используются, но первая версия ядра linux версии 0.01 была монолитной.
Модульное ядро состоит из большого количества модулей (программ управления ресурсами) или драйверов, которые подгружаются в память по мере необходимости. Например, в большинстве дистрибутивов в ядро включена поддержка процессоров как Intel, так и AMD.

Ядра большинства современных дистрибутивов хороши тем, что они определяют практически любое оборудование и подгружают соответствующие модули/драверы. Именно поэтому такие дистрибутивы как Ubuntu, Fedora, SuSE и многие другие нормально работают "из коробки". Но в этом и кроется их недостаток.

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

Именно для оптимизации ядра его и пересобирают, оставив в ядре лишь то оборудование, которое реально установлено на компьютере, и модули того, что бывает используется или потенциально может использоваться.

Многих пользователей слова "собрать ядро" очень пугают, и они даже не пытаются это сделать. Но все (как всегда) на много проще, чем кажется. Сейчас мы соберем новое ядро для своего дистрибутива Ubuntu (для других дистрибутивов все делается точно также за исключением использования sudo).

Пошаговая инструкция по сборке ядра в Ubuntu.

Поиск и подготовка ядра

1. Для начала скачиваем последнюю стабильную версию ядра (примерно 60 МиБ). Я скачивал linux-2.6.32.6, но у вас может оказаться более свежая версия.
2. Скачанный файл надо разархивировать в произвольную папку (некоторые эксперты рекомендуют использовать /usr/src/, но на самом деле это не играет какой-то значимой роли). Я выбрал /home/user/temp, где после извлечения появилась папка linux-2.6.32.6.

Подготовка к сборке.

1. Необходимо установить через Synaptic следующие пакеты:

gcc
libc6-dev
kernel-package
libncurses5-dev
fakeroot
build-essential

которые потребуются при компиляции ядра. И пакеты (со всеми предложенными зависимостями):

qt3-dev-tools
libqt3-mt-dev

Эти пакеты необходимы для запуска GUI конфигуратора ядра xconfig.
2. Даем ядру имя. Заходим в папку с ядром (у меня это - /home/user/temp/linux-2.6.32.6) и в файле Makefile прописываем значение строки EXTRAVERSION, например:

EXTRAVERSION=-mynewkernel.ver.1

Значение этого поля можеты быть любым. Его предназначение - это помочь вам не запутаться в куче ядер, если вы будете перекомпилировать его несколько раз.

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

Сбор сведений об устройствах в Linux

Теперь выясняем параметры следующего:

  • процессор(ы)
  • оперативная память
  • чипсет материнской платы
  • видеокарта
  • сетевая карта(ы)
  • звуковая карта и прочее мультимедийное оборудование
  • жесткие диски и CD/DVD приводы
  • устройства ввода/вывода (клавиатура, мышь, планшеты и т.д.)
  • файловые системы
  • параметры сети (протоколы разных уровней)
  • системы и алгоритмы шифрования
  • usb-устройства и т.д.

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

Для получения сведений о подключенных устройствах можно использовать следующие команды

lspci
lsusb

lspci выводит список PCI устройств: чипсет, контроллеры видео, сетевые конроллеры и т.д.

Рекомендую использовать так:

lspci -v

Ключ -v означает verbose, т.е сильно подробно. Например, для сетевой карты я получил такой ответ:

04:00.0 Network controller: Atheros Communications Inc. AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
Subsystem: Device 1a3b:1089
Flags: bus master, fast devsel, latency 0, IRQ 18
Memory at febf0000 (64-bit, non-prefetchable) [size=64K]
Capabilities: <access denied>
Kernel driver in use: ath9k
Kernel modules: ath9k

В строке "Kernel driver in use" указан используемый драйвер ядра. Эта информация нам в дальнейшем очень пригодится.

lsusb - список USB устройств: клавиатуры, мышки, вэб-камеры и т.д.
Обе эти команды можно использовать с ключом -v для получения более подробной информации об устройствах.
Так же можно использовать команду dmesg для получения сведений об устройстве или группе устройств, например подробные сведения о процессоре можно получить так:

dmesg | grep CPU

Но я всегда отдаю предпочтение программам с GUI. Рекомендую использовать одну (или обе сразу) из приведенных ниже программ. Они есть в стандартном репозитории Ubuntu.

Sysinfo

Очень простой и понятный интерфейс. Если вы не никогда не собирали информацию о своей системе и не компилировали ядро, то эта программа для вас.

sysinfo2

Здесь нам наиболее важен пункт Hardware (в левой колонке). Выбрать тип оборудования можно в выпадающем меню справа вверху.

sysinfo hardware

System Profiler and Benchmark

Вот эту программу я рекомендую для сбора информации о своем компьютере.

spb1

В отличии от sysinfo информация об устройствах здесь несколько лучше структурирована и более полна: в описании устройства указано, какой модуль за него отвечает (на скриншоте видно, что драйвер Wi-Fi карты находится в модуле ath9). Но самое важно для нас находится в пункте Kernel Modules. Здесь перечислены все (почти) модули, загруженные ядром, т.е. мы можем быть уверены на 90%, что эти устройства есть в системе.

System Profiler and Benchmark - Kernel modules

Конфигурирование ядра я рекомендую делать с открытым System Profiler and Benchmark, постоянно сверяясь с ним.

Конфигурирование и сборка ядра.

Теперь, когда все готово, можно приступать к созданию своей конфигурации.

Сначала находим в папке /boot файл с названием config-2.6.XX-XX-generic, копируем его в папку с ядром и переименовываем в .config.

Копируем в папку с ядром следующий скрипт build-kernel.sh:

#!/bin/sh

# Запускаем графическую утилиту конфигурирования ядра xconfig
# Можно заменить команду на gconfig (GTK версия)
# После внесения изменений сохранитесь и закройте конфигуратор
make xconfig

# Очищаем папку от мусора (если он есть)
sudo make-kpkg clean

# Собираем ядро в .deb пакеты
sudo make-kpkg --initrd kernel_image kernel_headers

# Очищаем папку с исходниками от "мусора". Будут удалены все скомпилированные компоненты и файл настроек .config
# Прежде чем ответить "Да" рекомендуется сохранить копию .config
read  -p "Очистить от временных файлов включая .config? (эта операция необратима, рекомендуется сохранить копию .config. Если не уверены, ответьте НЕТ) [y/n]: " myyn
case "$myyn" in
[ДдYy]   ) echo "Начало очистки папки ядра...";sudo make mrproper;;
[НнNn]   ) echo "Пропускаем...";;
*      ) echo "Пропускаем...";;
esac

# Выходим из режима суперпользователя
exit

и присваиваем ему соответствующие права:

chmod +x build-kernel.sh

Запускаем скрипт build-kernel.sh командой:

./build-kernel.sh

Если получите ошибку запуска xconfig/gconfig, то надо удовлетворить требуемые зависимости (опять лезем в Synaptic и выбираем указанные в ошибке пакеты). Если все условия выполнены, то первое, что мы увидим это окно графического конфигуратора:

GUI конфигуратора ядра xconfig (KDE)

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

GUI конфигуратора ядра gconfig (GTK)

В gconfig состояние пакета отмечается галочкой в одном из 3х столбцов: N - не устанавливать, M - установить модулем, Y - установить в основное ядро.

Какую утилиты выбрать - это дело каждого, но я предпочитаю xconfig.

Отмечаем нужные нам параметры для установки.

Советы и подсказки по конфигурированию ядра.

  1. Перед сборкой нового ядра убедитесь, что абсолютно все устройства вашей текущей конфигурации работаю нормально (это очень сильно облегчит вам жизнь).
  2. При первом запуске конфигуратор будет использовать файл настроек вашего текущего ядра, т.к. обнаружит файла .config в папке с новым ядром. Поэтому, если все устройства в системе работают нормально, то НЕ ДОБАВЛЯЙТЕ ни какие пакеты, т.к. они ТОЧНО не будут использоваться в системе.
  3. Если вы не уверены в необходимости того или иного модуля/драйвера, выбирайте "установить модулем". Тогда есть шанс, что он не будет мешать системе, даже если он не требуется.
  4. Внимательно вчитывайтесь в описание модулей (и учите английский), если там есть рекомендации, то прислушайтесь к ним.
  5. Удаляйте только то, что вы уверены вам не пригодится. Например, если у вас процессор от Intel, то все связанное с процессорами AMD можно удалять (и наоборот).
  6. Используйте поиск. Сначала включите в меню Show all для отображения скрытых элементов (вложенные элементы, родитель которых не помечен для установки). Например, у меня ноутбук Asus, поэтому я ввел название марки в поиск и последовательно включил все, касающееся ноутбуков Asus. Аналогичным образом можно исключать модули, которые вам не нужны. Например, я нашел все модули для ноутбуков Dell, Compaq, Toshiba и др. и убрал их из конфигурации.
  7. Не поленитесь прогнать поиском все модули, которые вы нашли с помощью System Profiler and Benchmark и убедитесь, что они включены в ядро (полностью включены, а не как модули), это даст прирост в производительности компьютера.

Я думаю, что для начала этого хватит. В идеале, конечно же, внимательно прочитать информацию о каждом модуле и определить для себя, нужен ли он. Но для этого нужно хорошее знание английского, глубокое понимание принципов работы компьютера, знание железа и не меньше суток свободного времени, чтобы все это прочитать и осознать. Я рекомендую начинать с реализации пп.1-7, и лишь потом (если все нормально) начинать эксперементировать с оставшимися модулями. Лично у меня ушел месяц на сборку ядра, которое мне нравится, но и в нем еще много лишнего (думаю, что еще полгода я буду его вычищать).
Теперь можно переходить к сборке ядра. Все, что для этого нужно - сохранить полученный конфигурационный файл .config и закрыть конфигуратор. Скрипт автоматически выполнит очистку системы и запустит процесс сборки ядра. Ядро с параметрами по умолчанию от Ubuntu у меня собирается за 1,5 часа, а оптимизированное под мои нужды - 30 мин.

В результате работы скрипта build-kernel.sh в папке, где лежит папка с ядром (у меня /home/user/temp/) должны появиться два файла:

linux-headers-2.6.32.6_бла-бла-бла.deb
linux-image-2.6.32.6_бла-бла-бла.deb

Это заголовки и образ ядра. Теперь устанавливаем эти .deb пакеты привычным способом (лучше сначала установите headers).
Теперь можно перезагружаться.В меню grub вы увидите свое ядро. Скорее всего оно не подцепит графику, поэтому драйверы видеокарты придется ставить заново (это если вы пользуетесь проприетарными драйверами). Вот теперь все. Поздравляю - вы собрали свое ядро с нуля!
Но не радуйтесь сильно, даже если все завелось с первой попытки (так тоже бывает - мне рассказывали).

Советы по работе с ядром

  1. Не кидайтесь сразу еще раз собирать ядро, урезав его еще сильнее. Подождите 2-3 дня усиленной работы на компьютере, фиксируя все сбои и нестандартное/непривычное поведение системы. Когда же вы дозреете до следующего этапа сборки, то сохраняйте конфигурационный файл .config, чтобы всегда иметь возможность откатиться к рабочей версии.
  2. Не стоит держать большое количество собранных ядер, поэтому не забывайте очищать систему от ядерного переизбытка.
  3. При выходе новой версии ядра, смело кидайте ему свой .config, тогда вам придется лишь внимательно просмотреть изменения в новом ядре и выбрать нужное модули.
  4. Перед сборкой нового ядра сделайте бэкап файла .config (он в папке с ядром). И выполните в папке с ядром команду sudo make mrproper, чтобы удалить все файлы, оставшиеся от предыдущей компиляции.

Вот так все просто!

PS: И все же, собирая ядра, надо быть осторожным. Можно обрушить систему, а делать потом восстановление информации совсем не хочется. Жаль, что носители информации регуларно падают и "падают" без помощи человека (особенно флешки), но востановить можно почти все.

Популярность: 19%

Поделиться в соц. сетях

Опубликовать в Одноклассники
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Яндекс
Опубликовать в Google Buzz
Опубликовать в Google Plus