Chargez un noyau linux sans reboot avec kexec

Thierry Gayet
Thierry GayetCTO chez AMA R&D en AMA R&D

Chargez un noyau linux sans reboot avec kexec

Chargez
un
nouveau
noyau
linux à chaud avec kexec
Thierry GAYET
http://www.nextinnovation.org

Qui n'a jamais souhaité pouvoir tester un noyau à chaud sans avoir à
rebooter physiquement son système pour minimiser le temps mort
du au redémarrage d'un système.

1. Introduction
Le nom « kexec » provient de l'exécution du noyau, dérivé de l'appel du noyau exec Unix / Linux.
C'est un mécanisme du noyau Linux qui permet le démarrage «à chaud» d'un nouveau noyau
« sur » le noyau en cours d'exécution.
En effet, il permet donc de sauter plusieurs étape :
•

phase d'initialisation du matériel par le microprogramme du système : BIOS, BIOS UEFI,
coreboot (aka linuxBios) ;

•

différents tests sur le matériel :
◦ mémoire vive ;
◦ périphériques de stockages ou mass-storage (disques RAID, … ) ;
◦ ...

•

bootloader grub ou autre

Il charge donc directement le nouveau noyau en mémoire, et commence à s'exécuter
immédiatement après. Cela permet d'éviter de longs délais associés à un redémarrage complet, et
peut aider les systèmes à répondre aux exigences de haute disponibilité en minimisant les temps
d'arrêt.
Cela fonctionne sur des serveurs de grosses capacités (mémoire, disques, etc), et même sur
certain ordinateurs de bureau ou portables.

2. Installation
Tout comme cela peut être fait habituellement, les binaires de kexec sont disponible dans la
majorité des repos de packages. Kexec est fournis par le paquet “kexec-tools” :
$ apt-cache search kexec
[sudo] password for tgayet:
kexec-tools - tools to support fast kexec reboots
mkelfimage - utility to create ELF boot images from Linux kernel images
pxe-kexec - Fetch PXE configuration file and netboot using kexec
$ apt-get install kexec-tools

Avec les dérivés de Red Hat, la commande pourra varier « yum install kexec-tools » ou sous
gentoo « emerge -av kexec-tools ».
L'installation de ce package entraînera par dépendance l'installation d'autres packages comme
« debconf », « initramfs-tools », « makedumpfile » et enfin « crash ».
3. Démarrage
Un redémarrage via “kexec” se décompose en 2 phases :
Un redémarrage via « kexec » se décompose en 2 phases :
•

chargement du noyau en spécifiant les paramètres nécessaires ;

•

exécution du redémarrage

3.1 Vérification des conditions initiales
Premièrement on vérifiera la version courante du noyau GNU/linux déjà chargé pour la comparer
une fois le redémarrage du nouveau noyau effectué :
$ uname -a
Linux PCL131017 3.8.0-34-generic #49~precise1-Ubuntu SMP Wed Nov 13 18:05:00 UTC 2013 x86_64
x86_64 x86_64 GNU/Linux

On vérifiera également les paramètres passés au noyau par le bootloader grub2 :
$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.8.0-34-generic root=UUID=b48414f7-fdbc-4b4d-97fc-a2b40e53e839 ro quiet
splash vt.handoff=7

Enfin, on pourra vérifier les versions noyaux présente dans la partition de boot :
$ ls -al /boot | grep vmlinuz
-rw-r--r-- 1 root root 3847424 févr. 27 2013 vmlinuz-2.6.32-art-generic
-rw-r--r-- 1 root root 4237104 nov. 18 19:47 vmlinuz-2.6.38.8-xenomai
-rw------- 1 root root 4998096 nov. 21 01:23 vmlinuz-3.2.0-57-lowlatency
-rw-r--r-- 1 root root 5426432 oct. 15 16:40 vmlinuz-3.8.0-29-generic
-rw------- 1 root root 5428304 sept. 11 20:44 vmlinuz-3.8.0-31-generic
-rw------- 1 root root 5428528 oct. 2 18:43 vmlinuz-3.8.0-32-generic
-rw------- 1 root root 5426064 oct. 24 18:50 vmlinuz-3.8.0-33-generic
-rw------- 1 root root 5426224 nov. 13 19:26 vmlinuz-3.8.0-34-generic
et
$ ls -al /boot | grep initrd.img
-rw-r--r-- 1 root root 13324390 nov. 18 20:11 initrd.img-2.6.38.8-xenomai
-rw-r--r-- 1 root root 14240658 déc. 6 12:32 initrd.img-3.2.0-57-lowlatency
-rw-r--r-- 1 root root 16208253 oct. 15 17:03 initrd.img-3.8.0-29-generic
-rw-r--r-- 1 root root 16211572 oct. 15 17:58 initrd.img-3.8.0-31-generic
-rw-r--r-- 1 root root 16214027 nov. 7 09:49 initrd.img-3.8.0-32-generic
-rw-r--r-- 1 root root 16242300 nov. 19 09:58 initrd.img-3.8.0-33-generic
-rw------- 1 root root 24034504 déc. 14 11:01 initrd.img-3.8.0-34-generic
On pourra donc soit charger un noyau compilé séparément ou bien un autre noyau.

3.2 Chargement du noyau
Dans cette phase préparatoire, il sera donné plusieurs paramètre à “kexec” :
•

le noyau à charger (option “-l”)

•

les options qui doivent être passé à ce noyau (option “—append=” ou “—command-line=”)

•

l’initrd à appliquer (option “—initrd=” ou “—ramdisk=”)

Cela donne donc avec le chargement du noyau 3.8.0.33 :
$ sudo kexec -l /boot/vmlinuz-3.8.0-33-generic --append="$( cat /proc/cmdline ) panic=10"
--initrd=/boot/initrd.img-3.8.0-33-generic

Pour la ligne de paramètre, on reprendra celui du noyau courant qui au runtime peut être obtenu
depuis le pseudo filesystem /proc/cmdline.
A noter que le ramdisk reste optionnel et que nous aurions pu nous contenter de :
$ sudo kexec -l /boot/vmlinuz-3.8.0-33-generic --append="$( cat /proc/cmdline ) panic=10"

Une fois le noyau chargé, cela ne l'exécute pas pour autant.

3.3 Redémarrage du noyau noyau
L’option “-e” (pour “execute”) de la commande kexec lance la séquence de redémarrage. :
$ sudo kexec -e
Attention sur un serveur cela change de noyau mais sur un desktop, la session sera coupée.
Une fois redémarré, on peut vérifier le changement de noyau grace à la version :
$ uname -a
Linux PCL131017 3.8.0-33-generic #48~precise1-Ubuntu SMP Thu Oct 24 16:28:06 UTC 2013 x86_64
x86_64 x86_64 GNU/Linux
Et voilà votre système qui vient de change de noyau et cela à chaud !!

3. L'envers du décors de kexec
Un des plus grands défis dans le développement de kexec vient du fait que le noyau Linux
fonctionne à partir d'une adresse fixe en mémoire. Cela signifie que le nouveau noyau aura besoin
de se charger à la même adresse que le noyau actuel. Sur les systèmes x86, le noyau se trouve à
l'adresse phyisique 0x100000 (adresse de 0xc0000000 en virtuel, connu sous le nom
PAGE_OFFSET). La tâche d'écrasement de l'ancien noyau avec la nouvelle se fait en trois étapes
:
•

Copie du nouveau noyau en mémoire ;

•

Déplacement de l'image du noyau dans la mémoire dynamique du noyau ;

•

Copie de cette image dans la destination réelle (en remplaçant le noyau actuel), puis
redémarrage du nouveau noyau .

Les deux premières étapes sont réalisées lors du chargement du nouveau noyau .La première
tâche consiste à interpréter le contenu du fichier image du noyau. Kexec-tool a été construit de
telle sorte que l'on puisse en principe charger et démarrer à n'importe quel moment un noyau
(même non-linux).
Actuellement, il est possible de démarrer à n'importe quel noyau de format ELF32. Le fichier est
analysé et les segment du noyau sont chargés dans les buffers. Ces segments sont classés en
fonction de la nature du code.
Par exemple, dans le cas où le format de fichier du noyau couramment utilisé est « bzImage », les
segments typiques sont pour le code 16 bits noyau, le code du noyau sera 32 bits, et init Code du
disque virtuel .
La structure utilisée pour le suivi de ces segments est connu comme kexec_segment et est une
structure assez simple en soit :
struct kexec_segment
{
void* buf;
size_t bufsz;
void* mem;
size_t memsz;
};

Détail de la structure kexec_segment.

Les deux premiers éléments de la structure pointe sur la mémoire tampon de l'espace utilisateur
et sa taille. Les deux éléments suivants indiquent la destination finale du segment ainsi que sa
taille.
Une fois l'image du noyau chargée en mémoire par le module relatif au format respectif, elle est
transférée dynamiquement grâce à l'appel système sys_kexec. Cet appel système alloue les
pages de noyau dynamique pour chacun des segments qui ont été adoptées depuis l'espace
utilisateur et copie les segments sur ces pages noyau.
Kexec alloue également une page de noyau pour stocker un petit stub de code assembleur, connu
sous le nom reboot_code_buffer. Cette souche de code fait le travail réel d'écrasement du noyau
actuel avec le nouveau noyau et s'il déplace. Le reboot_code_buffer est le seul tampon qui se
trouve dans son dernier « lieu transitoire». En d'autres termes, il est exécuté à partir du même
endroit où il a été initialement initialement chargé. Pour ce faire, sur les systèmes avec MMU
d'activé, la page contenant le code identité comme mapée. Pour parler simplement, il s'agit de
créer une page d'entrée de table dans la structure de la table de la page du noyau « init_mm »
avec la même adresse physique et virtuel. Cela est nécessaire pour être en mesure d'accéder à
ce morceau de code lors de l'opération de redémarrage , comme nous le verrons plus tard.
Les informations sur la reboot_code_buffer, les différents segments, et d'autres détails sont
maintenues grâce à l'utilisation de la structure de kimage suivante :
struct kimage
{
kimage_entry_t head;
kimage_entry_t *entry;
kimage_entry_t *last_entry;
unsigned long destination;
unsigned long offset;
unsigned long start;
struct page *reboot_code_pages;
unsigned long nr_segments;
struct kexec_segment segment[KEXEC_SEGMENT_MAX+1];
struct list_head dest_pages;
struct list_head unuseable_pages;
};

Détail de la structure kimage.

Les parties les plus importantes de cette structure sont, bien sûr, le segment
[KEXEC_SEGMENT_MAX+1] qui pointent vers les tampons de la mémoire du noyau contenant
l'image, et le pointeur reboot_code_pages au stub assembleur utilisé pendant la phase de
redémarrage.
Une fois l'image du noyau chargé, le système est prêt à redémarrer avec ce dernier. Le
fonctionnement réel sur le redémarrage sur le nouveau noyau démarre avec la commande kexec
-e . Cette commande appelle essentiellement le noyau pour effectuer un redémarrage à l'aide de
l'appel
système
de
sys_reboot,
mais
avec
un
drapeau
spécial
de
LINUX_REBOOT_CMD_KEXEC
L'appel système reboot, en voyant le drapeau spécial, transfère le contrôle à la fonction
machine_kexec(). Les actions réalisées par machine_kexec( ) sont extrêmement spécifique à
l'architecture. Sous x86, la séquence d'actions est la suivante:
1. Pour l'accès reboot_code_buffer bascule de la structure de mm du processus actuel à la
structure de init_mm du noyau ;
2.

Arrête les APICS et désactive les interruptions ;

3.

Copie l' ensemble du code de stub dans le reboot_code_buffer que l'on a attribué lors
du chargement de l'image du noyau. Le code assembleur se trouve dans le sousprogramme de relocate_new_kernel ;

4. Charge tous les registres de segment avec le segment de données du noyau
( __KERNEL_DS ) de valeur et invalide la GDT et IDT ;
5. va au code localisé dans reboot_code_buffer, et passe des informations vitales comme
les paramètres à passer au nouveau noyau, la page d'indirection contenant les adresses
source / destination de l'image du noyau, l'adresse de départ du nouveau noyau,
l'adresse de la page reboot_code_buffer et un drapeau indiquant si le système a
l'extension d'adresse physique (PAE) est activé.
Le stub assembleur effectue quant à lui les opérations suivantes :
•

Lit les arguments de la pile et les sauvegarde dans des registres et désactive les
interruptions ;

•

En utilisant l'adresse de sa propre page qui lui a été passé comme argument, met en
place une pile à la fin de cette page ;

•

Stocke l'adresse de départ de la nouvelle image du noyau sur la pile de sorte que le
retour du code de remplacement prendra automatiquement le système à l'image du
nouveau noyau ;

•

Désactive la pagination en réglant les bits appropriés dans le registre de cr0 ;

•

Remet le registre de base de répertoire de pages, cr4 , à zéro ;

•

Efface la traduction Tampons de Consultation (TLB) ;

•

Copie toutes les pages d'image du noyau dans leurs pages de destination finale ;

•

Vide le TLB une fois de plus ;

•

Remet tous les registres à zéro , à l'exception du registre de pointeur de pile esp ( car il
pointe vers la pile contenant l'adresse de départ du nouveau noyau ) .

•

« Retours » à partir du stub. Cela prend en compte automatiquement le système comme
le nouveau noyau .

Après cette séquence terminée, le nouveau noyau prend le contrôle et le système est démarré
normalement.

4. Avantages et utilisations de kexec
Les systèmes avec des exigences de haute disponibilité et les développeurs du noyau qui doivent
redémarrer sans cesse leurs systèmes apprécieront le plus des avantages que peut offrir kexec.
Parce que kexec saute les parties les plus fastidieuses (lente) du redémarrage du système, à
savoir la phase de firmware, le redémarrages avec kexec sont extrêmement rapides et la
disponibilité est augmentée.
Kexec a également des applications intéressantes dans les outils de vidage mémoire. Le projet
Linux Kernel Crash Dumps (LKCD) a utilisé kexec pour élaborer un mécanisme de dumping
différent.
Lors d'un kernel panic du système ou lors de l'initialisation d'un dump par l'utilisateur, l'image de la
mémoire système est comprimé et stocké dans les pages de mémoire disponibles. Ensuite, le
système est redémarré avec un autre noyau en utilisant kexec. La zone de stockage est précisé à
ce dernier de façon à éviter tout écrasement ou altération. Par la suite, le dump mémoire peut
être récupéré sur l'une d'une partition de disque ou à travers le réseau.
La clé de la réalisation réside dans le fait qu'en évitant l'étape de firmware pendant le
redémarrage, LKCD est capable d'empêcher le contenu de la mémoire physique d'être effacé.

5. Spécificité à Debian ou Ubuntu
Pour les utilisateurs de Debian, Ubuntu, etc, “kexec” ce substitue au “reboot” classique de la machine dès
son installation.
Par défaut, un “reboot” charge, à chaud, le noyau “/vmlinuz” avec les options courantes (récupérées dans
“/proc/cmdline”) et l’initrd “/initrd.img”.
Ces paramètres peuvent être modifiés dans le fichier « /etc/default/kexec » :
...
# Utilisation de kexec pour le redémarrage ? true/false
LOAD_KEXEC=true
# Noyau par défaut à charger :
KERNEL_IMAGE="/vmlinuz"
# initrd à charger par défaut :
INITRD="/initrd.img"
# Options de démarrage du noyau. Si vide, récupère les options
# de /proc/cmdline :
APPEND=""
# ex : APPEND="$( cat /proc/cmdline ) panic=10"

Une fois “kexec-tools” installé sur votre système vous pouvez effectuer un redémarrage classique via
“coldreboot” qui est un script bash contenant :
#!/bin/sh
NOKEXECFILE=/tmp/no-kexec-reboot
/bin/rm -f $NOKEXECFILE
touch $NOKEXECFILE
/sbin/reboot $*

La commande du redémarrage nécessite elle aussi des droits superutilisateur :
$ sudo coldreboot

6. Allier un boot tftp avec Kexec
Avec kexec, le package « pxe-kexec » est utilisable. Il faut tout d'abord l'installer :
$ sudo apt-get install pxe-kexec

Pour la mise en place de kexec via pxe, l'utilitaire « pxkxc » peut être téléchargé :
http://myllynen.fedorapeople.org/
Il allie la simplicité du PXE et la puissance de kexec pour permettre des démarrage d'une image
kernel / initrd depuis un serveur PXE sans la nécessité pour le soutien HW, les images de
démarrage, ou même d'avoir à redémarrer le système.
Par exemple, on peut lancer l'installation d'une distribution sans média de démarrage.
pxkxc fournit une interface utilisateur et comme il a été implémenté en Python il est facile de
l'améliorer et de le personnaliser au besoin.
Quelques exemples de cas d'utilisation concret :
•

Un utilisateur décide, avec le soutien kexec, de faire une nouvelle installation d'un système
linux sur un système en cours d'exécution. L'utilisateur exécute simplement pxkxc en tant
que root et choisit l'option de menu appropriée . Le programme d'installation démarre
automatiquement séparément en téléchargeant ou l'écriture des images de démarrage
incluant tout le support nécessaire pour le matériel.

•

Une entreprise dispose de plusieurs types de systèmes sur leur réseau, dont la plupart
supportent PXE au niveau matériel. Les autres sont compatible avec gPXE. Cependant , le
portage de nouveaux drivers ou même des sous-systèmes du noyau se révélerait une
tâche hardue à concrétiser pour faire en sorte que tous les drivers réseau possède un
support avec gPXE. En créant une image d'amorçage constitué par un noyau récent
GNU/linux et un initrd modifié qui lance pxkxc l' entreprise peut faire les installations
basées PXE sur tous leurs systèmes, indépendamment du niveau de prise en charge
PXE / gPXE de leur matériel. Aussi, en ajoutant quelques personnalisations comme les
paramètres de proxy HTTP ou d'autres ajustements en fonction de l'environnement de
réseau détectée, cela devient un outils convivial pour l'administrateur système et réseau.
Pxkxc jusqu'ici a surtout été testé en utilisant les touches F12 et F13, l'autre combinaisons
peuvent aussi fonctionner.

7. Sécurité
Bien que possible, la mise en œuvre d'un mécanisme tel que kexec soulève deux défis majeurs:
•

La mémoire du noyau en cours d'exécution est remplacé par le nouveau noyau, alors que
l'ancien est toujours en cours d'exécution ;

•

Le nouveau noyau devra généralement s'attendre à ce que tous les périphériques
physiques soient déjà dans un état bien défini, car ils sont après un redémarrage du
système , lorsque le BIOS , l'UEFI ou le microprogramme du système réinitialise les à un
état « sain d'esprit » . Le contournement d'un réel redémarrage peut laisser les appareils
dans un état inconnu, et le nouveau noyau devra se remettre de cette transition.

Il y a des problèmes de sécurité associés au mécanisme kexec, comme pratiquement tout ce que
peut être chargé et exécuté de cette façon, en raison du fait que le nouveau noyau à exécuter
n'est pas nécessairement signé.
En d'autres termes, même si un mécanisme dans le noyau solide permettrait d'assurer que seuls
les modules du noyau Linux signés puisse être chargés dans le noyau en cours d'exécution,
l'utilisateur root peut toujours charger du code arbitraire via kexec et l'exécuter.

8. Conclusion
Voila, avec kexec, il est possible de réduire la disponibilité d'un système en minimisant les reboot.
Cela peu également servir à tester la configuration d'un noyau.

9. Liens
•
•
•
•
•
•
•
•
•

https://www.kernel.org/pub/linux/kernel/people/geoff/petitboot/kexec-man-11.10.21g90da2c37.txt
http://manpages.ubuntu.com/manpages/precise/en/man8/kexec.8.html
http://manpages.ubuntu.com/manpages/precise/en/man8/pxe-kexec.8.html
http://myllynen.fedorapeople.org/pxkxc-0.1.1.tar.gz
http://doc.fedora-fr.org/wiki/Configuration_d
%27un_serveur_pour_lancer_des_installations_par_PXE_boot
http://pxe-kexec.berlios.de/
https://www.kernel.org/pub/linux/kernel/people/geoff/petitboot/petitboot.html
http://www.solemnwarning.net/kexec-loader/
http://www.solemnwarning.net/kexec-loader/faq
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

http://www.solemnwarning.net/kexec-loader/readme.html
https://wiki.archlinux.org/index.php/kexec
http://www.almesberger.net/cv/papers/ols2k-9.pdf
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/exec.3.html
http://web.archive.org/web/20130121033946/http://www.ibm.com/developerworks/linux/lib
rary/l-kexec/index.html
http://archive09.linux.com/feature/1502
http://mjg59.dreamwidth.org/28746.html
http://www.outflux.net/blog/archives/2013/12/10/live-patching-the-kernel/
http://turbochaos.blogspot.fr/2013/10/writing-linux-rootkits-301_31.html
http://prefetch.net/blog/index.php/2009/07/06/using-kdump-to-get-core-files-on-fedora-andcentos-hosts/
http://www.solemnwarning.net/kexec-loader/downloads/addmod.sh
https://github.com/mjg59/kexec-tools/tree/mjg_dummy
http://grsecurity.net/~spender/msr32.c
http://xorl.wordpress.com/2010/11/20/grkernsec_hidesym-hide-kernel-symbols/
http://web.archive.org/web/20130116180330/http://lkcd.sourceforge.net/
https://docs.google.com/file/d/0ByaHyu9Ur1viMm52TFdXTVVNWjg/edit
http://wwwarchive.xenproject.org/files/xensummit_santaclara11/aug3/7_DanielK_Kexec_KDump.pdf

Recomendados

Analyse d'un kernel (crash, core) dump por
Analyse d'un kernel (crash, core) dumpAnalyse d'un kernel (crash, core) dump
Analyse d'un kernel (crash, core) dumpGaëtan Trellu
1.7K vistas9 diapositivas
Install arch ultrabook full luks ssd por
Install arch ultrabook full luks ssdInstall arch ultrabook full luks ssd
Install arch ultrabook full luks ssdAnthony Le Goff
1.5K vistas15 diapositivas
utilisation des core dump sous linux por
utilisation des core dump sous linuxutilisation des core dump sous linux
utilisation des core dump sous linuxThierry Gayet
1.5K vistas13 diapositivas
Gestion et surveillance du reseau syslogng por
Gestion et surveillance du reseau  syslogngGestion et surveillance du reseau  syslogng
Gestion et surveillance du reseau syslogngKiemde Franck
812 vistas13 diapositivas
PostgreSQL sous linux por
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linuxKhalid ALLILI
2.3K vistas6 diapositivas
Config ip por
Config ipConfig ip
Config ipMouhsine Najih
726 vistas6 diapositivas

Más contenido relacionado

La actualidad más candente

Administration reseau linux por
Administration reseau linuxAdministration reseau linux
Administration reseau linuxRiadh Briki
1K vistas59 diapositivas
2020 (1) por
2020 (1)2020 (1)
2020 (1)MarouaneBelmallem
19 vistas33 diapositivas
Noyau por
NoyauNoyau
NoyauMoncef Elbouazzaoui
621 vistas33 diapositivas
Virtualiastion des systèmes d'exploitations por
Virtualiastion des systèmes d'exploitationsVirtualiastion des systèmes d'exploitations
Virtualiastion des systèmes d'exploitationsSGHIOUAR abdelfettah
2.3K vistas38 diapositivas
Boot por
BootBoot
Bootelfergougui
791 vistas24 diapositivas
Cours linux complet por
Cours linux completCours linux complet
Cours linux completaubin82
22.7K vistas255 diapositivas

La actualidad más candente(20)

Administration reseau linux por Riadh Briki
Administration reseau linuxAdministration reseau linux
Administration reseau linux
Riadh Briki1K vistas
Cours linux complet por aubin82
Cours linux completCours linux complet
Cours linux complet
aubin8222.7K vistas
Installation Et Configuration De Monkey Spider por Mohamed Ben Bouzid
Installation Et Configuration De Monkey SpiderInstallation Et Configuration De Monkey Spider
Installation Et Configuration De Monkey Spider
Mohamed Ben Bouzid1.8K vistas
Clonezilla serveur por yaaf
Clonezilla serveurClonezilla serveur
Clonezilla serveur
yaaf1.6K vistas
Rapport administration systèmes et supervision réseaux tp4 diabang master1 tr por Cheikh Tidiane DIABANG
Rapport administration systèmes et supervision réseaux tp4 diabang master1 trRapport administration systèmes et supervision réseaux tp4 diabang master1 tr
Rapport administration systèmes et supervision réseaux tp4 diabang master1 tr
Rapport Kernel Linux - Configuration – Compilation & installation por Ayoub Rouzi
Rapport Kernel Linux - Configuration –  Compilation & installationRapport Kernel Linux - Configuration –  Compilation & installation
Rapport Kernel Linux - Configuration – Compilation & installation
Ayoub Rouzi991 vistas
Principes de fonctionnement unix por webreaker
Principes de fonctionnement unixPrincipes de fonctionnement unix
Principes de fonctionnement unix
webreaker1.3K vistas
Rapport administration systèmes et supervision réseaux tp3 diabang master1 tr por Cheikh Tidiane DIABANG
Rapport administration systèmes et supervision réseaux tp3 diabang master1 trRapport administration systèmes et supervision réseaux tp3 diabang master1 tr
Rapport administration systèmes et supervision réseaux tp3 diabang master1 tr
Rapport administration systèmes et supervision réseaux tp2 diabang master1 tr por Cheikh Tidiane DIABANG
Rapport administration systèmes et supervision réseaux tp2 diabang master1 trRapport administration systèmes et supervision réseaux tp2 diabang master1 tr
Rapport administration systèmes et supervision réseaux tp2 diabang master1 tr
Rapport openembedded por Ayoub Rouzi
Rapport openembeddedRapport openembedded
Rapport openembedded
Ayoub Rouzi149 vistas
Rapport administation systèmes et supervision réseaux tp1 diabang master1 tr por Cheikh Tidiane DIABANG
Rapport administation systèmes et supervision réseaux tp1 diabang master1 trRapport administation systèmes et supervision réseaux tp1 diabang master1 tr
Rapport administation systèmes et supervision réseaux tp1 diabang master1 tr
Scheduler & SLA por Ayoub Rouzi
Scheduler & SLAScheduler & SLA
Scheduler & SLA
Ayoub Rouzi154 vistas

Destacado

Mi querido-barrios-altos por
Mi querido-barrios-altosMi querido-barrios-altos
Mi querido-barrios-altosLucero Garcia
1.2K vistas24 diapositivas
Head turn por
Head turn Head turn
Head turn catavrio
413 vistas39 diapositivas
2008 Bloc Quebecois Platform Ch. 2 por
2008 Bloc Quebecois Platform Ch. 22008 Bloc Quebecois Platform Ch. 2
2008 Bloc Quebecois Platform Ch. 2guest8e28f9
615 vistas20 diapositivas
Podcast.BlogAutomobile.Show1 por
Podcast.BlogAutomobile.Show1Podcast.BlogAutomobile.Show1
Podcast.BlogAutomobile.Show1Clem B
245 vistas13 diapositivas
Administracion estaregica por
Administracion estaregicaAdministracion estaregica
Administracion estaregicajenithvargas24
263 vistas9 diapositivas
Horloge des mensonge_sop por
Horloge des mensonge_sopHorloge des mensonge_sop
Horloge des mensonge_sopcatavrio
371 vistas9 diapositivas

Destacado(20)

Mi querido-barrios-altos por Lucero Garcia
Mi querido-barrios-altosMi querido-barrios-altos
Mi querido-barrios-altos
Lucero Garcia1.2K vistas
Head turn por catavrio
Head turn Head turn
Head turn
catavrio413 vistas
2008 Bloc Quebecois Platform Ch. 2 por guest8e28f9
2008 Bloc Quebecois Platform Ch. 22008 Bloc Quebecois Platform Ch. 2
2008 Bloc Quebecois Platform Ch. 2
guest8e28f9615 vistas
Podcast.BlogAutomobile.Show1 por Clem B
Podcast.BlogAutomobile.Show1Podcast.BlogAutomobile.Show1
Podcast.BlogAutomobile.Show1
Clem B245 vistas
Horloge des mensonge_sop por catavrio
Horloge des mensonge_sopHorloge des mensonge_sop
Horloge des mensonge_sop
catavrio371 vistas
Cévennes Tourisme - Expériences du 2.0 dans le eTourisme : pourquoi, pour qui... por Cévennes Tourisme
Cévennes Tourisme - Expériences du 2.0 dans le eTourisme : pourquoi, pour qui...Cévennes Tourisme - Expériences du 2.0 dans le eTourisme : pourquoi, pour qui...
Cévennes Tourisme - Expériences du 2.0 dans le eTourisme : pourquoi, pour qui...
Cévennes Tourisme1.3K vistas
Educación inclusiva Un aporte desde la Formación Uniguajira - Universidad Ped... por Universidad de La Guajira
Educación inclusiva Un aporte desde la Formación Uniguajira - Universidad Ped...Educación inclusiva Un aporte desde la Formación Uniguajira - Universidad Ped...
Educación inclusiva Un aporte desde la Formación Uniguajira - Universidad Ped...
Presentación1 por lvjc
Presentación1Presentación1
Presentación1
lvjc167 vistas
Absolument vital mcf por catavrio
Absolument vital mcfAbsolument vital mcf
Absolument vital mcf
catavrio292 vistas
Absolument vital mcf por catavrio
Absolument vital mcfAbsolument vital mcf
Absolument vital mcf
catavrio830 vistas
0 phi blondes juste-pour_rire-r por catavrio
0 phi blondes juste-pour_rire-r0 phi blondes juste-pour_rire-r
0 phi blondes juste-pour_rire-r
catavrio289 vistas
Sports Violence por izzi007
Sports ViolenceSports Violence
Sports Violence
izzi007327 vistas
Planea y evalúa los recursos financieros-Laura Arango por liarango
Planea y evalúa los recursos financieros-Laura ArangoPlanea y evalúa los recursos financieros-Laura Arango
Planea y evalúa los recursos financieros-Laura Arango
liarango303 vistas
2008 Bloc Quebecois Platform Ch. 1 por guest8e28f9
2008 Bloc Quebecois Platform Ch. 12008 Bloc Quebecois Platform Ch. 1
2008 Bloc Quebecois Platform Ch. 1
guest8e28f9820 vistas
L inventeur de-ey_davidson_gl1209 por catavrio
L inventeur de-ey_davidson_gl1209L inventeur de-ey_davidson_gl1209
L inventeur de-ey_davidson_gl1209
catavrio230 vistas
2èMe Groupe De Travail.V2 por guest4adcac0
2èMe Groupe De Travail.V22èMe Groupe De Travail.V2
2èMe Groupe De Travail.V2
guest4adcac01.1K vistas

Similar a Chargez un noyau linux sans reboot avec kexec

Rapport systéme embarqué busybox por
Rapport systéme embarqué busyboxRapport systéme embarqué busybox
Rapport systéme embarqué busyboxAyoub Rouzi
1.2K vistas20 diapositivas
Etude DéTailléé de la pile réseau sous GNU Linux por
Etude DéTailléé de la pile réseau sous GNU LinuxEtude DéTailléé de la pile réseau sous GNU Linux
Etude DéTailléé de la pile réseau sous GNU LinuxThierry Gayet
663 vistas75 diapositivas
Reverse Engineering d'un ransomware por
Reverse Engineering d'un ransomwareReverse Engineering d'un ransomware
Reverse Engineering d'un ransomwareNinaSAMMUT
66 vistas12 diapositivas
TD_complet_reseau__CISCO__Packet Tracer.pdf por
TD_complet_reseau__CISCO__Packet Tracer.pdfTD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdfInes Ben Hassine
607 vistas15 diapositivas
DRAFT - Vm Ware - Installation Nuxeo por
DRAFT - Vm Ware - Installation NuxeoDRAFT - Vm Ware - Installation Nuxeo
DRAFT - Vm Ware - Installation NuxeoPASCAL Jean Marie
2.1K vistas49 diapositivas
Meetup Systemd vs sysvinit por
Meetup Systemd vs sysvinitMeetup Systemd vs sysvinit
Meetup Systemd vs sysvinitChristian Charreyre
1.3K vistas24 diapositivas

Similar a Chargez un noyau linux sans reboot avec kexec(20)

Rapport systéme embarqué busybox por Ayoub Rouzi
Rapport systéme embarqué busyboxRapport systéme embarqué busybox
Rapport systéme embarqué busybox
Ayoub Rouzi1.2K vistas
Etude DéTailléé de la pile réseau sous GNU Linux por Thierry Gayet
Etude DéTailléé de la pile réseau sous GNU LinuxEtude DéTailléé de la pile réseau sous GNU Linux
Etude DéTailléé de la pile réseau sous GNU Linux
Thierry Gayet663 vistas
Reverse Engineering d'un ransomware por NinaSAMMUT
Reverse Engineering d'un ransomwareReverse Engineering d'un ransomware
Reverse Engineering d'un ransomware
NinaSAMMUT66 vistas
TD_complet_reseau__CISCO__Packet Tracer.pdf por Ines Ben Hassine
TD_complet_reseau__CISCO__Packet Tracer.pdfTD_complet_reseau__CISCO__Packet Tracer.pdf
TD_complet_reseau__CISCO__Packet Tracer.pdf
Ines Ben Hassine607 vistas
DRAFT - Vm Ware - Installation Nuxeo por PASCAL Jean Marie
DRAFT - Vm Ware - Installation NuxeoDRAFT - Vm Ware - Installation Nuxeo
DRAFT - Vm Ware - Installation Nuxeo
PASCAL Jean Marie2.1K vistas
Solution d'OTA por Sidereo
Solution d'OTASolution d'OTA
Solution d'OTA
Sidereo1.4K vistas
JBoss clustering et tuning (lab 2/3) por Fourat Zouari
JBoss clustering et tuning (lab 2/3)JBoss clustering et tuning (lab 2/3)
JBoss clustering et tuning (lab 2/3)
Fourat Zouari5.4K vistas
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf por Pascal Ponzoni
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdfoptimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
Pascal Ponzoni6 vistas
Spring Boot & Containers - Do's & Don'ts por Julien Wittouck
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
Julien Wittouck200 vistas
Contrôle de système d’exploitation por digidid
Contrôle de système d’exploitation Contrôle de système d’exploitation
Contrôle de système d’exploitation
digidid1.5K vistas
01 05 installation d'un noyau et de modules noyau por Noël
01 05 installation d'un noyau et de modules noyau01 05 installation d'un noyau et de modules noyau
01 05 installation d'un noyau et de modules noyau
Noël 346 vistas
Presentation kernel - Kernel Linux - Configuration – Compilation & installation por Ayoub Rouzi
Presentation kernel - Kernel Linux - Configuration –  Compilation & installationPresentation kernel - Kernel Linux - Configuration –  Compilation & installation
Presentation kernel - Kernel Linux - Configuration – Compilation & installation
Ayoub Rouzi622 vistas
04 03 logical volume manager por Noël
04 03 logical volume manager04 03 logical volume manager
04 03 logical volume manager
Noël 793 vistas
Installation et Configuration ee JDK et de Tomcat por Mohamed Ben Bouzid
Installation et Configuration ee JDK et de TomcatInstallation et Configuration ee JDK et de Tomcat
Installation et Configuration ee JDK et de Tomcat
Mohamed Ben Bouzid2.9K vistas
Virtualiser une machine_physique por anasslv
Virtualiser une machine_physiqueVirtualiser une machine_physique
Virtualiser une machine_physique
anasslv845 vistas

Chargez un noyau linux sans reboot avec kexec

  • 1. Chargez un nouveau noyau linux à chaud avec kexec Thierry GAYET http://www.nextinnovation.org Qui n'a jamais souhaité pouvoir tester un noyau à chaud sans avoir à rebooter physiquement son système pour minimiser le temps mort du au redémarrage d'un système. 1. Introduction Le nom « kexec » provient de l'exécution du noyau, dérivé de l'appel du noyau exec Unix / Linux. C'est un mécanisme du noyau Linux qui permet le démarrage «à chaud» d'un nouveau noyau « sur » le noyau en cours d'exécution. En effet, il permet donc de sauter plusieurs étape : • phase d'initialisation du matériel par le microprogramme du système : BIOS, BIOS UEFI, coreboot (aka linuxBios) ; • différents tests sur le matériel : ◦ mémoire vive ; ◦ périphériques de stockages ou mass-storage (disques RAID, … ) ; ◦ ... • bootloader grub ou autre Il charge donc directement le nouveau noyau en mémoire, et commence à s'exécuter immédiatement après. Cela permet d'éviter de longs délais associés à un redémarrage complet, et peut aider les systèmes à répondre aux exigences de haute disponibilité en minimisant les temps d'arrêt. Cela fonctionne sur des serveurs de grosses capacités (mémoire, disques, etc), et même sur certain ordinateurs de bureau ou portables. 2. Installation Tout comme cela peut être fait habituellement, les binaires de kexec sont disponible dans la majorité des repos de packages. Kexec est fournis par le paquet “kexec-tools” : $ apt-cache search kexec [sudo] password for tgayet: kexec-tools - tools to support fast kexec reboots mkelfimage - utility to create ELF boot images from Linux kernel images pxe-kexec - Fetch PXE configuration file and netboot using kexec $ apt-get install kexec-tools Avec les dérivés de Red Hat, la commande pourra varier « yum install kexec-tools » ou sous gentoo « emerge -av kexec-tools ». L'installation de ce package entraînera par dépendance l'installation d'autres packages comme « debconf », « initramfs-tools », « makedumpfile » et enfin « crash ».
  • 2. 3. Démarrage Un redémarrage via “kexec” se décompose en 2 phases : Un redémarrage via « kexec » se décompose en 2 phases : • chargement du noyau en spécifiant les paramètres nécessaires ; • exécution du redémarrage 3.1 Vérification des conditions initiales Premièrement on vérifiera la version courante du noyau GNU/linux déjà chargé pour la comparer une fois le redémarrage du nouveau noyau effectué : $ uname -a Linux PCL131017 3.8.0-34-generic #49~precise1-Ubuntu SMP Wed Nov 13 18:05:00 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux On vérifiera également les paramètres passés au noyau par le bootloader grub2 : $ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-3.8.0-34-generic root=UUID=b48414f7-fdbc-4b4d-97fc-a2b40e53e839 ro quiet splash vt.handoff=7 Enfin, on pourra vérifier les versions noyaux présente dans la partition de boot : $ ls -al /boot | grep vmlinuz -rw-r--r-- 1 root root 3847424 févr. 27 2013 vmlinuz-2.6.32-art-generic -rw-r--r-- 1 root root 4237104 nov. 18 19:47 vmlinuz-2.6.38.8-xenomai -rw------- 1 root root 4998096 nov. 21 01:23 vmlinuz-3.2.0-57-lowlatency -rw-r--r-- 1 root root 5426432 oct. 15 16:40 vmlinuz-3.8.0-29-generic -rw------- 1 root root 5428304 sept. 11 20:44 vmlinuz-3.8.0-31-generic -rw------- 1 root root 5428528 oct. 2 18:43 vmlinuz-3.8.0-32-generic -rw------- 1 root root 5426064 oct. 24 18:50 vmlinuz-3.8.0-33-generic -rw------- 1 root root 5426224 nov. 13 19:26 vmlinuz-3.8.0-34-generic et $ ls -al /boot | grep initrd.img -rw-r--r-- 1 root root 13324390 nov. 18 20:11 initrd.img-2.6.38.8-xenomai -rw-r--r-- 1 root root 14240658 déc. 6 12:32 initrd.img-3.2.0-57-lowlatency -rw-r--r-- 1 root root 16208253 oct. 15 17:03 initrd.img-3.8.0-29-generic -rw-r--r-- 1 root root 16211572 oct. 15 17:58 initrd.img-3.8.0-31-generic -rw-r--r-- 1 root root 16214027 nov. 7 09:49 initrd.img-3.8.0-32-generic -rw-r--r-- 1 root root 16242300 nov. 19 09:58 initrd.img-3.8.0-33-generic -rw------- 1 root root 24034504 déc. 14 11:01 initrd.img-3.8.0-34-generic On pourra donc soit charger un noyau compilé séparément ou bien un autre noyau. 3.2 Chargement du noyau Dans cette phase préparatoire, il sera donné plusieurs paramètre à “kexec” :
  • 3. • le noyau à charger (option “-l”) • les options qui doivent être passé à ce noyau (option “—append=” ou “—command-line=”) • l’initrd à appliquer (option “—initrd=” ou “—ramdisk=”) Cela donne donc avec le chargement du noyau 3.8.0.33 : $ sudo kexec -l /boot/vmlinuz-3.8.0-33-generic --append="$( cat /proc/cmdline ) panic=10" --initrd=/boot/initrd.img-3.8.0-33-generic Pour la ligne de paramètre, on reprendra celui du noyau courant qui au runtime peut être obtenu depuis le pseudo filesystem /proc/cmdline. A noter que le ramdisk reste optionnel et que nous aurions pu nous contenter de : $ sudo kexec -l /boot/vmlinuz-3.8.0-33-generic --append="$( cat /proc/cmdline ) panic=10" Une fois le noyau chargé, cela ne l'exécute pas pour autant. 3.3 Redémarrage du noyau noyau L’option “-e” (pour “execute”) de la commande kexec lance la séquence de redémarrage. : $ sudo kexec -e Attention sur un serveur cela change de noyau mais sur un desktop, la session sera coupée. Une fois redémarré, on peut vérifier le changement de noyau grace à la version : $ uname -a Linux PCL131017 3.8.0-33-generic #48~precise1-Ubuntu SMP Thu Oct 24 16:28:06 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux Et voilà votre système qui vient de change de noyau et cela à chaud !! 3. L'envers du décors de kexec Un des plus grands défis dans le développement de kexec vient du fait que le noyau Linux fonctionne à partir d'une adresse fixe en mémoire. Cela signifie que le nouveau noyau aura besoin de se charger à la même adresse que le noyau actuel. Sur les systèmes x86, le noyau se trouve à l'adresse phyisique 0x100000 (adresse de 0xc0000000 en virtuel, connu sous le nom PAGE_OFFSET). La tâche d'écrasement de l'ancien noyau avec la nouvelle se fait en trois étapes : • Copie du nouveau noyau en mémoire ; • Déplacement de l'image du noyau dans la mémoire dynamique du noyau ; • Copie de cette image dans la destination réelle (en remplaçant le noyau actuel), puis redémarrage du nouveau noyau . Les deux premières étapes sont réalisées lors du chargement du nouveau noyau .La première tâche consiste à interpréter le contenu du fichier image du noyau. Kexec-tool a été construit de telle sorte que l'on puisse en principe charger et démarrer à n'importe quel moment un noyau (même non-linux). Actuellement, il est possible de démarrer à n'importe quel noyau de format ELF32. Le fichier est analysé et les segment du noyau sont chargés dans les buffers. Ces segments sont classés en fonction de la nature du code. Par exemple, dans le cas où le format de fichier du noyau couramment utilisé est « bzImage », les
  • 4. segments typiques sont pour le code 16 bits noyau, le code du noyau sera 32 bits, et init Code du disque virtuel . La structure utilisée pour le suivi de ces segments est connu comme kexec_segment et est une structure assez simple en soit : struct kexec_segment { void* buf; size_t bufsz; void* mem; size_t memsz; }; Détail de la structure kexec_segment. Les deux premiers éléments de la structure pointe sur la mémoire tampon de l'espace utilisateur et sa taille. Les deux éléments suivants indiquent la destination finale du segment ainsi que sa taille. Une fois l'image du noyau chargée en mémoire par le module relatif au format respectif, elle est transférée dynamiquement grâce à l'appel système sys_kexec. Cet appel système alloue les pages de noyau dynamique pour chacun des segments qui ont été adoptées depuis l'espace utilisateur et copie les segments sur ces pages noyau. Kexec alloue également une page de noyau pour stocker un petit stub de code assembleur, connu sous le nom reboot_code_buffer. Cette souche de code fait le travail réel d'écrasement du noyau actuel avec le nouveau noyau et s'il déplace. Le reboot_code_buffer est le seul tampon qui se trouve dans son dernier « lieu transitoire». En d'autres termes, il est exécuté à partir du même endroit où il a été initialement initialement chargé. Pour ce faire, sur les systèmes avec MMU d'activé, la page contenant le code identité comme mapée. Pour parler simplement, il s'agit de créer une page d'entrée de table dans la structure de la table de la page du noyau « init_mm » avec la même adresse physique et virtuel. Cela est nécessaire pour être en mesure d'accéder à ce morceau de code lors de l'opération de redémarrage , comme nous le verrons plus tard. Les informations sur la reboot_code_buffer, les différents segments, et d'autres détails sont maintenues grâce à l'utilisation de la structure de kimage suivante : struct kimage { kimage_entry_t head; kimage_entry_t *entry; kimage_entry_t *last_entry; unsigned long destination; unsigned long offset; unsigned long start; struct page *reboot_code_pages; unsigned long nr_segments; struct kexec_segment segment[KEXEC_SEGMENT_MAX+1]; struct list_head dest_pages; struct list_head unuseable_pages; }; Détail de la structure kimage. Les parties les plus importantes de cette structure sont, bien sûr, le segment [KEXEC_SEGMENT_MAX+1] qui pointent vers les tampons de la mémoire du noyau contenant l'image, et le pointeur reboot_code_pages au stub assembleur utilisé pendant la phase de redémarrage. Une fois l'image du noyau chargé, le système est prêt à redémarrer avec ce dernier. Le
  • 5. fonctionnement réel sur le redémarrage sur le nouveau noyau démarre avec la commande kexec -e . Cette commande appelle essentiellement le noyau pour effectuer un redémarrage à l'aide de l'appel système de sys_reboot, mais avec un drapeau spécial de LINUX_REBOOT_CMD_KEXEC L'appel système reboot, en voyant le drapeau spécial, transfère le contrôle à la fonction machine_kexec(). Les actions réalisées par machine_kexec( ) sont extrêmement spécifique à l'architecture. Sous x86, la séquence d'actions est la suivante: 1. Pour l'accès reboot_code_buffer bascule de la structure de mm du processus actuel à la structure de init_mm du noyau ; 2. Arrête les APICS et désactive les interruptions ; 3. Copie l' ensemble du code de stub dans le reboot_code_buffer que l'on a attribué lors du chargement de l'image du noyau. Le code assembleur se trouve dans le sousprogramme de relocate_new_kernel ; 4. Charge tous les registres de segment avec le segment de données du noyau ( __KERNEL_DS ) de valeur et invalide la GDT et IDT ; 5. va au code localisé dans reboot_code_buffer, et passe des informations vitales comme les paramètres à passer au nouveau noyau, la page d'indirection contenant les adresses source / destination de l'image du noyau, l'adresse de départ du nouveau noyau, l'adresse de la page reboot_code_buffer et un drapeau indiquant si le système a l'extension d'adresse physique (PAE) est activé. Le stub assembleur effectue quant à lui les opérations suivantes : • Lit les arguments de la pile et les sauvegarde dans des registres et désactive les interruptions ; • En utilisant l'adresse de sa propre page qui lui a été passé comme argument, met en place une pile à la fin de cette page ; • Stocke l'adresse de départ de la nouvelle image du noyau sur la pile de sorte que le retour du code de remplacement prendra automatiquement le système à l'image du nouveau noyau ; • Désactive la pagination en réglant les bits appropriés dans le registre de cr0 ; • Remet le registre de base de répertoire de pages, cr4 , à zéro ; • Efface la traduction Tampons de Consultation (TLB) ; • Copie toutes les pages d'image du noyau dans leurs pages de destination finale ; • Vide le TLB une fois de plus ; • Remet tous les registres à zéro , à l'exception du registre de pointeur de pile esp ( car il pointe vers la pile contenant l'adresse de départ du nouveau noyau ) . • « Retours » à partir du stub. Cela prend en compte automatiquement le système comme le nouveau noyau . Après cette séquence terminée, le nouveau noyau prend le contrôle et le système est démarré normalement. 4. Avantages et utilisations de kexec Les systèmes avec des exigences de haute disponibilité et les développeurs du noyau qui doivent redémarrer sans cesse leurs systèmes apprécieront le plus des avantages que peut offrir kexec. Parce que kexec saute les parties les plus fastidieuses (lente) du redémarrage du système, à savoir la phase de firmware, le redémarrages avec kexec sont extrêmement rapides et la disponibilité est augmentée. Kexec a également des applications intéressantes dans les outils de vidage mémoire. Le projet Linux Kernel Crash Dumps (LKCD) a utilisé kexec pour élaborer un mécanisme de dumping
  • 6. différent. Lors d'un kernel panic du système ou lors de l'initialisation d'un dump par l'utilisateur, l'image de la mémoire système est comprimé et stocké dans les pages de mémoire disponibles. Ensuite, le système est redémarré avec un autre noyau en utilisant kexec. La zone de stockage est précisé à ce dernier de façon à éviter tout écrasement ou altération. Par la suite, le dump mémoire peut être récupéré sur l'une d'une partition de disque ou à travers le réseau. La clé de la réalisation réside dans le fait qu'en évitant l'étape de firmware pendant le redémarrage, LKCD est capable d'empêcher le contenu de la mémoire physique d'être effacé. 5. Spécificité à Debian ou Ubuntu Pour les utilisateurs de Debian, Ubuntu, etc, “kexec” ce substitue au “reboot” classique de la machine dès son installation. Par défaut, un “reboot” charge, à chaud, le noyau “/vmlinuz” avec les options courantes (récupérées dans “/proc/cmdline”) et l’initrd “/initrd.img”. Ces paramètres peuvent être modifiés dans le fichier « /etc/default/kexec » : ... # Utilisation de kexec pour le redémarrage ? true/false LOAD_KEXEC=true # Noyau par défaut à charger : KERNEL_IMAGE="/vmlinuz" # initrd à charger par défaut : INITRD="/initrd.img" # Options de démarrage du noyau. Si vide, récupère les options # de /proc/cmdline : APPEND="" # ex : APPEND="$( cat /proc/cmdline ) panic=10" Une fois “kexec-tools” installé sur votre système vous pouvez effectuer un redémarrage classique via “coldreboot” qui est un script bash contenant : #!/bin/sh NOKEXECFILE=/tmp/no-kexec-reboot /bin/rm -f $NOKEXECFILE touch $NOKEXECFILE /sbin/reboot $* La commande du redémarrage nécessite elle aussi des droits superutilisateur : $ sudo coldreboot 6. Allier un boot tftp avec Kexec Avec kexec, le package « pxe-kexec » est utilisable. Il faut tout d'abord l'installer : $ sudo apt-get install pxe-kexec Pour la mise en place de kexec via pxe, l'utilitaire « pxkxc » peut être téléchargé : http://myllynen.fedorapeople.org/ Il allie la simplicité du PXE et la puissance de kexec pour permettre des démarrage d'une image kernel / initrd depuis un serveur PXE sans la nécessité pour le soutien HW, les images de démarrage, ou même d'avoir à redémarrer le système. Par exemple, on peut lancer l'installation d'une distribution sans média de démarrage. pxkxc fournit une interface utilisateur et comme il a été implémenté en Python il est facile de l'améliorer et de le personnaliser au besoin. Quelques exemples de cas d'utilisation concret :
  • 7. • Un utilisateur décide, avec le soutien kexec, de faire une nouvelle installation d'un système linux sur un système en cours d'exécution. L'utilisateur exécute simplement pxkxc en tant que root et choisit l'option de menu appropriée . Le programme d'installation démarre automatiquement séparément en téléchargeant ou l'écriture des images de démarrage incluant tout le support nécessaire pour le matériel. • Une entreprise dispose de plusieurs types de systèmes sur leur réseau, dont la plupart supportent PXE au niveau matériel. Les autres sont compatible avec gPXE. Cependant , le portage de nouveaux drivers ou même des sous-systèmes du noyau se révélerait une tâche hardue à concrétiser pour faire en sorte que tous les drivers réseau possède un support avec gPXE. En créant une image d'amorçage constitué par un noyau récent GNU/linux et un initrd modifié qui lance pxkxc l' entreprise peut faire les installations basées PXE sur tous leurs systèmes, indépendamment du niveau de prise en charge PXE / gPXE de leur matériel. Aussi, en ajoutant quelques personnalisations comme les paramètres de proxy HTTP ou d'autres ajustements en fonction de l'environnement de réseau détectée, cela devient un outils convivial pour l'administrateur système et réseau. Pxkxc jusqu'ici a surtout été testé en utilisant les touches F12 et F13, l'autre combinaisons peuvent aussi fonctionner. 7. Sécurité Bien que possible, la mise en œuvre d'un mécanisme tel que kexec soulève deux défis majeurs: • La mémoire du noyau en cours d'exécution est remplacé par le nouveau noyau, alors que l'ancien est toujours en cours d'exécution ; • Le nouveau noyau devra généralement s'attendre à ce que tous les périphériques physiques soient déjà dans un état bien défini, car ils sont après un redémarrage du système , lorsque le BIOS , l'UEFI ou le microprogramme du système réinitialise les à un état « sain d'esprit » . Le contournement d'un réel redémarrage peut laisser les appareils dans un état inconnu, et le nouveau noyau devra se remettre de cette transition. Il y a des problèmes de sécurité associés au mécanisme kexec, comme pratiquement tout ce que peut être chargé et exécuté de cette façon, en raison du fait que le nouveau noyau à exécuter n'est pas nécessairement signé. En d'autres termes, même si un mécanisme dans le noyau solide permettrait d'assurer que seuls les modules du noyau Linux signés puisse être chargés dans le noyau en cours d'exécution, l'utilisateur root peut toujours charger du code arbitraire via kexec et l'exécuter. 8. Conclusion Voila, avec kexec, il est possible de réduire la disponibilité d'un système en minimisant les reboot. Cela peu également servir à tester la configuration d'un noyau. 9. Liens • • • • • • • • • https://www.kernel.org/pub/linux/kernel/people/geoff/petitboot/kexec-man-11.10.21g90da2c37.txt http://manpages.ubuntu.com/manpages/precise/en/man8/kexec.8.html http://manpages.ubuntu.com/manpages/precise/en/man8/pxe-kexec.8.html http://myllynen.fedorapeople.org/pxkxc-0.1.1.tar.gz http://doc.fedora-fr.org/wiki/Configuration_d %27un_serveur_pour_lancer_des_installations_par_PXE_boot http://pxe-kexec.berlios.de/ https://www.kernel.org/pub/linux/kernel/people/geoff/petitboot/petitboot.html http://www.solemnwarning.net/kexec-loader/ http://www.solemnwarning.net/kexec-loader/faq
  • 8. • • • • • • • • • • • • • • • • • http://www.solemnwarning.net/kexec-loader/readme.html https://wiki.archlinux.org/index.php/kexec http://www.almesberger.net/cv/papers/ols2k-9.pdf http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/exec.3.html http://web.archive.org/web/20130121033946/http://www.ibm.com/developerworks/linux/lib rary/l-kexec/index.html http://archive09.linux.com/feature/1502 http://mjg59.dreamwidth.org/28746.html http://www.outflux.net/blog/archives/2013/12/10/live-patching-the-kernel/ http://turbochaos.blogspot.fr/2013/10/writing-linux-rootkits-301_31.html http://prefetch.net/blog/index.php/2009/07/06/using-kdump-to-get-core-files-on-fedora-andcentos-hosts/ http://www.solemnwarning.net/kexec-loader/downloads/addmod.sh https://github.com/mjg59/kexec-tools/tree/mjg_dummy http://grsecurity.net/~spender/msr32.c http://xorl.wordpress.com/2010/11/20/grkernsec_hidesym-hide-kernel-symbols/ http://web.archive.org/web/20130116180330/http://lkcd.sourceforge.net/ https://docs.google.com/file/d/0ByaHyu9Ur1viMm52TFdXTVVNWjg/edit http://wwwarchive.xenproject.org/files/xensummit_santaclara11/aug3/7_DanielK_Kexec_KDump.pdf