kexec_load
Section: System Calls (2)
Updated: 5 février 2023
Index
Return to Main Contents
NOM
kexec_load, kexec_file_load - Charger un nouveau noyau pour une exécution
ultérieure
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <linux/kexec.h> /* Définition des constantes KEXEC_* */
#include <sys/syscall.h> /* Définition des constantes SYS_* */
#include <unistd.h>
long syscall(SYS_kexec_load, unsigned long entry,
unsigned long nr_segments, struct kexec_segment *segments,
unsigned long flags);
long syscall(SYS_kexec_file_load, int kernel_fd, int initrd_fd,
unsigned long cmdline_len, const char *cmdline,
unsigned long flags);
Note : la glibc ne fournit pas de fonction autour de cet appel système,
l'utilisation de syscall(2) est requise.
DESCRIPTION
L'appel système kexec_load() charge un nouveau noyau qui peut être
exécuté plus tard avec un reboot(2).
Le paramètre flags est un masque de bits qui contrôle l'opération de
l'appel. Les valeurs suivantes peuvent être spécifiées dans flags :
- KEXEC_ON_CRASH (depuis Linux 2.6.13)
-
Lancer automatiquement le nouveau noyau lors d'un plantage du système. Ce
« crash kernel » est chargé dans une zone de la mémoire réservée définie au
moment de l'amorçage en utilisant le paramètre crashkernel de la ligne de
commande du noyau. L'emplacement de cette mémoire réservée est envoyé à
l'espace utilisateur avec le fichier /proc/iomem, dans une entrée « Crash
kernel ». Une application de l'espace utilisateur peut analyser ce fichier
et préparer une liste de segments (voir ci-dessous) indiquant cette mémoire
réservée en tant que cible. Si ce paramètre est indiqué, le noyau vérifie
que les segments cibles indiqués dans segments tombent dans la région
réservée.
- KEXEC_PRESERVE_CONTEXT (depuis Linux 2.6.27)
-
Préserver le matériel système et les états logiciels avant d'exécuter le
nouveau noyau. Cela pourrait être utilisé pour la mise en veille prolongée
du système. Cet attribut n'est disponible que si le noyau a été configuré
avec CONFIG_KEXEC_JUMP, et n'est effectif que si nr_segments est
strictement positif.
Les bits de poids fort (correspondant au masque 0xffff0000) de flags
contiennent l'architecture du noyau qui est en attente d'exécution. Indiquez
la constante KEXEC_ARCH_DEFAULT pour utiliser l'architecture actuelle, ou
une ou plusieurs (en utilisant l'opérateur OU) des constantes d'architecture
suivantes : KEXEC_ARCH_386, KEXEC_ARCH_68K, KEXEC_ARCH_X86_64,
KEXEC_ARCH_PPC, KEXEC_ARCH_PPC64, KEXEC_ARCH_IA_64,
KEXEC_ARCH_ARM, KEXEC_ARCH_S390, KEXEC_ARCH_SH, KEXEC_ARCH_MIPS
et KEXEC_ARCH_MIPS_LE. L'architecture doit pouvoir être exécutée sur le
processeur du système.
Le paramètre entry est l'adresse du point d'entrée physique dans l'image
noyau. Le paramètre nr_segments est le nombre de segments vers lesquels
pointe le pointeur segments ; le noyau impose une limite (arbitraire) de
16 quant au nombre de segments. Le paramètre segments est un tableau de
kexec_segment structures qui définissent la disposition du noyau :
struct kexec_segment {
void *buf; /* Tampon dans l'espace utilisateur */
size_t bufsz; /* Taille du tampon */
void *mem; /* Adresse physique du noyau */
size_t memsz; /* Taille de l'adresse physique */
};
L'image noyau définie par segments est copiée du processus appelant dans
le noyau, dans la mémoire normale ou réservée (si KEXEC_ON_CRASH est
positionné). Le noyau effectue d'abord divers tests de validité des
informations passées à segments. Si ces tests réussissent, il copie les
données du segment dans la mémoire du noyau. Chaque segment indiqué dans
segments est copié comme suit :
- •
-
buf et bufsz identifient une région de la mémoire dans l'espace
d'adressage virtuel de l'appelant qui est la source de la copie. La valeur
de bufsz ne peut pas excéder celle du champ memsz.
- •
-
mem et memsz indiquent une plage d'adresses physiques cible de la
copie. Les valeurs indiquées dans les deux champs doivent être des multiples
de la taille de page du système.
- •
-
bufsz octets sont copiés du tampon source vers le tampon du noyau
cible. Si bufsz est inférieur à memsz, les octets excédentaires dans
le tampon du noyau sont remis à zéro.
En cas de kexec normal (c'est-à-dire si l'attribut KEXEC_ON_CRASH n'est
pas positionné), les données du segment sont chargées dans n'importe quelle
mémoire disponible et déplacées vers leur destination finale lors du
redémarrage de kexec (par exemple quand la commande kexec(8) est exécutée
avec l'option -e).
En cas de kexec problématique (panic) (c'est-à-dire que l'attribut
KEXEC_ON_CRASH est positionné), les données du segment sont chargées dans
la mémoire réservée au moment de l'appel et, après un plantage, le mécanisme
kexec donne simplement le contrôle à ce noyau.
L'appel système kexec_load() n'est disponible que si le noyau a été
configuré avec CONFIG_KEXEC.
kexec_file_load()
L'appel système kexec_file_load() est équivalent à kexec_load(), mais
il prend un autre ensemble de paramètres. Il lit le noyau à charger à partir
du fichier auquel renvoie le descripteur de fichier kernel_fd et l'initrd
(« initial RAM disk ») à charger à partir du fichier auquel renvoie le
descripteur de fichier initrd_fd. Le paramètre cmdline est un pointeur
vers un tampon contenant la ligne de commande du nouveau noyau. Le paramètre
cmdline_len indique la taille du tampon. Le dernier octet du tampon doit
être un octet NULL ('\0').
Le paramètre flags est un masque de bits qui modifie le comportement de
l'appel. Les valeurs suivantes peuvent être spécifiées dans flags :
- KEXEC_FILE_UNLOAD
-
Décharger le noyau actuellement chargé.
- KEXEC_FILE_ON_CRASH
-
Charger le nouveau noyau dans la région de mémoire réservée au plantage de
noyau (comme pour KEXEC_ON_CRASH). Ce noyau est démarré si le noyau en
cours d'exécution plante.
- KEXEC_FILE_NO_INITRAMFS
-
Le chargement de initrd/initramfs est facultatif. Indiquez cet attribut si
aucun initramfs ne doit être chargé. Si cet attribut est positionné, la
valeur passée à initrd_fd est ignorée.
L'appel système kexec_file_load() a été ajouté pour prendre en charge les
systèmes où le chargement de « kexec » doit être restreint aux noyaux
signés. Cet appel système n'est disponible que si le noyau a été configuré
avec CONFIG_KEXEC_FILE.
VALEUR RENVOYÉE
S'ils réussissent, ces appels système renvoient 0. En cas d'erreur, ils
renvoient -1 et remplissent errno avec l'erreur.
ERREURS
- EADDRNOTAVAIL
-
L'attribut KEXEC_ON_CRASH était indiqué mais la région indiquée par les
champs mem et memsz d'une des entrées de segments va au-delà de la
mémoire réservée au plantage de noyau.
- EADDRNOTAVAIL
-
La valeur du champ mem ou memsz dans une des entrées de segments
n'est pas un multiple de la taille de page du système.
- EBADF
-
kernel_fd ou initrd_fd n'est pas un descripteur de fichier valable.
- EBUSY
-
Un autre plantage du noyau est déjà chargé, ou un plantage du noyau est déjà
utilisé.
- EINVAL
-
flags n'est pas correct.
- EINVAL
-
La valeur du champ bufsz dans une des entrées de segments dépasse la
valeur du champ memsz correspondant.
- EINVAL
-
nr_segments dépasse KEXEC_SEGMENT_MAX (16).
- EINVAL
-
Deux ou plusieurs tampons cibles du noyau se chevauchent.
- EINVAL
-
La valeur de cmdline[cmdline_len-1] n'est pas '\0'.
- EINVAL
-
Le fichier auquel renvoie kernel_fd ou initrd_fd est vide (de longueur
zéro).
- ENOEXEC
-
kernel_fd ne renvoie pas à un fichier ouvert ou le noyau ne peut pas
charger ce fichier. Actuellement, le fichier doit être une bzImage et
contenir un noyau x86 chargeable dans 4 Gio de mémoire (voir le fichier
Documentation/x86/boot.txt des sources du noyau).
- ENOMEM
-
La mémoire n’a pu être allouée.
- EPERM
-
L'appelant n'a pas la capacité CAP_SYS_BOOT.
VERSIONS
L'appel système kexec_load() est apparu dans Linux 2.6.13. L'appel
système kexec_file_load() est apparu dans Linux 3.17.
STANDARDS
Ces appels système sont spécifiques à Linux.
VOIR AUSSI
reboot(2), syscall(2), kexec(8)
Les fichiers Documentation/kdump/kdump.txt et
Documentation/admin-guide/kernel-parameters.txt des sources du noyau.
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- kexec_file_load()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 04:42:29 GMT, May 23, 2024