Ядро

Обновлено 31 января 2020

Linux

Версии ядра

Ядро Calculate Linux входит в состав пакета sys-kernel/calculate-sources и имеет несколько версий и разновидностей, описываемых USE-флагами. Пример:

eix calculate-sources

[I] sys-kernel/calculate-sources [1]
     Доступные версии:      
     (4.19.96) 4.19.96^bs
     (4.19.97) ~4.19.97^bs
     (5.4.12) 5.4.12^bs{tbz2}
     (5.4.13) ~5.4.13^bs
       {build desktop firmware fsync +grub minimal muqss pae symlink themes uksm +vmlinuz KERNEL="linux"}
     Установленные версии:  5.4.12(5.4.12)^bs{tbz2}(02:38:06 18.01.2020)(desktop firmware fsync grub minimal symlink themes vmlinuz -build -muqss -pae -uksm KERNEL="linux")
     Домашняя страница:     http://www.calculate-linux.org
     Описание:              Calculate Linux kernel image

[1] "calculate" /var/db/repos/calculate

Для стабильных версий ядра, а также для самой свежей версии ядра доступны бинарные пакеты для десктопа и сервера. На момент написания статьи стабильными являются версии ядра 5.4.12 и 4.19.96, а свежая версия версия - 5.4.13.

Ядро Calculate Linux разделяется на десктопную и серверную версии по наличию USE-флага desktop. Ниже приведён список остальных USE-флагов:

  • firmware - добавляет в зависимости пакет sys-kernel/linux-firmware или sys-firmware/eth-firmware
  • fsync - патчи повышения производительности в играх, использующих Proton от компании Valve
  • grub - добавляет в зависимости загрузчик grub
  • minimal - устанавливает ядро без исходного кода
  • muqss - патч, добавляющий поддержку планировщика задач MuQSS
  • symlink - создаёт символическую ссылку /usr/src/linux на исходный код ядра
  • themes - добавляет в зависимости пакет с темой для Plymouth
  • uksm - патч, добавляющий технологию совмещения одинаковых страниц памяти в одну, альтернатива ksm
  • vmlinuz - компилировать и устанавливать ядро во время установки пакета

Переход на пониженную версию ядра

В случае сложностей, вызванных стабильностью работы системы, поддержкой оборудования или драйверов, вы можете установить пониженную версию ядра. Для перехода на версию 4.19.x выполните:

cl-update --sync-only

echo ">sys-kernel/calculate-sources-5" >> /etc/portage/package.mask/custom

emerge -a sys-kernel/calculate-sources

После этого перезагрузите компьютер, выбрав в меню загрузчика Advanced options и указав ядро 4.19. После загрузки закончите обновление:

cl-update

Программа удалит ядро 5.4 и пересоберёт пакеты с модулями ядра.

Переход на самую свежую версию ядра

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

echo "sys-kernel/calculate-sources" >> /etc/portage/package.keywords/custom

cl-update

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

Сборка ядра со своей конфигурацией

Во время сборки ядра из пакета sys-kernel/calculate-sources происходит настройка его конфигурации при помощи шаблонов утилит Calculate. Вы можете максимально удобным способом сгенерировать свой шаблон с изменениями настроек. В дальнейшем ваш шаблон будет использоваться во время сборки ядра из исходного кода.

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

USE="-minimal -vmlinuz" emerge -a sys-kernel/calculate-sources

Для изменения настроек и сборки ядра выполните:

cl-kernel

Программа запустит утилиты Calculate для генерации стандартных настроек, после этого выполнит make menuconfig для вызова интерфейса настроек. По завершении работы будет создан шаблон, включающий выполненные изменения, после чего запустится процесс компиляции и установки ядра:

Изменение настроек ядра Linux

По умолчанию будут использованы исходники ядра, на которые указывает символическая ссылка /usr/src/linux. Если в системе установлено несколько версий пакета sys-kernel/calculate-sources либо другие пакеты с исходным кодом ядра, такие как (sys-kernel/gentoo-sources, sys-kernel/vanilla-sources и т.д.), вам может потребоваться указать версию ядра для сборки. Для просмотра доступных версий выполните:

cl-kernel --kver list

 * 4.19.97-gentoo
 * 4.19.96-calculate *

Пример указания версии ядра:

cl-kernel --kver 4.19.96-calculate

Если после изменения настроек вы хотите пропустить компиляцию ядра, используйте опцию --skip-build.

В конце сборки ядра вам может понадобиться обновить модули. Убедитесь, что символическая ссылка /usr/src/linux указывает на собираемую вами версию ядра, а затем выполните:

emerge @module-rebuild

Выполнив повторно запуск конфигуратора, вы найдёте сохранёнными внесённые вами ранее изменения. Результат своей работы программа сохраняет в директории пользовательских шаблонов /var/calculate/templates, создав там директорию kernel.

tree -a /var/calculate/templates

/var/calculate/templates
└── kernel
    ├── 10-calculate-x86_64-4.19
    └── .calculate_directory

1 directory, 2 files

Чтобы использовать новые настройки в дальнейшем при установке новых версий ядра, вам следует устанавливать пакет sys-kernel/calculate-sources не бинарно. Как вариант, добавьте USE-флаг -minimal, выполнив:

echo "sys-kernel/calculate-sources -minimal" >> /etc/portage/package.use/custom

Теперь при установке пакета ядро будет собираться с вашими изменениями:

emerge -a sys-kernel/calculate-sources

Сборка других ядер

Как уже было отмечено, при помощи утилиты cl-kernel вы можете собирать и устанавливать не только ядро sys-kernel/calculate-sources, но и любое другое ядро, например sys-kernel/gentoo-sources, sys-kernel/vanilla-sources.

Для примера, установите последнюю версию пакета sys-kernel/vanilla-sources, имеющего оригинальный исходный код и лишённый каких-либо сторонних патчей:

echo sys-kernel/vanilla-sources >> /etc/portage/package.keywords/custom

emerge -a sys-kernel/vanilla-sources

Отобразите список доступных ядер:

cl-kernel --kver list

 * 5.4.15
 * 5.4.12-calculate *

Обратите внимание, что ядро 5.4.12-calculate отмечено красным цветом. Это означает, что оно не содержит исходного кода, т.к. по умолчанию пакет sys-kernel/calculate-sources устанавливается с выключенным USE-флагом minimal.

Для настройки, сборки и установки ядра достаточно выполнить:

cl-kernel --kver 5.4.15

Очевидно, что настраивать с нуля ядро достаточно долго и у вас скорей всего уже есть свой файл настроек .config, который можно предварительно скопировать в директорию с исходным кодом ядра /usr/src/linux-5.4.15/.config. Для использования настроек загруженного ядра выполните:

cl-kernel --kver 5.4.15 --convert

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

head -1 /var/calculate/templates/kernel/10-vanilla-x86_64-5.4

# Calculate format=kernel name=.config os_install_arch_machine==x86_64&&merge(sys-kernel/vanilla-sources)>=5.4

В дальнейшем этот шаблон будет использоваться для создания конфигурационного файла .config при установке пакета sys-kernel/vanilla-sources.

Сборка ядра без initramfs

Файл initramfs служит для возможности загружать модули ядра на раннем этапе загрузки системы. После первой загрузки установленной системы initrams оптимизируется и из него удаляются модули, не загруженные в память, сокращая время загрузки ядра. Отказ от использования initrams может ещё больше ускорить запуск ядра, заметно повлияв на время загрузки системы в целом.

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

Запустите настройку ядра:

cl-kernel

Перейдите в раздел General setup и отключите поддержку Initial RAM filesystem and RAM disk (initramfs/initrd) support.

Скриншот

Initial RAM filesystem and RAM disk (initramfs/initrd) support

Включите в состав ядра корневую файловую систему. Чтобы узнать, какая файловая система используется, выполните:

findmnt /
TARGET SOURCE         FSTYPE OPTIONS
/      /dev/nvme0n1p2 btrfs  rw,noatime,ssd,discard,space_cache,subvolid=5,subvol=/

Перейдите в раздел File systems и укажите Y на вашей файловой системы.

Скриншот

Btrfs filesystem support

Для десктопа с жёстким диском M.2 этих настроек может оказаться достаточно. В случае использования SATA/SAS или SCSI контроллеров, RAID и т.п. вам может понадобиться вкомпилировать в ядро дополнительные драйвера, отвечающие за поддержку вашего устройства. По завершении настройки выйдите из программы. После этого будет запущена сборка ядра.

Добавление патчей

Патчи для ядра системы могут добавить поддержку оборудования, а в некоторых случаях повысить отзывчивость системы или внести другие улучшения. Для добавления, скачайте патч в директорию /var/calculate/templates и преобразуйте в формат шаблона, добавив первой строкой патча заголовок шаблона:

/var/calculate/templates/file_patch

# Calculate format=diff env=install ac_install_patch==on&&merge(sys-kernel/calculate-sources)>=4.19
...

В заголовке указан формат diff, условие выполнения патча и проверка на версию устанавливаемого пакета.

Пример добавления патча

Пример добавления патча kernel_gcc_patch, расширяющего список процессоров для оптимизации ядра компилятором. Скачайте репозиторий, выполнив:

git clone https://github.com/graysky2/kernel_gcc_patch.git

Скопируйте файл с патчем в директорию шаблонов ядра:

cp kernel_gcc_patch/enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v4.13+.patch /var/calculate/templates/kernel_gcc_patch

Добавьте заголовок шаблона к патчу:

/var/calculate/templates/kernel/patch/kernel_gcc_patch

# Calculate format=diff env=install ac_install_patch==on&&merge(sys-kernel/calculate-sources)>=4.19
...

Установите исходный код ядра. Параметр --jobs=1 запустит процесс установки в один поток, в логе которого можно увидеть вывод сообщения об успешном применении патча:

USE="-vmlinuz -minimal" emerge -a --jobs=1 sys-kernel/calculate-sources
...
>>> Source configured.
 * Применение патчей Calculate утилитами для calculate-sources ...
 * Применение патча enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v4.13+.patch
 * Утилиты Calculate изменили файлы:
 *      .config
 *      arch/x86/Kconfig.cpu
 *      arch/x86/Makefile
 *      arch/x86/Makefile_32.cpu
 *      arch/x86/include/asm/module.h
>>> Compiling source in /var/calculate/tmp/portage/sys-kernel/calculate-sources-5.4.12/work/linux-5.4.12-calculate ...
...

Выполните настройку ядра, выбрав ваш процессор из нового списка:

cl-kernel

Перейдите в раздел Processor type and features ---> Processor family (Generic-x86-64). Вы увидите, что список доступных CPU существенно расширился.

Скриншот

Linux/x86 Kernel Configuration

После сохранения настроек ядро будет собрано. Патч и обновлённые настройки ядра будут использованы и во время сборки пакета sys-kernel/calculate-sources из исходного кода.

Модули ядра

Модуль ядра - объект, содержащий код, который расширяет функциональность запущенного ядра. Посмотреть загруженные в данный момент модули можно выполнив lsmod. Подробную информацию по модулю можно вывести, выполнив modinfo <имя модуля>. Для того, чтобы модуль ядра подгружался автоматически во время загрузки системы, создайте файл с расширением .conf в директории /etc/modules-load.d в котором перечислите отдельными строками модули и по необходимости параметры к ним. Пример:

/etc/modprobe.d/custom.conf

options <имя модуля> <параметр>=<значение>

Посмотреть список доступных опций модуля можно, используя утилиту modinfo. Пример определения доступных параметров модуля snd-intel8x0:

modinfo -p snd-intel8x0

index:Index value for Intel i8x0 soundcard. (int)
id:ID string for Intel i8x0 soundcard. (charp)
ac97_clock:AC'97 codec clock (0 = whitelist + auto-detect, 1 = force autodetect). (int)
ac97_quirk:AC'97 workaround for strange hardware. (charp)
buggy_semaphore:Enable workaround for hardwares with problematic codec semaphores. (bool)
buggy_irq:Enable workaround for buggy interrupts on some motherboards. (bint)
xbox:Set to 1 for Xbox, if you have problems with the AC'97 codec detection. (bool)
spdif_aclink:S/PDIF over AC-link. (int)
inside_vm:KVM/Parallels optimization. (bint)
enable: (bool)
joystick: (int)

Пример настройки загрузки модуля snd-intel8x0 с установленным значением параметра ac97_clock:

/etc/modprobe.d/snd-intel8x0.conf

options snd-intel8x0 ac97_clock=48000

Для того, чтобы отключить загрузку модулей, добавьте их в файл blacklist.conf. Пример отключения загрузки модуля usblp:

/etc/modprobe.d/blacklist.conf

blacklist usblp

Удаление ядра

При удалении пакета sys-kernel/calculate-sources будет удалено ядро вместе с модулями. Если ядро было собрано при помощи утилиты cl-kernel, в том числе из исходного кода установленного из другого пакета портежей, установленное ядро с модулями будет удалено при удалении этого пакета.

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

/etc/calculate/ini.env

[system]
remove_old_kernel = off

Заметка

При обновлении пакетов утилитой cl-update, старое ядро не будет удаляться, если с него в этот момент загружена система.

Ускорение сборки ядра

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

emerge -a dev-util/ccache

Время сборки ядра 5.4.12 с использованием ccache на тестовом ПК с процессором AMD Ryzen 5 3600 стало занимать 1 м. 25 с. вместо 10 м. 24 с.!