MacBook Pro上のUbuntu 18.04でサスペンドが動くようにする

はじめに

MacBook Pro 15-inch, Mid 2012 (機種ID: MacBookPro10,1)にUbuntu 18.04をインストールしてみたのですが、動かしたまま画面を閉じるとAppleマークのライトは消えるのですがファンは回り続け、その後画面を開いても復帰しない状態でした。

検索してみると Getting suspend in Linux working on a MacBook Pro という記事があったので、これを参考に設定してみました。

設定方法

ちょうど良さそうなので systemd.service (5)type=oneshot を使ってみました。

cat <<EOF | sudo tee /etc/systemd/system/workaround-for-suspend.service > /dev/null
[Unit]
Description=A workaround to get suspend work properly when lid are closed
# https://joshtronic.com/2017/03/13/getting-suspend-in-linux-working-on-a-macbook-pro/

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo XHC1 > /proc/acpi/wakeup && echo LID0 > /proc/acpi/wakeup'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl start workaround-for-suspend
sudo systemctl enable workaround-for-suspend

今回知ったのですが、ずっと稼働し続けるようなサービスではなくて、実行して終了するようなプログラムを指定する場合は RemainAfterExit=yes を指定しておけば、サービスの状態確認では active と表示されます。意図通り正常に実行されているというのがわかりやすいのでつけてみました。

$ sudo systemctl status workaround-for-suspend
● workaround-for-suspend.service - A workaround to get suspend work properly when lid are closed
   Loaded: loaded (/etc/systemd/system/workaround-for-suspend.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sun 2018-05-06 09:39:59 JST; 14min ago
 Main PID: 2976 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/workaround-for-suspend.service

 5月 06 09:39:59 sunshine7 systemd[1]: Starting A workaround to get suspend work properly when lid are closed...
 5月 06 09:39:59 sunshine7 systemd[1]: Started A workaround to get suspend work properly when lid are closed.

(参考) /etc/rc.localはType=forkingを使っていた

/etc/rc.local について調べていたら、これもsystemdのサービスとして実装されていました。

$ LC_ALL=C ls -l /lib/systemd/system/rc?local.service
-rw-r--r-- 1 root root 716 Apr 21 01:55 /lib/systemd/system/rc-local.service
lrwxrwxrwx 1 root root  16 Apr 29 00:52 /lib/systemd/system/rc.local.service -> rc-local.service

脱線しますが、上のコマンドで LC_ALL=C のところを最初は LANG=C にして試したら日付が日本語で出てしまいました。検索してみると [覚書]ざけんな。”LANG=C” “LANGUAGE=C”で日本語!!英語にならない!!の怒りの対策。”LC_ALL=C”?”LANG=POSIX”?、suでdpkg-reconfigure locales情けないぞ! | Deginzabi163's Blog という記事がありました。

Ansibleのモジュール内でコマンドを実行するときも LANG=C を使っている箇所があるのでこれは困るなーと思うのですが、なぜこんなことになっていたのか。

話を戻して /lib/systemd/system/rc-local.service の中身は以下のようになっていました。

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

Typeはoneshotではなくforkingを使っています。理由はわからないです。 ここでも RemainAfterExit=yes を使っています。というより、実はこれを見て知りました。