arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou

Log | Files | Refs |

index.sh (8919B)


      1 #! page
      2 title: Linux et les mécanismes de veille
      3 author: Arthur Pons
      4 description: Apprenons en plus sur la veille et l\'hibernation dans Linux
      5 publication: 2025-02-24
      6 
      7 section: main
      8 
      9 ## Sources principales
     10 
     11   * https://docs.kernel.org/admin-guide/pm/sleep-states.html
     12   * https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate
     13   * https://wiki.archlinux.org/title/Power_management#ACPI_events
     14   * https://www.malekal.com/acpi-advanced-configuration-and-power-interface/
     15   * https://www.kernel.org/doc/html/latest/power/swsusp.html
     16 
     17 ## Ce que j'ai appris
     18 
     19 ### Les différents modes
     20 
     21 Il y a trois grands types de veilles dans l'ordre de consommation d'énergie :
     22 
     23   1. Suspend to idle
     24   2. Standby
     25   3. Suspend to RAM (veille)
     26   4. Hibernation
     27 
     28 A titre personnel je ne suis pas certain d'avoir déjà utilisé les deux premiers
     29 qui semblent être des économies toutes relatives d'énergie. Je suppose que
     30 l'immense majorité du temps les personnes veulent 3. ou 4.
     31 
     32 L'hibernation est documentée comme étant un mode radicalement différent des
     33 autres. Il implique beaucoup plus d'étapes et de complexité. Cela explique
     34 certainement en partie pourquoi c'est un mode qui semble être moins fiable.
     35 
     36 ### Savoir ce qui notre système supporte
     37 
     38 La [documentation
     39 linux](https://docs.kernel.org/admin-guide/pm/sleep-states.html) nous apprend
     40 qu'il existe dans `/sys/power` des fichiers dont le contenu détermine l'état du
     41 noyau :
     42 
     43   * `/sys/power/state` contient la liste des états disponibles. Sur mon pc
     44     j'ai `freeze mem disk`. `freeze` est le mode Suspend to idle, `mem` est
     45     configurable mais sera généralement la veille RAM et disk l'hibernation.
     46   * `mem_sleep` contient les différents mode de veille disponibles. Sur mon pc
     47     j'ai `s2idle [deep]`. Le mode entre crochet est celui sélectionné, il sera
     48     activé si l'on déclenche le mode `mem` du fichier précédent. Ici
     49     sélectionner `s2idle` serait à priori redondant avec le `freeze` du fichier
     50     précédent mais je ne suis pas certain.
     51   * `disk` contient les différentes actions que le noyau peut lancer après avoir
     52     créé l'image d'hibernation. Sur mon pc j'ai `[platform] shutdown reboot
     53     suspend test_resume`. Comme pour le fichier précédent l'action sélectionnée
     54     est entre crochets. Les modes `reboot` et `test_resume` sont là pour des
     55     besoins de diagnostics. `platform` mettra l'ordi dans un état spécial s'il
     56     supporte ACPI[^2]. `shutdown` éteindra l'ordinateur et `suspend` le mettra
     57     en veille RAM. C'est une hibernation dite hybride.
     58   * `image_size` contient, en octet, la taille maximale des images
     59     d'hibernation. Cette taille n'est pas absolue mais le système fera de son
     60     mieux pour la respecter. S'il n'y parvient pas il prendra plus de place.
     61 
     62 ### Changer de mode
     63 
     64 #### Directement par le noyau
     65 
     66 Dans l'esprit "tout est fichier" le noyau linux permet de déclencher ces états
     67 en interagissant avec des fichiers[^1]. Pour déclencher un mode il faut écrire
     68 son nom dans `/sys/power/state`. Pour `mem` et `disk` le comportement sera
     69 modifié selon le mode ou l'action choisie dans `mem_sleep` et `disk`. Pour
     70 changer de sélection dans l'un de ces deux fichiers il faut également écrire le
     71 nom de ce que l'on veut sélectionner. Avant de donner des exemples une petite
     72 explication de l'erreur suivante :
     73 
     74     $ sudo printf "freeze" > /sys/power/stat
     75     sh: 1: cannot create /sys/power/stat: Permission denied
     76 
     77 Bien que le `printf` ait été exécuté avec les bons droits la redirection est
     78 elle effectuée par le shell courant. Trois solutions :
     79 
     80   1. Se logger en tant que root
     81 
     82 Ces commandes font toutes des choses différentes mais pour notre besoin passons
     83 sur les détails :
     84 
     85     $ sudo -i
     86     $ sudo -s
     87     $ su -
     88 
     89   2. Passer la commande en argument d'un shell
     90 
     91     $ sudo sh -c 'printf "freeze" > /sys/power/stat
     92 
     93   3. Utiliser `tee`
     94 
     95 `tee` prend dans stdin des données et les écrit dans dans lefichier qui lui est
     96 passé en argument. Puisque cela permet d'écrire dans un fichier sans redirection
     97 ça fonctionne :
     98 
     99     $ printf "freeze" | sudo tee /sys/power/state
    100 
    101   4. BONUS : vim (`c$freezeZZ`)
    102 
    103     $ sudo vim /sys/power/state
    104 
    105 Après ce petit détour, des exemples de mise en veille :
    106 
    107 Déclencher le mode suspend to idle
    108 
    109     $ cat /sys/power/mem_sleep
    110     s2idle [deep]
    111     $ sudo sh -c 'printf "freeze" > /sys/power/state'
    112 
    113 S'assurer que le mode `mem` soit de la veille RAM et l'activer :
    114 
    115     $ cat /sys/power/mem_sleep
    116     [s2idle] deep
    117     $ sudo sh -c 'printf "deep" > /sys/power/mem_sleep'
    118     $ cat /sys/power/mem_sleep
    119     s2idle [deep]
    120     $ sudo sh -c 'printf "mem" > /sys/power/state'
    121 
    122 #### Avec systemd (brrrr)
    123 
    124 Beaucoup de distributions linux viennent dorénavant avec `systemd`. J'aime pas
    125 trop, j'ai le sentiment que ça rajoute pleins de niveaux de complexité
    126 supplémentaires qui, lorsqu'ils fonctionnent bien sont super mais lorsqu'ils
    127 fonctionnent mal rendent plus difficile le débogage. La quantité de choses que
    128 fait systemd rend sa documentation également plus difficile. Peu importe,
    129 l'utilisation est ici simple :
    130 
    131     # RAM
    132     $ systemctl suspend
    133     # Hibernation
    134     $ systemctl hibernate
    135     # Hybride
    136     $ systemctl hybrid-sleep
    137 
    138 Alors pourquoi passer par systemd plutôt que le noyau directement ?
    139 Principalement parce que `systemd` offre un peu plus de garantie que tout se
    140 passe bien au retour (wifi, session etc). Par exemple sur mon pc un retour de
    141 veille RAM déclenchée via le noyau ne me demande pas de mot de passe de session.
    142 Pour cause, le noyau n'a pas à savoir qu'il aurait du verrouiller ma session. Un
    143 retour d'une veille déclenchée par systemd lui le fait parce que systemd estime
    144 qu'il est pertinent de verrouiller la session avant de mettre le système en
    145 veille.
    146 
    147 ### Les problèmes d'hibernation
    148 
    149 Personnellement quand j'essaye d'hiberner j'ai soit :
    150 
    151     $ sudo sh -c 'echo "disk" >> /sys/power/state'
    152     sh: 1: echo: echo: I/O error
    153 
    154 soit
    155 
    156     $ sudo systemctl hibernate 
    157     Call to Hibernate failed: Not enough swap space for hibernation
    158 
    159 Le souci étant que mon disque est déjà complètement rempli d'une seule partition
    160 prenant toute la place. Je ne peux pas agrandir la partition de swap à chaud, il
    161 faudrait que je boot sur une clef usb pour. J'arrête donc l'écriture de
    162 l'article ici pour aujourd'hui.
    163 
    164 #### Disque chiffré avec LVM
    165 
    166 Il faudrait à priori :
    167 
    168   1. vérifier quelle partition héberge le swap
    169 
    170 	$ swapon --output-all
    171 	NAME      TYPE      SIZE USED PRIO UUID                                 LABEL
    172 	/dev/dm-2 partition 980M  16K   -2 40cdc190-2bb5-4a76-bab5-46aaaeb3dcd3 
    173 	$ lvdisplay
    174 	  --- Logical volume ---
    175 	  LV Path                /dev/arthur-dnum-vg/root
    176 	  LV Name                root
    177 	  VG Name                arthur-dnum-vg
    178 	  LV UUID                xEJcr2-RIcA-EcaA-MvAQ-ZO2f-nFdj-lLyrQj
    179 	  LV Write Access        read/write
    180 	  LV Creation host, time arthur-dnum, 2023-12-09 14:03:58 +0100
    181 	  LV Status              available
    182 	  # open                 1
    183 	  LV Size                236,52 GiB
    184 	  Current LE             60550
    185 	  Segments               1
    186 	  Allocation             inherit
    187 	  Read ahead sectors     auto
    188 	  - currently set to     256
    189 	  Block device           254:1
    190 	   
    191 	  --- Logical volume ---
    192 	  LV Path                /dev/arthur-dnum-vg/swap_1
    193 	  LV Name                swap_1
    194 	  VG Name                arthur-dnum-vg
    195 	  LV UUID                wWcepR-TPnV-D2Xo-YRYY-6Zjl-n8aC-ZcYhdN
    196 	  LV Write Access        read/write
    197 	  LV Creation host, time arthur-dnum, 2023-12-09 14:03:58 +0100
    198 	  LV Status              available
    199 	  # open                 2
    200 	  LV Size                980,00 MiB
    201 	  Current LE             245
    202 	  Segments               1
    203 	  Allocation             inherit
    204 	  Read ahead sectors     auto
    205 	  - currently set to     256
    206 	  Block device           254:2
    207 	   
    208 
    209 ou alternativement :
    210 
    211 	$ lsblk
    212 	NAME                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
    213 	sda                             8:0    0 238,5G  0 disk  
    214 	├─sda1                          8:1    0   512M  0 part  /boot/efi
    215 	├─sda2                          8:2    0   488M  0 part  /boot
    216 	└─sda3                          8:3    0 237,5G  0 part  
    217 	  └─sda3_crypt                254:0    0 237,5G  0 crypt 
    218 		├─arthur--dnum--vg-root   254:1    0 236,5G  0 lvm   /
    219 		└─arthur--dnum--vg-swap_1 254:2    0   980M  0 lvm   [SWAP]
    220 
    221 Ici la réponse est assez évidente puisque l'une des deux volume logique s'appelle swap mais vérifions tout de même
    222 
    223 	$ realpath /dev/arthur-dnum-vg/swap_1
    224 	/dev/dm-2
    225 
    226 Pour redimensionner le swap il faudra éventuellement faire de la place en rendant plus petit les autres LVM :
    227 
    228 	$ lvresize -L-3G /dev/arthur-dnum-vg/root
    229 
    230 Puis agrandir le swap :
    231 
    232 	$ lvresize -L+3G /dev/arthur-dnum-vg/swap_1
    233 
    234 [^1]: j'adore
    235 [^2]: ça a l'air d'être tout un truc mais pas le temps de regarder maintenant