précision sur les événements ACPI

Bonjour,
Je recherche des précisions sur les événements acpi
J’ai observé qu’ils étaient gérés via /etc/acpi et via /usr/share/acpi-support/
OK. Par contre pour mieux les comprendre j’aurais voulu une correspondance entre les termes anglais et français
L’applet GNOME de gestion de batteries propose les événements Eteindre écran / Mettre en veille / hiberner / Éteindre. Par contre l’aide ACPI de wikipedia propose des stades G1 à G3 avec des sous-stages dans G1 : S1 à 4 : power on suspend, suspend to RAM, standby, hibernate… Et dans /etc/acpi, il y a des suspend, hibernate, sleep…
Ont ils tous un lien entre eux ou alors est ce des événements différents aux noms similaires ?

Par exemple, lorsque l’on sélectionne mettre en veille via l’applet de gestion d’énergie de GNOME quel script est lancé ?

Désolé si je ne suis as très clair (à la relecture j’ai eu quelques doutes, mais je ne sais trop comment tourner ma question !)

Merci
Cyrille

Bojour,
je suis loin d’être un expert, mais j’ai déja eu l’occasion de me confronter avec l’ACPI. Il me semble que tu mélanges plusieurs choses. L’ACPI, c’est pour communiquer avec le BIOS, soit pour récupérer des infos de la carte mère (tension batterie, vitesse ventilos, ), soit pour en envoyer (heure de réveil, vitesse ventilos, …).
La mise en veille est quelque chose de bien plus complexe qui dépasse le cadre de l’ACPI. Il faut sauvegarder l’état du système, et ce n’est pas une mince affaire.

Oui, mais ça n’est pas ça question, il y a des événements ACPI liés aux fonctions d’hinbernation (fermer le portable, appuyer sur la touche ON/OFF, fin de batterie, etc). La correspondance n’est effectivement pas claire: Poiur ce que tu as evoqué

  • Le sleep (stand by (?)) -> mise en veille simple, l’ordinateur est en «stand by», consommation minimale (en théorie, si tu met un screensaver, c’est faux) mais ça tourne toujours.
  • Le hibernate en RAM (suspend (?))correspond à la mise en veille simple et est un arrêt de la machine avec la RAM alimentée et rafraichie de telle manière à en conserver le contenu. SI ta batterie dégage, tu perds tout.
  • Le hibernate en disk (suspend to disk) est une mise en veille prolongée, la RAM est sauvée sur le swap et la machine arrêtée.

Mais effectivement, ça n’est pas clair…

OK merci pour ces précisions, je vais continuer à me documenter !

Il parait que le paquet uswsusp fonctionne assez bien

guilleml.wordpress.com/
wiki.debian.org/Suspend

Alors pour le suspend sur un inspiron, j’utilise effectivement uswsusp. J’appelle en fait un script

/usr/local/bin/hibernation #!/bin/sh touch /tmp/RESUME dohibernation
dohibernation est un programme suid root appelant s2disk.

J’ai un script /etc/init.d/perso que j’appelle au début de /etc/init.d/perso
(éxécuté systématiquement). Ce script me permet de refaire ce qui est défait au réveil (paramètres disques, économie batterie, etc).

[code]#!/bin/sh
ETAT=cat /proc/acpi/ac_adapter/AC/state | sed -e 's/state: *//'
if [ -f /tmp/RESUME ] ; then
/etc/init.d/hdparm restart

/usr/local/bin/reveillevideo.sh

 if [ $ETAT  = "on-line" ] ; then
     echo Sur secteur ;
     echo max_performance > /sys/class/scsi_host/host0/link_power_management_policy
     echo 499 > /proc/sys/vm/dirty_writeback_centisecs
 else 
     echo sur batterie
     echo min_power > /sys/class/scsi_host/host0/link_power_management_policy
     echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
     mount -o remount,noatime /  
 fi
 I=`cat /var/tmp/AVRESUME`
 echo $[$I+1] > /var/tmp/AVRESUME
 rm -f /tmp/RESUME

else
I=cat /var/tmp/SSRESUME
echo $[$I+1] > /var/tmp/SSRESUME
fi
[/code]

OK merci pour ces précisions, je vais potasser ça ce Week-End. Il me reste que le suspend a régler (par contre, je ne sais pas pourquoi je me prends la tête car je ne l’utilise jamais… Peut être par curiosité :unamused: )

En fait si, c’est bien tu verras. Tu laisses tes bureaux en l’état et tu récupères ça le soir. Je trouve ça vraiment pratique…

Tiens au fait, tu as donc laissé tomber cette méthode :
viewtopic.php?f=3&t=13773
:question:
Perso. ce qui m’intéresse vraiment c’est essentiellement de relancer hdparm en sortie de veille.

Cette partie de ton script :

echo Sur secteur ; echo max_performance > /sys/class/scsi_host/host0/link_power_management_policy echo 499 > /proc/sys/vm/dirty_writeback_centisecs else echo sur batterie echo min_power > /sys/class/scsi_host/host0/link_power_management_policy echo 1500 > /proc/sys/vm/dirty_writeback_centisecs mount -o remount,noatime /

c’est essentiellement pour des X autres que Gnome, plus légers et qui n’ont pas d’applet de gestion de l’energie, non ?

Bonne soirée,

OK je vais tester, ça ne me fera pas de mal !

Oui, j’ai trouvé un script exécuté systématiquement (acpi-support), du coup je passe par là.


Qu'entends tu par là ? 
J'ai compris ce qu'est le SUID ROOT mais je ne sais guère comment l'appliquer :
Faut écrire un script bash avec les droits SUID ? Ou ça ce fait comme des liens symboliques ?
Enfin, ce n'est pas très clair pour moi...
Merci
Cyrille

Qu’entends tu par là ?
J’ai compris ce qu’est le SUID ROOT mais je ne sais guère comment l’appliquer :
Faut écrire un script bash avec les droits SUID ? Ou ça ce fait comme des liens symboliques ?
Enfin, ce n’est pas très clair pour moi…
Merci
Cyrille

Non, les scripts ne peuvent être exécutés en suid root facilement. On peut le faire avec perl modulo des contraintes pénibles mais pas en bash. dohibernation est un simple programme C qui fait un appel très précis du code. Bien sûr on peut se débrouiller avec sudo pour faire la même chose mais je n’aime pas sudo et ça fait depuis belle lurette que j’ai écrit ce code que j’adapte au fur et à mesure.

[code]#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>

char disk[]="/usr/sbin/s2disk";
char ram[]="/usr/sbin/s2ram";

int systemp(pg,argv)
char *pg;
char **argv;
{
pid_t pid;
int code_retour;

if ((pid = fork()) < 0) return(-1);
if (pid == 0)
{
execv(pg,argv);
return(-2);
}
while (waitpid(pid,&code_retour,0) <0)
if (errno != EINTR) return(-2);
return(code_retour);
}

void erreur(message)
char *message;
{
printf(“Erreur %s\n”,message);
exit(1);
}
void ausecours()
{
printf(“hibernation\n”);
printf(“Appel de s2disk ou s2ram (avec option -r).\n”);
exit(2);
}

main(argc,argv)
int argc;
char **argv;
{
int i,j,doram;
char *image;
char * argv1[4];

int option;
uid_t uid_root;

doram = 0;
while ((option = getopt(argc,argv,“sh”)) != -1) {
switch(option) {
case ‘r’:
doram = 1;
break;
case ‘h’:
case ‘?’:
default:
ausecours();
break;
}
}
if (optind < argc) image = argv[optind];
else image =NULL;

/* remplacement de l’uid par celui de root */
if ((uid_root =geteuid()) != 0) erreur(“vous n’êtes pas root!”);
if (setreuid(uid_root,uid_root) < 0) erreur(“Setuid impossible”);

if (doram) argv1[0]=ram;
else argv1[0]=disk;
argv1[1]=NULL;
if (doram) execv(ram,argv1);
else execv(disk,argv1);
exit(0);
}
[/code]