Bonjour Module est un module simple pour le noyau Linux qui a pour objectif principal de journaliser son activité dans un fichier texte. Il sert de démonstration pratique pour comprendre les bases de la programmation de modules noyau sous Debian 12 (Bookworm).
Journalisation au Chargement
- Crée ou ouvre le fichier
/tmp/bonjour.txt - Insère le message :
"Module chargé - en fonction\n" - Utilise les appels système du noyau pour l’écriture fichier
Journalisation au Déchargement
- Rouvre le même fichier à la suppression du module
- Ajoute le message : « Module déchargé – hors fonction\n »
- Garantit une trace de l’état du module
Archive du projet
bonjour_module.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Votre Nom");
MODULE_DESCRIPTION("Un module simple qui log dans /tmp/bonjour.txt");
// Fonction d'initialisation du module
static int __init bonjour_init(void)
{
struct file *fichier;
loff_t pos = 0;
char *message = "Module charge - en fonction\n";
printk(KERN_INFO "BonjourModule: Initialisation du module\n");
// Ouvrir le fichier en écriture (création si nécessaire)
fichier = filp_open("/tmp/bonjour.txt", O_WRONLY | O_CREAT | O_APPEND, 0644);
if (IS_ERR(fichier)) {
printk(KERN_ERR "BonjourModule: Erreur d'ouverture du fichier\n");
return PTR_ERR(fichier);
}
// Écrire dans le fichier
kernel_write(fichier, message, strlen(message), &pos);
// Fermer le fichier
filp_close(fichier, NULL);
printk(KERN_INFO "BonjourModule: Message ecrit dans /tmp/bonjour.txt\n");
return 0;
}
// Fonction de nettoyage du module
static void __exit bonjour_exit(void)
{
struct file *fichier;
loff_t pos = 0;
char *message = "Module decharge - hors fonction\n";
printk(KERN_INFO "BonjourModule: Dechargement du module\n");
// Ouvrir le fichier en écriture
fichier = filp_open("/tmp/bonjour.txt", O_WRONLY | O_APPEND, 0644);
if (IS_ERR(fichier)) {
printk(KERN_ERR "BonjourModule: Erreur d'ouverture du fichier a la sortie\n");
return;
}
// Écrire dans le fichier
kernel_write(fichier, message, strlen(message), &pos);
// Fermer le fichier
filp_close(fichier, NULL);
printk(KERN_INFO "BonjourModule: Module decharge\n");
}
module_init(bonjour_init);
module_exit(bonjour_exit);
Makefile
obj-m += bonjour_module.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
install:
$(MAKE) -C $(KDIR) M=$(PWD) modules_install
Installation des prérequis , headers de fichier du noyau ,et les build-essential so pas encore mis.
sudo apt update
sudo apt install linux-headers-$(uname -r) build-essential
compilation et test
# Compiler le module
make
# Charger le module
sudo insmod bonjour_module.ko
# Vérifier que le module est chargé
lsmod | grep bonjour_module
# Vérifier le contenu du fichier log
cat /tmp/bonjour.txt
# Voir les messages du noyau
dmesg | tail
# Décharger le module
sudo rmmod bonjour_module
# Vérifier à nouveau le fichier log
cat /tmp/bonjour.txt
Usage typique
# Chargement manuel
sudo insmod bonjour_module.ko
# Vérification
cat /tmp/bonjour.txt
dmesg | tail
# Déchargement
sudo rmmod bonjour_module
mais encore
sudo dmesg
..
[506409.469558] bonjour_module: loading out-of-tree module taints kernel.
[506409.472225] BonjourModule: Initialisation du module
[506409.472488] BonjourModule: Message ecrit dans /tmp/bonjour.txt
bruno@work:~/Works/module/bonjour_module $
🔧 Mécanismes Techniques
Fonctions Noyau Utilisées
filp_open(): Ouverture/création de fichierkernel_write(): Écriture dans le fichierfilp_close(): Fermeture propre du fichierprintk(): Journalisation interne du noyau
