(1) video グループに www-data( RH系の場合は apache ) を登録
video グループが無ければ
$ sudo groupadd video
で作成し、
$ sudo gpasswd -a www-data video
でグループに追加。ついでに自分のアカウントも video グループに追加する
例えば自分が foo ならば
$ sudo gpasswd -a www-data foo
追加されたか確認
$ grep video /etc/group
video:x:44:foo,www-data
apache を再起動しないとグループファイルの変更が反映されないので注意 ! ( ハマった orz )
$ sudo /etc/init.d/apache2 restart
(2) recfriioが使うロックファイルのパーミッション設定
/var/lock/friiodetect
が無ければ
$ touch /var/lock/friiodetect
で作成してから
$ chmod 664 /var/lock/friiodetect
$ sudo chown www-data:video /var/lock/friiodetect
正しく設定されたか確認
$ ls -al /var/lock/friiodetect
-rw-rw-r-- 1 foo video 0 2009-01-10 14:25 /var/lock/friiodetect
(3) USBのパーミッション設定
/etc/udev/rules.d/40-permissions.rules に
# HDUS
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \
ATTRS{idVendor}=="3275", ATTRS{idProduct}=="6051", \
MODE="0664", GROUP="video"
# friio
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", \
ATTRS{idVendor}=="7a69", ATTRS{idProduct}=="0001", \
MODE="0664", GROUP="video"
を追加する。その後HDUSかfriioを差しHDUSなら更に as11loader を実行したらパーミッションが正しく
設定されているか確認する。例えば
$ lsusb
Bus 003 Device 006: ID 3275:6051
と表示されたら /dev/bus/usb/003/006 のパーミッションを調べて
$ ls -al /dev/bus/usb/003/006
crw-rw-r-- 1 root video 189, 261 2009-01-10 12:59 /dev/bus/usb/003/006
と、グループが video となっていれば良い
udev は 2.6.15 以上のカーネルでないと動かないので注意
それよりも古いカーネルの場合は次の様にして手動で /dev/bus/usb/〜( 又は /proc/bus/usb/〜 ) の
パーミッションを変更すること。
まずHDUSを挿して認識したか確認する。
# apt-get install usbutils
# lsusb
Bus 001 Device 008: ID 1738:5211
例えば as11loader 実行後に次の様に IDが変わったとしたら、
# lsusb
Bus 001 Device 009: ID 3275:6051
chown と chmod でデバイスのパーミッションを直接指定する。
# chown www-data:video /proc/bus/usb/001/009
# chmod 664 /proc/bus/usb/001/009
# ls -al /proc/bus/usb/001/009
-rw-rw-r-- 1 www-data video 66 2009-02-14 20:32 /proc/bus/usb/001/009
(4) 動作確認
recfriio が video グループに属するユーザから動かせるか確認
うまく起動したら Ctrl+c ( kill -INT ) で正常に終了するか確認する
$ recfriio --hdus 25 10 /dev/null
Tuner type is HDUS.
Search friios from dir: /dev/bus/usb
1 friios found:
/dev/bus/usb/003/006: use this friio.
device: /dev/bus/usb/003/006
opening HDUS...done.
freq = 545
CNR: 25.704
Signal level: 49.2855
Output ts file.
sync 158 bytes
sync 128 bytes
done.
Rec time: 9.179645 sec.
CNR: 25.6313
Signal level: 49.1446
closing HDUS...done.
想定する玄箱Pro の環境は以下の通りとする。
$ uname -a
Linux kurobox 2.6.12.6-mda1 #2 Sun Apr 22 16:16:39 JST 2007 armv5tejl GNU/Linux
$ cat /etc/debian_version
4.0
(1) Debian をインストールする
(2) apache2 と php5 をインストール
# apt-get install apache2
# apt-get install php5
一般ユーザのディレクトリも見れるようにする。
# cd /etc/apache2/mods-enabled/
# ln -s ..//mods-available/userdir.load .
# ln -s ..//mods-available/userdir.conf .
また、php5のfgetcsv()関数で日本語が消えるのでシステムの locale を設定する。
# apt-get install locales
# dpkg-reconfigure locales
ja_JP.UTF-8 UTF-8 の作成とデフォルト指定をしたらリブート。
(3) recfriio と as11loader のビルド
以下のパッケージをインストールする。
patch
make
g++
pkg-config
libglib2.0-dev
libboost-dev
libboost-thread-dev
libboost-filesystem-dev
libpcsclite-dev
libusb-dev
更に
# cd /usr/lib
# ln -s libboost_thread-gcc-mt-1_33_1.so.1.33.1 libboost_thread-mt.so
ただし、このまま recfriio をビルドすると負荷が高すぎてドロップするので
コンパイルオプションを設定して最適化する。
まず recfriior4/Makefile の CXXFLAGS の行を
CXXFLAGS = -O3 -march=armv5te -pipe -fomit-frame-pointer -fprefetch-loop-arrays -g -Wall -pthread -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(B25) $(HDUS) $(UDP) `pkg-config --cflags glib-2.0`
に変更。次に arib25v021/arib25/src/Makefile の CFLAGS の行を
CFLAGS = -Wall -O3 -march=armv5te -pipe -fomit-frame-pointer -fprefetch-loop-arrays -g $(PCSC_CFLAGS) -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
に変更して make する。
(4) kjournald を止める
kjournald の負荷が高くて(8%位)ドロップするので /etc/fstab をいじって ext3 -> ext2 にする。
/dev/sda4 /home ext2 defaults 1 1
(5) その他のrecfiioの設定
基本的には[2] recfriio の設定の通りで良いが、カーネルの問題で
udevが起動しないので「(3) USBのパーミッション設定」の所は飛ばして
/etc/fstab に
none /proc/bus/usb usbfs auto,devmode=0666,devgid=(videoグループのgid) 0 0
という行を入れて再起動するとパーミッションが自動設定されるようになる。
また、/var/lock に www-data がロックファイルを書き込めるようにするため
# chown root:www-data /var/lock
# chmod 775 /var/lock
を実行する。
更に、HDUSを挿したまま起動したときに自動的にファームウェアを読み込ませるために
/etc/rc.local に次の文を追加する。
sleep 5
cd (パス)
./as11loader
(パス)の部分は as11loarder と SKNET_AS11Loader.sys が置いてある場所を指定する。
sleep の秒数は適当に変える。
(6) カードリーダの設定
はじめに pscsd と libccid をインストールする。ただし、このまま recfriio を動かしても
b25->set_b_cas_card failed. code=-8
disable b25 decoding.
というエラーが出て/var/log/messages に
Feb 13 21:29:31 localhost pcscd: winscard_svc.c:565:MSGCheckHandleAssociation() Client failed to authenticate
と表示される。調べたら
ttp://pc11.2ch.net/test/read.cgi/linux/1193058543/699
> [ Linux ] Linux でビデオ録画【六枚目】
> 699 名前:login:Penguin []: 2008/11/01(土) 22:59:30 ID:UEZF30rt (2)
> 記事の中にもあるように-fno-strict-aliasingをつけて解決。
という話があったので pcsc-lite-1.4.102.tar.bz2 をダウンロードして自分で作成して
pscsd と libccid を上書きすることにする。きちんとパッケージを作りたい人は上の2chのスレを参考にすること。
まず次のパッケージをインストール
libhal-dev
次に configure の 22680 行辺りの
CFLAGS="-Wall -fno-common $CFLAGS"
を
CFLAGS="-Wall -fno-strict-aliasing $CFLAGS"
に変更してから
./configure --disable-libhal --sysconfdir=/etc --prefix=/usr --enable-usbdropdir=/usr/lib/pcsc/drivers LDFLAGS="-lpthread"
make
make install
(注意) 今回の環境では --disable-libhal を付けないとデーモンが起動しなかった。
次に ccid-1.3.9.tar.bz2 をダウンロードしてきて
./configure --sysconfdir=/etc --prefix=/usr --enable-usbdropdir=/usr/lib/pcsc/drivers
make
make install
(7) recfriio を動かす
www-dataにsuしてテストしてみる。CPU負荷は平均で 55% 程度となる。
ただし、kill -INT で止めると
recfriio: select failed.: Interrupted system call
と出る時がある(要調査)。
(8) recfriio server の設定
基本的には[3] recfriio server の設定の通りで良いが、
crontabが一般ユーザから実行出来ないので
# chmod +s /usr/bin/crontab
しておく。
更に、apacheにアクセスすると一時的に負荷が上がってドロップが生じるので
下の様にconfig.phpの REFRESH の値を大きく取って手動で表示を更新した方が良い。
// 動作状況の更新間隔(秒)
define( 'REFRESH', 10000 );
また、サスペンドすることが出来ないので代わりにシャットダウンするしかない。
その場合はSUSPEND、および SUSPENDOPT は次の様にする。
define( 'SUSPEND', 'sudo /sbin/halt' );
define( 'SUSPENDOPT', '-p' );
sudo visudo には下の設定を追加しておく
%video ALL=(ALL) NOPASSWD: /sbin/halt
[6] FAQ
Q. 今まで動いていたのに急に動かなくなった
A.
lsusb でチューナが認識されているか確認する。また、端末から手動で recfriio を動かすと
ロックファイル( /var/lock/friiodetect ) が出来るのでwww-data( apache ) がロックファイルを開けなくなる。
その場合はロックファイルのパーミッションを変える。
または do-record.sh を書き換えて --lockfile オプションに違うロックファイルを指定する。
Q. 予約録画のログは何処?
A.
var/log.txt
Q. 予約録画が始まると他の録画スレッドが止まる
A.
チューナ数が足りないと予約録画開始1分前に重要度の低い録画スレッドから停止するようにしてある。
チューナ数が十分にあるのに停止する場合は config.php の TUNERNUM の数字を正しく設定すること。
Q HDUSを挿す度にいちいち as11loader を実行するのが面倒くさい
A.
HDUSのファームウェア( SKNET_AS11Loader.sys ) を接続時に自動読み込みするようにするには、
/etc/udev/rules.d/80-programs.rules に次の文を追加する。
(パス)の部分は as11loarder と SKNET_AS11Loader.sys が置いてある場所を指定する。
# load the firmware of HDUS
SUBSYSTEM=="usb", ACTION=="add", \
ATTRS{idVendor}=="1738", ATTRS{idProduct}=="5211", \
RUN+="/bin/sh -c 'cd (パス);./as11loader'"
HDUSを差して
$ lsusb
Bus 003 Device 006: ID 3275:6051
の様にIDが表示されればOK。ただし、環境によってはPCを再起動した時は上の方法では自動でファームウェアは読み込まれ
ないようなので、その場合は rc.local で次の様に直接 as11loarder を呼び出す。
sleep 5
cd (パス)
./as11loader
(パス)の部分は as11loarder と SKNET_AS11Loader.sys が置いてある場所を指定する。
sleep の秒数は適当に変える。
更新履歴
・2009/2/16 ver.0.6.0
番組表キャッシュの保持日時を2週間に延長した( CATCHETIME -> CACHEDAY に変更 )
一回予約録画が終わってもcrontabからスケジュールが消えてなかったバグを修正
予約録画にサスペンド機能を追加
・2009/2/14 ver.0.5.2
・ヘルプに玄箱proの項を追加
・2009/2/9 ver.0.5.1
1回予約録画が録画後に予約一覧から削除されないバグを修正
・2009/2/8 ver.0.5
一回のみの予約録音で午前0時に丁度にセットした予約が開始しないバグを修正
予約設定画面で他の予約にエラーがあるとエラーが出続けるバグを修正
予約設定画面に「毎日」ボタンを付けた
予約時間の重複チェックをするようにした
空き容量に残り時間も表示するようにした( 126 Mbyte/分で計算 )
・2009/2/1 ver.0.4
TV王国から番組表をダウンロードしてiEPGによる予約が出来るようにした
タイトルにバージョンを入れるようにした
ディスク空き容量の表示を1分毎に更新するようにした
・2009/1/25 ver.0.3
一回のみの録画予約対応
予約画面に次回予定日を表示
予約と状況画面の更新にXMLHttpRequestを使うようにした
予約録画時にチューナ数が足り無い場合は重要度の低い録画から止めるようにした
・2009/1/17 ver.0.2
crontabによる録画予約機能追加
config-recfriio.phpを廃止してconfig.php一つに統一
設定ファイルや状態管理ファイル等は全て var 以下に作ることにした
操作画面の視聴、録画ボタンを押したときに全ての設定状態を保存するようにした
操作画面に設定保存ボタン追加
上書き防止の日付はdo-record.shの中で付けることにした
do-record.sh から do-record.php をwgetで呼び出して状態管理をするようにした
録画予約時のログ機能追加
動作状況の経過時間を「分:秒」表示にした
動作状況の表示更新リンクをボタンに変更
操作設定や状況をバーをクリックして折りたためるようにした
ヘルプへのリンクを追加
ヘルプをいろいろ更新
・2009/1/10 ver.0.1
公開