Résoudre les Problèmes de Gel sur les Systèmes Linux en Utilisant pci=nomsi

Les utilisateurs de Linux peuvent parfois rencontrer des problèmes de gel du système, souvent causés par des conflits d’interruptions ou des incompatibilités matérielles. Récemment, j’ai rencontré un problème complexe de ce type sur un mini-ordinateur Zotac CI320 Nano. Après une série de diagnostics et de tests, j’ai pu résoudre le problème en utilisant l’option de démarrage du noyau pci=nomsi. Cet article détaillé explique le problème, la solution et les étapes à suivre pour aider d’autres utilisateurs qui pourraient rencontrer des problèmes similaires.

Contexte du Problème

Le mini-ordinateur Zotac CI320 Nano que j’utilise se figeait régulièrement, même lorsqu’il était démarré à partir d’une clé USB en mode live. Malgré des tentatives de résolution en mettant à jour le BIOS et en testant différents systèmes Linux, le problème persistait. Les journaux système montraient des erreurs liées à l’ACPI et aux périphériques PCI, indiquant des conflits d’interruptions.

Les Symptômes

Les symptômes du problème incluaient :

  • Le système se figeait régulièrement, nécessitant un redémarrage manuel.
  • Des erreurs dans les journaux système, telles que :
  x86/cpu: VMX (outside TXT) disabled by BIOS
  ACPI BIOS Error (bug): Could not resolve symbol [\_SB._OSC.CDW1], AE_NOT_FOUND
  ACPI Error: Aborting method \_SB._OSC due to previous error (AE_NOT_FOUND)
  genirq: Flags mismatch irq 0. 00000080 (i801_smbus) vs. 00015a00 (timer)
  i801_smbus 0000:00:1f.3: Failed to allocate irq 0: -16

Diagnostic

Pour diagnostiquer le problème, j’ai utilisé les journaux système et plusieurs commandes pour vérifier les erreurs et les paramètres de démarrage du noyau.

Vérifier les journaux système

Les commandes suivantes m’ont permis de vérifier les erreurs dans les journaux système :

dmesg | grep -i error
journalctl -p 0..3 -xb

Vérifier les paramètres de démarrage du noyau

Pour vérifier avec quels paramètres le noyau a été démarré, j’ai utilisé :

cat /proc/cmdline

Cela m’a permis de voir les options de démarrage actuelles et de confirmer les paramètres utilisés.

Solution : Utilisation de pci=nomsi

L’option de démarrage du noyau pci=nomsi désactive les interruptions MSI (Message Signaled Interrupts) pour les périphériques PCI. Les interruptions MSI, bien que plus modernes et efficaces, peuvent parfois poser des problèmes de compatibilité matérielle ou de pilotes, entraînant des comportements erratiques comme des gels du système.

Étapes pour appliquer l’option pci=nomsi

  1. Éditez le fichier de configuration de GRUB :
   sudo nano /etc/default/grub
  1. Ajoutez l’option de démarrage pci=nomsi : Modifiez la ligne suivante pour inclure pci=nomsi :
   GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi"
  1. Mettez à jour GRUB :
   sudo update-grub
  1. Redémarrez le système :
   sudo reboot

Vérification

Après avoir appliqué cette option et redémarré, j’ai utilisé les commandes suivantes pour vérifier les journaux système et m’assurer que le problème était résolu :

dmesg | grep -i error
journalctl -p 0..3 -xb

Les erreurs précédentes avaient disparu, et le système ne se figeait plus.

Autres Options de Démarrage du Noyau

Outre pci=nomsi, il existe d’autres options de démarrage du noyau qui peuvent aider à résoudre des problèmes similaires. Voici quelques-unes des options les plus courantes :

acpi=off

  • Description : Désactive entièrement le support ACPI.
  • Utilisation :
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=off"
  • Impact : Désactiver l’ACPI peut résoudre certains problèmes de compatibilité matérielle, mais cela désactive également toutes les fonctionnalités de gestion de l’énergie fournies par l’ACPI, telles que l’hibernation, la suspension et la gestion des ventilateurs.

acpi=ht

  • Description : Désactive toutes les fonctionnalités ACPI sauf la gestion des interruptions.
  • Utilisation :
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=ht"
  • Impact : Cette option maintient certaines fonctionnalités essentielles de l’ACPI tout en désactivant les autres, ce qui peut aider à résoudre des problèmes de compatibilité sans affecter significativement la gestion de l’énergie.

libata.noacpi=1

  • Description : Désactive l’utilisation de l’ACPI pour libata, le sous-système de gestion des disques ATA.
  • Utilisation :
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash libata.noacpi=1"
  • Impact : Cette option peut aider à résoudre des problèmes liés aux disques ATA sans désactiver complètement l’ACPI pour les autres composants.

noapic

  • Description : Désactive l’APIC (Advanced Programmable Interrupt Controller).
  • Utilisation :
  GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noapic"
  • Impact : Désactiver l’APIC peut résoudre certains problèmes d’interruptions, mais cela peut également affecter la performance du système dans certains cas.

Combinaisons d’Options

Vous pouvez combiner plusieurs options de démarrage pour aborder différents aspects des problèmes de compatibilité. Par exemple :

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=ht pci=nomsi libata.noacpi=1"

Cela désactive certaines fonctionnalités ACPI, désactive les interruptions MSI pour les périphériques PCI, et désactive l’utilisation de l’ACPI pour les disques ATA.

Exemple Complet

Voici un exemple complet si vous utilisez plusieurs options de démarrage pour résoudre les problèmes :

  1. Éditez le fichier GRUB :
   sudo nano /etc/default/grub
  1. Ajoutez les options de démarrage cumulées :
   GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi=ht pci=nomsi libata.noacpi=1"
  1. Mettez à jour GRUB :
   sudo update-grub
  1. Redémarrez le système :
   sudo reboot

Conclusion

Si vous rencontrez des problèmes de gel du système sous Linux, surtout sur des systèmes utilisant des périphériques PCI, essayez d’utiliser l’option de démarrage du noyau pci=nomsi. Cette solution peut résoudre des conflits d’interruptions et améliorer la stabilité du système. En cas de problèmes persistants, essayez d’autres options de démarrage comme acpi=ht, libata.noacpi=1, ou noapic. Utilisez les journaux système pour diagnostiquer les erreurs et ajuster les paramètres en conséquence.

Surveillance continue

Pour surveiller le système en continu et capturer les journaux en cas de gel, vous pouvez créer un script de surveillance :

#!/bin/bash
LOG_DIR="/var/log/custom_logs"
mkdir -p $LOG_DIR

while true; do
    dmesg > $LOG_DIR/dmesg.log
    journalctl -xb > $LOG_DIR/journalctl.log
    sleep 10
done

Rendez le script exécutable et exécutez-le :

chmod +x /path/to/script.sh
./path/to/script.sh &

En suivant ces étapes et en utilisant ces options de démarrage, vous pouvez améliorer la stabilité de votre système Linux et résoudre les problèmes de gel.