Kernel/Aggiornamento
Questo articolo descrive la procedura per l'aggiornamento ad una nuova versione del kernel Linux.
La generazione di un nuovo kernel dalla nuova sorgente è lo stesso processo di creazione di un kernel durante l'installazione del sistema. La differenza è che si potrebbe usare la configurazione del vecchio kernel per creare la configurazione del nuovo kernel. L'uso della vecchia configurazione permette l'utente di evitare di esplorare tutte le opzioni del kernel nuovamente (come make menuconfig)
La configurazione del kernel è salvata in un file nominato .config nella directory che contiene il kernel stesso. Un nuovo kernel potrebbe aver avuto opzioni o funzionalità aggiunte o rimosse dal vecchio kernel. La configurazione del kernel specifica se una funzionalità del kernel debba essere attivata o meno, forse integrato nel kernel, o forse costruito come moduli che possono essere caricati nel kernel in esecuzione su richiesta. Quindi il file di configurazione di un nuovo kernel potrebbe avere nuove voci di configurazioni non presenti nel vecchio kernel, e potrebbe non avere alcune voci presenti invece nel file di configurazione del vecchio kernel.
Per far fronte a tali cambiamenti del file di configurazione, il file di configurazione del vecchio kernel deve essere convertito in una configurazione utilizzabile con il nuovo. Questo articolo mostra come creare un nuovo kernel dalla nuova sorgente del kernel con la conversione del file di configurazione provenienti dal vecchio kernel.
Kernel upgrade in Gentoo involves these steps:
- Install the new kernel sources.
- Setting the symlink to the (newly installed) kernel sources.
- Moving to the new kernel's folder.
- Adjusting the .config file for the options introduced to, or removed from, the new kernel's configuration.
- Compiling the kernel and the initramfs.
- Updating the bootloader.
- Removing or keeping the old kernel.
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.
Installazione
L'aggiornamento del kernel potrebbe essere una buona idea quando delle nuove sorgenti sono state rilasciate. Le nuove sorgenti del kernel sono a volte installati durante l'aggiornamento del sistema tramite il seguente comando
root #
emerge --ask --update --deep --with-bdeps=y --newuse @world
Ovviamente le sorgenti del kernel possono essere installate direttamente usando il seguente comando (si sostituisca "gentoo-sources" con qualunque versione del kernel che è in uso):
root #
emerge --ask --update --deep --with-bdeps=y --newuse sys-kernel/gentoo-sources
L'installazione di nuove sorgenti del kernel non fornisce all'utente un nuovo kernel. E' necessario produrre ed installare un nuovo kernel dalla nuova sorgente e quindi riavviare il sistema per eseguire effettivamente il nuovo kernel.
Configurazione
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.
Il link simbolico/usr/src/linux dovrebbe sempre puntare alla directory contenente la sorgente del kernel attualmente in esecuzione. Questo può essere fatto in uno dei tre dei seguenti modi:
- Installare la sorgente del kernel con
USE="symlink"
- Impostare il link con eselect
- Aggiornare manualmente il link simbolico
Configurazione del link con eselect
Per impostare il link simbolico con eselect:
root #
eselect kernel list
Available kernel symlink targets: [1] linux-3.14.14-gentoo * [2] linux-3.16.3-gentoo
Questo comando genera la lista dei kernel disponibili. L'asterisco indica quale sia la directory della sorgente selezionata.
Per cambiare la sorgente del kernel, per esempio alla seconda voce:
root #
eselect kernel set 2
Aggiornamento manuale del link simbolico
Per impostare il link simbolico manualmente:
root #
ln -sf /usr/src/linux-3.16.3-gentoo /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
Installare la sorgente del kernel con la USE flag "symlink"
Questo implicherà che /usr/src/linux punti alla directory della sorgente del nuovo kernel.
Se necessario, il link può essere comunque modificato successivamente con uno degli altri due metodi.
Spostarsi nella nuova cartella
Ora che il link simbolico è stato modificato, cambia la directory di lavoro nella nuova cartella del kernel.
root #
cd /usr/src/linux
Questo comando è ancora necessario anche se la directory di lavoro era già /usr/src/linux quando il collegamento simbolico è stato modificato. Fino a quando il nuovo collegamento simbolico non verrà effettivamente seguito, la console sarà ancora nella directory del vecchio kernel.
Adjusting the .config file for the new kernel
Copy the previous kernel configuration
La configurazione del precedente kernel necessita di essere copiata nella cartella della sorgente del nuovo kernel. Oltre alla copia di backup che è stata salvata in /root in un passaggio precedente, la vecchia configurazione può essere trovata in diversi punti:
- Nel filesystem procfs, se l'opzione Enable access to .config through /proc/config.gz(CONFIG_IKCONFIG_PROC) è stata attivata nel kernel attualmente in esecuzione:
root #
zcat /proc/config.gz > /usr/src/linux/.config
root #
zcat /proc/config.gz > /usr/src/linux/.config
- Dal vecchio kernel. Questo funziona solo quando il vecchio kernel è stato compilato con CONFIG_IKCONFIG:
root #
/usr/src/linux/scripts/extract-ikconfig /path/to/old/kernel >/usr/src/linux/.config
root #
/usr/src/linux/scripts/extract-ikconfig /path/to/old/kernel >/usr/src/linux/.config
- Nella directory /boot, se la configurazione è stata precedentemente installata in questa posizione:
root #
cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
root #
cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
- Nella directory del kernel attualmente in esecuzione:
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/
- Nella directory /etc/kernels/, se l'opzione
SAVE_CONFIG="yes"
è impostata nel file /etc/genkernel.conf e genkernel è stato utilizzato in precedenza:
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
file.config
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.
Per usare la configurazione di un vecchio kernel con uno nuovo, è necessario che questa sia prima convertita. La conversione può essere effettuata eseguendo make silentoldconfig oppure, in alternativa, make olddefconfig.
make silentoldconfig
make silentoldconfig è stato rimosso a partire dalla versione 4.19 di Linux, e verrà sostituito da make syncconfig.
La seguente configurazione è come la configurazione basata su testo con make config. Per le nuove opzioni di configurazione, viene richiesta una decisione all'utente. Per esempio:
root #
cd /usr/src/linux
root #
make silentoldconfig
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] (NEW)
La stringa "(NEW)"" alla fine della linea sottolinea che questa opzione è nuova. Nelle parentesi quadre a sinistra della stringa ci sono le possibili risposte Yes (Sì), no (o), module (modulo) oppure ? per visualizzare l'aiuto. La risposta raccomandata (default) è in maiuscolo (in questo caso Y). L'aiuto riporta spiegazioni sull'opzione o sul driver.
Sfortunatamente make silentoldconfig non mostra molte informazioni per ogni opzione, come il contesto, e qualche volta è difficoltoso dare la giusta risposta. In questo caso, la migliore strada è ricordare il nome dell'opzione e ricontrollarla successivamente tramite uno dei strumenti grafici di configurazione del kernel.
make olddefconfig
Se tutte le nuovi opzioni di configurazioni possono essere impostate con il loro valore raccomandato (default) allora è possibile usare make olddefconfig:
root #
cd /usr/src/linux
root #
make olddefconfig
make help
E' possibile usare make help per vedere gli altri metodi di conversione:
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
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.
Compilazione
Quando moduli esterni sono installati (come nvidia o zfs), è necessario eseguire make modules_prepare come descritto in sotto prima di generare il kernel. Alcuni moduli non possono essere installati o preparati prima che il kernel sia stato generato.
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
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.
Creazione e installazione automatizzate
È possibile compilare e installare automaticamente il kernel appena installato utilizzando gli hook di Portage. Sebbene siano possibili anche altri approcci, quanto segue è basato sul pacchetto genkernel e gentoo-sources. Richiede i seguenti prerequisiti:
- genkernel all è in grado di compilare e installare il kernel a cui il link simbolico /usr/src/linux punta a
$BOOTDIR
e al bootloader. - Il use flag
symlink
è impostata per l'ebuild del kernel.
Se questi sono soddisfatti, installa semplicemente l'hook di Portage post_pkg_postinst
come mostrato di seguito.
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
}
Risoluzione dei problemi di generazione
Quando si stanno sperimentando problemi durante la ricompilazione del kernel corrente, è potrebbe essere d'aiuto sanificare la sorgente del kernel. Ci si assicuri prima di creare un backup del file .config dato che l'operazione lo elminerà. Ci si assicuri inoltre di non usare suffissi come .bak o ~ dato che make distclean eliminerà anche questi.
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
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.
Rimozione
Si veda l'articolo Rimozione del kernel.