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.tar

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 fichier
  • kernel_write() : Écriture dans le fichier
  • filp_close() : Fermeture propre du fichier
  • printk() : Journalisation interne du noyau