MythTV with nvram-wakeup

MythTV Top

ACPIを使用した方法もあります。

新しいマシンではこちらのほうが簡単です。


MythTVはを使って録画をしているとPCを24時間稼動させておくか 録画時間の前に手動で立ち上げなくてはいけない。常時稼動させてもいいのだけど結構電気代がかかる。 そこでBIOSの時間起動を使って次の予約の前に自動的に起動するよにする。

Shutdown/Wakeup HowToを参考に設定


nvram-wakeupの設定

カーネル

カーネルでnvramとrtcをサポートする

インストール

nvram-wakeupをインストールする

$ sudo apt-get install nvram-wakeup -t unstable
	

設定

サポートされているかとりあえず実行してみる

$ sudo nvram-wakeup
nvram-wakeup: Your mainboard is currently not supported.
nvram-wakeup: Please try determining the addresses and sending the following
nvram-wakeup: information back to the maintainers:
nvram-wakeup:  - The addresses you found out (read README.mb)
nvram-wakeup:  - Mainboard vendor:   Gigabyte Technology Co., Ltd.
nvram-wakeup:  - Mainboard type:     7ZX
nvram-wakeup:  - Mainboard revision: 1.0
nvram-wakeup:  - BIOS vendor:        American Megatrends Inc.
nvram-wakeup:  - BIOS version:       62710
nvram-wakeup:  - BIOS release:       03/29/2002
	

私が使用しているマザーはGigabyteのGA-7ZXでソースを見るとサポートされているようだけどBIOSをアップデートしているので 認識してくれない。README.mb.gzをみてまずguess-helperを試していみる。 指示どおりにBIOSの時間を合わせてはguess-helperを実行を数回してnvram-wakeup.confが 出来たがいまいち。そこで今度は"running `guess' manually"の通りにやってみる。

running guess manually

mkdir guess
	

"Wake UP On RTC"を有効にして時間を 12月31日 23:59:59にあわせるGA-7ZXには月の項目が無いので無視
起動して

$ sudo cat_nvram > guess/31.23.59.59+
	

"Wake UP On RTC"を有効にして時間を 10月11日 12:13:14にあわせる
起動して

$ sudo cat_nvram > guess/11.12.13.14+
	

"Wake UP On RTC"を有効にして時間を 1月1日 00:00:00にあわせる
起動して

$ sudo cat_nvram > guess/01.00.00.00+
	

"Wake UP On RTC"を無効にして時間を 1月1日 00:00:00にあわせる
起動して

$ sudo cat_nvram > guess/01.00.00.00-
	

guessディレクトリでguessを実行する

$ cd guess
$ sudo guess
$Id: guess.c,v 1.22 2004/03/04 08:38:14 bistr-o-math Exp $
Opened file 31.23.59.59+ readonly...
Opened file 11.12.13.14+ readonly...
Opened file 01.00.00.00+ readonly...
Opened file 01.00.00.00- readonly...
Couldn't read byte 0x80 from 31.23.59.59+
Assuming size of files 128 bytes

################################################
##  Mainboard autodetection information:
##
guess: Opening /dev/mem in O_RDONLY mode...
guess: _DMI_ table found: base: 0xF05F0, size: 0x3FB, count: 30
guess: data block   1 at offset 0x000: type   0, size 0x014 ( 20)
guess: found string "American Megatrends Inc."
guess: found string "62710"
guess: found string "03/29/2002"
guess: data block   2 at offset 0x03F: type   1, size 0x019 ( 25)
guess: data block   3 at offset 0x0AD: type   2, size 0x008 (  8)
guess: found string "Gigabyte Technology Co., Ltd."
guess: found string "7ZX"
guess: found string "1.0"
guess: data block   4 at offset 0x0E5: type   3, size 0x011 ( 17)
guess: data block   5 at offset 0x14B: type   4, size 0x020 ( 32)
guess: data block   6 at offset 0x1B7: type   7, size 0x013 ( 19)
guess: data block   7 at offset 0x1D4: type   7, size 0x013 ( 19)
guess: data block   8 at offset 0x1F1: type   5, size 0x016 ( 22)
guess: data block   9 at offset 0x209: type   6, size 0x00C ( 12)
guess: data block  10 at offset 0x21C: type   6, size 0x00C ( 12)
guess: data block  11 at offset 0x22F: type   6, size 0x00C ( 12)
guess: data block  12 at offset 0x242: type   9, size 0x00D ( 13)
guess: data block  13 at offset 0x255: type   9, size 0x00D ( 13)
guess: data block  14 at offset 0x268: type   9, size 0x00D ( 13)
guess: data block  15 at offset 0x27B: type   9, size 0x00D ( 13)
guess: data block  16 at offset 0x28E: type   9, size 0x00D ( 13)
guess: data block  17 at offset 0x2A1: type   9, size 0x00D ( 13)
guess: data block  18 at offset 0x2B3: type  10, size 0x006 (  6)
guess: data block  19 at offset 0x2C8: type  11, size 0x005 (  5)
guess: data block  20 at offset 0x2F0: type   8, size 0x009 (  9)
guess: data block  21 at offset 0x30D: type   8, size 0x009 (  9)
guess: data block  22 at offset 0x32A: type   8, size 0x009 (  9)
guess: data block  23 at offset 0x347: type   8, size 0x009 (  9)
guess: data block  24 at offset 0x35F: type   8, size 0x009 (  9)
guess: data block  25 at offset 0x379: type   8, size 0x009 (  9)
guess: data block  26 at offset 0x38F: type   8, size 0x009 (  9)
guess: data block  27 at offset 0x3A3: type   8, size 0x009 (  9)
guess: data block  28 at offset 0x3B7: type   8, size 0x009 (  9)
guess: data block  29 at offset 0x3CB: type   8, size 0x009 (  9)
guess: data block  30 at offset 0x3DF: type  13, size 0x016 ( 22)
guess: Following DMI entries found:
guess:  - Mainboard vendor:   "Gigabyte Technology Co., Ltd."
guess:  - Mainboard type:     "7ZX"
guess:  - Mainboard revision: "1.0"
guess:  - BIOS vendor:        "American Megatrends Inc."
guess:  - BIOS version:       "62710"
guess:  - BIOS release:       "03/29/2002"
##    - Mainboard vendor:   "Gigabyte Technology Co., Ltd."
##    - Mainboard type:     "7ZX"
##    - Mainboard revision: "1.0"
##    - BIOS vendor:        "American Megatrends Inc."
##    - BIOS version:       "62710"
##    - BIOS release:       "03/29/2002"

checking 0x30: 0x0B 0x0B 0x0A 0x0A
checking 0x31: 0x9E 0x24 0xF3 0x73
checking 0x56: 0x92 0x92 0x92 0x12
addr_stat        = 0x56
shift_stat       = 7
checking 0x57: 0x1F 0x0B 0x01 0x01
addr_day         = 0x57
checking 0x58: 0x37 0x2C 0x20 0x20
addr_hour        = 0x58
checking 0x59: 0x7B 0x4D 0x40 0x40
addr_min         = 0x59
checking 0x5A: 0x3B 0x0E 0x00 0x00
addr_sec         = 0x5A
checking 0x6F: 0x31 0x11 0x01 0x00
addr_stat        = 0x6F   # but differs somewhere else
rtc_day          = 0x6F
reset_day        = ON
checking 0x73: 0x59 0x14 0x00 0x00
rtc_sec          = 0x73
checking 0x75: 0x59 0x13 0x00 0x00
rtc_min          = 0x75
checking 0x77: 0x23 0x12 0x00 0x00
rtc_hour         = 0x77
addr_chk_h       = 0x30
addr_chk_l       = 0x31

なんか出たので設定ファイルを作ってチェックする

$ sudo guess | cat > mymb.conf
$ sudo nvram-wakeup -C mymb.conf -N
nvram-wakeup: mymb.conf: 18: Previous definition of variable `addr_stat': first definition
in line 12
nvram-wakeup: Reading configuration file returned with errors.

エラーが出た。mymb.confを見るとaddr_statが二つ有るのでなんか怪しいコメントがついているほうをコメントにして再度実行

$ sudo nvram-wakeup -C mymb.conf -N
nvram-wakeup: mymb.conf: 21: Syntax error: unknown variable name
nvram-wakeup: Reading configuration file returned with errors.

rtc_secのところでエラーが出ているよくよくREADME.mb.gzを見るとrtc_sec,rtc_min,rtc_hourをrtc_time = ONに変えろと書いてあるのでそのとおりにする。

$ sudo nvram-wakeup -C mymb.conf -N

All values are displayed as they are stored in the nvram/rtc.
(and do not correspond necessarily to the system date/time)

WakeUp  : Enabled (0x92)
Day     : 27 (0x3B)
Hour    : 14 (0x2E)
Minute  : 52 (0x74)
Second  : 55 (0x37)
rtcDay  : 27 (0x27)
rtcHour : 14
rtcMin  : 52
rtcSec  : 55
Checksum: 0x0BA6

実際に試してみる

$ sudo nvram-wakeup -C mymb.conf -s `date +%s -d "18:00"`

All values are displayed as they are stored in the nvram/rtc.
(and do not correspond necessarily to the system date/time)

WakeUp  : Enabled (0x92)
Day     : 27 (0x3B)
Hour    : 14 (0x2E)
Minute  : 52 (0x74)
Second  : 55 (0x37)
rtcDay  : 27 (0x27)
rtcHour : 14
rtcMin  : 52
rtcSec  : 55
Checksum: 0x0BA6

Enabling (0x92) WakeUp-on-RTC in nvram.
New Day     : 28 (0x3C)
New Hour    : 17 (0x31)
New Minute  : 55 (0x77)
New Second  : 00 (0x00)
New rtcDay  : 28 (0x28)
New rtcHour : 17
New rtcMin  : 55
New rtcSec  : 00
New Checksum: 0x0B76

Now really WRITING into /dev/nvram...
And setting RTC alarm into /dev/rtc...

再起動してBIOSをチェックしてみると設定した時間と違う。 man nvram-wakeup.confなどを見ているとupper_methodにVT82Cxxxというオプションがあるのでこれを指定してみるとうまくいった。 このページを書きながらmanを確認したらupper_methodは--directisaオプションのときに有効みたいなことが書いてあったのでこのオプションを取ってみたらうまくいっていた。 いつの間にこの前は何か勘違いしていた?

設定ファイルをコピー

設定ファイルを/etcにコピーして終了

$ sudo cp mymb.conf /etc/nvram-wakeup.conf

ブートローダーの設定

grubを使っているのでgrubでのやり方を説明します。liloでも同じことはできるはず

nvram-wakeupで時間を設定した時間に起動するにはapmで電源を切る必要があるみたいだけど自分のカーネルはacpiで電源を管理している。 そこで一度再起動してapmで電源を切るだけのカーネルを起動するように設定する

パワーオフカーネルをダウンロード

このカーネルをダウンロードして/bootにおく

$ tar jxf reboot-2004.10.03.tar.bz2
$ sudo cp reboot-2004.10.03/bzImage.2.4.20.poweroff /boot

menu.listの変更

パワーオフカーネル用の設定を追加する
title PowerOff
root (hd0,1)
kernel /boot/bzImage.2.4.20.poweroff

lilo.confの変更

$ sudo vi /etc/lilo.conf

image = /boot/bzImage.2.4.20.poweroff
label = PowwerOff

$ sudo lilo

ここにdebも有るので私はそっちをダウンロードしてインストールした。 しかしmenu.listがおかしいと思うのでちょっと修正した
/boot/bzImage.2.4.18.poweroffがインストールされmenu.listの設定もされる


sudoの設定

mythbackendを実行しているユーザーにliloかgrubとshutdown,nvram-wakeupを実行できるようにする。 実行ユーザーがrootなら必要ない

$ sudo visudo

mythtv ALL= NOPASSWD: /usr/sbin/nvram-wakeup, /sbin/shutdown, /sbin/grub

シャットダウンスクリプトの作成

MythTVからシャットダウン確認、シャットダウンを行うスクリプトを用意する。mythbackendの実行ユーザーがrootならsudoは必要ない

一応liloのコマンドもコメントアウトして載せてありますが試してません。

mythsettime

nvram-wakeupで起動時間を設定する

#!/bin/sh
echo $1 > ~/myth.time
sudo /usr/sbin/nvram-wakeup -C /etc/nvram-wakeup.conf -s $1

mythpreshutdown

終了確認,0を返すとシャットダウン 1を返すとアイドルを再開する. 2を返すとクライアントの接続町に入る.

mythtrancodeやユーザーがログインしているときはシャットダウンしないようにするといい。

#!/bin/sh
echo "preshutdown"

# check mythtranscode running
ps_trans=`ps cax | grep -c mythtranscode`

if [ $ps_trans != 0 ] ; then
echo "mythtranscode running..."
exit 1
fi

echo "preshutdown ok"

exit 0

mythshutdown

パワーダウンカーネルで再起動する設定をして再起動する --default=のあとにPowerOffカーネルの番号を入れる

#!/bin/sh
echo "Shutdown" > ~/myth.shutdown
echo "savedefault --default={your PowerOff kernel} --once quit" | sudo /sbin/grub --batch
# sudo lilo -R PowerOff
sudo /sbin/shutdown -r now

簡単なスクリプトだけど一応こんなファイル

mythshutdownscripts.tar.gz

MythTVの設定

MythTVのsetupを実行して設定する

一般(General) -> シャットダウン/起動オプション(Shutdown / Wakeup Options に行く

クライアントが接続中はシャットダウンしないチェック
休止タイムアウト60
起動時間フォーマットtime_t
起動時間設定コマンド/usr/local/sbin/mythsettime $time
サーバー停止コマンド/usr/local/mythshutdown
シャットダウン前のチェックコマンド/usr/local/mythpreshutdown

これでクライアントが接続を終了してから60秒後にmythpreshutdownを実行し0が帰ってきたらシャットダウンします。

うまくいかなかったらmythbackendのログなどを見てください。