HOWTO Suspension APM v2

Un article de Gentoo Linux Wiki.

Cet article fait partie des HOWTOs.
Méthodes d'installation CD Live Noyau et matériel Portables et Notebooks Portage Système Réseaux et Services Serveur X Logiciels fréquemment utilisés Autres

J'ai (NdT : l'auteur a) récemment fait fonctionner swsusp2 (aussi dénommé software suspend v2, suspension logicielle ) (en) sur mon acer Travelmate 800 (une machine Centrino). Ca a parfaîtement fonctionné jusqu'ici, ce qui est tres bien, en prenant en compte que je n'ai jamais réussi à faire fonctionner swsusp*1*. Tout cela sur un noyau 2.6.5-gentoo-r1 (2.6.9 vanilla actuellement).

On peut supposer que le code de swsusp*2* fonctionne beaucoup mieux, donc ca vaut vraiment le coup d'essayer.

Sommaire

[modifier] Qu'est-ce que l'hibernation ?

L'hibernation (par swsusp) est une méthode pour conserver de l'énergie lorsque l'ordinateur n'est pas utilisé. A la base, il stocke le contenu de la RAM sur le disque dur et arrête la machine. Quand vous rallumez la machine, swsusp réécrit le contenu de la RAM dans la RAM. Ce procédé est habituellement plus rapide que d'arrêter le systeme complètement, et de le démarrer de nouveau. Vous pouvez laisser vos applications tourner et cela ne consomme pas d'énergie.

[modifier] Installation

[modifier] Installation de sources du noyau

Récupérez les dernières sources du noyau :

Code : Récupérer les sources du noyau
# emerge development-sources

Il est aussi possible d'utiliser les sources officielles (vanilla)

Code : Récupérer les sources du noyau vanilla
# cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.9.tar.bz2
# tar xjpf linux-2.6.9.tar.bz2

[modifier] Télécharger le patch et l'hibernate-script

Téléchargez le dernier "Current Stable Patch" (patch stable courant) à partir de la page de téléchargement de swsusp (en). Récupérez aussi la dernière version de l'hibernate-script.

L'hibernate-script a récemment été ajouté a portage. Premièrement, ajoutez "sys-apps/hibernate-script" a votre /etc/portage/package.keywords. Créez le fichier/répertoire s'ils n'existent pas encore.

Code : Ajout de "sys-apps/hibernate-script" à /etc/portage/package.keywords
# [ -d /etc/portage ] || mkdir -p /etc/portage
# echo "sys-apps/hibernate-script" >> /etc/portage/package.keywords
# emerge hibernate-script

Notez que vous devriez utiliser l'hibernate-script de la page de swsusp ou celui de portage. Je n'ai pas testé celui de portage, donc si quelqu'un pouvait commenter à ce propos ici, ce serait très bien. Pas de problèmes spécifiques rencontrés, ca a l'air de marcher. tro (sur gentoo-wiki.com)

[modifier] Patcher les sources du noyau

Nous allons prendre le patch du noyau que nous venons de télécharger, le décompresser, et l'appliquer (le patch) a nos sources du noyau. Après que vous ayez téléchargé le fichier sur /tmp/, vous pouvez le décompresser :

Code : Décompresser le patch
# cd /tmp/
# tar xjf /tmp/software-suspend-x.x.x-for-2.x.x

Pour appliquer le patch swsusp2 au noyau, premièrement allez dans votre répertoire de sources, et executez le script apply fourni, à partir d'ici, en spécifiant où ont été mis les patches :

Code : Appliquer les patches
# cd /usr/src/linux/
# /tmp/software-suspend-x.x.x-for-2.x.x/apply /tmp/software-suspend-x.x.x-for-x.x.x/

Vous pouvez aussi appeler l'aide du script :

Code : Aide du script apply
/tmp/software-suspend-x.x.x-for-2.x.x/apply --help

Le noyau devrait maintenant être patché. Si des erreurs se sont produites, les patches n'ont pas fonctionné avec votre noyau, pour une quelconque raison. Une raison pourrait etre que le noyau gentoo contienne déjà un patchset personnalisé. Essayez de télécharger une différente version du patch et/ou des sources du noyau.

[modifier] Configurer le noyau

Allez dans votre répertoire de noyau, exécutez make menuconfig, et regardez au niveau de "Power Management Options" :

Code : make menuconfig
Power management options (ACPI, APM)  --->
  [*] Power Management support
  Software Suspend
  Software Suspend 2  --->

Maintenant, vous avez "Software Suspend" et "Software Suspend 2". "Software Suspend" est l'ancienne implémentation qui vient avec chaque noyau. "Software Suspend 2" est la nouvelle implémentation.

Maintenant, sélectionnez les options suivantes :

Code : make menuconfig
Power management options (ACPI, APM)  --->
  [*] Power Management support
  Software Suspend []
  Software Suspend 2  --->
    <*> Software Suspend 2
    <*> Swap Writer
    <*> Text mode console support

Basiquement vous pouvez laisser cela ainsi, mais par la suite vous pouvez modifier tout le reste.

Comme option supplémentaire, vous pouvez ajouter la compression de l'image hibernée de la RAM :

Code : make menuconfig
[*] LZF image compression

Certains utilisateurs remarquent un processus d'hibernation plus rapide lorsque la compression est utilisée, mais ceci dépend en grande partie de la relation entre la vitesse du processeur et celle du disque dur, ainsi que de la taille de la mémoire système (utilisée).

[modifier] Compilation & installation du nouveau noyau, configuration du chargeur de démarrage pour swsusp2

Je n'expliciterai pas ici la compilation et l'installation du noyau. Jetez un oeil sur le web (NdT ou ici [HOWTO Configurer et compiler le noyau])

swsusp stocke les données d'hibernage sur votre partition de swap. Quand vous démarrez le noyau, il est nécessaire de lui dire où est la partition via une option du noyau. Ajoutez donc ceci a vos paramètres du noyau dans /etc/lilo/lilo.conf pour LILO ou /boot/grub/grub.conf pour GRUB :

Fichier : /etc/lilo/lilo.conf
...
append="... resume2=swap:/dev/hdx"
...

ou

Fichier : /boot/grub/grub.conf
...
kernel=... resume2=swap:/dev/hdx
...

et remplacez /dev/hdx par votre partition de swap.

(n'oubliez pas de lancer lilo après avoir modifié /etc/lilo.conf)

Astuce : Si la fonction de restauration ne fonctionne pas pour quelque raison, ajoutez noresume2 (et peut-être aussi noresume) a vos paramètres de noyau.

[modifier] Installer suspend-script

Si vous ne l'avez pas installé via portage : Le script que vous avez téléchargé, qui est utilisé pour faire hiberner la machine, doit être décompressé et installé.

Code : Installation du suspend script
# cd /tmp/
# tar xzf hibernate-script-x.xx.tar.gz

Ceci va simplement créer un répertoire /tmp/hibernate-script-x.xx/ contenant toutes les choses nécessaires.

Simplement, allez dans le répertoire nouvellement créé (sinon il y aura une erreur) et executez le install.sh fourni :

Code : Suite de l'installation de suspend-script
# cd /tmp/hibernate-script-x.xx/
# ./install.sh

Ceci créera un exécutable /usr/local/sbin/hibernate qui, quand exécuté mettra votre machine en hibernation, et créera aussi quelque scripts et fichiers de configuration dans /etc/hibernate/.

[modifier] Hiberner !

En tant que root, exécutez /usr/local/sbin/hibernate pour hiberner.

Pour minimiser les risques resultant d'une restauration infructueuse, essayez d'abord sans X (à partir de la console), puis avec X, mais sans être logué (sinon vous pouvez facilement casser votre configuration kde et d'autre choses du même genre). Démontez aussi les partitions qui ne sont pas nécessaires avant d'hiberner pour la première fois, pour éviter au maximum les problèmes.

[modifier] Annexe

[modifier] Configuration de swsusp2

Dans /etc/hibernate/hibernate.conf, il y a quelque choses que vous devriez configurer.

[modifier] Son

La carte son est souvent un problème. C'est pourquoi vous devriez envisager de redémarrer alsasound (si vous utilisez alsa) au moment de la restauration, comme ceci :

Fichier : /etc/hibernate/hibernate.conf
RestartServices alsasound

Dans le noyau 2.6.9, OSS apporte le support de l'hibernage (Je ne sais pas pour alsa).

[modifier] USB

Dans le noyau 2.6.5, les modules USB ne supportaient pas swsusp. C'est pourquoi vous devriez simplement les décharger avant l'hibernation, et les recharger après la reprise. Ceci peut être facilement fait en demandant a swsusp de redémarrer le service hotplug (qui est fourni sous gentoo par le paquet hotplug) :

Fichier : /etc/hibernate/hibernate.conf
RestartServices alsasound hotplug

Dans le noyau 2.6.9, il apparaît que l'USB supporte l'hibernage ! Ceci n'est donc plus nécessaire.

[modifier] Partitions de Disque Dur montées

Si vous avez des partitions auxqueles vous voulez accéder lorsque votre système est suspendu (comme une partition windows), swsusp devrait les démonter avant, et les remonter après une hibernation :

Fichier : /etc/hibernate/hibernate.conf
Unmount /mnt/c
OnResume 20 mount /mnt/c

Sinon vous allez facilement corrompre les données sur ce périphérique !

[modifier] Modules Problématiques

En général il est mieux de compiler les choses en modules quand on utilise swsusp, parce-que ca permet de les décharger/recahrger. Si vous avez des problèmes avec certains modules (J'ai eu un problème avec sd_mod, le module scsi de mon graveur, qui ne fonctionnait plus après l'hibernation), demandez a swsusp de les décharger puis de les recharger :

Fichier : /etc/hibernate/hibernate.conf
UnloadModules sd_mod
LoadModules sd_mod

Comme vous êtes probablement sur gentoo, vous pouvez aussi paramétrer

Fichier : /etc/hibernate/hibernate.conf
GentooModulesAutoload yes

[modifier] sudo - laissez les utilisateurs hiberner, aussi

(Passez cette section si vous (voulez) utilisez acpid)

Pour que les utilisateurs non-root puissent utiliser swsusp, vous pouvez utiliser sudo. Premièrement, installez sudo :

Code : Installation de sudo
# emerge sudo

Puis, utilisez visudo ou editez /etc/sudoers pour ajouter une entrée telle que :

Fichier : /etc/sudoers
... 
%wheel ALL=NOPASSWD: /usr/sbin/hibernate

Ceci permettra aux membres du groupe wheel d'executer /usr/sbin/hibernate :

Code : /usr/sbin/hibernate en tant qu'user du groupe wheel
$ sudo /usr/sbin/hibernate

Avoir un groupe spécial hibernate serait bien sûr mieux, vous pouvez ensuite y ajouter tous les utilisateurs.

Si vous utilisez bootsplash, vous devriez utiliser visudo pour ajouter ceci a /etc/sudoers :

Fichier : /etc/sudoers
...
%wheel ALL = NOPASSWD: /sbin/splash

[modifier] Configuration de l'ACPI - Utilisez le bouton du boîtier pour faire hiberner la machine

En premier lieu, configurez votre noyau avec l'ACPI. Ensuite, installez Modèle:Command et ajoutez-le à votre runlevel par défaut, pour le démarrer automatiquement :

Code : Installation du démon ACPI
 
# emerge acpid
# rc-update add acpid default

Puis éditez /etc/acpi/events/default pour qu'il contienne les lignes (Je ne me souviens pas si c'est par défaut) :

Fichier : /etc/acpi/events/default
event=button.*
action=/etc/acpi/default.sh %e

ce qui passera tous les évènements bouton à /etc/acpi/default.sh, que vous éditez ensuite :

Fichier : /etc/acpi/default.sh
 
#!/bin/sh
# Default acpi script that takes an entry for all actions

set $*

group=${1/\/*/}
action=${1/*\//}

case "$group" in
   button)
      case "$action" in
         <b>power)  /usr/sbin/hibernate</b>
           ;;
         *) logger "ACPI action $action is not defined"
            ;;
      esac
      ;;

   *)
      logger "ACPI group $group / action $action is not defined"
      ;;
esac

Puis redémarrez simplement acpid :

Code : Redémarrer acpid
 
/etc/init.d/acpid restart

Ce qui devrait résulter en l'appel du script hibernate quand vous pressez le bouton d'arrêt. Ceci permet de passer la configuration de sudo, puisqu'acpid a les privilèges de root.

[modifier] Trucs et Astuces

  • Pour faire redémarrer swsusp au lieu de l'arrêter, pressez "R" pendant le lancement de l'hibernage (Ceci le bascule en mode redémarrage);
  • Changez la verbosité (niveau de log en console) pendant le lancement de l'hibernage/la restauration en pressant 0 et 1;
  • Si la fonction de restauration ne fonctionne pas pour quelque raison, ajoutez noresume2 (et peut-être aussi noresume) a vos paramètres de noyau.

[modifier] Liens Utiles

Autres langues