Le PC ne se met plus en veille.
La première étape consiste à comprendre pourquoi le PC ne se mettait plus en veille. Un peu de logs supplémentaires nous seraient utiles. Le plus simple pour les activer temporairement est d'exécuter la commande suivante en root:
systemctl set-environment SYSTEMD_LOG_{LEVEL=debug,TARGET=journal} systemctl restart systemd-logind
Une fois ces commandes exécutées, on peut avoir des logs avec la commande journalctl -b -u systemd-logind
:
juil. 01 08:12:22 beitou systemd-logind[22720]: Lid closed. juil. 01 08:12:22 beitou systemd-logind[22720]: Ignoring lid switch request, 4 displays connected. juil. 01 08:12:22 beitou systemd-logind[22720]: Ignoring lid switch request, 4 displays connected. juil. 01 08:12:28 beitou systemd-logind[22720]: Lid opened.
Oh, j'ai donc 4 moniteurs connectés en même temps ! Ah, en fait non. Il doit donc y avoir une détection qui échoue. Pour en savoir plus, on peut demander gentiment à ACPI:
$ cat /sys/class/drm/*/*/status unknown unknown unknown unknown
Mais je m'aperçois qu'après un boot les valeurs sont correctes:
$ cat /sys/class/drm/*/*/status disconnected connected disconnected disconnected
Les valeurs deviennent incorrectes uniquement après un retour de veille. Cependant elles redeviennent normales après (par exemple) un appel à xrandr
.
Après quelques rapports de bug, j'ai des pistes. Il semble que ce souci n'arrive que depuis le noyau 4.1. Après avoir appliqué le patch d'un mail de la liste du noyau, ce premier souci est corrigé. Il semble aussi que systemd v221 inclue un contournement au souci, mais je ne l'ai pas essayé.
Place aux autres soucis !
Le PC se réveille après quelques secondes.
Quelques forums m'ont mis la puce à l'oreille: il semble que ce soit le module USB qui envoie des événements de réveil.
On peut le voir en affichant /proc/acpi/wakeup
:
$ cat /proc/acpi/wakeup Device S-state Status Sysfs node P0P1 S4 *disabled XHC S3 *enabled pci:0000:00:14.0 HDEF S4 *disabled pci:0000:00:1b.0 RP01 S4 *disabled pci:0000:00:1c.0 PXSX S4 *disabled RP03 S4 *disabled pci:0000:00:1c.2 PXSX S5 *disabled pci:0000:04:00.0 PXSX S4 *disabled pci:0000:05:00.0 *disabled platform:rtsx_pci_sdmmc.0 *disabled platform:rtsx_pci_ms.0 PEG0 S4 *disabled PEGP S4 *disabled PEG1 S4 *disabled PEG2 S4 *disabled LID0 S4 *enabled platform:PNP0C0D:00
Cela sert normalement à réveiller le PC si le clavier est actionné, mais on dirait que des événements sont envoyés qui ne devraient pas être reçus... La solution évidente consiste à désactiver cette fonction (en root):
# echo XHC > /proc/acpi/wakeup $ cat /proc/acpi/wakeup Device S-state Status Sysfs node P0P1 S4 *disabled XHC S3 *disabled pci:0000:00:14.0 HDEF S4 *disabled pci:0000:00:1b.0 RP01 S4 *disabled pci:0000:00:1c.0 PXSX S4 *disabled RP03 S4 *disabled pci:0000:00:1c.2 PXSX S5 *disabled pci:0000:04:00.0 PXSX S4 *disabled pci:0000:05:00.0 *disabled platform:rtsx_pci_sdmmc.0 *disabled platform:rtsx_pci_ms.0 PEG0 S4 *disabled PEGP S4 *disabled PEG1 S4 *disabled PEG2 S4 *disabled LID0 S4 *enabled platform:PNP0C0D:00
Pour l'exécuter au boot, voici ce que j'ai fait.
J'ai d'abord édité /etc/systemd/system/disable-xhc-wakeup.service
avec le contenu suivant:
[Unit] Description=Disable XHC Wakeup [Service] ExecStart=/usr/local/bin/disable-xhc-wakeup [Install] WantedBy=multi-user.target
Puis j'ai édité /usr/local/bin/disable-xhc-wakeup
avec ce contenu:
#!/bin/sh
if grep -q XHC.*enabled /proc/acpi/wakeup ; then
echo XHC > /proc/acpi/wakeup
fi
Et j'ai enfin activé ce nouveau service (en root):
# systemctl enable disable-xhc-wakeup.service
Le touchscreen ne fonctionne plus après un resume
Après un peu de recherche, j'ai découvert que simplement décharger et recharger le module hid_multitouch
corrigeait le souci:
modprobe -r hid_multitouch modprobe hid_multitouch
Il ne reste plus qu'à le faire de manière systématique.
Attention, beaucoup de documentation pointe vers /usr/lib/pm-utils/defaults
, mais ce fichier n'est plus utilisé avec systemd
.
J'ai donc créé un fichier /etc/systemd/system/reload_multitouch.service
:
[Unit] Description=Reload hid_multitouch kernel module After=sleep.target [Service] Type=oneshot ExecStart=/sbin/modprobe -r hid_multitouch ; /sbin/modprobe hid_multitouch [Install] WantedBy=sleep.target
Puis je l'ai activé:
# systemctl enable reload_multitouch
Et voilà !
J'ai rapporté le bug sur le bugtracker du noyau Linux donc vous pourrez suivre la résolution éventuelle !