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