Login Logout

TipsKernel

Tips Kernel

Introduction

$ uname -a

Le noyau en lui même est un fichier de quelques Mo. Il est souvent nommé /boot/vmlinuz-X.y.z-patch. C’est ce fichier qui est lancé par le boot loader (LILO, GRUB, Yaboot, etc.). Les modules éventuels se retrouvent souvent sous le répertoire /lib/modules/X.y.z-patch/. Parlons aussi du fichier System.map (table des symboles du noyau) qui se trouve en général dans le répertoire /boot/. Enfin, parlons du fichier initrd qui se trouve sur certains systèmes Linux. Il s’agit d’un disque RAM initialisé au démarrage avant le noyau pour permettre un démarrage en deux phases (utile dans certains cas). Ce fichier sera également lancé par le boot loader.

timestamp dmesg

Quant on a une ligne du type :

[3412725.317750] entry->group=(null) inode=(null) wd=4096

On peut déduire depuis combien d’heure(s) cela s’est produit avec la commande :

$ echo "($(awk '{print $1}' /proc/uptime) - 3412725.317750 ) / 60 / 60" | bc
18

Depuis dmesg version 2.25 (Debian Jessie), on peut utiliser dmesg -T qui indiquera la date et l’heure. Exemple de sortie :

# dmesg -T
[…]
[Fri Jul  7 10:57:14 2017] usb 1-2.1.4: new low-speed USB device number 12 using xhci_hcd           
[Fri Jul  7 10:57:14 2017] usb 1-2.1.4: New USB device found, idVendor=1e54, idProduct=2030         
[Fri Jul  7 10:57:14 2017] usb 1-2.1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0    
[Fri Jul  7 10:57:14 2017] usb 1-2.1.4: Product: USB Keyboard                                       
[Fri Jul  7 10:57:14 2017] usb 1-2.1.4: Manufacturer: TypeMatrix.com                                
[…]

touches magiques Sysrq

Avec le clavier

Alt+SysRq+<touche magique>

SysRq est souvent la touche Impr écran (sur certains claviers, il faut Fn), donc Alt+Impr écran+<touche magique>

En ligne de commande / SSH

# sysctl -w kernel.sysrq=1
# echo <touche magique> > /proc/sysrq-trigger

Ou si sysctl ne fonctionne pas…

# sysctl -w kernel.sysrq=1
-bash: /sbin/sysctl: Input/output error
# echo "1" > /proc/sys/kernel/sysrq

Voici les principales touches magiques (dans un ordre croissant de violence) :

  • s : Will attempt to sync all mounted filesystems.
  • u : Will attempt to remount all mounted filesystems read-only.
  • b : Will immediately reboot the system without syncing or unmounting your disks.

Pour la liste complète des touches magiques : https://www.kernel.org/doc/Documentation/sysrq.txt

CPU hotplug

L’ajout de CPU à chaud peut être utile sur des machines virtuelles.

Activation :

# echo 1 > /sys/devices/system/cpu/cpu1/online
[2413287.667565] CPU1 has been hot-added
# echo 1 > /sys/devices/system/cpu/cpu2/online
[2413287.668239] CPU2 has been hot-added

Désactivation :

# echo 0 > /sys/devices/system/cpu/cpu2/online

Compilation de noyau

Préparation du noyau

Noyau vanilla :

$ tar -xf linux-X.y.z.tar.xz

Patches

Patches rc ou X.y.z

$ cd linux-X.y
$ patch -p1 < ../patch

Ne pas utiliser de noyau X.y.z car les modifications sont déjà intégrées aux patches rc.

Patches grsecurity :

https://grsecurity.net/

$ gunzip < grsecurity.patch.gz |  patch -p0

Patches IPTables

http://www.netfilter.org/documentation/HOWTO/fr/netfilter-extensions-HOWTO.html

$ cd netfilter/patch-o-matic
$ ./runme extra

Patches Debian

Debian propose des paquets linux-source-* contenant les sources vanilla patchées.

Choix des options

Pour le choix des options, plusieurs alternatives :

  • make menuconfig (nécessite le paquet libncurses5-dev)
  • make xconfig (nécessite le paquet libqt4-dev)
  • make config

Pour récupérer les options d’un autre noyau (même plus ancien) :

$ cp /boot/config-X.y.z .config
$ make oldconfig

Compilation classique

# apt install libssl-dev
$ make clean
$ make bzImage 
$ make modules

Pour l’installer :

# cp arch/i386/boot/bzImage /boot/vmlinuz-foo
# makes modules_install

Compilation “à la sauce Debian”

# apt install kernel-package build-essential kmod xz-utils

Modifier éventuellement le fichier /etc/kernel-pkg.conf puis lancer la compilation :

$ make-kpkg clean
$ make-kpkg -j4 --append-to-version=-foo --initrd buildpackage

FAQ

erreur “No filesystem could mount root”

En cas d’erreur :

No filesystem could mount root, tried:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

Une solution possible est de vérifier que l’initrd est bien présent et/ou de le regénérer via update-initramfs ; par exemple avec un noyau 3.2.0-4-amd64 :

# update-initramfs -c -v -k 3.2.0-4-amd64
# update-grub2