Tous les articles par Speedy

Suppression automatique de modules non utilisés avec un noyau 2.6.

Depuis la sortie du noyau 2.6, l’option autoclean de rmmod (rmmod -a) qui permettait de supprimer facilement de la mémoire les modules du noyau non utilisés n’est plus disponible.

Cet article donne une façon de rétablir une telle fonctionnalité.

Avertissement: Si cette possibilité a disparu du noyau 2.6, c’est pour une très bonne raison. La suppression de certains modules n’est pas conseillée et est susceptible de rendre un système instable, voire même de le planter. Même si cette fonctionnalité était disponible avec les noyaux 2.4.x, elle était tout aussi dangereuse.

Le contexte.

Il m’arrive de temps en temps de lire des disquettes ou des CD-ROM. Je trouve très dommage d’encombrer en permanence la mémoire de ma machine avec des drivers rarement utilisés, surtout quand la machine dispose de très peu de mémoire.

D’où l’idée de compiler en module les drivers du lecteur de disquettes, du lecteur de CDROM et les systèmes de fichier iso 9660, ext2 et fat et de les charger en mémoire seulement quand c’est nécessaire.

Le chargement automatique de ces modules lorsqu’on monte une disquette ou un CDROM n’a posé aucun problème, mais une fois qu’on en a fini avec eux, les modules restent en mémoire si on ne les supprime pas manuellement.

Une solution.

Tout d’abord, le noyau doit être compilé avec les options nécessaires:

– Le système de fichier /proc (CONFIG_PROC_FS).
– L’option permettant de supprimer des modules pour les noyaux 2.6 uniquement (CONFIG_MODULE_UNLOAD).
Par défaut, cette dernière option n’est pas compilée.

Pour détecter et décharger les modules inutiles, j’ai écrit un script bash (appelé autoclean). Il recherche dans /proc/modules les modules dont le compteur d’utilisation est à zéro puis les supprime avec rmmod.

Certains drivers ne mettent pas ce compteur à jour lorsqu’ils sont compilés sous forme de modules. C’est notamment le cas de certains drivers de souris ou de clavier (comment décider si le driver d’une souris est utilisé ?). De tels modules risquent donc d’être supprimés alors qu’ils sont utilisés et nécessaires à la bonne marche du système.

Afin d’éviter ce genre de problèmes, j’ai prévu d’utiliser un fichier de configuration (/usr/local/etc/autoclean.conf). Le script vérifie que les modules dont le compteur est à zéro ne sont pas présents dans ce fichier avant de les supprimer. Ce fichier, dont les lignes commençant par un # sont ignorées, n’a pas de format particulier.

Voici le source de ce script:


#!/bin/bash

EXCLUDE=/usr/local/etc/autoclean.conf

cat /proc/modules | egrep "[[:space:]]0[[:space:]]" |
while read MODULE NOT_USED; do
if ! (sed -e "/^#/d" $EXCLUDE | grep "<$MODULE>") &> /dev/null ; then
/sbin/rmmod $MODULE
fi
done

exit 0

Pour une suppression automatique des modules, il suffit d’ajouter un appel à ce script dans une cron table. Par exemple, dans ma cron table root, j’ai ajouté la directive suivante:


*/15 * * * * /usr/local/sbin/autoclean

Cette directive lance une recherche et une suppression des modules non utilisés toutes les 15 minutes.

Conclusion.

Cette méthode s’est montrée très fiable chez moi et m’a permis de réduire de façon substancielle l’empreinte mémoire de mon noyau sans sacrifier la moindre fonctionnalité.

Cependant, il faut rester très prudent avec la suppression des modules. Certains modules ne doivent pas être supprimés du tout et d’autres ne peuvent pas l’être par cette méthode car il n’y a aucun moyen fiable de savoir quand ils sont utilisés et quand ils ne le sont pas.

Créer une disquette de boot pour noyau 2.6 avec grub

Contrairement à leurs ancêtres, les noyaux 2.6 ont besoin d’un gestionnaire d’amorçage pour booter. La création d’une disquette de boot ne peut donc plus se faire au moyen d’un simple:


# cp bzImage /dev/fd0

La création d’une disquette de boot avec lilo ayant échoué, je décide de tenter ma chance avec grub.

Cet article décrit la méthode que j’ai employé pour arriver à mes fins (ce n’est certainement pas la seule méthode possible).

Je partirai du principe que grub est déjà installé sur le PC qui servira à créer la disquette boot.

Installation de grub sur une disquette

Premièrement, formatez la disquette au format ext2fs et créez-y les répertoires boot et boot/grub:


# mke2fs /dev/fd0
# mount -t ext2 /dev/fd0 /floppy
# mkdir /floppy/boot
# mkdir /floppy/boot/grub

Ensuite, on copie sur la disquette les fichiers stage1 et stage2 de grub (les fichiers *stage1_5 ne sont pas indispensables ici).

# cp /usr/lib/grub/i386-pc/stage[12] /floppy/boot/grub[[localisation des fichiers sur une Debian woody]]

Enfin, on peut passer à l’installation de grub proprement dite.


# umount /floppy
# grub
Probing devices to guess BIOS drives. This may take a long time.

GRUB version 0.91 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename. ]

grub> root (fd0)
Filesystem type is ext2fs, using whole disk

grub> setup (fd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... no
Running "install /boot/grub/stage1 d (fd0) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded
Done.

grub> quit

Voilà, grub est installé sur la disquette, il n’y a plus qu’à le configurer.

Configuration de grub

Tout d’abord, voici comment booter un noyau qu’on aura au préalable copié sur la disquette.


# mount -t ext2 /dev/fd0 /floppy
# cp bzImage /floppy/boot

A ce stade, il n’y a plus qu’à créer un fichier: le fichier de configuration /floppy/boot/grub/menu.lst.

Le contenu suivant fera très bien l’affaire:


timeout 2
default 0
title Linux 2.6.0-test10 (disquette)
root (fd0)
kernel /boot/bzImage root=/dev/sda3

Naturellement, remplacez le /dev/sda3 par la partition root.

Grub permet également de booter un noyau qui se trouve sur un autre média.

Pour aller chercher un noyau sur le disque dur, il suffit d’ajouter au fichier menu.lst une entrée de ce style.


title Linux 2.6.0-test10 (disque dur)
root (hd0,0)
kernel /bzImage root=/dev/sda3

hd0,0 fait référence à la première partition du premier disque dur. Dans mon cas, il s’agit de /boot qui est sur une partition séparée, d’où le /bzImage.

Il ne reste plus qu’à démonter la disquette (umount /floppy) et à tester…

Conclusion

La création d’une disquette de boot avec grub reste simple. Une fois grub installé sur une disquette de 1.44 Mo, il reste plus de 1.2 Mo pour le noyau, ce qui est largement suffisant.

Grub est également d’une très grande souplesse puisque depuis une disquette, on a la possibilité d’aller chercher le noyau à booter sur un disque dur (ce qui est plus rapide si on boote sur disquette suite à un simple problème de MBR).

Noyau 2.6 sur une Debian Woody.

Je partirai du principe que le lecteur est déjà familiarisé avec la
compilation des noyaux de la famille 2.4.x « à l’ancienne ».

Bien que ce que je présente dans ce guide se soit assez bien passé pour moi, je ne peux que très vivement recommander de faire une sauvegarde complète du système avant de commencer, surtout si la configuration de la machine sort un tant soit peu de l’ordinaire.

Le noyau 2.6 est encore en béta version, et il est à craindre que les drivers de certains périphériques peu courants n’aient pas encore été beaucoups testés.

1/ La compilation.

La dernière version du noyau peut-être récupérée sur Le package update:

Si ce package est présent (dpkg -l | grep update pour vérifier), il provoquera un avertissement [[warning: process `update’ used the obsolete bdflush system call. Fix your initscripts ?]] pendant la phase d’init. Ce package est obsolète depuis la sortie du noyau 2.2.8 et peut-être supprimé.

Clients NFS:

Par défaut, /etc/init.d/nfs-common lance le démon lockd. Avec un kernel récent, c’est inutile (lockd est lancé automatiquement au montage d’un volume nfs). Avec le noyau 2.6, ça a provoqué un message d’erreur [[lockdsvc: function not implemented] »>http://www.kernel.org à l’init. Ce message est inoffensif. Pour éviter ce désagrément, il suffit de positionner la variable NEED_LOCKD à no au début du script nfs-common.

Pour s’assurer que le lancement de lockd à l’init n’est pas nécessaire, il suffit de faire un test. Si avec un nfs-common modifié un ‘ps aux’ fait apparaître une ligne [lockd »>ici après montage d’un volume nfs, ce script peut-être modifié sans risque.

Conclusion:

Il est encore un peu tôt pour que je me prononce sur ce noyau. Seul mon 486 tourne régulièrement avec le noyau 2.6 (contre toute attente, tous les drivers nécessaires à son bon fonctionnement avaient été portés).

Les résultats préliminaires sont plutôt encourageant. Le seul problème que j’ai eu à déplorer en 2 semaines d’utilisation est un freeze complet de la machine intervenu après une semaine et demie de fonctionnement continu et sans le moindre incident.

Compte tenu du caractère pour le moins exotique de la plate forme de test, ce n’est pas si mal pour un noyau qui est encore en béta version.