как скомпилировать модуль ядра linux

Пишем простой модуль ядра Linux

Захват Золотого Кольца-0

Linux предоставляет мощный и обширный API для приложений, но иногда его недостаточно. Для взаимодействия с оборудованием или осуществления операций с доступом к привилегированной информации в системе нужен драйвер ядра.

Модуль ядра Linux — это скомпилированный двоичный код, который вставляется непосредственно в ядро Linux, работая в кольце 0, внутреннем и наименее защищённом кольце выполнения команд в процессоре x86–64. Здесь код исполняется совершенно без всяких проверок, но зато на невероятной скорости и с доступом к любым ресурсам системы.

Не для простых смертных

Написание модуля ядра Linux — занятие не для слабонервных. Изменяя ядро, вы рискуете потерять данные. В коде ядра нет стандартной защиты, как в обычных приложениях Linux. Если сделать ошибку, то повесите всю систему.

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

Можно в основном забыть традиционные парадигмы разработки приложений. Кроме загрузки и выгрузки модуля, вы будете писать код, который реагирует на системные события, а не работает по последовательному шаблону. При работе с ядром вы пишете API, а не сами приложения.

У вас также нет доступа к стандартной библиотеке. Хотя ядро предоставляет некоторые функции вроде printk (которая служит заменой printf ) и kmalloc (работает похоже на malloc ), в основном вы остаётесь наедине с железом. Вдобавок, после выгрузки модуля следует полностью почистить за собой. Здесь нет сборки мусора.

Необходимые компоненты

Прежде чем начать, следует убедиться в наличии всех необходимых инструментов для работы. Самое главное, нужна машина под Linux. Знаю, это неожиданно! Хотя подойдёт любой дистрибутив Linux, в этом примере я использую Ubuntu 16.04 LTS, так что в случае использования других дистрибутивов может понадобиться слегка изменить команды установки.

Во-вторых, нужна или отдельная физическая машина, или виртуальная машина. Лично я предпочитаю работать на виртуальной машине, но выбирайте сами. Не советую использовать свою основную машину из-за потери данных, когда сделаете ошибку. Я говорю «когда», а не «если», потому что вы обязательно подвесите машину хотя бы несколько раз в процессе. Ваши последние изменения в коде могут ещё находиться в буфере записи в момент паники ядра, так что могут повредиться и ваши исходники. Тестирование в виртуальной машине устраняет эти риски.

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

Установка среды разработки

На Ubuntu нужно запустить:

Устанавливаем самые важные инструменты разработки и заголовки ядра, необходимые для данного примера.

Примеры ниже предполагают, что вы работаете из-под обычного пользователя, а не рута, но что у вас есть привилегии sudo. Sudo необходима для загрузки модулей ядра, но мы хотим работать по возможности за пределами рута.

Начинаем

Приступим к написанию кода. Подготовим нашу среду:

Запустите любимый редактор (в моём случае это vim) и создайте файл lkm_example.c следующего содержания:

Мы сконструировали самый простой возможный модуль, рассмотрим подробнее самые важные его части:

Теперь можно внедрить модуль и проверить его. Для этого запускаем:

Если всё нормально, то вы ничего не увидите. Функция printk обеспечивает выдачу не в консоль, а в журнал ядра. Для просмотра нужно запустить:

Вы должны увидеть строку “Hello, World!” с меткой времени в начале. Это значит, что наш модуль ядра загрузился и успешно сделал запись в журнал ядра. Мы можем также проверить, что модуль ещё в памяти:

Для удаления модуля запускаем:

Если вы снова запустите dmesg, то увидите в журнале запись “Goodbye, World!”. Можно снова запустить lsmod и убедиться, что модуль выгрузился.

Как видите, эта процедура тестирования слегка утомительна, но её можно автоматизировать, добавив:

в конце Makefile, а потом запустив:

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

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

Немного интереснее

Копнём чуть глубже. Хотя модули ядра способны выполнять все виды задач, взаимодействие с приложениями — один из самых распространённых вариантов использования.

Поскольку приложениям запрещено просматривать память в пространстве ядра, для взаимодействия с ними приходится использовать API. Хотя технически есть несколько способов такого взаимодействия, наиболее привычный — создание файла устройства.

В нашем примере мы возвращаем “Hello, World”. Хотя это не особенно полезная функция для приложений, она всё равно демонстрирует процесс взаимодействия с приложением через файл устройства.

Вот полный листинг:

Тестирование улучшенного примера

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

Теперь после запуска make test вы увидите выдачу старшего номера устройства. В нашем примере его автоматически присваивает ядро. Однако этот номер нужен для создания нового устройства.

(в этом примере замените MAJOR значением, полученным в результате выполнения make test или dmesg )

Параметр c в команде mknod говорит mknod, что нам нужно создать файл символьного устройства.

Теперь мы можем получить содержимое с устройства:

или даже через команду dd :

Вы также можете получить доступ к этому файлу из приложений. Это необязательно должны быть скомпилированные приложения — даже у скриптов Python, Ruby и PHP есть доступ к этим данным.

Когда мы закончили с устройством, удаляем его и выгружаем модуль:

Заключение

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

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

Источник

Конфигурирование и компиляция ядра Linux

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

Установка утилит

Скачиваем исходный код ядра

Вывод команды будет примерно следующим:

Имя пакета, содержащего исходные коды ядра обычно имеет следующий вид: linux-source-Версия. Например, для ядра версии 2.6.24: linux-source-2.6.24. Самая последняя версия ядра в репозиториях Ubuntu называется просто linux-source, без указания версии на конце. Для установки исходных кодов последней версии ядра Ubuntu Linux, выполните команду:

Распаковываем исходный код ядра

Перейдем в директорию /usr/src и разархивируем ядро. Для этого выполните следующие команды:

Конфигурация ядра

Перед вами появится интерфейс, в котором вы можете включать или отключать определенные опции ядра:

Теперь выберите «Exit» (нажав кнопку Вправо и затем Enter ) и выйдите из утилиты. Перед выходом из утилиты выскочит сообщение с вопросом — сохранить проделанные изменения, выберите Yes.

Компиляция ядра

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

Наконец, чтобы запустить компиляцию ядра, выполним команду:

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

Установка (инсталляция) ядра

Запуск системы с новым ядром

Проверим работоспособность системы с новым ядром. Перезагрузите компьютер. В меню загрузчика GRUB вы должны будете увидеть новый пункт, соответствующей вашему новому ядру, которое должно загрузиться по умолчанию. Если все пройдет успешно, то система запустится с новым ядром.

Источник

Русские Блоги

Глава 1 Разработка модуля ядра драйвера

1.1 Основы механизма модуля ядра

1.1.1 Концепция модулей ядра

1.1.2 Структура модуля ядра Linux

Минимум две точки входа
* Функция загрузки модуля module_init ()
* Функция удаления модуля module_exit ()
Два макроопределения module_init () и module_exit () объявляют функцию загрузки и функцию выгрузки модуля, которые определены в linux3.14 / include / linux / init.h. Содержание:

Каждый модуль может иметь только один module_init и один module_exit.
Давайте сравним приложение и увидим разницу между приложением и модулем ядра:

Таблица 1

Сравнение приложения и модуля ядра резюмируется следующим образом.
Таблица 2

1.1.3 Скомпилировать и загрузить модуль ядра Linux

Собственно, компиляция ядра уже упоминалась, теперь давайте рассмотрим:
Makefile ядра linux3.14 разделен на 5 компонентов:
Makefile на верхнем уровне Makefile

3. Итерация каталога

Если значение CONFIG_EXT2_FS равно y или m, kbuild отобразит каталог ext2 в нисходящей итерации, но его роль ограничена этим. Должны ли файлы в каталоге ext2 быть скомпилированы как модули или связаны с ядром, или Определяется содержимым Makefile в каталоге ext2
4. Различные методы компиляции модулей.
При компиляции модуля вы можете поместить его в дерево кода и использовать Make modules для компиляции модуля. Вы также можете поместить каталог файлов, связанных с модулем, за пределы дерева кода. Location, используйте следующую команду для компиляции модуля:

1.2 Начало работы с компиляцией модуля ядра Makefile

1.2.1 Компиляция модулей

1.2.2 Анализ конкретного процесса компиляции

1.2.3 Простое описание внутренней компиляции

Если вы переместите модуль hello в исходный код ядра. Например, если вы поместите его в / usr / src / linux / driver /, будет определено KERNELRELEASE.
в / usr / src / linux / Makefile

В настоящее время модуль hello больше не компилируется только с помощью make, а компилируется с помощью модулей make в ядре. В это время модуль драйвера компилируется с ядром.

1.3 Передача параметров модуля

1.3.1 определение module_param ()

Обычно при программировании в пользовательском режиме, то есть в приложении, вы можете передавать параметры командной строки через main (), а когда вы пишете модуль ядра, вы передаете параметры через module_param ().
Макрос module_param () недавно добавлен в ядро ​​Linux 2.6. Этот макрос определен в файле include / linux / moduleparam.h и определяется следующим образом:

Итак, мы определяем параметр модуля через макрос module_param ():

1.3.2 Как использовать module_param ()

Макрос module_param () не объявляет переменные, поэтому вы должны объявить переменные перед использованием макроса. Типичное использование выглядит следующим образом:

Они должны быть записаны в начале исходного файла модуля. То есть int_var является глобальным. Также возможно сделать имя переменной внутри исходного файла модуля и имя внешнего параметра разными именами, которые определяются с помощью module_param_ named ().
a – module_param_named()
module_param_named(name, variable, type, perm);
имя внешнее (пространство пользователя) имя видимого параметра;
переменная Имя глобальной переменной в исходном файле;
тип
разрешения на доступ
И параметр module_param реализуется параметром module_param_ named, за исключением того, что имя совпадает с именем переменной.
Например:

b-строковый параметр
Если параметр модуля является строкой, для определения параметра модуля обычно используется тип charp. Ядро копирует строку, предоставленную пользователем, в память, и соответствующая переменная указывает на эту строку.
Например:

параметр c-массива
параметры массива, значения, указанные в списке, разделенном запятыми, также поддерживаются загрузчиком модуля. Чтобы объявить параметр массива, используйте:

Имя массива имен (также имя параметра),
type Тип элемента массива,
num целочисленная переменная,
Обычное значение разрешения perm.
Если параметр массива установлен при загрузке, num устанавливается равным количеству предоставленных чисел.Загрузчик модуля отказывается иметь больше значений, чем может вместить массив.

1.3.3 Пример использования

Скомпилируйте и сгенерируйте исполняемый файл hello

1.4 Экспорт таблицы символов

Оба этих макроса используются для экспорта данного символа за пределы модуля.Определение макроса версии _GPL может сделать символ доступным только для модуля с лицензией GPL. Символы должны экспортироваться в глобальную часть файла модуля, а не в функцию. Это связано с тем, что два вышеуказанных макроса будут расширены в специальное объявление, а переменная должна быть глобальной. Эта переменная хранится в специальной исполняемой части модуля («ELF-раздел»). При загрузке ядро ​​использует этот раздел для поиска переменных, экспортируемых модулем (заинтересованные читатели могут видеть

1.4.1 Определение макроса EXPORT_SYMBOL анализ

1. Исходный код

Перед анализом сначала усвойте следующие связанные знания:
1) # оператор, ## оператор
Обычно используют # для создания строки в определении макроса. #abc означает строку «abc» и так далее.
## Оператор называется связующим звеном препроцессора и используется для замены и склейки двух разных символов,
, например: #define xName (n) x ## n
, тогда xName (4) становится x4
2) gcc_ attribute_ Атрибуты:
_ attribute_Функция ((section («section_name»))) заключается в том, чтобы поместить указанную функцию или переменную в раздел с именем «section_name».
_ attribute_Добавление атрибутов может быть непосредственно добавлено к оператору определения, когда функция или переменная определены.
, например:
int myvar__ attribute__((section(“mydata”))) = 0;
означает, что целочисленная переменная myvar = 0 определена, а переменная хранится в разделе с именем «mydata»
Подробное описание gcc_attribute см. по адресу:
http://blog.sina.com.cn/s/blog_661314940100qujt.html
2. Какова роль EXPORT_SYMBOL?
Функция или символ, определенные в теге EXPORT_SYMBOL, открыты для всего кода ядра и могут быть напрямую вызваны в вашем модуле ядра без изменения кода ядра, то есть использование EXPORT_SYMBOL может сделать функцию символически Экспорт в другие модули для использования.
Вот сравнение с System.map: System.map содержит адрес функции при подключении. После того, как соединение установлено, в процессе работы ядра 2.6 неизвестно, какой символ находится по какому адресу.
Символ EXPORT_SYMBOL сохраняет эти символы и соответствующие адреса, и соответствующие адреса этих символов могут быть найдены во время работы ядра. В процессе загрузки модуля его суть заключается в динамическом подключении к ядру.Если в модуле есть ссылки на символы ядра или других модулей, эти символы должны быть EXPORT_SYMBOL, чтобы можно было найти соответствующее адресное соединение.

1.4.2 Как использовать EXPORT_SYMBOL

1.4.3 Примеры

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

Подсказки:

Описание файла заголовка драйвера

2. Подкаталог include / asm файлов заголовков, относящихся к архитектуре.
Эти файлы заголовков в основном определяют некоторые структуры данных, макрофункции и переменные, тесно связанные с архитектурой ЦП. Всего 4 файла.

3. Подкаталог специального заголовочного файла ядра Linux include / linux

4. Подкаталог с системной структурой данных include / sys

Источник

Сборка модуля ядра Linux без точных заголовочных файлов

Представьте, что у вас имеется образ ядра Linux для телефона на базе Android, но вы не располагаете ни соответствующими исходниками, ни заголовочными файлами ядра. Представьте, что ядро имеет поддержку подгрузки модулей (к счастью), и вы хотите собрать модуль для данного ядра. Существует несколько хороших причин, почему нельзя просто собрать новое ядро из исходников и просто закончить на том (например, в собранном ядре отсутствует поддержка какого-нибудь важного устройства, вроде LCD или тачскрина). С постоянно меняющимся ABI ядра Linux и отсутствием исходников и заголовочных файлов, вы можете подумать, что окончательно зашли в тупик.

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

Но больше об этом далее.

Конфигурация ядра

Предполагая, что arm-eabi-gcc у вас доступен по одному из путей в переменной окружения PATH, и что терминал открыт в папке с исходными файлами ядра, вы можете начать конфигурацию ядра и установку заголовочных файлов и скриптов:

Написание простого модуля

Поместите следующий текст в файл Makefile в той же директории:

Сборка модуля достаточна проста, однако на данном этапе полученный модуль не сможет загрузиться.

Сборка модуля

Далее, также имеем здесь определение структуры модуля:

Начинаете понимать, почему обычно предполагается использовать в точности те же заголовочные файлы, с которыми было собрано наше ядро?

Далее, определения версий символов:

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

Изучаем ядро

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

Ядро использует следующую функцию для поиска в своей таблицы символов (в kernel/module.c):

Структура, используемая в данной функции, определена в include/linux/module.h:

Примечание: данный код ядра не изменился значительно за последние четыре года (видимо, с момента рассматриваемого релиза ядра 3.0, — прим. пер.).

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

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

Я написал скрипт для декомпрессии и извлечения информации о символах ядра в автоматическом режиме. Это должно работать с любой свежей версией ядра, при условии, что ядро не перемещаемое (relocatable) и вы знаете базовый адрес в памяти, куда оно грузится. Скрипт принимает опции для количества и порядка следования битов (endianness) архитектуры, и по умолчанию использует значения, подходящие для ARM. Базовый адрес, однако, должен быть указан. Он может быть найден, на ядрах ARM, в dmesg :

(прим. пер. — однако, не все ядра выводят эти данные в лог, мне довелось встретить один такой практически уникальный случай, когда, видимо, ввиду урезанных опций конфигурации эта информация не выводилась, в таком случае можно обратиться к конфигу PAGE_OFFSET в файле arch/arm/Kconfig и просто надеяться, что вендор использовал одно из дефолтных значений).

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

Если ядро не сжато, вы можете использовать программу unbootimg как изложено в данном посте, для того, чтобы получить образ ядра из вашего образа boot. Как только у вас есть образ ядра, скрипт может быть запущен следующим образом:

Источник

Сборка ядра Linux

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

Раньше ядро собирали для того чтобы получить максимальную производительность от своего оборудования, но сейчас, учитывая стремительное увеличение мощности компьютеров увеличение производительности при сборке ядра совсем незаметно. Сейчас сборка ядра может понадобиться пользователям не бинарных дистрибутивов, таких как Gentoo, тем, кто хочет внести некоторые изменения в ядро, получить новую самую свежую версию ядра и, конечно, же тем, кто хочет полностью разобраться в работе своей системы. В этой статье мы рассмотрим как собрать ядро Linux на примере дистрибутива Ubuntu.

Сборка ядра Linux из исходников

1. Текущая версия ядра

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

2. Установка необходимых пакетов

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

sudo apt install libncurses-dev libncurses dwarves build-essential gcc bc bison flex libssl-dev libelf-dev

После установки пакетов можно переходить к загрузке исходников ядра.

3. Получение исходников ядра

Исходники лучшие брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. В этой статье будет рассмотрена загрузка исходников с kernel.org.

Итак когда определились с версией зайдите на kernel.org и скачайте нужные исходники в формате tarball:

В этой статье будет использована самая новая на данный момент стабильная версия 5.13.7. Полученный с официального сайта архив необходимо распаковать. Для этого перейдите в папку загрузок и выполните команду распаковки:

Затем нужно перейти в папку с распакованными исходниками ядра. Например, для версии 5.13.7 команда будет выглядеть вот так:

4. Текущая конфигурация ядра

Вы можете сами настраивать ядро с нуля, но это, скорее всего, займет очень много времени и точно не для новичков. Поэтому удобнее всего взять текущую конфигурацию ядра и использовать её в качестве базы для сборки нового. Во многих дистрибутивах конфигурация хранится в файле /proc/config.gz. Однако это будет работать только если была включена соответствующая опция ядра. Извлечь такую конфигурацию можно с помощью команды:

Часто поддержка этой возможности отключена. Но в Ubuntu и других современных дистрибутивах, конфигурация ядра находится в папке /boot, в файле с названием config и версия ядра. Если у вас в системе установлено несколько ядер, то будет несколько конфигурационных файлов. Например, config-5.11.0-25-generic:

Для того чтобы скопировать этот конфигурационный файл в папку с исходниками выполните:

5. Автоматическая конфигурация

Полученную конфигурацию необходимо актуализировать до состояния текущего ядра. В новых версиях ядра, обычно, добавляются новые опции, значений которых ещё нет в конфигурации ядра вашего дистрибутива. Для этого есть несколько скриптов. В этой статье будет рассмотрено только два: oldconfig и localmodulesconfig. Первый скрипт позволяет в интерактивном режиме заполнить новые поля конфигурации. Для его запуска в папке с исходниками ядра выполните:

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

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

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

Здесь обратите внимание на алгоритм сжатия модулей ядра. Лучше оставить без сжатия:

6. Ручная настройка ядра

После того как вы выполнили один из автоматических скриптов настройки ядра, вы можете захотеть настроить что-то дополнительно вручную. Для этого используется команда menuconfig. Она позволяет изменять настройки ядра в псвевдографическом меню. Для его запуска выполните:

По каждому пункту можно получить справку. Для этого выберите кнопку Help и нажмите Enter:

Пункт Support for paging of anonymous memory (swap) позволяет включить поддержку подкачки:

Возвращайтесь назад с помощью кнопки Exit, а затем откройте пункт File systems. Здесь можно включить или отключить поддержку файловых систем. Убедитесь, что включена поддержка ext4 и ext3, а также можете включить Btrfs и F2FS:

6. Сборка ядра и установка вручную

Если вы хотите установить ядро вручную достаточно выполнить такие команды последовательно для его сборки:

По умолчанию будет использоваться только одно ядро процессора. Вы можете ускорить сборку попросив программу использовать сразу несколько ядер с помощью опции -j. Например, для сборки в 8 потоков используйте такую команду:

После завершения выполнения этих команд сборка ядра Linux будет завершена, дальше необходимо установить ядро. Для этого выполните:

Скрипт автоматически обновит конфигурацию Grub и вы сможете перезагрузить компьютер и получить новое ядро:

Но прежде чем идти дальше, давайте рассмотрим ещё один способ сборки ядра.

7. Сборка пакета для Ubuntu

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

После завершения сборки ядра Linux пакеты появятся на каталог выше каталога с исходниками:

Для установки этих пакетов достаточно выполнить такую команду:

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

Для удаления ядра, установленного таким способом достаточно загрузится с другим ядром и удалить пакеты ядра из системы. Например, для этой версии команда будет выглядеть так:

sudo apt remove linux-headers-5.13.7 linux-image-5.13.7 linux-image-5.13.7-dbg linux-libc-dev

Что делать если ядро не загружается

Если по каким-либо причинам собранное только что ядро не загружается, то ничего страшного ещё не произошло. Вы можете загрузится со старым ядром и начать всё сначала или удалить новое ядро и продолжить использовать систему со старым ядром. Для этого в меню Grub необходимо выбрать пункт Дополнительные параметры, а потом нужную версию ядра, например: 5.11.0.25:

Если меню Grub не отображается, попробуйте зажать перед загрузкой операционной системы клавишу Shift. После авторизации в системе вы можете удалить новое ядро с помощью пакетного менеджера, если использовали его для установки или вручную. Для удаления вручную следует удалить файлы ядра из папки /boot. Например:

А затем необходимо обновить конфигурацию Grub:

После этого в вашей системе останутся только старые ядра.

Выводы

Вот и все. В этой статье мы подробно рассмотрели выполняется сборка ядра Linux из исходников. Это будет полезно всем желающим лучшие понять свою систему, и тем, кто хочет получить самую новую версию ядра в своей системе. Если остались вопросы, задавайте комментарии!

Нет похожих записей

Оцените статью:

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux, интересуюсь всем, что связано с информационными технологиями и современной наукой.

47 комментариев

Установку первого своего линукса начинал с именно ручной настройки и сборки ядра. Уже и не помню сколько было попыток, прежде чем оно «завелось»:) Где-то неделю по вечерам после работы я его собирал на домашнем компьютере читая хэндбуки в консольном браузере 🙂 Это в 2008-м году было. С винды сел на gentoo. На сборку всей системы до юзабельного состояния у меня ушло недели 3. С тех пор и ковыряюсь в никсах.

Перейти с окноуза и сразу на генту это уже целая биография

Можно разве что прикрутить старое ядро к новому дистрибутиву.

Возможно, если знаете Си, чтоб вытянуть драйвер и кучу зависимостей поправить в исходном коде нового ядра. Вот только какой вэтом великий смысл для домашнего ПК, находящегося за NAT провайдера и за NAT роутера? Или найденные уязвимости старой версии ядра, другие домачадцы будут эксплуатировать?

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

Я так понимаю это ошибка и вместо 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 года, очень полезная вещь(не реклама, совет новичкам).

Поставил себе 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.

Я давно (очень давно) не компилировал ядра. еще со вторых версий.

есть вопорос: в случае если новое ядро не оживёт, можно ли будет загрузиться в том что было и заново начать сборки?

Раньше я руками правил граб для того чтобы было старое ядро.

Сейчас в 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 в ДВА раза больше. Скорее всего из-за добавления нового железа и появления новых штучек (в очень обширном понятии этого слова).

У меня вопрос у автору и ко всем комментирующим. КТО-ТО ИЗ ВАС ПРОВОДИЛ СБОРКУ ЯДРА СОГЛАСНО ЭТОМУ ПОСТУ. ЗАЧЕМ ТАКОЕ ПИСАТЬ? ИЛИ ЭТО ОПЕЧАТКИ.

И ОПЫТ, СЫН ОШИБОК.

ПРАВИЛЬНО НУЖНО НЕ sudo make install && sudo make modules_install, А

всё. у меня всё получилось!

Эта ошибка вылазиет,не могу ничего скомпилировать.Что делать?

sudo make install && sudo make modules_install ТАК НЕ ПРАВИЛЬНО.

слушай, а может компутеры эти и Тимофей Хирьянов, это все не твое?

Как узнать установлено ли ядро или нет после перезагрузки?

Вся статья из каких-то поломанных команд (с ошибками, не продуманные), начиная с первых же строк! ADMIN это ник или статус владельца сайта? В любом случае, выкладывать такие статьи, человеком опытным, позор! Тем более не допилить такую статью до ума за 5 лет! Тем более для такого популярного ресурса и уж тем более для столь важной темы, основы основ Linux(без которой дальше никто и никуда не двинет)! При учёте вполне вменяемых комментариев, с исправлениями и доработками!
ПОЗОР.

Сергей прекрасно ответил. вот достойная помощь. Наверное Вы родились с ОЗУ не скажу где. Человек узнать хочет что-то, научиться чему-то. Его или не его решать только ему.

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • как скомпилировать драйвер под linux
  • как скомпилировать windows forms в exe
  • как скомпилировать python в exe файл linux
  • как скомпилировать cpp в linux
  • как скомпилировать c в linux для windows

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии