Ядро/Обновление
Эта статья описывает шаги необходимые для обновления ядра Linux.
Сборка нового ядра из свежего исходного кода является практически тем же процессом, как и во время установки системы. Разница заключается в том, что для экономии времени можно конвертировать конфигурацию от старого ядра под изменения, сделанные в новом ядре, вместо того, чтобы снова устанавливать все опции (например, с помощью make menuconfig).
В новом ядре могут быть опции или возможности, которых нет в старом ядро, или наоборот, из нового ядра могут быть убраны некоторые из опций, которые были в старом ядре. Поэтому в конфигурационном файле нового ядра могут быть новые опции, которые отсутствуют в конфигурационном файле старого ядра, или некоторых опций больше нет в новом ядре, но они присутствовали в конфигурационном файле старого ядра.
Эта статья демонстрирует, как обращаться с такими изменениями файла конфигурации путём конвертации старой конфигурации в конфигурацию, пригодную для нового ядра.
Обновления ядра в Gentoo включает следующие шаги:
- Установка нового исходного кода ядра.
- Установка символьной ссылки на (недавно установленный) исходный код ядра.
- Вход в каталог с новым ядром.
- Настройка файла .config для параметров, которые были удалены или добавлены в конфигурацию нового ядра.
- Сборка ядра и initramfs.
- Обновление загрузчика.
- Удаление или сохранение старого ядра.
Разумно будет сделать резервную копию конфигурации ядра, чтобы не потерять предыдущую конфигурацию. Многие пользователи потратили много времени на поиск оптимальной конфигурации системы, и терять эту информацию им точно не хочется. Для создания такой резервной копии вы можете использовать один из способов в разделе про копирование предыдущей конфигурации ядра.
Установка нового исходного кода ядра
Для обновление ядра в начале нужно установить новый исходный код ядра. Этот исходный код иногда устанавливается в результате обновления системы при запуске следующей команды:
root #
emerge --ask --update --deep --with-bdeps=y --newuse @world
Конечно, исходный код ядра можно установить напрямую, используя команду (замените gentoo-sources на любую версию ядра, которую используете):
root #
emerge --ask --update --deep --with-bdeps=y --newuse sys-kernel/gentoo-sources
Установка нового исходного кода ядра не дает пользователю обновленное ядро. Новый исходный код нужно собрать в новое ядро и установить, а затем перезапустить систему.
Установка символьной ссылки на новый исходный код ядра
Конфигурация ядра сохранена в файле .config, в каталоге с исходным кодом ядра.
Символьная ссылка /usr/src/linux должна всегда указывать на каталог, в котором находится исходный код используемого в настоящий момент ядра. Это может быть сделано одним из трех способов:
- По умолчанию: Настройка ссылки с помощью eselect
- Альтернатива 1: Ручное обновление символьной ссылки
- Альтернатива 2: Установка исходного кода ядра с
USE="symlink"
По умолчанию: Настройка символьной ссылки с помощью eselect
Для настройки символьной ссылки с помощью eselect:
user $
eselect kernel list
Available kernel symlink targets: [1] linux-3.14.14-gentoo * [2] linux-3.16.3-gentoo
Это вывод доступных исходных кодов ядра. Звездочка указывает на выбранный исходный код.
Для выбора исходного кода ядра, например, второго в списке, выполните:
root #
eselect kernel set 2
Альтернатива 1: Изменение символьной ссылки вручную
Для изменения символьной ссылки вручную:
root #
ln -sf /usr/src/linux-3.16.3-gentoo /usr/src/linux
user $
ls -l /usr/src/linux
lrwxrwxrwx 1 root root 19 Oct 4 10:21 /usr/src/linux -> linux-3.16.3-gentoo
Альтернатива 2: Установка исходного кода ядра с USE-флагом symlink
Это заставит /usr/src/linux ссылаться на свежеустановленный исходный код ядра.
Если необходимо, это можно изменить одним из двух методов.
Переход в каталог с новым ядром
После того, как была изменена символьная ссылка, смените рабочую директорию на каталог с новым ядром.
user $
cd /usr/src/linux
Эта команда необходима, даже если вы уже находились в каталоге /usr/src/linux, когда изменялась символьная ссылка. Пока вы не перезайдете в каталог, консоль всё ещё будет в каталоге старого ядра.
Конвертация файла .config для нового ядра
Копирование предыдущей конфигурации ядра
Конфигурацию от старого ядра необходимо скопировать в каталог с новым. Старую конфигурацию можно найти в нескольких местах:
- В файловой системе procfs, если параметр ядра Enable access to .config through /proc/config.gz был включен в работающем на данный момент ядре:
root #
zcat /proc/config.gz > /usr/src/linux/.config
- Из старого ядра. Такое будет работать только в случае, если старое ядро было собрано с CONFIG_IKCONFIG:
root #
/usr/src/linux/scripts/extract-ikconfig /path/to/old/kernel >/usr/src/linux/.config
- В каталоге /boot, если туда был установлен конфигурационный файл:
root #
cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
- В каталоге ядра, которое работает на данный момент:
root #
cp /usr/src/linux-3.14.14-gentoo/.config /usr/src/linux/
- В каталоге /etc/kernels/, если
SAVE_CONFIG="yes"
настроено в /etc/genkernel.conf и ядро было собрано с помощью genkernel:
root #
cp /etc/kernels/kernel-config-x86_64-3.14.14-gentoo /usr/src/linux/.config
Обновление файла .config
Комманды make oldconfig и make menuconfig могут вызываться автоматически с помощью genkernel во время сборки, если вы включите параметры OLDCONFIG и MENUCONFIG в файле /etc/genkernel.conf. Если вы включили параметр OLDCONFIG в конфигурации genkernel или с помощью параметра --oldconfig комманды genkernel, перейдите к разделу с сборкой.
Новое ядро обычно требует новый файл .config для поддержки новых опций ядра. Файл .config с предыдущего ядра может быть сконвертирован для использования новым ядром. Конвертация может быть выполнена несколькими способами, например, с помощью команд make oldconfig или make olddefconfig.
make oldconfig
make syncconfig стал частью внутреннего устройства; по возможности используйте make oldconfig. make silentoldconfig был удален, начиная с ядра Linux версии 4.19.
Следующая конфигурация похожа на текстовый интерфейс из make config. Для новых опций она предоставляет выбор пользователю. Например:
root #
cd /usr/src/linux
root #
make oldconfig
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] (NEW)
Надпись (NEW) в конце строки означает, что это новая опция. В левой части, в квадратных скобках, указаны возможные ответы: Yes, no, module или ? для справки. Рекомендуемый ответ (т.е. по умолчанию) написан большими буквами (здесь Y). В справке дано пояснение к опции или драйверу.
К сожалению, make oldconfig не дает исчерпывающей информации для каждой опции, так что иногда трудно выбрать правильный ответ. В этом случае, лучше запомнить название параметра и найти его позже с помощью одного из инструментов конфигурации ядра. Для просмотра списка новых опций, используйте make listnewconfig перед make oldconfig.
make olddefconfig
make olddefconfig оставит все настройки с старого файла .config, и установит новые настройки в их рекомендуемое значение (т.е. в значение по умолчанию):
root #
cd /usr/src/linux
root #
make olddefconfig
make help
Используйте make help для просмотра других доступных методов преобразования конфиг файла:
user $
make help
Наблюдение различий
Инструмент diff может быть использован для сравнения старого и нового файла .config, чтобы просмотреть вновь добавленные опции:
user $
comm -2 -3 <(sort .config) <(sort .config.old)
# CONFIG_BATTERY_RT5033 is not set # Compiler: gcc (Gentoo 12.2.1_p20230428-r1 p2) 12.2.1 20230428 # Linux/x86 4.19.284-gentoo Kernel Configuration CONFIG_ARCH_USE_MEMREMAP_PROT=y CONFIG_GCC_VERSION=120201 CONFIG_GENTOO_PRINT_FIRMWARE_INFO=y CONFIG_INET_TABLE_PERTURB_ORDER=16 CONFIG_PLUGIN_HOSTCC="" CONFIG_RANDOM_TRUST_BOOTLOADER=y CONFIG_UNIX_SCM=y CONFIG_USER_NS=y
И какие были удалены:
user $
comm -1 -3 <(sort .config) <(sort .config.old)
# CONFIG_GCC_PLUGINS is not set # CONFIG_NVM is not set # CONFIG_RANDOM_TRUST_CPU is not set # CONFIG_USER_NS is not set # Compiler: gcc (Gentoo 10.2.0-r5 p6) 10.2.0 # Linux/x86 4.19.184-gentoo Kernel Configuration CONFIG_GCC_VERSION=100200 CONFIG_PLUGIN_HOSTCC="g++"
Так же, ядро предоставляет скрипт для точного сравнения двух файлов, даже, если опции уже были добавлены в файл:
user $
/usr/src/linux/scripts/diffconfig .config.old .config
После этого опции могут быть изучены и изменены при необходимости коммандой:
root #
make menuconfig
Цель menuconfig полезна тем, что она безопасно управляет зависимостями опций от других опций.
Сборка
Ручная сборка и установка
Having configured the new kernel as described in the previous sections, if external kernel modules are installed (like nvidia or zfs), it may be necessary to prepare them before building the new kernel, and then to rebuild the modules with the newly built kernel:
root #
make modules_prepare
root #
make
root #
emerge --ask @module-rebuild
Using the
-jN
option with make
(where N
is the number of parallel jobs) can speed up the compilation process on multi-threaded systems. For example, make -j5
on a system with four logical cores.Having built both the kernel and the modules, both should be installed:
root #
make modules_install
root #
make install
Finally, the bootloader must be reconfigured to account for the new kernel filenames, as described below. initramfs must be rebuilt if one is used as well.
Автоматическая сборка и установка
It is possible to automatically build and install the newly emerged kernel using Portage hooks. While other approaches are also possible, the following is based on genkernel and gentoo-sources package. It requires the following prerequisites:
- genkernel all is able to build and install the kernel to which the /usr/src/linux symlink points into
$BOOTDIR
and the bootloader. - The
symlink
use flag is set for the kernel ebuild.
If those are fulfilled, simply install a post_pkg_postinst
Portage hook as shown below. Keep in mind this calls genkernel with --no-module-rebuild
, since using module-rebuild would run emerge in emerge, and result in a deadlock waiting on the lock file. Remember to run emerge @module-rebuild
after any update that includes a kernel upgrade.
post_pkg_postinst() {
# Eselect the new kernel or genkernel will build the current one
eselect kernel set linux-"${KV}"
CURRENT_KV=$(uname -r)
# Check if genkernel has been run previously for the running kernel and use that config
if [[ -f "${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" ]] ; then
genkernel --no-module-rebuild --kernel-config="${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" all
# Use latest kernel config from current kernel
elif [[ -f "${EROOT}/usr/src/linux-${CURRENT_KV}/.config" ]] ; then
genkernel --no-module-rebuild --kernel-config="${EROOT}/usr/src/linux-${CURRENT_KV}/.config" all
# Use known running good kernel
elif [[ -f /proc/config.gz ]] ; then
zcat /proc/config.gz >> "${EROOT}/tmp/genkernel.config"
genkernel --no-module-rebuild --kernel-config="${EROOT}/tmp/genkernel.config" all
rm "${EROOT}/tmp/genkernel.config"
# No valid configs known, compile a clean one
else
genkernel --no-module-rebuild all
fi
}
Решение проблем сборки
Если возникают проблемы при пересборке текущего ядра, то может помочь очистка исходного кода ядра. Удостоверьтесь, что сохранили файл .config, так как данная операция удалит его. Удостоверьтесь, что не используется окончание файла .bak или ~ для бэкапа, так как make distclean очищает и такие файлы.
root #
cp .config /usr/src/kernel_config_bk
root #
make distclean
root #
mv /usr/src/kernel_config_bk .config
Обновление загрузчика
The upgraded and installed kernel must be registered with the bootloader or directly with the UEFI firmware, see Kernel/Configuration. Users of GRUB can use the method below, users of other bootloaders must consult the Handbook.
Make sure /boot partition is mounted.
Использование grub-mkconfig
The following command can be executed for updating GRUB's configuration file:
root #
grub-mkconfig -o /boot/grub/grub.cfg
If GRUB itself was upgraded (besides the kernel), for instance as part of a world set upgrade, it is necessary to also re-install GRUB, otherwise it may not boot. See GRUB#GRUB Bootloader Installation for details.
By enabling the grub USE flag on sys-kernel/installkernel grub-mkconfig will be regenerated automatically every time a new kernel is installed.
Systemd-boot
A systemd-boot configuration file for the new kernel is generated automatically when the kernel is installed. No manual action is required.
Удаление старого ядра
Смотрите статью Удаление ядра.
Смотрите также
- Genkernel — утилита созданная Gentoo, которая используется для автоматизации процесса сборки ядра и initramfs.
- Dracut — an initramfs infrastructure and aims to have as little as possible hard-coded into the initramfs.
- Kernel/Configuration — описывает ручную конфигурацию и настройку ядра Linux.
- Обновление GRUB на новое ядро