Mots-Clés ‘mise en veille’

Mise en veille et Wifi

Lundi 2 août 2010

Aujourd’hui, je désire vous parler de la mise en veille (dite suspend-to-ram ou mode S3) sous Linux.

Dans un précédent article, j’avais évoqué un problème de configuration réseau lors d’un retour de mise en veille. Depuis la version 1.2 (Locris) de ma distribution Frugalware, la mise en veille fonctionne de façon acceptable sur ma machine. J’écris « de façon acceptable » car un problème subsiste: lors d’un retour de mise en veille, la configuration Wifi semble perdue. Cette perte est probablement due au mauvais rechargement du module ndiswrapper (pilote utilisée pour mon adaptateur Wifi). J’ai donc entrepris l’écriture d’un script shell permettant de résoudre ce problème. En voici le contenu :

#!/bin/sh

# Arrêt du réseau
service interfaces stop
modprobe -r ndiswrapper

# Mise en veille
echo -n mem > /sys/power/state

# Redémarrage du réseau
service interfaces start

Le but du script est assez simple : mettre en veille le système, et gérer le retour de mise en veille. La mise en veille est opérée par la partie centrale du script (echo -n mem …). L’opération clé de ce script est modprobe -r ndiswrapper. Elle permet de décharger le module ndiswrapper. Ainsi, lors du retour de la mise en veille et de la configuration du réseau, le module sera automatiquement et proprement rechargé.

Après avoir donné les droits d’exécution à ce script shell, il sera possible de l’exécuter en tant qu’utilisateur root.

Cependant, ma machine est un ordinateur portable, et je trouve pratique que le système se mette en veille lorsque je referme l’écran. Par ailleurs, le clavier de ma machine dispose d’une touche SUSPEND qui n’a, pour l’instant, aucun effet.

Pour améliorer cette situation, j’ai modifié le script du démon acpid, exécuté lorsqu’un évènement ACPI est généré. Il s’agit du fichier /etc/acpi/acpi_handler.sh. En voici le contenu :

#!/bin/sh # Default acpi script that takes an entry for all actions

IFS=${IFS}/
set $@

case « $1″ in
button)
case « $2″ in
power) /sbin/init 0
;;
sleep)
;;
lid)
;;
*) logger « ACPI action $2 is not defined »
;;
esac
;;
*)
logger « ACPI group $1 / action $2 is not defined »
;;
esac

Ainsi, lorsque le bouton « sleep » (touche SUSPEND) ou le bouton « lid » (une sorte d’interrupteur déclenché lorsque l’écran est refermé), le système sera mis en veille.

Grâce à tout cela, je dispose d’une mise en veille fonctionnelle et pratique. Bien entendu, je reste ouvert à vos remarques, suggestions et questions.