Home / 電源管理(Linux)

大層なタイトルだが、所謂省電力の為のスリープと起床の寄せ集め。

要件定義(笑)

起床
自動復帰… 無人状態かも知れない。
休憩
Suspend to RAM。
S3: メモリ以外の給電停止。いわゆるスリープ。
就寝
休憩と同じ… なのだけど無人の状態。

ざっくりスケジュール

  1. 9:00 起床(自動起動)
  2. 3時間後にスリープ
  3. 午後からは必要に応じて起床
  4. 定時後、或いは深夜に WOL で起床
  5. 3時間後にスリープ

起床(自動復帰)

リアルタイムクロック(RTC)に起こしてもらう。
wakealarm にアラーム日時を書き込めば良いらしい。 難点は次回のアラーム一発だけな点。 BIOS 設定に項目が有れば無問題なのだが、今回のマシンはノートPCなせいか備わってない。

RTC確認

良く判らないけど参考サイトの通りに見ておく。

$ grep -i rtc /boot/config-5.4.0-148-generic
CONFIG_HPET_EMULATE_RTC=y
CONFIG_PM_TRACE_RTC=y
CONFIG_RTC_LIB=y
CONFIG_RTC_MC146818_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
...
$ grep -i rtc /var/log/kern.log
Apr 28 21:32:21 x230 kernel: [    0.145206] PM: RTC time: 12:31:53, date: 2023-04-28
Apr 28 21:32:21 x230 kernel: [    0.733414] rtc_cmos 00:02: RTC can wake from S4
Apr 28 21:32:21 x230 kernel: [    0.733606] rtc_cmos 00:02: registered as rtc0
Apr 28 21:32:21 x230 kernel: [    0.733618] rtc_cmos 00:02: alarms up to one month, y3k, 114 bytes nvram, hpet irqs
Apr 28 21:32:21 x230 kernel: [    0.832435] rtc_cmos 00:02: setting system clock to 2023-04-28T12:31:54 UTC (1682685114)

ハードウェア クロックの読み出し
$ sudo hwclock
2023-04-13 15:27:25.952387+09:00

頼りにするのは RTC なので、その時刻を見ておくべし。

hwclock は常にローカルタイム表示らしい。 --utc オプションや --localtime オプションで変わる訳ではないそうな。 某の環境は UTC 記録。+09:00 の表記なので一目瞭然である。

因みに adjtime を見てみると、随分古い。 shutdown 時の書き戻す度に更新する物では無さそうだ。

$ cat /etc/adjtime
0.000000 1584207453 0.000000
1584207453
UTC

$ date -d @1584207453
2020年  3月 15日 日曜日 02:37:33 JST

$ date -d "2020/3/15 2:37:33" +%s
1584207453

アラーム設定方法

10分後にセットする例
-u が付いているが効果は無く、無用と思う。

# echo `date -u +%s -d +10min`> /sys/class/rtc/rtc0/wakealarm

設定値確認(例では過ぎているが…)

# cat /proc/driver/rtc 
rtc_time        : 06:43:22
rtc_date        : 2023-04-13
alrm_time       : 06:42:37
alrm_date       : 2023-04-13
alarm_IRQ       : no
alrm_pending    : no
update IRQ enabled      : no
periodic IRQ enabled    : no
periodic IRQ frequency  : 1024
max user IRQ frequency  : 64
24hr            : yes
periodic_IRQ    : no
update_IRQ      : no
HPET_emulated   : yes
BCD             : yes
DST_enable      : no
periodic_freq   : 1024
batt_status     : okay

アラームとcronを仕込む

アラーム時刻に起床したら、直ぐに翌日のアラームをセットしたいが、スクリプトを書けそうなイベントが判らない。
ElectornではpowerMonitorAPI -Event: 'resume'が用意されてるらしいが…

手軽にやるには cron か…
スマートでない気がするが、毎日9時過ぎに、翌日の 8:50 に起床するようアラームをセットする。

アラームセットのスクリプト

翌日の 8:50 決め打ちで文字列を生成し、UNIXエポックに変えてセットする。
setalrm.sh とでも名付けて保存。

#!/bin/sh
dt=`date '+%Y-%m-%d 08:50:00' --date '1 days'`
#echo 0 > /sys/class/rtc/rtc0/wakealarm
echo `date +%s --date="$dt"`> /sys/class/rtc/rtc0/wakealarm

0時過ぎに叩いたら当日に起きない、とか、休日を考慮してないとか不備は有る orz

# crontab -e で仕込む(編集する)

9時丁度は念の為に避ける。DDNS の更新も2日毎にやる。

# 8:50 アラームによる起床
# 翌日のアラームをセット
5 9 * * * /root/setalrm.sh
# MyDNS.JPへの通知(更新)
15 9 */2 * * /root/mydns.sh 1> /dev/null 2> /dev/null

起床(強制復帰)/WOL(Wake-on-Lan)

WOLツール

Ubuntu パッケージの中から wake キーワードを含む物の抜粋し、Details を機械翻訳/加工した。

wakeonlan
 'Wake-on-Lan' パケットに対応するマザーボードやネットワークカードのあるマシンを、遠隔から立ち上げ(電源を入れ)る事ができます。
 本ツールにより、単一のマシンまたは一群のマシンを立ち上げることができます。
 WOL パケットを構成するためにマシンの MAC アドレスが必要です。
 尚、'etherwake' とは異なり、UDP パケットを用いる為、本ツールの使用に root 権限は不要です。
etherwake
WOL (Wake-on-LAN) は、イーサネット接続を介してコンピューターの電源を入れることができる標準です。
 WOL 対応のネットワーク インターフェイス カードを搭載したコンピュータは、スリープ モードから復帰するか、BIOS 機能を介してスタンバイから電源を入れることができます。
 etherwake を他の実装から分離する 1 つの機能は、WOL パスワードもサポートすることです。
shutdown-at-night
このツールを使用すると、ワークステーションの定期的なシャットダウンを夕方にスケジュールしたり、nvram-wakeup、ACPI wakeup、または wake-on-lan を使用して毎朝起動したりできます。
 wake-on-lan ウェイクアップ シーケンスの場合、ローカル ネットワーク/サブネット上に1台のウェイク マシンが必要です。
 これは、nvram-wakeup によって直前にウェイクアップされたサーバー マシンまたはクライアント マシンである可能性があります。
 シャットダウン シーケンスは、CRON ジョブを介して午後 4 時以降に 1 時間ごとに開始されます。
 ただし、非アクティブ/使用されていないように見えるマシンのみがシャットダウンされます。(現在使用中のマシンは稼働し続けます。)
 Shutdown-at-Night ツールは、構成ファイルを介して、または shutdown-at-night-hosts と呼ばれる NIS ネットグループのメンバーシップを介してアクティブ化できます。
nvram-wakeup
nvram-wakeup は、BIOS 中の起動時間を読み書き可能です。(2.4.x カーネルでは /dev/nvram 経由または直接 I/O ポートにアクセス)
 起動時間には、コンピュータは自動で soft-off 状態から起動されます。
 ビデオディスクレコーダ VDR に対して 、nvram-wakeup はフックスクリプトを インストールするので、VDR は、電源断時に起動時間をセットできます。

etherwake を試してみる
etherwake [options] Host-ID
 etherwake は、Wake-On-LAN (WOL) "Magic Packet" を生成して送信するプログラムで、ソフトパワーダウン (ACPI D3 ウォーム状態) のマシンを再起動するために使用されます。
 オプションでのパスワードを含めて、標準の AMD Magic Packet フォーマットを生成します。
 単一の必須パラメータは、nsswitch.conf(5) で指定された ethers(5) データベースによって MAC アドレスに変換できるステーション (MAC) アドレスか、又はホストID です。

↑某の環境では MACアドレスを得られないようで、エラーとなる↓

$ sudo etherwake -b 192.168.xxx.xx
etherwake: The Magic Packet host address must be specified as
  - a station address, 00:11:22:33:44:55, or
  - a hostname with a known 'ethers' entry.

nsswitch.conf には詳しくないので手っ取り早く MACアドレスを与える事に…
その MACアドレスを知るには、ここでは直接に PC を見た方が早いのだが、ARP から得る手も有るので、ping を打ってから参照してみる(って云うか、起動してなきゃ駄目な訳で…)

$ ping x200
PING x200 (192.168.xxx.xx) 56(84) bytes of data.
64 bytes from x200 (192.168.xxx.xx): icmp_seq=1 ttl=64 time=9.40 ms
…
…
$ ip n
192.168.xxx.1 dev wlp3s0 lladdr ...
192.168.xxx.xx dev wlp3s0 lladdr ... REACHABLE
42.150.xx.xxx dev wlp3s0 lladdr ...

ifname を与えて…

$ sudo etherwake  00:xx:xx:xx:xx:xx
SIOCGIFHWADDR on eth0 failed: No such device

$ sudo etherwake -i wlp3s0 00:xx:xx:xx:xx:xx

これでMagic Packetなるものが発行出来る訳だけど、宛先の無線LANはハイカラ(笑)な品では無いので起きてはくれませぬ。有線NICなら起きてくれる。

wolpac.jpg

何よりこのツールはインターネット越しにルーターを越えては行けぬようなので、これでおしまい orz


無線/有線アダプタWLI-UTX-AG300を試してみる

無線アダプタなんだけども、有線NIC へ横流ししてくれるそうで、これに投げると Wake up する。価値有る一品 (・∀・)

$ wakeonlan  00:1f:xx:xx:xx:xx
Sending magic packet to 255.255.255.255:9 with 00:1f:xx:xx:xx:xx

$ ip n
192.168.xxx.1 dev wlp3s0 lladdr 90:f3:xx:xx:xx:xx REACHABLE
192.168.xxx.11 dev wlp3s0  FAILED
192.168.xxx.50 dev wlp3s0  FAILED <-------------------------- 無線部
192.168.xxx.51 dev wlp3s0 lladdr 00:1f:xx:xx:xx:xx STALE <--- 有線NIC

リモートから Wake-up

wakeonlan が使える(みたい)。 IPv4な宛先、UDPポート、MACアドレスを与える。

$ wakeonlan  -i 150.xxx.xxx.xxx -p 7779  20:89:xx:xx:xx:xx
Sending magic packet to 150.xxx.xxx.xxx:7779 with 20:89:xx:xx:xx:xx

なお、旨くやるには条件が有る(有った)。


自宅のルーターは問題有り

J-COM の HG100R-02JG には、WAN→LAN中継設定のような設定は無く、無理っぽい。orz

駄目元で下記を設定してみるも、(ディレクティッド)ブロードキャストにはならないもよう。
ネットワーク内のPCでキャプチャを眺めると、ARP が走っていた。正解か?

色んな方が書いているように、255 設定は弾くブロックするが[正しい|良い]作りに感じる。


参考

クロック
アラーム
WOL
date/cron コマンド

Home / 電源管理(Linux)

© 2008 usskim    http://usskim.web.fc2.com/
inserted by FC2 system