2014/05/19の記録:今日のDebian iBook(スリープ関係)
今日はスリープ関係について。
(Debian Wheezy LXDE on iBook G3 366 SE)
PowerBookの方はDebianのインストール以来スリープ関係で苦労したことを書いたが、いまだに解決していない。
それに比べるとiBookの方は、電源管理に使っているxfce4-power-managerの、バッテリー残量表示に多少の不具合はあるものの、スリープ関連には問題があると認識していなかった。
しかし、PowerBookの問題解決に頭を悩ませる中で、ふと、iBookの方はどうなっているか確かめたくなってやってみると、iBookでもスリープに問題が出ることがわかった。
問題とは具体的には以下のようなもの。
- スリープから復帰してもネットワークが切れたままつながらない。
- タッチパッドのタップ機能をオフに設定してあるのに、復帰後はデフォルトであるオンの状態になってしまう。
- 復帰後、スリープさせようとしてもしなくなる。(一回の起動毎にスリープは一度しかできないということ)
- コンピュータがシャットダウンしなくなる。(ログアウト画面等で「シャットダウン」なり「再起動」を選ぶと、文字がずらずら出てくる画面になると思うが、そこで「起動中のプログラムを終了できない」といった旨の表示が出て、終了させたはずのアプリケーションも含めていくつかのプログラムの名前が出るが、表示はさらに進んで「電源を切ります」あるいは「再起動します」という内容の文が出るところまでいくが、そこで止まってしまう)
ほかにも問題がありそうだが、とりあえず僕が認識しただけでもこれだけの不具合が出る。
このうちのいくつかは解決策を見つけたものの、根本的な解決にはならないので気持ち悪い。
と思っていたところで、ちょっと用を済ませるためにiBookを起動させたまましばらく離れていて、戻ってきたらスリープしていた。PowerBookとは違いスリープできなくなっていたわけではなく復帰後に問題がおこる状態だったので、そのこと自体に不思議はない。
だが、また問題がおこるだろうと思いつつ復帰させてみると、予想に反して上に挙げたような問題は一つもおきなかった。
スリープがうまくいく場合とうまくいかない場合があるということになるので、その理由をあれこれ考えて、次の様に推論することができた。
- これまでのスリープの実験は、xfce4-power-managerのアイコンを右クリックして「サスペンド」を選んでスリープさせるか、ふたを閉じてスリープさせるかのどちらかの方法で行った。
- 前者は明らかにxfce-power-managerの機能であり、後者、つまりふたを閉めたらスリープに入るのも、xfce4-power-managerでそのように設定している以上、xfce4-power-managerの働きによるスリープであると考えられる。
- 今、一定時間触らずにいたためにスリープに入り、うまくいったわけだが、その形のスリープはスリープの問題に気づいてからためしていなかった。
- 一定時間触らずにいるとスリープに入る設定もxfce4-power-managerでしているものの、仮にxfce4-power-manager以外にもiBookをスリープに入らせる仕組みがあり、その仕組みではxfce4-power-managerで設定した時間より短い時間でスリープに入らせる設定になっていたとしたら、うまくいった今回のスリープはxfce4-power-managerではないその仕組みによるものだったことになる。
- 今回うまくいったのは、xfce4-power-managerとは別の仕組みによってスリープに入ったためかもしれない。
この仮説を検証するために、xfce4-power-managerでふたを閉めた際のアクションの設定を「サスペンド」から「何もしない」に変えた上で、ふたを閉めてみたところスリープに入った。
ふたを開けて復帰させると、不具合が出なかった。
これで次の点が確認できた。
- スリープにはxfce4-power-managerによるものとそうでないものがある。
- スリープでの不具合はxfce4-power-managerの働きによるスリープの場合におきる。
- xfce4-power-manager以外の仕組みによるスリープでは不具合がおきない。
そこで、xfce4-power-managerではいっさいスリープしないように設定を変えた。
その状態でいじってみると、一定時間触らなかった場合とふたを閉めた場合のほかに、電源ボタンを押すとスリープに入り、そのスリープは復帰後に問題が起きないことを確認できた。
その上で、xfce4-power-manager以外のスリープの仕組みとして思い当たったのはPBButtonsdだけだったので、
/etc/pbbuttonsd.conf
をいじって色々試してしてみた。
pbbuttonsd.confをエディタで開いてみてみたところ、スリープに関連しそうなのは次のような行。
onAC_TimerAction = none ; none, suspend-to-ram, suspend-to-disk, blankscreen
onAC_CoverAction = suspend-to-ram
onAC_KeyAction = suspend-to-ram : SleepKey
onAC_SuspendTime = 0 ; time in 1/10 seconds
onAC_DimTime = 0 ; time in 1/10 seconds
onBattery_TimerAction = suspend-to-ram ; none, suspend-to-ram, suspend-to-disk, blankscreen
onBattery_CoverAction = suspend-to-ram
onBattery_KeyAction = suspend-to-ram : SleepKey
onBattery_SuspendTime = 3000 ; time in 1/10 seconds
onBattery_DimTime = 600 ; time in 1/10 seconds
SleepKey = 116
まず、押すとスリープに入るボタンのことだと思われるSleepKeyの数字を変えてみることにした。
116というのはxmodmapをいじるときに使ったkeycodeの事だろうと思い、xevで調べて確認したF12キーのkeycode、96に変えた上で保存して、再起動した。
(xmodmap、xevについては03/31の記録等を参照)
起動後早速F12キーを押してみたが、スリープはしない。しかし、電源キーを押してもスリープしない。
このことから、SleepKeyとしてF12キーを使う設定には失敗したものの、pbbuttonsd.confをいじることでスリープの設定をいじれることが確認できた。またこのことから、うまくいくスリープを実現している仕組みがpbbuttonsdであると判断してまず間違いないと思われる。
F12キーをスリープキーにできなかった理由はよくわからないが、xmodmapで使うkeycodeとは別のキーコードがあり、そのキーコードで電源キーが116なんだろう(ついでに言えばそのキーコードではF12キーは96ではないのだろう)と考えておくことにする。この推論は間違っているかもしれないが、スリープに入るキーを電源キー以外にしたいと思っているわけではなく、あくまでうまくいくスリープを司っているのはPBBbuttonsdである、ということを確認するためにとりあえずキーコードをいじってみただけなので、この問題は今回はスルーすることにして先に進む。
【PBButtonsdのページをよく見てみたら、なんだかよくは分からんが、やっぱりこのキーコードはxmodmapのものとは別のもののようだ。例えば次のようなページがあった。
Cross-Referenced Linux and Device Driver Code
(2014/05/21)】
SleepKeyの設定を元に戻したあとで、デフォルトではAC電源接続の際はスリープしない設定になっているようなのでそこを改めるために
onAC_TimerAction = suspend-to-ram
とした。
ついで、onAC_SuspendTime、onBattery_SuspendTimeというのはそれぞれAC電源、バッテリー時のサスペンドに入るまでの放置時間の設定であると思われ、その右に続いている断り書きから数字の単位は10分の1秒であると思われるが、DimTimeが何のことだかわからないので、確認のためにとりあえずDimTimeの方を100(10秒)、SuspendTimeの方を200(20秒)に設定した上でiBookを再起動して、秒数を数えながら放置してみたら、約10秒後に画面が暗くなり、約20秒後に、ちゃんとスリープしてくれた。
PBButtonsdのさしあたり必要な設定が思い通りにできることがわかったので、実際に使う設定を考える。
色々考えたが、ACとバッテリーとで設定を変える必要を特に感じないことから、両方ともバッテリーのデフォルトの数字にあわせておくことにして、
onAC_SuspendTime = 3000
onAC_DimTime = 600
onBattery_SuspendTime = 3000
onBattery_DimTime = 600
にした。
(モニターが暗くなるのがちょっと早いかな、とは思う。1200くらいでもいいかも。しばらくいろいろ試してみる)
設定としてはこれでかまわないのだが、さらに実験をしてみたくなったので、
onBattery_CoverAction = suspend-to-disk
としてsuspend to disk、すなわちハイバネートを試してみたが、これはうまくいかなかった。
モニターは消えるのだが、コンピュータ自体はしばらく動いていそうな音がして、やがて音もしなくなるのだが、復帰させようと思ってキーを押しても、電源ボタンを押しても復帰しない。
結局、コマンド+コントロール+電源を押して強制再起動をすると、ハイバネートからの復帰ではなく、普通に起動した。
ハイバネートの機能は、少なくともさらに色々勉強しない限り使えないことがわかったが、前にも書いたようにハイバネートは元々好きではなく、サスペンドがあればそれでいいので、設定を元に戻してiBookのスリープ問題は解決したことにした。
(ハイバネートが好きでないのは、リナックスに限らず、今までうまくいったためしがないため。うまくいくハイバネートがあればそれはそれで結構なことだが、別になくてもいいや)
まとめておくと、xfce4-power-managerのスリープ機能は、Appleの機械ではうまくいかなそうなので、スリープ関係はAppleの機械向けに開発された仕組みであるPBButtonsdに任せるのが良さそうだ、というのが現状での僕の考え。
ただし、xfce4-power-managerがうまくいかないのはあくまでスリープ機能だけで、モニターを暗くしたり消してしまったりする機能は問題なく動作しているようだし、その点についての設定はPBButtonsdよりも細かく、容易にできるので、xfce4-power-managerは削除せずに使い続けていいと思う。
さらに言えば、バッテリー残量を示す仕組みはPBButtonsdにはないので、いずれにしてもそのための何か別の仕組みが必要なので、バッテリー残量インジケータとしてもxfce4-power-managerを残しておく意味がある(冒頭で書いたように多少の不具合はあるけれども)。
xfce4-power-managerにはスリープさせないように設定しておきさえすればいい。
【とは書いたものの、その後色々考えて、使わないものを無駄に起動させておくのを避けた方がいいということになり、xfce4-power-managerを使うのはやめて、バッテリー残量表示にはよりシンプルなxbattbarを使うことにした。詳細は05/27の記録参照。(07/14)】