タイマーによる起動/停止


LinkStation には「スリープ設定」といって、 指定時刻になると起動したり、停止したりする機能がある。
この機能を探ってみる。

設定時刻は、/etc/melco/timer_sleep に保存され、 ppc_uartd がそれを読み込んで、 AVR に何らかのコマンドを送って実現しているはず。

内向きサーバ(HGLAN)は、夜中にバックアップやらログの整理やら、 いろいろ処理をさせているのだが、当然電源を入れていないと これらの処理が起動しない。
タイマー起動がうまくいけば、夜中の処理時刻前に必ず起動し、 これらの処理を確実に行えるようになる。

Web からの設定

HLAN ファームウェア 1.41 の設定トップから、「スリープ設定」を実行する。
スリープ設定を使ったことなかったので、 実際ににスリープさせてみたら、POWER LED が、約5秒間隔で点滅した。 この”滅”がなんとも言えず弱弱しい。 モワ〜と消えていく。

スリープから復帰後も POWER LED が約5秒間隔で点滅したまま。
電源ボタン長押しで電源を OFF にしても約5秒間隔で点滅したまま。
手動電源 OFF から指定時刻に起動するかを確認したら、、、 起動してこない。 これでは、目的が達せないぞ。

あらためて、manual.pdf を読んでみる。
たしかに、 「・スリープ機能を設定すると、Link Stationが起動していてもスリープ状態 になっていても電源ランプがゆるやかに点滅します。」 と書いてある。POWER LED に関してはマニュアルどおり。
でも「電源 OFF から復帰できません」とは書いてない。 シャットダウンの説明のところには、 「・スリープ機能設定画面でスリープ復帰時刻を設定しておくと、 自動的にLink Station の電源をONにすることもできます。」と 書いてあるのに。
ひょっとすると、Web からのシャットダウンと、 電源ボタンによる電源 OFF とは違う?
Web のシャットダウン実行時のスクリプト setup-shutdown-in.cgi から呼ばれる /www/script/melsub_shutdown.sh を見ても、 普通に shutdown -h now しているようにしか見えないし、 電源ボタンを長押ししたときに ppc_uartd は 同じ /www/script/melsub_shutdown.sh を読んでいるはずだし。

おっかしぃーなぁと、Web からシャットダウンしてみたが、、、 指定時刻になっても起動してこなかった。

なぁ〜んや。うごかへんやん。

スクリプトの解析

気を取り直して、、、
「スリープ設定」の時に実行されるスクリプトは、 /www/cgi-bin/setup-sleep-in.cgi。
これを読んでみると、
  • /etc/melco/timer_sleep に設定値を書き出し
  • AVR に QQQQ を送り
  • /etc/melco/timer_status を書き換え
  • syslog に記録
  • ap_servd を再起動
    している。
    おや? 何で、ap_servd を再起動しているの?
    スリープを実行しているのは、ppc_uartd ではなく ap_servd ?

    設定ファイル

    /etc/melco/timer_sleep

    スリープを使用する場合
    on<>スリープ開始時刻<>スリープ復帰時刻
    
    スリープを使用しない場合
    off<>スリープ開始時刻<>スリープ復帰時刻
    

    /etc/melco/timer_status

    スリープを使用する場合
    sleep<>ready<>スリープ開始時刻<>スリープ復帰時刻
    
    スリープを使用しない場合
    none<>none<>none<>none
    

    ppc_uartd, ap_servd, libls.so.1.0.1 を strings してみた結果、
    /etc/melco/timer_sleep を見ているのは、ppc_uartd
    /etc/melco/timer_status を見ているのは ap_servd

    スリープって?

    スリープというと、動作状態を RAM(もしくは HDD)に保持したままの状態を イメージするが、LinkStation のスリープがどういう状態なのかを確認する。

    スリープを設定した状態で、login していると、、、 設定時刻を1分ほど過ぎてシャットダウンが始まった。
    シャットダウン後に手動で電源をONにし、 再度 login し、uptime を見てみると、

    root@LINK:~# uptime
     12:03pm  up 0 min,  1 user,  load average: 0.37, 0.09, 0.03
    
    と、普通に立ち上がっただけのようである。
    /var/log/messages を見ても、
    May  1 12:01:15 LINK kernel: Kernel logging (proc) stopped.
    May  1 12:01:15 LINK kernel: Kernel log daemon terminating.
    May  1 12:01:15 LINK exiting on signal 15
    May  1 12:03:02 LINK syslogd 1.3-3: restart.
    May  1 12:03:02 LINK kernel: klogd 1.3-3, log source = /proc/kmsg started.
    
    と、 12:01 に普通にシャットダウンされて、 12:03 に普通に立ち上がってきただけ のようである。

    AVR の QQQQ コマンド

    AVR の QQQQ コマンドも確認する。

    まず、スリープ設定をしていない状態で、QQQQ を送ってみる。

    root@LINK:~# echo -n 'QQQQ' > /dev/ttyS1
    
    ん?何も起こらない。
    POWER LED が点滅することを期待していたが、、、

    手動設定でのスリープ

    スリープ設定をしていない状態から、手操作で
  • /etc/melco/timer_sleep を修正し
  • /etc/melco/timer_status を修正し
  • AVR に QQQQ を送り
  • ap_servd を再起動
    してみた。
    Web からと同様、POWER LED がゆっくり点滅。 指定時間にシャットダウンされた。

    今度は、ap_servd 関連以外の設定のみしてみようと、 /etc/melco/timer_sleep を修正し終わった時点で、 POWER LED がゆっくり点滅していることに気が付いた。
    /var/log/message を見てみると、

    May  1 15:52:19 LINK uart daemon[236]: Timer is set with 5/1 15:55-5/1 16:00. (because timer file is re-initialized)
    
    と残されている。
    ひょっとすると、ap_servd なんて、スリープにまったく関係ないの?
    あと AVR への QQQQ コマンドも。

    そうこうしているうちに、 設定時刻(を1分過ぎた 15:56 )にシャットダウンされ、 設定時刻(のちょっと前)には電源が入った。

    ap_servd はスリープとは関係ないみたいである。
    じゃあ、どうして Web から設定するときの CGI スクリプトは ap_servd を再起動しているんだろう?

    続いて、 /etc/melco/timer_sleep の第一フィールドを on から off に変更した。 程なく /var/log/message に

    May  1 16:02:05 LINK uart daemon[236]: Timer is released. (because timer file is re-initialized)
    
    というログが残り、POWER LED が点灯したままとなった。

    基準時間

    /var/log/messages を見ていて気が付いた。
    May  1 18:18:42 LINK uart daemon[236]: Timer is set with 5/2 17:00-5/2 17:30. (because timer file is re-initialized)
    May  1 18:19:22 LINK uart daemon[236]: Timer is set with 5/2 18:00-5/2 18:30. (because timer file is re-initialized)
    May  1 18:20:02 LINK uart daemon[236]: Timer is set with 5/1 19:00-5/1 19:30. (because timer file is re-initialized)
    
    基準時間は、スリープ開始時刻で、その時刻が
  • 現在より前なら明日
  • 現在より後なら今日
    とされるようである。
    上のほうで、手動電源 OFF すると指定時刻に起動してこなかったが、 原因は手動での電源 OFF ではなく、 設定時間が次の日になっていたからではないかと思われる。

    ためしに、5分後にスリープ、10分後に復帰の設定をして、 手動で電源OFFしておいたら、10分後に起動してきた。


    LinkStation/玄箱 をハックしよう → タイマーによる起動/停止(2)

    Copyright (C) 2004 Yasunari Yamashita. All Rights Reserved.
    yasunari @ yamasita.jp
    山下康成京都府向日市