PT2+FUSE_b25+MythTVをDebianで使う上で録画失敗から対策したことを対策箇所ごとにまとめる。

録画マシンへの対策

エンコードなどマシンに負荷をかけすぎると録画中、fuse_b25がsyslogに“Driver Baffar Overflowed"というエラーを出して、以降の部分が録画されなくなる。

エンコードの際は、CPUコア(スレッド)の数より少ないスレッド数を指定する。

#2コア2スレッドの場合
$ ffmpeg -threads 1 [オプション]

更にfuse_b25の優先度は高くし、エンコードの優先度を低くしておく。

/etc/rc.local、fuse_b25のマウント部分

#マウント先の数字を元のデバイスよりいくつ大きくするか
OFFSET=10
for ADAPTER in 0 1 2 3
do
	NEW_ADAPTER=`expr $ADAPTER + $OFFSET`
	/usr/local/sbin/b25dir $NEW_ADAPTER
	nice --4 /usr/local/bin/fuse_b25 --target /dev/dvb/adapter$ADAPTER /dev/dvb/adapter$NEW_ADAPTER -o allow_other
done

ffmpegの優先度を下げる

$ nice -15 ffmpeg [オプション]

また、録画ディスクのI/Oに負荷をかけすぎても同様のことが起こるのでTsSplitterを使う場合は必ずWAITオプションを指定する。

$ wine TsSplitter.exe [オプション] -WAIT2,5

バックエンドへの対策

録画の開始時にMythTVのバックエンドが落ちることがある。PIDファイルが残るのでmythbackendのプロセスがなく、PIDファイルが残っていたら再起動させる。念のためfuse_b25の再マウントも行う。

$ sudo vi /usr/local/sbin/mythtv_check.sh

#!/bin/sh
#ロックファイルの存在確認
if [ ! -e /var/run/mythtv/mythbackend.pid ]
then
        exit 0
fi
#プロセスの存在確認
if [ `pgrep -c mythbackend` -ne 0 ]
then
        exit 0
fi
#ジョブが実行されていればkill
pkill -9 -u mythtv
#fuse_b25の再マウント
#マウント先の数字を元のデバイスよりいくつ大きくするか
OFFSET=10
for ADAPTER in 0 1 2 3
do
        NEW_ADAPTER=`expr $ADAPTER + $OFFSET`
        umount /dev/dvb/adapter$NEW_ADAPTER
        if [ $? -eq 0 ]
        then
                nice --4 /usr/local/bin/fuse_b25 --target /dev/dvb/adapter$ADAPTER /dev/dvb/adapter$NEW_ADAPTER -o allow_other
        fi
done
#mythtvの再起動
/etc/init.d/mythtv-backend restart

ダウンロード

CRONに登録(毎分実行)

$ sudo crontab -e
* * * * * /usr/local/sbin/mythtv_check.sh

MythTVがActive EIT Scanから録画に切り替わるときによく落ちているような感じではある。

fuse_b25の異常

Card I/O failed too many times.
dropped an ECM due to the failed/slow card.

時々、fuse_b25がsyslogに上記エラーを吐き続けて、録画できなくなる。これはマウントし直すまで直らない。その上、MythTVがActive EIT Scanでロックするため、マウント解除できなくなる。

この異常はActive EIT Scanを行なっている時に起こりやすく、ロックされて再マウントできなくなるので、優先して使うチューナーはActive EIT Scanを無効にしておくと良いだろう。

原因は不明だが、受信状態の悪い信号やccidとの相性が考えられる。

fuse_b25への対策(swatch)

swatchで/var/log/syslogを監視し、該当のログが出た場合にスクリプトを使って対処するようにする。

telnetを使って、Active EIT Scanを停止させるため、expectをインストールする。

$ sudo aptitude install expect

スクリプトの作成

$ sudo vi  /usr/local/sbin/b25refresh_pid.sh
#!/bin/sh
#Myth Protocolのバージョン
PROTOCOL_VER="63"
PROTOCOL_TOKEN="3875641D"
#MythTVのDBに登録されているホスト名
HOSTNAME="localhost"
#MythTVのPort
CONTROL_PORT="6543"
#MythTVのStatus Port
STATUS_PORT="6544"

#PIDからデバイス名とマウント先を取得
PID=$1
ADAPTERS=`ps aux | awk -v PID=$PID '$2==PID{print $13FS$14}'`
set -- $ADAPTERS
ADAPTER=$1
NEW_ADAPTER=$2
#チューナーのIDを取得
RECORDER_ID=`wget http://localhost:$STATUS_PORT/ -O - -o /dev/null | \
        awk -v ENCODER=${NEW_ADAPTER}/frontend0 '$6==ENCODER{print $2}'`
#IDが取得できたらチューナーを解放
if [ ! -z $RECORDER_ID ]
then
	#Myth Protocolで通信(telnet)
        expect -c "
        set timeout 20
        spawn telnet localhost $CONTROL_PORT
        expect \"\n\"
        expect \"\n\"
        expect \"\n\"
        send \"33       MYTH_PROTO_VERSION $PROTOCOL_VER $PROTOCOL_TOKEN\n\"
        expect \"ACCEPT\"
        expect \"$PROTOCOL_VER\"
        send \"\n\"
        send \"23       ANN Monitor $HOSTNAME 0\n\"
        expect \"OK\"
        send \"87      QUERY_RECORDER $RECORDER_ID\[\]:\[\]SPAWN_LIVETV\[\]:\[\]release\[\]:\[\]0\n\"
        send \"87      QUERY_RECORDER $RECORDER_ID\[\]:\[\]SPAWN_LIVETV\[\]:\[\]release\[\]:\[\]0\n\"
        expect \"ok\"
        send \"87      QUERY_RECORDER $RECORDER_ID\[\]:\[\]STOP_LIVETV\n\"
        send \"87      QUERY_RECORDER $RECORDER_ID\[\]:\[\]STOP_LIVETV\n\"
        send \"87      QUERY_RECORDER $RECORDER_ID\[\]:\[\]STOP_LIVETV\n\"
        expect \"ok\"
        send \"\n\n\n\n\"
        " > /dev/null
        sleep 1
fi
#fuse_b25を再マウント
umount $NEW_ADAPTER
if [ $? -eq 0 ]
then
        nice --4 /usr/local/bin/fuse_b25 --target $ADAPTER $NEW_ADAPTER -o allow_other
        exit 0
else
        exit 1
fi

ダウンロード

PIDを指定すると、デバイスを解放させて再マウントするスクリプト。環境に合わせて変数を書き換えて利用する。バージョンとトークンの一覧はここにある。Myth Protocolで通信し、Live TVを利用するふりをして、デバイスを解放させる。

swatchのインストール

$ sudo aptitude install swatch

swatchで使用するディレクトリの作成

$ sudo mkdir /usr/local/swatch/
$ sudo mkdir /usr/local/swatch/rules/ #設定ファイルの格納先
$ sudo mkdir /usr/local/swatch/scripts/ #生成されるスクリプトの格納先

設定ファイルの作成

$ sudo vi /usr/local/swatch/rules/fuse_b25.rule
watchfor /FUSE_b25\[([0-9]+)\]: Card I\/O failed too many times./
        exec /usr/local/sbin/b25refresh_pid.sh $1

swatchによる監視の開始

$ sudo swatch --daemon -c /usr/local/swatch/rules/fuse_b25.rule --script-dir /usr/local/swatch/scripts/ -t /var/log/syslog

/etc/rc.localに追記

#マウント先の数字を元のデバイスよりいくつ大きくするか
OFFSET=10
for ADAPTER in 0 1 2 3
do
	NEW_ADAPTER=`expr $ADAPTER + $OFFSET`
	/usr/local/sbin/b25dir $NEW_ADAPTER
	nice --4 /usr/local/bin/fuse_b25 --target /dev/dvb/adapter$ADAPTER /dev/dvb/adapter$NEW_ADAPTER -o allow_other
done

rm /usr/local/swatch/scripts/.swatch_script.*
swatch --daemon -c /usr/local/swatch/rules/fuse_b25.rule --script-dir /usr/local/swatch/scripts/ -t /var/log/syslog

監視を停止させたりする必要がないので簡単に済ませた。

fuse_b25への対策(簡易版)

定期的に再マウントさせる。再マウント時にカードが初期化されるので録画中であった場合、関係のないチューナーでも映像が乱れる。そのため、録画中には再マウントを行わない。

再マウント用のシェルスクリプト

$ sudo vi /usr/local/sbin/b25refresh.sh
#!/bin/sh
#MythTVのStatus Port
PORT=6544
#マウント先の数字を元のデバイスよりいくつ大きくするか
OFFSET=10
#録画・視聴中に動作しない
if [ `wget http://localhost:$PORT/ -O - -o /dev/null | \
 grep /dev/dvb/adapter | grep -c "recording"` -eq 0 ]
#視聴中は構わず再マウントする場合
#if [ `wget http://localhost:$PORT/ -O - -o /dev/null | \
# grep /dev/dvb/adapter | grep -c " is recording."` -eq 0 ]
then
        for ADAPTER in 0 1 2 3
        do
		NEW_ADAPTER=`expr $ADAPTER + $OFFSET`
                umount /dev/dvb/adapter$NEW_ADAPTER
                if [ $? -eq 0 ]
                then
			sleep 1
                        nice --4 /usr/local/bin/fuse_b25 --target /dev/dvb/adapter$ADAPTER /dev/dvb/adapter$NEW_ADAPTER -o allow_other
                else
                        exit 1
                fi
        done
fi

ダウンロード

CRONに登録

$ sudo crontab -e
*/15 * * * * /usr/local/bin/b25refresh.sh > /dev/null 2>&1

Active EIT Scanが有効になっていると、チューナーがロックされてマウント解除できなくなるので、優先的に使うチューナーではActive EIT Scanを無効にしておく。この対策でActive EIT Scanが無効のチューナーでの録画成功率が上がる。

Active EIT Scanが有効になっているチューナーがsyslogにエラーを吐いている場合、一度視聴を行なってActive EIT Scanを停止させてからコマンドを実行するといい。

設置は簡単だが、チューナーの解放を行わないため、swatchを使った対策の方が確実になる。ただし、Active EIT Scanを使わない場合は十分な対策となる。

参考: Myth Protocol/Guide – MythTV Official Wiki

関連記事


4月 16th, 2012

Posted In: ソフトウェア

タグ: , , , , , , , ,

One Comment

  • ESEJVTDWVXWBGX より:

    What i do not understood is actually how you are now not really a lot more neatly-favored than you might be now. You are very intelligent. You know therefore significantly when it comes to this matter, produced me personally imagine it from so many various angles. Its like men and women are not fascinated except it one thing to accomplish with Lady gaga! Your individual stuffs excellent. All the time maintain it up!

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください