Noyau Linux

Pense-bête

Fichiers “core”

Lorsqu’un processus plante, il peut être possible de récupérer une image de son espace mémoire (core) au moment du crash (man 5 core). Cette fonctionnalité étant désactivée par défaut, il faut pour l’activer ajuster le paramètre core des limites de session PAM (man 8 pam_limits) : la valeur attendue est la taille maximale autorisée pour un un fichier core en kilo octets.

ulimit -c 50000       # autorise des fichiers core jusqu'à 50 Mo
ulimit -c unlimited   # autorise des fichiers core de toute taille

Pour rendre la modification persistante, modifiez plutôt le fichier /etc/security/limits.conf (lignes “core”).

⚠️ En fonction de la quantité de mémoire manipulée par processus exécutés sur la machine, les fichiers cores peuvent peser jusqu’à plusieurs gigas octets ! Assurez-vous d’avoir assez d’espace disque pour les stocker, ou définissez une taille maximale en conséquence.

Par défaut, en cas de crash d’un processus le noyau Linux génère un fichier humblement nommé core situé dans le répertoire d’exécution du processus crashé — habituellement / pour les daemons, mais cela peut être variable d’un logiciel à l’autre. Cependant, vous pouvez personnaliser l’emplacement et le nom du fichier à l’aide du paramètre noyau kernel.core_pattern.

Exemple :

echo "/tmp/%e.%t.core" > /proc/sys/kernel/core_pattern   # générera "/tmp/apache.1413621913.core"

Les éléments de personnalisation du nom de fichier selon le contexte du crash sont :

Astuces

Magic keys : éteindre son système proprement lorsque son ordinateur est bloqué

Si par malheur votre système GNU/Linux venait à “freezer” (plus rien ne bouge et le clavier ne répond plus) et alors que vous vous dirigez résigné vers le bouton Power de votre ordinateur, sachez qu’il existe une méthode pour arrêter proprement un système bloqué — attention, pas planté (kernel panic) — et ainsi éviter de devoir ramasser son système de fichiers à la petite cuillère au prochain reboot. Dans une telle situation, tape la séquence de caractères suivante en maintenant les touches <alt> et <Print screen> (SysRq) enfoncées :

reisub

En pressant les touches <alt> et <SysRq>, vous activez une option particulière du noyau appelée “Magic keys” qui vous permet de demander directement au noyau d’effectuer certaines opérations. Ici, chaque lettre de la séquence correspond à une de ces actions, qui sont à entrer scrupuleusement dans l’ordre annoncé :

  1. r (pour Raw) : passe le clavier en mode “brut”
  2. e (pour tErm) : envoie le signal SIGTERM à tous les processus en cours (sauf init)
  3. i (pour kIll) : envoie le signal SIGKILL à tous les processus qui tourneraient encore malgré le précédent SIGTERM (sauf init)
  4. s (pour Sync) : vide le cache des disques durs et force l’écriture des données
  5. u (pour Umount) : démonte tous les systèmes de fichiers et les remonte en lecture seule pour éviter une vérification au prochain démarrage
  6. b (pour reBoot) : reboote l’ordinateur ;)

Réinitialiser un mot de passe root oublié (sans Live CD)

Sur la plupart des distributions récentes, même le mode single vous demande le mot de pass root. Ici, l’astuce consiste à booter la machine en modifiant la séquence de boot traditionnelle (chargement du noyau et de ses modules, puis init et la traversée des runlevels : on va ici obtenir directement un shell directement après le chargement du noyau et ainsi pouvoir agir sur le système sans avoir à se logger. À l’écran du bootloader (GRUB ou LiLo), ajouter le paramètre suivant aux options du noyau :

init=/bin/sh

…et bootez. Passé quelques secondes vous vous voyez offrir un prompt, mais avant de dégainer le passwd il faut remonter le système de fichiers en écriture (car dans les premières étapes du démarrage le FS est en lecture seule) :

mount -o remount,rw /
passwd                  # ou modifiez à la main /etc/passwd (supprimez le "x" du deuxième champ de la ligne root)
sync                    # on force les écritures sur le disque sur
mount -o remount,ro /
reboot

Vider le cache système

echo 3 >/proc/sys/vm/drop_caches

Libérer l’espace occupé par un fichier utilisé par un processus

Il arrive parfois qu’un processus utilise un fichier pour y écrire (beaucoup) de données, mais ne le ferme pas lorsqu’il a finit de l’utiliser et maintient donc son descripteur de fichier (FD, “file descriptor”) ouvert. En conséquence, le volume de données du fichier est occupé sur le disque, et vous ne pouvez pas supprimer le fichier puisqu’il est déjà effacé du point de vue du système de fichiers. Si vous ne pouvez pas arrêter/redémarrer le processus afin qu’il “lâche” le FD, on pourrait penser que vous l’avez dans le fondement…

Pas de panique, malgré son absence sur le disque dur il est toujours possible d’accéder au contenu du fichier en question via l’identifiant du FD tenu par le processus lui-même : vous pouvez donc “écraser” ses données comme vous le feriez sur un fichier traditionnel. Pour récupérer l’identifiant du FD, repérez la référence dans la 5ème colonne (“FD”) à l’aide de la commande lsof :

# lsof
COMMAND     PID   TID USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
…
python    13179       marc    3w      REG                8,1  1443964  8135942 /tmp/blah (deleted)
…

Puis écrasez les données du fichier via sa représentation virtuelle dans /proc/<PID du processus>/fd/ :

echo >/proc/13179/fd/3

La taille du fichier — bien que toujours ouvert —, est maintenant de 0 octets :

# lsof
COMMAND     PID   TID USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
…
python    13179       marc    3w      REG                8,1       0   8135942 /tmp/blah (deleted)
…

Forcer un processus à terminer en générant un fichier “core”

kill -SIGQUIT <PID>