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

From Gentoo Wiki
< Kernel
Jump to:navigation Jump to:search
This page is a translated version of the page Kernel/Upgrade and the translation is 88% complete.
Other languages:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

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

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

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

Эта статья демонстрирует, как обращаться с такими изменениями файла конфигурации путём конвертации старой конфигурации в конфигурацию, пригодную для нового ядра.

Обновления ядра в Gentoo включает следующие шаги:

  • Шаг 1: Установка нового исходного кода ядра.
  • Шаг 2: Установка символьной ссылки на новый исходный код ядра.
  • Шаг 3: Вход в каталог с новым ядром.
  • Шаг 4: Настройка файла .config для опций, которые были удалены или добавлены в конфигурацию нового ядра.
  • Шаг 5: Сборка ядра и initramfs.
  • Шаг 6: Обновление загрузчика.
  • Шаг 7: Удаление или сохранение старого ядра.


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

Установка нового исходного кода ядра

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

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 должна всегда указывать на каталог, в котором находится исходный код используемого в настоящий момент ядра. Это может быть сделано одним из трех способов:

  1. По умолчанию: Настройка ссылки с помощью eselect
  2. Альтернатива 1: Ручное обновление символьной ссылки
  3. Альтернатива 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. Для новых опций она предоставляет выбор пользователю. Например:

user $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, и установит новые настройки в их рекомендуемое значение (т.е. в значение по умолчанию):

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

make help

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

user $make help

Наблюдение различий

Инструмент diff может быть использован для сравнения старого и нового файла .config, чтобы просмотреть вновь добавленные опции:

user $diff <(sort .config) <(sort .config.old) | awk '/^<.*(=|Linux)/ { $1=""; print }'
CONFIG_64BIT_TIME=y
CONFIG_AMD_NB=y
CONFIG_ARCH_CLOCKSOURCE_INIT=y
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
CONFIG_ARCH_HAS_PTE_DEVMAP=y
CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
CONFIG_ARCH_STACKWALK=y
CONFIG_ARCH_USE_MEMREMAP_PROT=y
CONFIG_BLK_PM=y
CONFIG_CC_CAN_LINK=y
CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_KASAN_GENERIC=y
CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_HYGON=y
CONFIG_CPU_SUP_ZHAOXIN=y
CONFIG_CRYPTO_LIB_AES=y
CONFIG_CRYPTO_LIB_ARC4=y
CONFIG_CRYPTO_LIB_DES=y
CONFIG_CRYPTO_LIB_SHA256=y
CONFIG_DEBUG_MISC=y
CONFIG_DRM_I915_FORCE_PROBE=""
CONFIG_DRM_I915_SPIN_REQUEST=5
CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250
CONFIG_DYNAMIC_EVENTS=y
CONFIG_EFI_EARLYCON=y
CONFIG_GCC_PLUGINS=y
CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
CONFIG_HAVE_ARCH_STACKLEAK=y
CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_EISA=y
CONFIG_HAVE_FAST_GUP=y
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
CONFIG_HAVE_GENERIC_VDSO=y
CONFIG_HAVE_MOVE_PMD=y
CONFIG_HAVE_PCI=y
CONFIG_INIT_STACK_NONE=y
CONFIG_IO_URING=y
CONFIG_KASAN_STACK=1
CONFIG_LEDS_TRIGGER_AUDIO=y
CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m
CONFIG_NET_VENDOR_GOOGLE=y
CONFIG_NET_VENDOR_MICROCHIP=y
CONFIG_NET_VENDOR_PENSANDO=y
CONFIG_NET_VENDOR_XILINX=y
CONFIG_NF_NAT=m
CONFIG_NF_NAT_MASQUERADE=y
CONFIG_NVMEM_SYSFS=y
CONFIG_OPTIMIZE_INLINING=y
CONFIG_POWER_SUPPLY_HWMON=y
CONFIG_PROC_PID_ARCH_STATUS=y
CONFIG_SKB_EXTENSIONS=y
CONFIG_SND_INTEL_NHLT=y
CONFIG_UBSAN_ALIGNMENT=y
CONFIG_UNIX_SCM=y
CONFIG_USB_AUTOSUSPEND_DELAY=2
CONFIG_X86_ACPI_CPUFREQ_CPB=y
CONFIG_X86_MCE_AMD=y
# end of Gentoo Linux
# Linux/x86 5.4.0-gentoo Kernel Configuration

И какие были удалены:

user $diff <(sort .config) <(sort .config.old) | awk '/^>.*(=|Linux)/ { $1=""; print }'
CONFIG_ANON_INODES=y
CONFIG_ARCH_DISCARD_MEMBLOCK=y
CONFIG_ARCH_HAS_SG_CHAIN=y
CONFIG_ARCH_HAS_ZONE_DEVICE=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARM_GIC_MAX_NR=1
CONFIG_AUDIT_TREE=y
CONFIG_AUDIT_WATCH=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_DEFAULT_CFQ=y
CONFIG_DEFAULT_IO_DELAY_TYPE=0
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_DEFAULT_SECURITY=""
CONFIG_DMA_DIRECT_OPS=y
CONFIG_FB_BACKLIGHT=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
CONFIG_HAVE_GENERIC_GUP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_IA32_AOUT=y
CONFIG_INET6_XFRM_MODE_BEET=y
CONFIG_INET6_XFRM_MODE_TRANSPORT=y
CONFIG_INET6_XFRM_MODE_TUNNEL=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_INET_XFRM_MODE_TUNNEL=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IOSCHED_CFQ=y
CONFIG_IOSCHED_NOOP=y
CONFIG_MAY_USE_DEVLINK=y
CONFIG_NO_BOOTMEM=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_DEV_DMA_OPS=y
# Linux/x86 4.19.86-gentoo Kernel Configuration

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

user $/usr/src/linux/scripts/diffconfig .config.old .config

make menuconfig

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

root #make menuconfig

Цель menuconfig полезна тем, что она безопасно управляет зависимостями опций от других опций.

Сборка

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

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

Автоматическая сборка и установка

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() {
# Eselect the new kernel or genkernel will build the current one
	eselect kernel set linux-"${PV}"-gentoo
	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 --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 --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 --kernel-config="${EROOT}/tmp/genkernel.config" all
		rm "${EROOT}/tmp/genkernel.config"
# No valid configs known, compile a clean one
	else
		genkernel all
	fi
}

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

Заметка
Этап modules_prepare не требуется, если вы собираете всё ядро, так как эта функция выполняется как часть этого процесса обычной сборки.

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

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

Обновление загрузчика

The upgraded and built kernel needs to be set up and eventually a bootloader or boot item updated, see Kernel/Configuration#Setup. Users of Grub can use the method below, users of other bootloaders must consult the handbook.

After making 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

Using systemd-boot-gen to update systemd-boot UEFI configuration

Предупреждение
Installing from the cargo, the Rust package manager, should be done at one's own risk. The Gentoo project cannot what is built from it and could contain security risks particularly at the bootloader level. This could mean installing a rootkit if compromised. Proceed with the following section with caution.

Manual installation of systemd-boot-gen:

user $cargo install systemd-boot-gen

Copy the kernel parameters to /etc/default/cmdline, the file should contain:

Файл /etc/default/cmdline
CMDLINE="<kernel command line parameters>"

И запустите, используя права администратора:

user $sudo ~/.cargo/bin/systemd-boot-gen

This will generate the boot configuration in /boot/loader/entries/ for all the available /boot/vmlinuz-* that have a matching /boot/initramfs-*.

Сохранение или удаление старого ядра

Сохранение старого исходного кода ядра

Исходные коды ядра постепенно становятся неподдерживавыми. Некоторым пакетам необходим текущий код для сборки. Чтобы защитить новую версию от удаления с помощью depclean, можно добавить его в набор world (файл /var/lib/portage/world) так:

root #emerge --noreplace sys-kernel/gentoo-sources:здесь.новая.версия

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

root #emerge --deselect sys-kernel/gentoo-sources:здесь.ненужная.версия

Удаление старого ядра

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

Смотрите также

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