Ядро/Обновление

From Gentoo Wiki
< Kernel
Jump to: navigation, search
This page is a translated version of the page Kernel/Upgrade and the translation is 100% complete.

Other languages:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

Эта статья описывает шаги необходимые для обновления ядра.

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

root #emerge --ask --update --deep --with-bdeps=y --newuse @world

Конечно, исходный код ядра можно установить напрямую, используя команду (замените gentoo-sources на hardened-sources, если используется профиль hardened):

root #emerge --ask --update --deep --with-bdeps=y --newuse sys-kernel/gentoo-sources

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

Сборка нового ядра из свежего исходного кода является практически тем же процессом, как и во время установки системы. Разница заключается в том, что можно использовать конфигурацию от старого ядра для создания конфигурации для нового ядра. Использование старой конфигурации избавляет пользователя от повторной установки необходимых опций (например, с помощью make menuconfig).

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

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

Создание резервной копии текущей конфигурации ядра

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

Очень просто создать резервную копию конфигурации текущего ядра:

root #cd /usr/src/linux
root #cp .config ~/kernel-config-`uname -r`

При условии, что символьная ссылка на исходный код ядра была установлена правильно, эта команда копирует конфигурацию используемого ядра в домашний каталог root, переименовывая файл конфигурации в kernel-config- с подстановкой версии запущенного ядра Linux.

Configuration

Установка символьной ссылки на новый исходный код ядра

Символьная ссылка /usr/src/linux всегда должна указывать на каталог в котором находится исходный код используемого в настоящий момент ядра. Это может быть сделано одним из трех способов:

  1. Установка исходного кода ядра с USE="symlink"
  2. Настройка ссылки с помощью eselect
  3. Ручное обновление символьной ссылки

Установка исходного кода ядра с USE-флагом symlink

Это заставит /usr/src/linux ссылаться на свежеустановленный исходный код ядра.

Если необходимо, это можно изменить одним из двух методов.

Настройка символьной ссылки с помощью eselect

Для настройки символьной ссылки с помощью eselect:

root #eselect kernel list
Available kernel symlink targets:
 [1] linux-3.14.14-gentoo *
 [2] linux-3.16.3-gentoo

Это вывод доступных исходных кодов ядра. Звездочка указывает на выбранный исходный код.

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

root #eselect kernel set 2

Изменение символьной ссылки вручную

Для изменения символьной ссылки вручную:

root #ln -sf /usr/src/linux-3.16.3 /usr/src/linux
root #ls -l /usr/src/linux
lrwxrwxrwx 1 root root 19 Oct  4 10:21 /usr/src/linux -> linux-3.16.3-gentoo

Moving to the new folder

Now that the symbolic link has been modified, change the working directory to the new kernel folder.

root #cd /usr/src/linux
Заметка
This command is still necessary even if the working directory was already /usr/src/linux when the symlink was modified. Until the new symlink is actually followed, the console will still be in the old kernel's directory.

Копирование предыдущей конфигурации ядра

Конфигурацию от старого ядра необходимо скопировать в новое. Ее можно найти в нескольких местах:

  • В файловой системе 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

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

Чтобы использовать старую конфигурацию для нового ядра, ее нужно конвертировать. Конвертация может быть выполнена с помощью запуска make silentoldconfig или make olddefconfig. Используйте одну из них.

make silentoldconfig

Важно
make silentoldconfig is being removed as of linux version 4.19, it will be replaced by make syncconfig.

Следующая конфигурация похожа на текстовый интерфейс из make config. Для новых опций она предоставляет выбор пользователю. Например:

root #cd /usr/src/linux
root #make silentoldconfig
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] (NEW)

(NEW) в конце строки отмечает эту опцию как новую. В левой части, в квадратных скобках, указаны возможные ответы: Yes, no, module или ? для справки. Рекомендуемый ответ (т.е. по умолчанию) написан большими буквами (здесь Y). В справке дано пояснение к опции или драйверу.

К сожалению, make silentoldconfig не дает исчерпывающей информации для каждой опции, так что иногда трудно выбрать правильный ответ. В этом случае, лучше запомнить название параметра и найти его позже с помощью одного из инструментов конфигурации ядра.

make olddefconfig

Если новые опции должны быть оставлены как они рекомендуются (по умолчанию), то тогда используйте make olddefconfig:

root #cd /usr/src/linux
root #make olddefconfig

make help

Используйте make help для просмотра других доступных методов преобразования конфиг файла:

root #make help

Компиляция

Важно
Когда установлены внешние модули ядра (например, nvidia или zfs), возможно, необходимо выполнить make modules_prepare, как написано ниже, перед тем, как собрать ядро. Некоторые модули не могут быть установлены или подготовлены до того, как будет собрано ядро.
Важно
Не забудьте перенастроить bootloader для нового ядра, и пересобрать initramfs, если он используется.

На этом шаге следуйте инструкциям статьи ручная конфигурация.

Automated build and installation

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:

  1. genkernel all is able to build and install the kernel to which the /usr/src/linux symlink points into $BOOTDIR and the bootloader.
  2. 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.

Файл /etc/portage/env/sys-kernel/gentoo-sourcesAutomated kernel build and installation portage hook
post_pkg_postinst() {
	CURRENT_KV=$(uname -r)
	# Check to see 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 --kernel-config="${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" all
	elif [[ -f "${EROOT}/usr/src/linux-${CURRENT_KV}/.config" ]] ; then # Use latest kernel config from current kernel
		genkernel --kernel-config="${EROOT}/usr/src/linux-${CURRENT_KV}/.config" all
	elif [[ -f /proc/config.gz ]] ; then # Use known running good kernel
		zcat /proc/config.gz >> "${EROOT}/tmp/genkernel.config"
		genkernel --kernel-config="${EROOT}/tmp/genkernel.config" all
		rm "${EROOT}/tmp/genkernel.config"
	else # No valid configs known
		genkernel all
	fi
}

Переустановка внешних модулей ядра

Заметка
The modules_prepare step is not required if building an entire kernel as this function is done as part of the standard process.

Все внешние модули ядра, такие как binary kernel modules, необходимо перекомпилировать для каждого нового ядра. Если ядро еще не собрано, оно должно сперва быть подготовлено для компиляции его внешних модулей:

root #make modules_prepare

Пакеты с модулями ядра можно пересобрать заново, используя набор @module-rebuild:

root #emerge --ask @module-rebuild

Решение проблем сборки

Если возникают проблемы при пересборке текущего ядра, то может помочь очистка исходного кода ядра. Удостоверьтесь, что сохранили файл .config, так как данная операция удалит его. Удостоверьтесь, что не используется окончание файла .bak или ~ для бэкапа, так как make distclean очищает и такие файлы тоже.

root #cp .config /usr/src/kernel_config_bk
root #make distclean
root #mv /usr/src/kernel_config_bk .config

Удаление старых ядер

Смотрите статью удаление ядра.

See also

  • Genkernel — утилита созданная Gentoo, которая используется для автоматизации процесса сборки ядра и initramfs.

Внешние ресурсы