Les ordinateurs portables fonctionnant sur de misérables petites batteries pouilleuses, leur autonomie est fortement limitée. On a donc cherché dès l'origine à augmenter cette autonomie par diverses méthodes, la plus évidente étant de mettre en "veille" ou d'éteindre l'ordinateur dès qu'on ne l'utilise pas.
Eteindre l'ordinateur et le rallumer pose cependant deux problèmes :
- Celui du temps nécessaire à l'extinction complète et au redémarrage (boot, ouverture de session...)
- Celui de pouvoir retrouver les choses dans l'état exact où on les avait laissées (connexions réseau, affichage, documents ouverts...)
En l'absence de solution à ces problèmes, devoir éteindre et rallumer un ordinateur représente une importante perte de temps et est donc peu praticable.
Des méthodes "améliorées" ont donc été mises au point, et leur usage n'est d'ailleurs pas limité aux seuls ordinateurs portables - on peut très bien les utiliser avec une machine de bureau pour en limiter autant que possible la consommation électrique quand on ne s'en sert pas, par exemple.
Les versions récentes de GNU/Linux gèrent très bien ces méthodes sur les ordinateurs dont le matériel (ACPI) (et les périphériques !) les supportent, et Ubuntu Hardy sait aussi bien effectuer la suspension que l'hibernation des 3 modèles très différents de portables sur lesquels je les ai essayées.
La suspension "en RAM"
La suspension en RAM est la méthode la plus rapide, mais la moins complète. Elle consiste à placer les périphériques du système [1] soit :
- Dans un état de "sommeil" à très faible consommation d'énergie
- ou complètement hors-tension
- ou à les laisser en fonction
...selon ce que chaque périphérique et le BIOS de la machine permettent, puis à interrompre le fonctionnement du processeur, laissant uniquement la mémoire RAM alimentée et rafraîchie, ce qui consomme très peu d'énergie.
Dans cet état, l'autonomie de la batterie du portable peut passer de quelques heures à plusieurs jours ; toutefois la machine n'est pas "éteinte" et continue de consommer. Une fois la batterie complètement vide, elle s'éteindra "pour de bon" ce qui aura sur le système un effet à peu près équivalent à ce qu'aurait eu une coupure de courant brutale, à ceci près que l'état des systèmes de fichiers sera meilleur au redémarrage (puisque les systèmes de fichiers auront été "synchronisés" juste avant la mise en suspension et qu'aucune écriture sur disque ne pouvait être en cours durant la suspension).
Le "réveil" de la machine depuis l'état de suspension est rapide (quelques secondes), puisque la mémoire RAM est restée chargée. Il n'y a pas de "boot" à faire ; le système doit "seulement" redémarrer son processeur et remettre les périphériques dans leur état de fonctionnement antérieur - ce qui est la partie le plus longue et la plus susceptible de causer des problèmes.
L'"hibernation" sur disque
L'hibernation sur disque est une méthode complète qui permet de réellement éteindre la machine, lui permettant de demeurer en l'état sans consommation électrique pour une durée indéfinie.
La mise en hibernation commence par la suspension de l'exécution de toutes les tâches en cours, puis l'enregistrement de l'état actuel des périphériques (quand cela est possible), puis la "compression" du contenu de la mémoire RAM suivie de l'écriture de cette "image mémoire compressée" dans la partition de swap. Une fois tout ceci fait, la machine est alors (complètement) éteinte et peut donc rester dans cet état indéfiniment.
Le "réveil" de la machine depuis l'état d'hibernation est plus long et plus complexe que pour la simple suspension. Pour le BIOS de l'ordinateur, c'est d'abord une mise en route "ordinaire", le chargement du bootloader (grub, lilo...), suivi du chargement de l'initramfs et du démarrage du noyau. Ça commence donc réellement comme un boot ordinaire.
Ensuite, le programme "resume" est appelé et decouvre la présence de l'image mémoire compressée dans la partition de swap. Le programme resume prend alors le pas sur la séquence de démarrage habituelle, il recopie et décompresse l'image mémoire sauvegardée en RAM, réinitialise les périphériques à partir de leur état sauvegardé (un peu comme lors d'un réveil de suspension), puis reprend l'exécution à partir de l'image restaurée en mémoire : l'ordinateur se trouve alors (théoriquement) dans l'état exact qui était le sien juste avant la mise en hibernation : utilisateur connecté, systèmes de fichiers montés, connections réseau, applications et fichiers ouverts, etc.[2]
N.B.: Il est possible de booter normalement sans reprise une machine qui a été hibernée si l'on passe au noyau le paramètre de boot "noresume". Dans ce cas, la machine bootera "normalement" dans l'état qui aurait été le sien après avoir subi une coupure de courant brutale.
Problèmes techniques
Les plus gros problèmes rencontrés avec les systèmes de suspension ou d'hibernation sont ceux relatifs aux périphériques du système. En effet, en fonctionnement normal, ils ont été initialisés par le BIOS, puis par leur pilote, puis leur état a été éventuellement modifié par l'application qui les utilise, etc.
Au "réveil", l'application (qui n'a rien vu) s'attend à retrouver les périphériques dans l'état exact où ils étaient auparavant, sans avoir besoin de les initialiser à nouveau.
Ceci implique que le système de suspension / hibernation / réveil doit être en mesure de déterminer et enregistrer l'état précis de tous les périphériques (par exemple mode vidéo en cours, vitesse actuelle du port série, volume réglé sur la carte son, firmware chargé dans une carte Wi-Fi, etc...) avant de les éteindre, et de restaurer cet état précis au réveil, avant de rendre la main au fonctionnement normal du système. Or ce n'est pas toujours possible, certains périphériques (surtout les anciens ou ceux non prévus pour des ordinateurs capables d'hibernation) étant capables d'exécuter une commande de changement d'état, mais incapables de faire un "rapport" de leur état courant au système. D'autres périphériques peuvent avoir des états tellement complexes (carte vidéo) qu'il n'est pas forcément possible de récupérer l'ensemble des informations nécessaires.
On peut alors rencontrer des problèmes avec de tels périphériques,[3] comme avoir un périphérique qui ne fonctionne plus au réveil, une image vidéo qui ne se rétablit pas complètement, une connexion réseau qui refuse de revenir, etc.
Ceci est d'autant plus vrai dans le mode hibernation, où les périphériques sont complètement éteints que dans le mode suspension où certains périphériques peuvent être placés en mode sommeil et conserver eux-mêmes leur "état" - ils ne sont pas complètement éteints.
De gros progrès ont été faits, et les suites logicielles d'hibernation et de réveil comportent des kyrielles de "méthodes spéciales" pour différents types de périphériques[4] ; toutefois, il peut encore parfois demeurer des problèmes. Vous vous montrerez indulgent après avoir lu cet article ;-)
Pièges à prévoir
- Problèmes liés à la suspension :
- Lors de la suspension, le système n'est pas complètement hors-tension. Il peut donc continuer à chauffer (et sur certains modèles, se décider à ventiler) dans certaines situations. De plus, il est possible que l'appui accidentel sur une touche[5] provoque le réveil de la machine. Si vous enfermez votre portable suspendu dans une housse ou un sac et que celui-ci se réveille inopinément, ou chauffe, il risque de surchauffer et de griller faute de ventilation et par excès d'isolation ! Étudiez bien votre machine pour connaître son comportement avant de vous décider ou non à la trimballer suspendue dans un sac (ce que je fais sans problème régulièrement avec mon Asus EeePC par exemple).
- Problèmes liés à l'hibernation :
- Pour pouvoir hiberner votre machine, vous devez disposer d'une partition de swap de taille appropriée, typiquement grosso-modo 2 fois la taille de la RAM de votre machine, et l'ensemble de vos périphériques doit accepter l'opération sans casse (faut essayer ;-)
- Problèmes liés à la suspension et à l'hibernation :
- Retrait ou ajout de périphériques : Quand votre ordinateur est hiberné, et dans une certaine mesure, suspendu, il ne peut pas se rendre compte de l'ajout ou de la suppression de nouveaux périphériques (branchement ou débranchement d'un câble secteur, d'un bidule USB, etc). Il se peut qu'au réveil il ne puisse pas effectuer les actions nécessaires à ce changement dont il ne se sera pas aperçu (changement du mode de gestion d'énergie, prise en compte du nouveau périphérique...). Pour cette raison, je conseille, si vous prévoyez de déplacer votre portable après l'avoir suspendu ou hiberné, de toujours retirer les périphériques (cordon secteur, clés USB...) avant de le suspendre, et de toujours le réveiller complètement avant de les reconnecter, de manière à ce qu'il soit toujours dans le même état précis à l'endormissement et au réveil et qu'il prenne en compte les changements de périphériques alors qu'il est "pleinement réveillé".
- Systèmes de fichiers sur périphériques USB : À la suspension ou l'hibernation, le système perd le montage de tous les systèmes de fichiers sur périphériques USB, ce qui peut poser problème (perte de données) s'il y a des fichiers ouverts ou des caches non vidés pour ces périphériques. Il est donc conseillé de démonter et ôter les périphériques de stockage USB avant de suspendre ou d'hiberner. Sur les noyaux 2.6.24 et supérieurs, la fonction "usb persist" permet de résoudre le problème et de conserver les montages USB au réveil.[6] Ceci marche particulièrement bien avec mon Asus EeePC pour conserver l'accès à sa carte mémoire SD à travers une suspension ou une hibernation.[7]
Considérations de performances
Si la suspension et son réveil sont généralement très rapides, l'hibernation et son réveil peuvent prendre beaucoup de temps. Sur une machine relativement peu puissante, il peut être bien plus long de l'hiberner que de l'arrêter normalement, et bien plus long de la réveiller que de faire un démarrage normal "à froid".
Ceci remet fortement en question l'intérêt de l'hibernation puisqu'elle ne fait plus gagner aucun temps, et peut même en faire perdre, le seul intérêt demeurant alors est de retrouver le système dans l'état exact où on l'avait laissé, intérêt toutefois minoré par la capacité de KDE à restaurer au démarrage toutes les applications (ou presque) qui étaient en cours quand il a été arrêté.
Il y a moyen (voir plus bas) d'agir sur le temps de mise en hibernation, mais ce sera au prix de la vitesse et de la réactivité de la machine après son réveil.
En effet, une machine réveillée après hibernation se montrera pour un temps plus lente et moins réactive qu'une machine fraîchement bootée, notamment parce que son cache-disque et ses buffers auront été vidés et qu'une partie de sa mémoire aura été (et sera encore) swappée...
Considérations de sécurité
La suspension et l'hibernation peuvent avoir d'importantes conséquences sur la sécurité d'un portable, ne serait-ce que parce que toutes deux réveillent le système dans l'état où il était à sa mise en veille, toutes applications et documents ouverts, et notamment que l'utilisateur n'a pas besoin de rouvrir sa session en tapant son login et son mot de passe.
Normalement, une session graphique au réveil soit se retrouver en mode "verrouillé et économiseur d'écran activé", ce qui nécessite la frappe du mot de passe de l'utilisateur pour accéder à la session, mais j'ai vu des cas plus ou moins imprévisibles où la session n'était pas verrouillée au réveil.
D'éventuelles sessions ouvertes sur des "consoles texte" ne seront pas verrouillées au réveil de la machine.
- La suspension d'une machine peut être considérée du point de vue de la sécurité comme strictement équivalente à laisser la machine allumée avec la session verrouillée par un économiseur d'écran, ce qui est une sécurité assez "moyenne", et encore faut-il que l'économiseur d'écran s'active effectivement...
- L'hibernation d'une machine a des conséquences très différentes :
- Tout d'abord, l'hibernation d'une machine est compatible avec une installation sur un disque complètement chiffré (LVM chiffrée contenant également le swap), ce qui protège pleinement la machine pendant son hibernation si on est dans un tel cas de figure.
- Comme la machine doit booter avant de se réveiller, elle pourra être verrouillée par un éventuel mot de passe de BIOS (qui n'offre par ailleurs pas une sécurité bien grande).
- Si la machine est installée sur LVM chiffrée, il faudra déverrouiller la LVM (comme lors d'un boot normal) pour pouvoir réveiller une machine hibernée.
- L'hibernation d'une machine au swap non chiffré pose de sérieux problèmes de sécurité !
- Pensez qu'au moment de la mise en hibernation, absolument tout ce qui se trouve en mémoire vive est copié sur le swap et y demeurera éventuellement un temps indéfini, y compris tous documents ouverts ainsi que des éléments qui sont d'habitude éventuellement protégés par le noyau pour ne pas être écrits sur le swap en fonctionnement normal, comme des clés de chiffrement, des mots de passe, etc...
- Le programme swsusp possède une fonction de chiffrement de l'image mémoire avec une "clé jetable", mais celle-ci ne semble pas active sur Ubuntu 8.04. Quoi qu'il en soit, cette fonction permet de rendre inutilisable ce qui avait été écrit sur le swap après le réveil de la machine, mais elle reste entièrement vulnérable pendant qu'elle est en état hiberné, puisque la clé de déchiffrement doit également être stockée dans le swap pour permettre le réveil de la machine. Ceci de mon point de vue proscrit l'usage de l'hibernation pour toute machine pouvant contenir des données confidentielles, sauf si l'hibernation est effectuée sur un swap situé à l'intérieur d'une LVM entièrement chiffrée.
- L'utilisation d'un swap dans une LVM chiffrée protège de ce problème, mais offre une sécurité moindre que celle apportée par un swap chiffré séparément par une clé aléatoire générée à chaque boot (ce qui est incompatible avec l'hibernation...). En effet, dans ce dernier cas, après chaque boot le contenu précédent du swap est irrémédiablement perdu pour tout le monde, tandis que dans le cas du swap en LVM chiffrée, celui qui obtiendrait par force ou par ruse la clé de déchiffrement de la LVM pourrait alors aller farfouiller également dans les anciens contenus du swap.
Résolution de problèmes
- Si vous avez une machine qui vous dit
swsusp: Not enough free memory
quand vous tentez de l'hiberner, puis se réveille aussitôt, essayez :
echo 2048248 > /sys/power/image_size
...et recommencez.[8]
- Si vous trouvez que votre machine est bien trop longue à hiberner et à se réveiller, essayez :
echo 0 > /sys/power/image_size
...vous obtiendrez en contrepartie une machine qui hibernera plus vite mais sera plus lente pendant un temps après s'être réveillée.
Une fois que vous avez trouvé la commande qui vous convient, ajoutez-la une fois pour toutes dans /etc/rc.local.
Pour plus d'infos à ce sujet, installer le package linux-doc-2.6.24 et lire le document /usr/share/doc/linux-doc-2.6.24/Documentation/power/swsusp.txt.gz.
Voilà, on dira que ça sera tout pour cette fois ;-)
Notes
[1] Affichage, carte vidéo, carte réseau, modem, disques, contrôleurs de disque, contrôleurs USB, etc...
[2] Pour plus d'infos sur l'hibernation, installer le package linux-doc-2.6.24 et lire les documents /usr/share/doc/linux-doc-2.6.24/Documentation/power/swsusp*.
[3] En particulier certains périphériques qui utiliseraient des pilotes Windows via ndiswrapper risquent de ne pas aimer...
[4] Jetez donc un coup d'oeil au contenu des répertoires /etc/acpi/suspend.d et /etc/acpi/resume.d...
[5] Avec certains portables, cela peut se produire si on appuie fort sur le "couvercle", même fermé...
[6] Pour plus d'infos sur "usb persist", installer le package linux-doc-2.6.24 et lire le document /usr/share/doc/linux-doc-2.6.24/Documentation/usb/persist.txt.gz.
[7] Le lecteur de carte mémoire de l'Asus EePC a en interne une interface USB...
[8] Sur l'un de mes portables, j'utilise la valeur 268435456.









