- Как собрать ядро Linux с нуля
- Сборка ядра Linux
- Шаг №1: Загрузка исходного кода
- Шаг №2: Распаковка архива с исходным кодом
- Шаг №3: Установка необходимых пакетов
- Шаг №4: Конфигурирование ядра
- Шаг №5: Сборка ядра
- Шаг №6: Обновление загрузчика
- Шаг №7: Перезагрузка системы
- Можно ли установить только ядро Linux?
- 7 ответов
Как собрать ядро Linux с нуля
Обновл. 18 Июн 2021 |
Ядро Linux является основой дистрибутивов Linux. Оно связывает аппаратное и программное обеспечение компьютера, а также отвечает за распределение доступных ресурсов.
Если вы хотите отключить несколько опций и драйверов или попробовать экспериментальные исправления, то вам необходимо будет собрать ядро вручную. В этой статье вы узнаете, как с нуля самостоятельно скомпилировать и установить ядро Linux.
Сборка ядра Linux
Процесс сборки ядра Linux состоит из семи простых шагов. Однако для выполнения этой процедуры вам потребуется значительное количество времени (зависящее от характеристик вашего компьютера).
Примечание: Для сборки ядра Linux я выделил следующие ресурсы:
виртуальная машина — VMware Workstation 15 Pro (15.5.6);
дистрибутив — Debian Linux (ветка Testing);
ресурсы — 2 ядра CPU (Ryzen 5 1600 AF), 2GB RAM, HDD;
время компиляции — 3+ часа.
После этого я попробовал собрать ядро еще раз, перенеся образ виртуальной машины на NVMe SSD A-Data XPG SX8200 Pro (1TB), а также увеличив количество доступных для виртуальной машины ядер CPU до 6, а RAM — до 4GB. В таком варианте время компиляции составило около 1.5 часов.
Шаг №1: Загрузка исходного кода
Откройте сайт kernel.org и найдите архив с исходными кодами самой свежей версии ядра (Latest Release).
Примечание: Не пугайтесь, если версия ядра на сайте kernel.org не совпадает с той, которую я использовал на данном уроке. Все рассмотренные шаги/команды работоспособны, просто вам придется заменить цифры в версии ядра на свои.
Затем откройте терминал и с помощью команды wget скачайте архив с исходным кодом ядра Linux:
Шаг №2: Распаковка архива с исходным кодом
Распакуем архив, применив команду tar :
$ tar xvf linux-5.12.10.tar.xz
Шаг №3: Установка необходимых пакетов
Нам потребуются дополнительные утилиты, с помощью которых мы произведем компиляцию и установку ядра. Для этого выполните следующую команду:
Пользователям Debian/Ubuntu/Linux Mint:
$ sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
Данная команда установит следующие пакеты:
Пакет | Описание |
git | Утилита, помогающая отслеживать изменения в файлах исходного кода. А в случае какой-либо ошибки, эти изменения можно будет откатить. |
fakeroot | Позволяет запускать команду в среде, имитирующей привилегии root. |
build-essential | Набор различных утилит для компиляции программ (компиляторы gcc, g++ и пр.). |
ncurses-dev | Библиотека, предоставляющая API для программирования текстовых терминалов. |
xz-utils | Утилита для работы с архивами в .xz-формате. |
libssl-dev | Библиотека для разработки и поддержки протоколов шифрования SSL и TLS. |
bc (Basic Calculator) | Интерактивный интерпретатор, позволяющий выполнять скрипты с различными математическими выражениями. |
flex (Fast Lexical Analyzer Generator) | Утилита генерации программ, которые могут распознавать в тексте шаблоны. |
libelf-dev | Библиотека, используемая для работы с ELF-файлами (исполняемые файлы, файлы объектного кода и дампы ядра). |
bison | Создает из набора правил программу анализа структуры текстовых файлов. |
Пользователям CentOS/RHEL/Scientific Linux:
$ sudo yum group install «Development Tools»
$ sudo yum groupinstall «Development Tools»
Также необходимо установить дополнительные пакеты:
$ sudo yum install ncurses-devel bison flex elfutils-libelf-devel openssl-devel
Пользователям Fedora:
$ sudo dnf group install «Development Tools»
$ sudo dnf install ncurses-devel bison flex elfutils-libelf-devel openssl-devel
Шаг №4: Конфигурирование ядра
Исходный код ядра Linux уже содержит стандартный файл конфигурации с набором различных настроек. Однако вы можете сами изменить его в соответствии с вашими потребностями.
Для этого перейдите с помощью команды cd в каталог linux-5.12.10:
Скопируйте существующий файл конфигурации с помощью команды cp :
$ sudo cp -v /boot/config-$(uname -r) .config
Чтобы внести изменения в файл конфигурации, выполните команду make :
Данная команда запускает несколько сценариев, которые далее откроют перед вами меню конфигурации:
Меню конфигурации включает в себя такие параметры, как:
Firmware Drivers — настройка прошивки/драйверов для различных устройств;
Virtualization — настройки виртуализации;
File systems — настройки различных файловых систем;
Для навигации по меню применяются стрелки на клавиатуре. Пункт H elp > поможет вам узнать больше о различных параметрах. Когда вы закончите вносить изменения, выберите пункт S ave > , а затем выйдите из меню с помощью пункта E xit > .
Примечание: Изменение настроек некоторых параметров может привести к тому, что в вашем новом ядре будет отсутствовать поддержка жизненно важных для системы функций. Если вы не уверены, что нужно изменить, то оставьте заданные по умолчанию настройки.
Примечание: Если вы использовали вариант с копированием файла конфигурации, то перед переходом к следующему шагу, откройте этот файл и проверьте, что параметр CONFIG_SYSTEM_TRUSTED_KEYS у вас определен так же, как указано на следующем скриншоте:
В противном случае вы можете получить ошибку:
make[4]: *** No rule to make target ‘debian/certs/test-signing-certs.pem’, needed by ‘certs/x509_certificate_list’. Stop.
make[4]: *** Waiting for unfinished jobs.
Шаг №5: Сборка ядра
Для старта сборки ядра выполните следующую команду:
Процесс сборки и компиляции ядра Linux занимает довольно продолжительное время.
Во время этого процесса в терминале будут перечисляться все выбранные компоненты ядра Linux: компонент управления памятью, компонент управления процессами, драйверы аппаратных устройств, драйверы файловых систем, драйверы сетевых карт и пр.
Затем нужно будет установить модули с помощью следующей команды:
$ sudo make modules_install
Осталось произвести установку нового ядра. Для этого необходимо выполнить:
$ sudo make install
Шаг №6: Обновление загрузчика
Загрузчик GRUB — это первая программа, которая запускается при включении системы.
Пользователям Debian/Ubuntu/Linux Mint:
Команда make install автоматически обновит загрузчик.
Для того, чтобы обновить загрузчик вручную, вам необходимо сначала обновить initramfs до новой версии ядра:
$ sudo update-initramfs -c -k 5.12.10
Затем обновить загрузчик GRUB с помощью следующей команды:
Пользователям CentOS/RHEL/Scientific Linux :
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
$ sudo grubby —set-default /boot/vmlinuz-5.6.9
Вы можете подтвердить детали с помощью следующих команд:
grubby —info=ALL | more
grubby —default-index
grubby —default-kernel
Шаг №7: Перезагрузка системы
После выполнения вышеописанных действий перезагрузите свой компьютер. Когда система загрузится, проверьте версию используемого ядра с помощью следующей команды:
Как видите, теперь в системе установлено собранное нами ядро Linux-5.12.10.
Поделиться в социальных сетях:
Источник
Можно ли установить только ядро Linux?
Мне просто интересно, если можно установить только ядро Linux, или если вам нужно использовать один из вариантов. Если бы это было возможно, как бы вы это сделали? Мне не нужен подробный учебник. Я просто хочу знать, как это будет сделано концептуально. Я плохо разбираюсь в материалах низкого уровня и хочу знать, как вы получаете ОС на компьютер. Я предполагаю, что это имеет какое-то отношение к MBR.
О, и я заметил, что многие ответы говорят о некотором распределении некоторого минимального Linux. Я должен был, наверное, сказать, что я не хочу устанавливать минимальный или голый Linux. Этот вопрос носит чисто теоретический характер. Тем не менее, я действительно ценю все ответы и сразу же обращусь к ним, если когда-нибудь захочу установить действительно персонализированный Linux.
7 ответов
Вы можете технически установить только загрузчик и ядро в одиночку, но как только ядро загрузится, оно будет жаловаться на то, что не сможет запустить «init», тогда он просто сидит там, и вы ничего не можете сделать с помощью он.
Кстати, это часть загрузчика, который находится в MBR. Ядро находится где-то на обычной области диска. Загрузочный загрузчик настроен так, чтобы знать, где это, поэтому он может загружать ядро и выполнять его.
Я не думаю, что вы точно понимаете, что вы просите, но вы можете взглянуть на Linux From Scratch .
Если вы спрашиваете, можете ли вы просто установить или обновить ядро «поверх» существующей системы без установки нескольких других программ?
Ядро Linux представляет собой двоичный файл, обычно называемый vmlinuz-x.x.x-x-name в boot (обычно это отдельный небольшой раздел в начале жесткого диска), где x — номер версии. «name» — это просто выбранное имя для ядра, которое можно установить во время компиляции, вы можете использовать его для определения того, на каком типе машины или архитектуры есть ядро или по какой-либо другой причине.
Он загружается при загрузке загрузчиком, обычно GRUB , который вызывается кодом загрузки в MBR, который вызывается BIOS ROM , Как только он загружен, он не «открыт» или специально защищен. Таким образом, вы можете заменить этот файл другим рабочим ядром. Но, GRUB имеет классную функцию, которая позволяет вам выбирать несколько ядер для загрузки. Поэтому довольно удобно добавлять ваше дополнительное ядро в этот список, но держите исходное известное рабочее ядро на всякий случай, если все пойдет не так.
Почти все дистрибутивы, которые я считаю, составляют «модульное» ядро, где драйверы устройств находятся в отдельных файлах. Поэтому большинству ядер нужна файловая система, содержащая драйверы, доступные для нее во время загрузки, и для этого требуется «initrd» (начальный RAM-диск) или «initramfs». GRUB загрузит ядро в месте в памяти и initrd в другом месте и перейдет к ядру, сообщая ему, где initrd является, начиная Linux.
Драйверы также могут быть «встроены» в ядро и поэтому автоматически загружаются и доступны, когда загрузчик загружает изображение vmlinuz . Ядра, которые предназначены для работы в различных системах (например, в большинстве дистрибутивов), обычно сводят к минимуму то, что встроено в ядро, потому что доступное оборудование будет сканироваться позже в процессе загрузки, и будут загружены только модули, представляющие текущее оборудование.
Существуют инструменты для изменения и создания initrds. У Debian есть хорошие инструменты, и я полагаю, что другие дистрибутивы тоже работают.
Итак, если вы загрузите более новое ядро с kernel.org и скомпилируете его для создания нового двоичного образа ядра, вам нужно сделать или обновить initrd с драйверами, которые работают с этим ядром. Старый initrd не будет работать, потому что драйверы должны совпадать с версией ядра, которое работает.
Файл initrd называется initrd.img-x.x.x.x-name аналогично ядру и может быть заменен после загрузки так же, как ядро, и наилучшая практика указывают, что вы не удаляете известный рабочий initrd, пока не узнаете, что можете успешно загрузиться в новое ядро + initrd.
Я надеюсь, что это даст некоторый контекст.
Если вы ищете «баребонную» установку Linux, в которой нет никаких дополнительных программ, установленных с ней, мой любимый выбор всегда устанавливал Debian netinst . Практически у вас есть только самые простые инструменты, необходимые для запуска текстовой консоли командной строки и nano в виде текстового редактора.
Я хотел бы второй Shadur , вы должны сделать свои руки грязными Linux From Scratch way.
Кроме того, что-то похожее, попробуйте Pocket Linux .
Руководство по Pocket Linux демонстрирует, как создать небольшую консольную систему GNU /Linux, используя только исходный код и пару дискет. Он предназначен для пользователей Linux, которые хотели бы получить более глубокое представление о том, как их система работает под защитой функций и инструментов распространения.
Можно установить ядро Linux без обычных инструментов пользовательского пространства. Обычно это делается во встроенных системах, таких как маршрутизаторы. Как правило, ядро загружается из ПЗУ или флэш-памяти и настраивается для соответствующего устройства (обычно с необходимыми драйверами, скомпилированными в ядро, а не с загрузкой в виде модулей).
Как минимум одна программа для пространства пользователя должна существовать, чтобы стать процессом init (не обязательно называемым init , но запущен ядром как процессом 1 и автоматическим родителем любых сиротских процессов) — если ядро не было изменено (а не просто настроено), чтобы не требовать этого.
Конечно, нет необходимости иметь оболочку для работы с Linux-устройством, хотя это может сделать процесс разработки намного проще!
Многие дистрибутивы предоставляют «основные» установки. Это то, что вы хотите. См. Ubuntu-minimal, debian net-install, archlinux (по умолчанию это просто ядро).
Другие ответы полезны, если вы хотите учиться, но это может быть не так: p
Одиночные исполняемые rootfs
Абсолютная минимальная система запускает одну программу /init , как я объяснил в Отдельное приложение Linux | Суперпользователь
Минимальный Linux Live
Для более интересной интерактивной системы это (в основном образовательный) небольшой скрипт, который:
- загружает источник для ядра и busybox
- компилирует их
- генерирует загрузочный ISO 8Mb с ними
ISO затем оставляет вас в минимальной оболочке с busybox.
С помощью QEMU вы можете легко загрузиться в систему.
Я изменил его, чтобы разрешить его запуск из исходного каталога ядра: https://github.com/cirosantilli /runlinux
, и вы останетесь в окне QEMU с новой минимальной системой. Высокий.
Поскольку он мал, это хороший способ прочитать источник и понять, что происходит.
Протестировано на Ubuntu 16.04.
Buildroot
Большой набор скриптов Makefile, которые управляют:
- GCC cross compilation toolchain
- компиляция ядра
- компиляция загрузчика
- генерация rootfs
- содержит множество рецептов загрузки /сборки пакетов в исходном дереве, включая сложные вещи, такие как GTK. Существует система зависимостей.
Alpine Linux
Встроенный дистрибутив с менеджером пакетов, который предлагает предварительно скомпилированные двоичные файлы с веб-сайта.
Источник