Самым основным компонентом операционной системы Linux есть ядро. Именно ядро выступает промежуточным звеном между пользовательскими программами и оборудованием компьютера. Во всех бинарных дистрибутивах нам не нужно заботиться о сборке и настройке ядра, все уже сделали за нас разработчики дистрибутива. Но если мы хотим собрать свой дистрибутив сами или установить самую свежую версию ядра, нам придется собирать ядро вручную.
Первый вариант раньше был актуален для тех кто хотел получить максимальную производительность от своего оборудования, но сейчас, учитывая стремительное увеличение мощности компьютеров увеличение производительности при сборке ядра совсем незаметно. Сейчас сборка ядра может понадобиться пользователям не бинарных дистрибутивов, таких как Gentoo, тем, кто хочет внести некоторые изменения в ядро, получить новую самую свежую версию ядра и, конечно, же тем, кто хочет полностью разобраться в работе своей системы.
В этой инструкции мы рассмотрим как собрать ядро Linux. Первая часть расскажет как настроить ядро в автоматическом режиме. Так сказать, для тех кто не хочет разбираться как оно работает, кому нужно лишь получить на выходе готовый продукт - собранное ядро. Во второй части мы рассмотрим основные этапы ручной настройки ядра, это процесс сложный, и небыстрый, но я попытаюсь дать основу, чтобы вы могли со всем разобраться сами.
Содержание статьи:
Получение исходников ядра
Самое первое что нужно сделать - это скачать исходники ядра. Исходники лучшие брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. Мы рассмотрим загрузку исходников с kernel.org.
Перед тем как скачивать исходники нам нужно определиться с версией ядра которую будем собирать. Есть две основных версии релизов - стабильные (stable) и кандидаты в релизы (rc), есть, конечно, еще стабильные с длительным периодом поддержки (longterm) но важно сейчас разобраться с первыми двумя. Стабильные это, как правило, не самые новые, но зато уже хорошо протестированные ядра с минимальным количеством багов. Тестовые - наоборот, самые новые, но могут содержать различные ошибки.
Итак когда определились с версией заходим на kernel.org и скачиваем нужные исходники в формате tar.xz:
В этой статье будет использована самая новая на данный момент нестабильная версия 4.4.rc7.
Получить исходники ядра Linux можно также с помощью утилиты git. Сначала создадим папку для исходников:
mkdir kernel_sources
Для загрузки самой последней версии наберите:
git clone https://github.com/torvalds/linux
Распаковка исходников ядра
Теперь у нас есть сохраненные исходники. Переходим в папку с исходниками:
cd linux_sources
Или если загружали ядро linux с помощью браузера, то сначала создадим эту папку и скопируем в нее архив:
mkdir linux_sources
cp ~/Downloads/linux* ~/linux_sources
Распаковываем архив с помощью утилиты tar:
tar xf linux*
И переходим в папку с распакованным ядром, у меня это:
cd linux-4.4-rc7/
Автоматическая настройка сборки ядра Linux
Перед тем как начнется сборка ядра linux, нам придется его настроить. Как я и говорил, сначала рассмотрим автоматический вариант настройки сборки ядра. В вашей системе уже есть собранное, настроенное производителем дистрибутива, и полностью рабочее ядро. Если вы не хотите разбираться с тонкостями конфигурации ядра, можно просто извлечь уже готовые настройки старого ядра и сгенерировать на их основе настройки для нового. Нам придется лишь указать значения для новых параметров. Учитывая, что в последних версиях не было и не намечается серьезных изменений можно отвечать на все эти параметры как предлагает скрипт настройки.
Параметры используемого ядра хранятся в архиве по адресу /proc/config.gz. Распакуем конфиг и поместим его в нашу папку утилитой zcat:
zcat /proc/config.gz > .config
А дальше запускаем скрипт адаптации настроек:
make oldconfig
В процессе его работы нужно будет ответить на несколько вопросов. Это новые параметры, которые изменились или были добавлены в новое ядро и поддержка нового оборудования, в большинстве случаев можно выбирать вариант по умолчанию. Обычно есть три варианта y - включить, n - не включать, m - включить в качестве модуля. Рекомендованный вариант написан с большой буквы, для его выбора просто нажмите Enter.
На все про-все у вас уйдет около 10-ти минут. После завершения процесса, ядро готово к сборке. Дальше мы рассмотрим настройку ядра вручную, а вы можете сразу перелистать к сборке ядра Linux.
Ручная настройка ядра Linux
Ручная настройка - сложный и трудоемкий процесс, но зато она позволяет понять как работает ваша система, какие функции используются и создать ядро с минимально нужным набором функций под свои потребности. Мы рассмотрим только главные шаги, которые нужно выполнить чтобы ядро собралось и заработало. Со всем остальным вам придется разбираться самому опираясь на документацию ядра. Благо в утилите настройки для каждого параметра есть обширная документация которая поможет вам понять какие еще настройки нужно включить.
Начнем. Для запуска меню настроек ядра linux наберите:
make menuconfig
Откроется вот утилита с интерфейсом ncurses:
Как видите, некоторые обязательные опции уже включены, чтобы облегчить вам процесс настройки. Начнем с самых основных настроек. Чтобы включить параметр нажмите y, чтобы включить модулем - m, для перемещения используйте клавиши стрелок и Enter, возвратиться на уровень вверх можно кнопкой Exit Откройте пункт General Setup.
Здесь устанавливаем такие параметры:
Local Version - локальная версия ядра, будет увеличиваться при каждой сборке на единицу, чтобы новые ядра при установке не заменяли собой старые, устанавливаем значение 1.
Automatically append version information to the version string - добавлять версию в название файла ядра.
Kernel Compression Mode - режим сжатия образа ядра, самый эффективный lzma.
Default Hostname - имя компьютера, отображаемое в приглашении ввода
POSIX Message Queues - поддержка очередей POSTIX
Support for paging of anonymous memory - включаем поддержку swap
Control Group support - поддержка механизма распределения ресурсов между группами процессов
Kernel .config support и Enable access to .config through /proc/config.gz- включаем возможность извлечь конфигурацию ядра через /proc/config.gz
Здесь все, возвращаемся на уровень вверх и включаем Enable loadable module support, эта функция разрешает загрузку внешних модулей, дальше открываем его меню и включаем:
Module unloading - поддержка отключения модулей
Forced module unloading - принудительное отключение модулей
Опять возвращаемся назад и открываем Processor type and features:
Processor family (Opteron/Athlon64/Hammer/K8) - выбираем свой тип процессора.
Опять возвращаемся и переходим в раздел File systems, тут установите все нужные галочки.
Обязательно включите The Extended 3 (ext3) filesystem и The Extended 4 (ext4) filesystem - для поддержки стандартных ext3 и ext4 файловых систем
Возвращаемся и идем в Kernel hacking.
Здесь включаем Magic SysRq key - поддержка магических функций SysRq, вещь не первой необходимости, но временами полезная.
Остался еще один пункт, самый сложный, потому что вам его придется пройти самому. Device Drivers - нужно пройтись по разделам и повключать драйвера для своего оборудования. Под оборудованием я подразумеваю нестандартные жесткие диски, мышки, USB устройства, веб-камеры, Bluetooth, WIFI адаптеры, принтеры и т д.
Посмотреть какое оборудование подключено к вашей системе можно командой:
lspci
После выполнения всех действий ядро готово к сборке, но вам, скорее всего, предстоит разобраться с очень многим.
Чтобы сохранить настройки переместите указатель с помощью стрелок вправо-влево, з позиции Select в позицию Save и нажмите Enter, потом еще раз подтвердите сохранение:
Чтобы выйти нажмите пару раз кнопку Exit.
Сборка ядра Linux
После завершения всех приготовлений может быть выполнена сборка ядра linux. Для начала процесса сборки выполните:
make && make modules
Теперь можете идти пить кофе или гулять, потому что процесс сборки длинный и займет около получаса.
Установка нового ядра
Когда ядро и модули будут собраны новое ядро можно устанавливать. Можно вручную скопировать файл ядра в папку загрузчика:
cp arch/x86_64/boot/bzImage /boot/vmlinuz
А можно просто выполнить установочный скрипт, сразу установив заодно и модули:
sudo make install && sudo make modules_install
После установки не забудьте обновить конфигурацию загрузчика Grub:
grub-mkconfig -o /boot/grub/grub.cfg
И перезагружаем компьютер чтобы увидеть новое ядро в работе:
sudo reboot
Выводы
Вот и все. В этой статье мы подробно рассмотрели как собрать ядро Linux из исходников. Это будет полезно всем желающим лучшие понять свою систему, и тем, кто хочет получить самую новую версию ядра в своей системе. Если остались вопросы, задавайте комментарии!
Установку первого своего линукса начинал с именно ручной настройки и сборки ядра. Уже и не помню сколько было попыток, прежде чем оно "завелось":) Где-то неделю по вечерам после работы я его собирал на домашнем компьютере читая хэндбуки в консольном браузере 🙂 Это в 2008-м году было. С винды сел на gentoo. На сборку всей системы до юзабельного состояния у меня ушло недели 3. С тех пор и ковыряюсь в никсах.
Перейти с окноуза и сразу на генту это уже целая биография
низнаю по-теме ли, ...в старом линуксе модем работает в последнем дистребюте не работает..думал как вытянуть со старого ядра, то что нужно модему и прикрутить к новому. это возможно?
Можно разве что прикрутить старое ядро к новому дистрибутиву.
Возможно, если знаете Си, чтоб вытянуть драйвер и кучу зависимостей поправить в исходном коде нового ядра. Вот только какой вэтом великий смысл для домашнего ПК, находящегося за NAT провайдера и за NAT роутера? Или найденные уязвимости старой версии ядра, другие домачадцы будут эксплуатировать?
"make && $ make modules" значёк доллара здесь -- опечатка?
Да
Вопрос: почему загрузка через браузер около 90 мб, а через консоль скачал 135 и это только 5% ?
Хорошо что сказали, через консоль качается очень много лишнего, нужно будет подправить ссылку.
Я так понимаю это ошибка и вместо lscpi нужно вводить lspci
Да.
Смотрю вы так ссылку и не поменяли. При клонирование скачивается много лишнего.
Ссылку поменял на Github, но там тоже скачивается документация. Так что если нужна самая последняя версия, которой еще нет на сайте, то придется качать все.
А после команды инсталяции
$ sudo make install && sudo make modules_install
Как затем правильно удалить ядро и модули при этом не затронув модули старого ядра?
У меня ОС ROSA Linux Fresh.
admin, расскажи, реально интересно как удалить модули ничего не сломав
Только в виде тестов. Смотрите какое у вас оборудование, отключаете лишнее, если что-то не работает - включаете. Иначе никак.
нееее, речь идет про модули sudo make modules_install какой командой обратить эту установку?
Я нашел ответ если кому интересно будет, удаляете ядра которые вам не нужны больше, в директории /boot так же удаляете сопровождающие файлы для удаляемых ядер, а именно: system.map и initramfs. Далее по поводу обращения в спять make modules_install: в директории /lib/modules просто удаляете папку с модулями соответствующую названием с названием ядра которое удаляете. И все, как будто ничего не было, другие ядра в целостности и сохранности и ничего не испорченно. Информация взята из журнала LinuxFormat за октябрь 2016 года, очень полезная вещь(не реклама, совет новичкам).
Тут есть один момент. Так как у нас уже есть рабочее ядро в установленной системе то, если не хотим выставлять все галочки в конфигурации нового ядра с нуля, берём готовый config либо из /boot либо из /proc:
# cp /boot/config-$( uname -r ) .config
# zcat /proc/config.gz > .config
В статью необходимо добавить заметку про libncurses5-dev .. у многих валится в ошибку при его отсутствии.. да и букву N можно выделить жирным шрифтом!!!))))) я как то пол дня сидел понять не мог где взять пакет libcurses5-dev без буквы n =) ... реально увидел ее только спустя 14 часов
Бред собачий
Поставил себе Ubuntu 16.04 на виртуальную машину и скачал ядро 4.11. Начал собирать, столкнулся с проблемами при сборке. Может, кому поможет.
sudo apt-get install libssl-dev build-essential kernel-package libncurses-dev
С помощью этих установок на Ubuntu 16.04 у меня всё заработало и ядро начало собираться.
Админ, статья хорошая, мне не хватило только преднастроек самой системы для работы со сборкой ядра, если добавишь, будет статья от А до Я.
Так вот оно что! Мне при сборке с помощью make && make modules выдавало ошибку про отсуствие openssl, ядро 4.19.2. Всё заработало
А можно ли в принципе включить поддержку программного RAID NTFS? Ядро 4.9.
Я софт рейд-1 делал с помощью mdadm
Как раз этой строчки мне и не хватало "sudo apt-get install libssl-dev build-essential kernel-package libncurses-dev".
Спасибо.
Как вручную установить само ядро описанно cp arch/x86_64/boot/bzImage /boot/vmlinuz, а как в ручную установить модули для ядра?
хм, если это так просто то почему разрабы не ставят самое последнее ядро?
например на Linux Mint сейчас используется ядро 4.15 а на kernel.org уже стабильное 4.17
Потому что меняется API ядра и разрабам надо кучу софта переписывать, чтоб корректно работало на новом ядре...не всё так быстро...Вы же не хотите получить какой-нибудь вечно глючный дистрибутив?
А что такое ядро ML?
По инструкции в одной из статей здесь обновляю ядро, но там можно выбрать только версию ML.
До этого в системе были только обычные версии ядра, без ML.
Допишите ключь -j , а то это на долго.
Я давно (очень давно) не компилировал ядра. еще со вторых версий.
есть вопорос: в случае если новое ядро не оживёт, можно ли будет загрузиться в том что было и заново начать сборки?
Раньше я руками правил граб для того чтобы было старое ядро.
Сейчас в grub есть дополнительные пункты меню со старыми ядрами или можно как и раньше исправлять конфиг перед загрузкой.
я уже ожидаю завершение компиляции... 5.2.8
странно как-то. раньше обязательно нужно было выкачивать заголовочные файлы, а сецчас и без их идёт компиляция ИЛИ они у меня уже есть???
Раньше, напрмер, для компиляции ядра 2.4.2 нужно было качать и распак linux-headers-2.4.2. Сейчас не так. И распоковку кодов ядра нужно было делать строго в /usr/src/
Ну понятно что времени не мало прошло со времен ядра 2,4, сейчас проще.
я уже ожидаю завершение компиляции... 5.2.8
странно как-то. раньше обязательно нужно было выкачивать заголовочные файлы, а сецчас и без их идёт компиляция ИЛИ они у меня уже есть???
Раньше, например, для компиляции ядра 2.4.2, нужно было качать и распак linux-headers-2.4.2. Сейчас не так. И распаковку кодов ядра нужно было делать строго в /usr/src/...
Ну понятно что времени не мало прошло со времен ядра 2,4, сейчас проще.
а обновлять grub не нужно?
update-grub
Я уже всё скомпилил и установил - иду в ребут...
По сравнению с ядрами 2.4, ядра 4.15 и 5.2 в ДВА раза больше. Скорее всего из-за добавления нового железа и появления новых штучек (в очень обширном понятии этого слова).
---
Что я изменил в ядре? Полностью отключил "амаутер радиотранс" - я не собираюсь делать из своего компа радистанцию
Весь блютуз тоже полностью отключил - не было, нет, и не будет у меня никаких блютузов.
Ну и полазил туда-сюда по ядрённым настройкам, молодость вспомнил.
Размер нового ядра 5.2.8 получился 7,2МБ, а те что еще присутствуют (4.15.х) - по 7,9мб.
усё. перезагрузка....
не получилось у меня загрузиться в новом ядре - но я уже понял где я натупил. Натупил я где-то около параметров usb-wakeup
Днем займусь.
Прикольная штука!
Всем удачи!
У меня вопрос у автору и ко всем комментирующим. КТО-ТО ИЗ ВАС ПРОВОДИЛ СБОРКУ ЯДРА СОГЛАСНО ЭТОМУ ПОСТУ??? ЗАЧЕМ ТАКОЕ ПИСАТЬ? ИЛИ ЭТО ОПЕЧАТКИ???
---
И ОПЫТ, СЫН ОШИБОК...
ПРАВИЛЬНО НУЖНО НЕ sudo make install && sudo make modules_install, А
1 make modules_install - УСТАНОВИТЬ МОДУЛИ ЯДРА В /lib/modules.
2 make install - И ТОЛЬКО ПОТОМ УСТАНОВИТЬ config-5.2.8 initrd.img-5.2.8 System.map-5.2.8 vmlinuz-5.2.8 В ДИРЕКТОРИЮ /boot
всё. у меня всё получилось!
Исправьте ошибку ( sudo make install && sudo make modules_install) - эти команды перепутаны.
scripts/kconfig/conf --silentoldconfig Kconfig
CHK include/config/kernel.release
UPD include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
UPD include/generated/utsrelease.h
CC kernel/bounds.s
CHK include/generated/bounds.h
UPD include/generated/bounds.h
CHK include/generated/timeconst.h
/bin/sh: 1: bc: not found
make[1]: *** [Kbuild:41: include/generated/timeconst.h] Ошибка 127
make: *** [Makefile:1036: prepare0] Ошибка 2
Эта ошибка вылазиет,не могу ничего скомпилировать.Что делать?
Салют! Нашел статейку в поисковике. вроде как дельная. вроде как - потому что это будет первый опыт. в общем я на учебе для себя открыл проект в котором нужно собрать ядро. есть много условий и конфиги надо бы писать самому. но главный вопрос в следующем... я пока что не в полной мере понимаю смысл ядра и потому задам вопрос. возможно ли во время сборки ядра автоматически (например через конфиги) разделить доступное дисковое пространство на разделы с нужными файловыми системами, и разделом подкачки... или может нужно по началу поставить виртуалку, разбить ее на разделы а после собирать ядро... в общем не понятно немного так как без какой нить оболочки командной я не смогу физически выполнять команды так как в виртуалке даже образа нету... я думаю что настройку разделов нужно делать по старинке а после кидать ядро.... Что вы скажете на это?
sudo make install && sudo make modules_install ТАК НЕ ПРАВИЛЬНО!!!
КОММАНДЫ ПЕРЕПУТАНЫ