Chargez un noyau linux sans reboot avec kexec

download Chargez un noyau linux sans reboot avec kexec

If you can't read please download the document

Transcript of Chargez un noyau linux sans reboot avec kexec

Diamond_editions

Chargez un nouveau noyau linux chaud avec kexec Thierry GAYEThttp://www.nextinnovation.orgQui n'a jamais souhait pouvoir tester un noyau chaud sans avoir rebooter physiquement son systme pour minimiser le temps mort du au redmarrage d'un systme.1. IntroductionLe nom kexec provient de l'excution du noyau, driv de l'appel du noyau exec Unix / Linux. C'est un mcanisme du noyau Linux qui permet le dmarrage chaud d'un nouveau noyau sur le noyau en cours d'excution. En effet, il permet donc de sauter plusieurs tape:phase d'initialisation du matriel par le microprogramme du systme: BIOS, BIOS UEFI, coreboot (aka linuxBios);

diffrents tests sur le matriel:mmoire vive;

priphriques de stockages ou mass-storage (disques RAID, );

...

bootloader grub ou autre

Il charge donc directement le nouveau noyau en mmoire, et commence s'excuter immdiatement aprs. Cela permet d'viter de longs dlais associs un redmarrage complet, et peut aider les systmes rpondre aux exigences de haute disponibilit en minimisant les temps d'arrt.Cela fonctionne sur des serveurs de grosses capacits (mmoire, disques, etc), et mme 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-toolsAvec les drivs de Red Hat, la commande pourra varier yum install kexec-tools ou sous gentoo emerge -av kexec-tools.L'installation de ce package entranera par dpendance l'installation d'autres packages comme debconf, initramfs-tools, makedumpfile et enfin crash.3. DmarrageUn redmarrage via kexec se dcompose en 2 phases : Un redmarrage via kexec se dcompose en 2 phases : chargement du noyau en spcifiant les paramtres ncessaires ;

excution du redmarrage

3.1 Vrification des conditions initialesPremirement on vrifiera la version courante du noyau GNU/linux dj charg pour la comparer une fois le redmarrage 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 vrifiera galement les paramtres passs 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=7Enfin, on pourra vrifier les versions noyaux prsente dans la partition de boot:$ ls -al /boot | grep vmlinuz -rw-r--r-- 1 root root 3847424 fvr. 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-genericet$ 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 dc. 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 dc. 14 11:01 initrd.img-3.8.0-34-genericOn pourra donc soit charger un noyau compil sparment ou bien un autre noyau.3.2 Chargement du noyauDans cette phase prparatoire, il sera donn plusieurs paramtre kexec:le noyau charger (option -l)

les options qui doivent tre pass ce noyau (option append= ou command-line=)

linitrd 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-genericPour la ligne de paramtre, 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'excute pas pour autant.3.3 Redmarrage du noyau noyauLoption -e (pour execute) de la commande kexec lance la squence de redmarrage.:$ sudo kexec -eAttention sur un serveur cela change de noyau mais sur un desktop, la session sera coupe.Une fois redmarr, on peut vrifier le changement de noyau grace la version:$ uname -aLinux 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/LinuxEt voil votre systme qui vient de change de noyau et cela chaud!!3. L'envers du dcors de kexec

Un des plus grands dfis dans le dveloppement de kexec vient du fait que le noyau Linux fonctionne partir d'une adresse fixe en mmoire. Cela signifie que le nouveau noyau aura besoin de se charger la mme adresse que le noyau actuel. Sur les systmes x86, le noyau se trouve l'adresse phyisique 0x100000 (adresse de 0xc0000000 en virtuel, connu sous le nom PAGE_OFFSET). La tche d'crasement de l'ancien noyau avec la nouvelle se fait en trois tapes :Copie du nouveau noyau en mmoire;

Dplacement de l'image du noyau dans la mmoire dynamique du noyau;

Copie de cette image dans la destination relle (en remplaant le noyau actuel), puis redmarrage du nouveau noyau .

Les deux premires tapes sont ralises lors du chargement du nouveau noyau .La premire tche consiste interprter le contenu du fichier image du noyau. Kexec-tool a t construit de telle sorte que l'on puisse en principe charger et dmarrer n'importe quel moment un noyau (mme non-linux).Actuellement, il est possible de dmarrer n'importe quel noyau de format ELF32. Le fichier est analys et les segment du noyau sont chargs dans les buffers. Ces segments sont classs 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 utilise 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;};Dtail de la structure kexec_segment.Les deux premiers lments de la structure pointe sur la mmoire tampon de l'espace utilisateur et sa taille. Les deux lments suivants indiquent la destination finale du segment ainsi que sa taille.

Une fois l'image du noyau charge en mmoire par le module relatif au format respectif, elle est transfre dynamiquement grce l'appel systme sys_kexec. Cet appel systme alloue les pages de noyau dynamique pour chacun des segments qui ont t adoptes 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 rel d'crasement du noyau actuel avec le nouveau noyau et s'il dplace. Le reboot_code_buffer est le seul tampon qui se trouve dans son dernier lieu transitoire. En d'autres termes, il est excut partir du mme endroit o il a t initialement initialement charg. Pour ce faire, sur les systmes avec MMU d'activ, la page contenant le code identit comme mape. Pour parler simplement, il s'agit de crer une page d'entre de table dans la structure de la table de la page du noyau init_mm avec la mme adresse physique et virtuel. Cela est ncessaire pour tre en mesure d'accder ce morceau de code lors de l'opration de redmarrage , comme nous le verrons plus tard.

Les informations sur la reboot_code_buffer, les diffrents segments, et d'autres dtails sont maintenues grce 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;};Dtail de la structure kimage.Les parties les plus importantes de cette structure sont, bien sr, le segment [KEXEC_SEGMENT_MAX+1] qui pointent vers les tampons de la mmoire du noyau contenant l'image, et le pointeur reboot_code_pages au stub assembleur utilis pendant la phase de redmarrage.Une fois l'image du noyau charg, le systme est prt redmarrer avec ce dernier. Le fonctionnement rel sur le redmarrage sur le nouveau noyau dmarre avec la commande kexec -e . Cette commande appelle essentiellement le noyau pour effectuer un redmarrage l'aide de l'appel systme de sys_reboot, mais avec un drapeau spcial de - LINUX_REBOOT_CMD_KEXEC L'appel systme reboot, en voyant le drapeau spcial, transfre le contrle la fonction machine_kexec(). Les actions ralises par machine_kexec( ) sont extrmement spcifique l'architecture. Sous x86, la squence d'actions est la suivante:Pour l'accs reboot_code_buffer bascule de la structure de mm du processus actuel la structure de init_mm du noyau;

Arrte les APICS et dsactive les interruptions;

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 sous-programme de relocate_new_kernel;

Charge tous les registres de segment avec le segment de donnes du noyau ( __KERNEL_DS ) de valeur et invalide la GDT et IDT;

va au code localis dans reboot_code_buffer, et passe des informations vitales comme les paramtres passer au nouveau noyau, la page d'indirection contenant les adresses source / destination de l'image du noyau, l'adresse de dpart du nouveau noyau, l'adresse de la page reboot_code_buffer et un drapeau indiquant si le systme a l'extension d'adresse physique (PAE) est activ.

Le stub assembleur effectue quant lui les oprations suivantes :Lit les arguments de la pile et les sauvegarde dans des registres et dsactive 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 dpart de la nouvelle image du noyau sur la pile de sorte que le retour du code de remplacement prendra automatiquement le systme l'image du nouveau noyau;

Dsactive la pagination en rglant les bits appropris dans le registre de cr0;

Remet le registre de base de rpertoire de pages, cr4 , zro;

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 zro , l'exception du registre de pointeur de pile esp ( car il pointe vers la pile contenant l'adresse de dpart du nouveau noyau ) .

Retours partir du stub. Cela prend en compte automatiquement le systme comme le nouveau noyau .

Aprs cette squence termine, le nouveau noyau prend le contrle et le systme est dmarr normalement.4. Avantages et utilisations de kexec

Les systmes avec des exigences de haute disponibilit et les dveloppeurs du noyau qui doivent redmarrer sans cesse leurs systmes apprcieront le plus des avantages que peut offrir kexec. Parce que kexec saute les parties les plus fastidieuses (lente) du redmarrage du systme, savoir la phase de firmware, le redmarrages avec kexec sont extrmement rapides et la disponibilit est augmente.Kexec a galement des applications intressantes dans les outils de vidage mmoire. Le projet Linux Kernel Crash Dumps (LKCD) a utilis kexec pour laborer un mcanisme de dumping diffrent.Lors d'un kernel panic du systme ou lors de l'initialisation d'un dump par l'utilisateur, l'image de la mmoire systme est comprim et stock dans les pages de mmoire disponibles. Ensuite, le systme est redmarr avec un autre noyau en utilisant kexec. La zone de stockage est prcis ce dernier de faon viter tout crasement ou altration. Par la suite, le dump mmoire peut tre rcupr sur l'une d'une partition de disque ou travers le rseau.La cl de la ralisation rside dans le fait qu'en vitant l'tape de firmware pendant le redmarrage, LKCD est capable d'empcher le contenu de la mmoire physique d'tre effac. 5. Spcificit Debian ou UbuntuPour les utilisateurs de Debian, Ubuntu, etc, kexec ce substitue au reboot classique de la machine ds son installation. Par dfaut, un reboot charge, chaud, le noyau /vmlinuz avec les options courantes (rcupres dans /proc/cmdline) et linitrd /initrd.img.Ces paramtres peuvent tre modifis dans le fichier /etc/default/kexec :...# Utilisation de kexec pour le redmarrage ? true/falseLOAD_KEXEC=true # Noyau par dfaut charger :KERNEL_IMAGE="/vmlinuz"

# initrd charger par dfaut :INITRD="/initrd.img" # Options de dmarrage du noyau. Si vide, rcupre les options# de /proc/cmdline :APPEND=""# ex : APPEND="$( cat /proc/cmdline ) panic=10"Une fois kexec-tools install sur votre systme vous pouvez effectuer un redmarrage classique via coldreboot qui est un script bash contenant:#!/bin/shNOKEXECFILE=/tmp/no-kexec-reboot

/bin/rm -f $NOKEXECFILEtouch $NOKEXECFILE/sbin/reboot $*La commande du redmarrage ncessite elle aussi des droits superutilisateur:$ sudo coldreboot6. 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-kexecPour la mise en place de kexec via pxe, l'utilitaire pxkxc peut tre tlcharg: http://myllynen.fedorapeople.org/Il allie la simplicit du PXE et la puissance de kexec pour permettre des dmarrage d'une image kernel / initrd depuis un serveur PXE sans la ncessit pour le soutien HW, les images de dmarrage, ou mme d'avoir redmarrer le systme. Par exemple, on peut lancer l'installation d'une distribution sans mdia de dmarrage.pxkxc fournit une interface utilisateur et comme il a t implment en Python il est facile de l'amliorer et de le personnaliser au besoin.Quelques exemples de cas d'utilisation concret:Un utilisateur dcide, avec le soutien kexec, de faire une nouvelle installation d'un systme linux sur un systme en cours d'excution. L'utilisateur excute simplement pxkxc en tant que root et choisit l'option de menu approprie. Le programme d'installation dmarre automatiquement sparment en tlchargeant ou l'criture des images de dmarrage incluant tout le support ncessaire pour le matriel.

Une entreprise dispose de plusieurs types de systmes sur leur rseau, dont la plupart supportent PXE au niveau matriel. Les autres sont compatible avec gPXE. Cependant , le portage de nouveaux drivers ou mme des sous-systmes du noyau se rvlerait une tche hardue concrtiser pour faire en sorte que tous les drivers rseau possde un support avec gPXE. En crant une image d'amorage constitu par un noyau rcent GNU/linux et un initrd modifi qui lance pxkxc l'entreprise peut faire les installations bases PXE sur tous leurs systmes, indpendammentdu niveau de prise en charge PXE / gPXE de leur matriel. Aussi, en ajoutant quelques personnalisations comme les paramtres de proxy HTTP ou d'autres ajustements en fonction de l'environnement de rseau dtecte, cela devient un outils convivial pour l'administrateur systme et rseau. Pxkxc jusqu'ici a surtout t test en utilisant les touches F12 et F13, l'autre combinaisons peuvent aussi fonctionner.

7. ScuritBien que possible, la mise en uvre d'un mcanisme tel que kexec soulve deux dfis majeurs:La mmoire du noyau en cours d'excution est remplac par le nouveau noyau, alors que l'ancien est toujours en cours d'excution;

Le nouveau noyau devra gnralement s'attendre ce que tous les priphriques physiques soient dj dans un tat bien dfini, car ils sont aprs un redmarrage du systme , lorsque le BIOS , l'UEFI ou le microprogramme du systme rinitialise les un tat sain d'esprit . Le contournement d'un rel redmarrage peut laisser les appareils dans un tat inconnu, et le nouveau noyau devra se remettre de cette transition.

Il y a des problmes de scurit associs au mcanisme kexec, comme pratiquement tout ce que peut tre charg et excut de cette faon, en raison du fait que le nouveau noyau excuter n'est pas ncessairement sign. En d'autres termes, mme si un mcanisme dans le noyau solide permettrait d'assurer que seuls les modules du noyau Linux signs puisse tre chargs dans le noyau en cours d'excution, l'utilisateur root peut toujours charger du code arbitraire via kexec et l'excuter.8. ConclusionVoila, avec kexec, il est possible de rduire la disponibilit d'un systme en minimisant les reboot. Cela peu galement servir tester la configuration d'un noyau.9. Lienshttps://www.kernel.org/pub/linux/kernel/people/geoff/petitboot/kexec-man-11.10.21-g90da2c37.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/library/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-and-centos-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://www-archive.xenproject.org/files/xensummit_santaclara11/aug3/7_DanielK_Kexec_KDump.pdf