Núcleo/Actualización

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 14% complete.
Outdated translations are marked like this.

Este artículo describe los pasos para actualizar a un nuevo núcleo.

Construir un nuevo núcleo a partir de los nuevos fuentes es básicamente el mismo proceso que el construir un nuevo núcleo cuando se instala el sistema. La diferencia es que se puede partir de la configuración del anterior núcleo para crear la configuración del nuevo. El utilizar la antigua configuración evita que el usuario tenga que recorrer de nuevo todas las opciones del núcleo (como con make menuconfig).

La configuración del núcleo se guarda en un archivo llamado .config en el directorio en el que se almacenan los fuentes del núcleo. Un nuevo núcleo puede tener opciones o características que no tiene un núcleo anterior o puede que ya no tenga una característica u opción que el núcleo anterior aún conserva. La configuración del núcleo especifica si las características y opciones de un núcleo están habilitadas o no, quizá construidas en el propio núcleo o quizás como módulos que se pueden cargar bajo demandan una vez el núcleo está en funcionamiento. Por tanto, el fichero de configuración del nuevo núcleo puede tener nuevas entradas que el fichero de configuración del núcleo antiguo no tiene y también puede que no tenga ya entradas que aún están presentes en el núcleo anterior.

Para tratar con este tipo de cambios en el fichero de configuración, se necesita convertir el fichero de configuración del núcleo antiguo a una configuración que pueda utilizar el nuevo núcleo. Este artículo muestra cómo crear un nuevo núcleo a partir de los nuevos fuentes realizando la conversión adecuada de la configuración del núcleo antiguo.

Kernel upgrade in Gentoo involves these steps:

  1. Install the new kernel sources.
  2. Setting the symlink to the (newly installed) kernel sources.
  3. Moving to the new kernel's folder.
  4. Adjusting the .config file for the options introduced to, or removed from, the new kernel's configuration.
  5. Compiling the kernel and the initramfs.
  6. Updating the bootloader.
  7. Removing or keeping the old kernel.
Importante
It is wise to make a backup of the kernel configuration so that the previous configurations are not lost. Many users devote considerable time to figure out the best configuration for the system, and losing that information is definitely not wanted. One of the ways introduced in Copy the previous kernel configuration of this article can be used for making a backup of the configuration file.

La actualización del núcleo puede ser una buena idea cuando se instalan los fuentes. A veces se instalan los fuentes cuando se actualiza el sistema lanzando la siguiente orden:

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

Desde luego se pueden instalar directamente utilizando la siguiente orden (reemplazar gentoo-sources por hardened-sources cuando se utilice un perfil hardened):

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

Al instalar unos nuevos fuentes del núcleo, no se le ofrece al usuario un nuevo núcleo. Es necesario construir e instalar un nuevo núcleo a partir de los nuevos fuentes y reiniciar el sistema para correr el nuevo núcleo.

Set symlink to new kernel sources

The kernel configuration is saved in a file named .config in the directory that holds the kernel sources, a symlink is used to point to that directory.

El enlace simbólico /usr/src/linux debe siempre apuntar al directorio que contiene los fuentes del nucleo en el que está corriendo. Esto se puede hacer de tres formas distintas:

  1. Instalar los nuevos fuentes del núcleo con USE="symlink"
  2. Ajustar el enlace con eselect
  3. Actualizar el enlace simbólico de forma manual

Definir el enlace on eselect

Para definir el enlace simbólico con eselect:

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

Esto muestra los fuentes del núcleo disponibles. El asterisco indica los fuentes elegidos.

Para cambiar los fuentes del núcleo, por ejemplo a la segunda entrada, se debe hacer los siguiente:

root #eselect kernel set 2

Actuar manualmente el enlace simbólico

Para definir el enlace simbólico manualmente:

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

Instalar los fuentes del núcleo con el ajustes USE para gestionar el enlace simbólico

Esto hará que /usr/src/linux apunte a los nuevos fuentes del núcleo instalados.

En caso de ser necesario, se puede modificar más tarde utilizando uno de los otros dos métodos.

Moving to the new kernel folder

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

user $cd /usr/src/linux
Nota
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.

Adjusting the .config file for the new kernel

Copy the previous kernel configuration

Se necesita copiar la configuración del núcleo antiguo al nuevo. Se puede encontrar en varios sitios:

  • En el sistema de ficheros procfs si la opción del núcleo Enable access to .config through /proc/config.gz se activó en el núcleo actual:
root #zcat /proc/config.gz > /usr/src/linux/.config
root #zcat /proc/config.gz > /usr/src/linux/.config
  • Desde el núcleo anterior. Esto funciona únicamente cuando el antiguo núcleo se compiló con CONFIG_IKCONFIG:
root #/usr/src/linux/scripts/extract-ikconfig /ruta/al/núcleo/anterior >/usr/src/linux/.config
root #/usr/src/linux/scripts/extract-ikconfig /path/to/old/kernel >/usr/src/linux/.config
  • En el directorio /boot si la configuración se instaló allí:
root #cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
root #cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
  • En el directorio del núcleo que está corriendo actualmente:
root #cp /usr/src/linux-3.14.14-gentoo/.config /usr/src/linux/
root #cp /usr/src/linux-3.14.14-gentoo/.config /usr/src/linux/
  • En el directorio /etc/kernels/, si se ha definido SAVE_CONFIG="yes" en /etc/genkernel.conf y se utilizó genkernelpreviamente:
root #cp /etc/kernels/kernel-config-x86_64-3.14.14-gentoo /usr/src/linux/.config
root #cp /etc/kernels/kernel-config-x86_64-3.14.14-gentoo /usr/src/linux/.config

Configure el nuevo núcleo

Nota
Invoking make oldconfig and make menuconfig can be done automatically via genkernel in the build process by enabling the OLDCONFIG and MENUCONFIG parameters in /etc/genkernel.conf. If OLDCONFIG is enabled in genkernel's configuration or if it's going to be enabled by passing --oldconfig option to genkernel command, jump to the build section in this article.

Para utilizar la configuración del núcleo antiguo en el nuevo nucleo, se necesita convertir. La conversión se puede realizar bien usando make silentoldconfig o make olddefconfig. Utilice una u otra pero no ambas.

make silentoldconfig

Importante
make syncconfig has become an internal implementation detail; make oldconfig should be used when possible. The make silentoldconfig target has been removed as of Linux version 4.19 and higher.

La siguiente configuración es igual que la configuración basada en texto con make config. Para nuevas opciones de configuración, se pregunta al usuario para que decida la opción. Por ejemplo:

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

La cadena (NEW) al final de la línea, marca esta opción como nueva. A la izquierda de la cadena entre corchetes se muestran las posibles respuestas: Yes (Sí), no (No), module (Módulo) o ? para mostrar la ayuda. La respuesta recomendada (esto es, la respuesta por defecto) se muestra en mayúsculas (en este caso: Y). La ayuda describe la opción o el controlador.

Lamentablemente, make silentoldconfig no muestra, al lado de la ayuda, más información de cada opción, como el contexto, de modo que a veces es difícil elegir la respuesta adecuada. En este caso, la mejor forma de proceder es recordar el nombre de la opción y revisarla más tarde a través de alguna de las herramientas gráficas de configuración del núcleo.

make olddefconfig

Si se desea ajustar todas la opciones nuevas de configuración a sus valores recomendados (esto es, por defecto) utilizar make olddefconfig:

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

make help

Utilizar make help para ver otros métodos de conversión que están disponibles:

root #make help

Observing the difference

A diff tool can be used to compare the old and new .config files to see what options have been added:

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

And which have been removed:

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++"

Alternatively, the kernel provides a script to cleanly compare two config files even if the options have moved in the file itself:

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

make menuconfig

The options can then be researched and changed if necessary by running:

root #make menuconfig

The menuconfig target is helpful because it safely handles kernel symbol dependency resolution.

Construcción

Importante
Cuando se instalan módulos del núcleo externos (como nvidia o zfs), puede que se necesite lanzar make modules_prepare tal y como se describe abajo antes de construir el núcleo. Algunos módulos no se pueden instalar o preparar antes de construir el núcleo.

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
Nota
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.

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. 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.

ARCHIVO /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-"${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
}

Resolver problemas en la construcción

Cuando tenga problemas mientras está reconstruyendo el núcleo actual, podría ser de utilidad sanear los ficheros fuente del núcleo. Asegúrese de hacer una copia de respaldo del fichero .config ya que esta operación lo eliminará. Asegúrese de no utilizar los sufijos .bak o ~ como indicadores de copia de respaldo ya que make distclean también los eliminará.

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

Update the bootloader

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.

Using grub-mkconfig

The following command can be executed for updating GRUB's configuration file:

root #grub-mkconfig -o /boot/grub/grub.cfg
Advertencia
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.
Consejo
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.

Eliminar núcleos antiguos

Lea el artículo sobre la eliminación del núcleo.

See also

Recursos externos