2019年6月1日土曜日

Ubuntuのスリープ(サスペンド)をThinkPad S1 YOGAで有効にする方法


背景

Ubuntu16.04あたりから電源周りの挙動が変わったためか、ThinkPad S1 YOGAを閉じると、一度はスリープ(サスペンド)するものの、すぐに起動するようになりました。

時間をかけて調べつつ試行錯誤したら解決方法が分かったので、備忘録を兼ねて共有します。

使ったもの

  • ThinkPad S1 YOGA
  • Ubuntu18.04

すぐに起動してしまう対策: acpi/wakeupをLID0以外をdisabledにする

下記のページを見つけました。

サスペンドができない

このページ(とページ内で紹介されているArchWiki)によると、/proc/acpi/wakeupのLID0以外をdisableにすればよいということでした。

acpi/wakeupの内容は、ファイルとして開いたり、catコマンドで表示すると確認できます。
cat /proc/acpi/wakeup

自分の環境では、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

LID0以外にXHCがenabledになっているので、下記のコマンドでXHCの設定を切り替えました。
sudo sh -c "echo XHC > /proc/acpi/wakeup"

LID0以外をdisabledにした状態でPCのモニタを閉じると、見事起動しないままスリープしてくれました!
スリープ状態になると、モニタの裏にあるロゴのLEDが時々ぼんやり明るくなるという光り方になります。


しかしながら、コマンドで設定を変更したacpi/wakeupは、再起動すると元の値に戻ってしまいます。
acpi/wakeupの設定変更を起動時に行うために、configure-acpi-wakeupというサービスを作ります。

まず、下記のようなファイルを作成します。
/etc/systemd/system/configure-acpi-wakeup.service
[Unit]
Type=oneshot
Description=configure-acpi-service [Service] ExecStart=/bin/bash -c "echo XHC > /proc/acpi/wakeup" [Install] WantedBy=multi-user.target

ファイルができたら下記のコマンドでサービスを開始し、有効化します。
sudo systemctl daemon-reload
sudo systemctl start configure-acpi-wakeup.service
sudo systemctl enable configure-acpi-wakeup.service

これにより、再起動するたびacpi/wakeupが書き換わり、期待する状態になってくれるようになりました。

スリープから復帰後にタッチパッドの複数指操作ができない対策: blacklist i2c_i801をコメントアウト

Ubuntuの不具合として報告されていました。

psmouse: after sleep/suspend thinkpad touchpad not functional

/etc/modprobe.d/blacklist.conf の blacklist i2c_i801をコメントアウト(行の始まりに#を追加)してPCを再起動すると、スリープから復帰してもタッチパッドが変わらず使えるようになりました。

具体的にはこのようにしました。
/etc/modprobe.d/blacklist.conf
# blacklist i2c_i801

調べたけれど分からなかったこと: スリープ中でもUSBから5Vが供給されたままになる

さて、スリープできない問題とタッチパッドの問題が解決したので、とりあえずはスリープ可能なPCを利用できます。

しかしながら、スリープしてもUSBから電気が供給されたままになっていて、USB機器を何か繋いでいると、スリープしてるけどUSB機器は動いて電気を消費するという状態になります。

これを解決しようと調べてはみたのですが、どうもLinuxのUSBの電源モードは、以前はsuspendが設定できていたものの、今はonかautoしか設定できないようで、電源供給を止めるモードというのが存在しないようでした。

Disable USB power for USB controlled power strip

PCがスリープしたらUSBも電源供給を停止する機能をご存知でしたら、コメントなどで共有していただけると嬉しいです。

まとめ

UbuntuをインストールしたPCを使わない時に気軽に画面を閉じてスリープさせられるようになりました。
スリープできなかったときと比べてPCをバッグに入れて移動する前後の時間が短くなり、とても便利になりました。(2015年あたりはできてた。)

同じような問題で困っている人にこの情報が届けば嬉しいです。

0 件のコメント :