Ubuntu 12.04 で PT3 と epgrec で録画する

Ubuntu 12.04 amd64 で PT3 のドライバをインストールして、 epgrec で録画できるようにしたときのメモ。 マシンは常時起動ではなく、録画が終わるとシャットダウンし、 次の録画が始まる前には自動で起動するようにした。

su で root になって作業した場合と sudo を使って root 権限でコマンドを実行した場合が混ざっているので、 適宜読み替えてください。

PT3 の FPGA の更新

まず、PT3 の FPGA の更新を行う。これは Windows で行う必要がある。 必要なファイルは http://earthsoft.jp/PT3/download.html にある。

まず、ドライバ PT3-Driver-100.exe をインストールする。 PT3-Update-095.zip を解凍して Update.exe を実行する。 私が購入した PT3 はすでに 0x04 だったので更新は必要なかった。

Windows は PT3 の FPGA の更新のためだけに使用した。 以下は Ubuntu 12.04 での作業になる。

PT3 のドライバのインストール

Linux の PT3 のドライバは https://github.com/m-tsudo/pt3 にある。 ありがたく使わせていただく。 適当なディレクトリに移動し、そのディレクトリにリポジトリをコピーしてコンパイルし、root 権限でインストールする。

git clone https://github.com/m-tsudo/pt3.git
cd pt3/
make
sudo make install

カードリーダ

カードリーダ関連は root で作業した。

apt-get install pcscd libpcsclite1 libpcsclite-dev libccid pcsc-tools

で必要なソフトウェアをインストールする。 B-CAS カードを挿したカードリーダを USB に挿して

pcsc_scan

Japanese Chijou Digital B-CAS Card (pay TV)

と表示されることを確認する。

ARIB STD-B25

何が必要なのかよくわからないが次のようにしてインストールする。

wget http://hg.honeyplanet.jp/pt1/archive/c44e16dbb0e2.zip -O pt1-c44e16dbb0e2.zip
unzip pt1-c44e16dbb0e2.zip
cd ../pt1-c44e16dbb0e2/arib25
make
sudo make install

recpt1

端末から録画するために recpt1 を使用する。 recpt1 のソースコードは http://hg.honeyplanet.jp/pt1/ で mercurial で管理されている。 ソースコードを取得して recpt1 のディレクトリに移動する。

hg clone http://hg.honeyplanet.jp/pt1/
cd pt1/recpt1

pt1_dev.h の /dev/pt1video1 などを環境に合わせて /dev/pt3video1 に変更する必要がある。 PT3 1台だけの使用の場合は、単純に /dev/pt3video* を /dev/pt3video* に変更すればよい。

後は、コンパイルしてインストールする。

./autogen.sh
./configure --enable-b25
make
sudo make install

ここで、一度、再起動しておく。

sudo reboot

apache2, mysql, and php

epgrec を使用するために apache2、mysql、php をインストールする。

sudo apt-get install apache2 php5 libapache2-mod-php5 php5-cli mysql-server php5-mysql

でインストールする。

epgdump

epgdump は epgrec が録画データから番組表を取り出すために必要になる。 次のようにして epgdump をインストールする。

wget http://sourceforge.jp/frs/redir.php\?m\=iij\&f\=%2Fepgrec%2F53385%2Fepgdumpr2_20111001.tar.gz -O epgdumpr2_20111001.tar.gz
tar xvzf epgdumpr2_20111001.tar.gz
cd epgdumpr2
make clean
make
cp epgdump /usr/local/bin

at の設定

epgrec を使うにはユーザ www-data が at コマンドを利用できなくてはならない。 /etc/at.deny に www-data が記入されていれば、それを削除する。

mysql のデータベース

mysql のデータベースを作成する。このとき、データベースにアクセスするユーザとパスワードを設定する。

mysql -u root -p

で mysql に mysql のユーザ root でログイン (Ubuntu のユーザ root ではない。パスワードは mysql を apt でインストールしたときに設定している)して epgrec というデータベースと mysql のユーザ epgrec のパスワードを指定する。 以下ではパスワードは PASS となっている。

create database epgrec;
grant all on epgrec.* to epgrec@localhost identified by 'PASS';
flush privileges;

epgrec の設置

epgrec の php を apache が使う標準的なディレクトリ /var/www 以下に設定する。

cd /var/www
git clone git://git.sourceforge.jp/gitroot/epgrec/epgrec.git
cd epgrec

epgrec は git で管理されているので、新しく running ブランチを作ってそのブランチで設定を行うことにする。

git checkout -b running
chmod 777 cache templates_c video thumbs settings
chmod 666 thumbs/index.html video/index.html

config.php をコピーしてチャンネルを設定する。環境に合わせて do-record.sh.* の中で環境に合うものをコピーする。

cp config.php.sample config.php
cp do-record.sh.pt1 do-record.sh

config.php でチャンネルを設定する。設定したら

git add config.php
git commit -m "Create config.php"

必要ならば変更して do-record.sh の方もコミットする。

git add do-record.sh
git commit -m "Copy do-record.sh.pt1 to do-record.sh"

録画ファイルを保存するディレクトリ /var/www/video を変更する

私の環境ではデータ用の HDD は /home にマウントしている。 録画ファイル用のディレクトリ /home/video を作り、 そこにシンボリックリンクを張った。

mkdir /home/video
chmod 777 /home/video
mv video/index.html /home/video
rmdir video
ln -s /home/video /var/www/epgrec/video

git でシンボリックリンクの扱いがどうなるのかわからないが、コミットしておく。

git add video
git commit -m "Create symbolic link video"

ブラウザから epgrec の設定

epgrec を設置した Ubuntu の IP アドレスを調べ、 http://UBUNTU_IP_ADDRESS/epgrec にブラウザでアクセスして epgrec の設定する。 上の mysql のデータベース作成例では

  • 「MySQL接続ユーザー名」は「epgrec」
  • 「MySQL接続パスワード」は「PASS」
  • 「使用データベース名」は「epgrec」

とする。必要ないときは電源を切ることにしたいので

  • 「省電力の設定」を「使用する」
  • 「録画スタート前に起動させる時間(分)」を「5」

とした。「設定を保存する」をクリックして進む。

PT3 一台の運用なので

  • 「地デジチューナーの台数」を「2」
  • 「BSチューナーの台数」を「2」

とする。あとは私の個人的な好みで

  • 「録画ファイル名の形式」を「%TYPE%%CH%_%TITLE%_%ST%_%ET%」
  • 「ページに表示する番組表の長さ(時間)」を「24」
  • 「1時間あたりの高さ」を「240」

と設定した。

「このリンクをクリックするとEPGの初回受信が始まります」をクリックして50分程度待つ。

常時起動のマシンであれば

cp /var/www/epgrec/cron.d/getepg /etc/cron.d/

で getepg をコピーして cron で番組情報を取得する。 以下で行うように必要なときに自動で電源をつけるようにするなら、getepg のコピーは省く。

自動復帰

まず、epgrec の設定をする前に、そもそも自動復帰できるかどうかを確認する。

echo `date +%s -d +3min` > /sys/class/rtc/rtc0/wakealarm 
shutdown -h now

としてシャットダウンする。3分後に起動しなければ BIOS の設定を確認する(マザーボードが対応していればだが)。

www-data ユーザが shutdown コマンドを使えないといけない。 epgrec のソースに含まれている 01_first を /etc/sudoers.d/ にコピーすれば良い。

cp /var/www/epgrec/sudoers.d/01_first /etc/sudoers.d/
chmod 440 /etc/sudoers.d/01_first
service sudo restart

次のコマンドで実際に www-data ユーザでシャットダウンして、きちんと実行できるか確認する。

sudo -u www-data sudo shutdown -h now

自動復帰するためには http://logsoku.com/thread/engawa.2ch.net/linux/1326804531/ にあるように起動時、終了時に epgwakealarm を実行するようにする。 ここで /sys/class/rtc/rtc0/wakealarm に電源を入れる時間が書き込まれる。 あまり詳しくはわからないので、間違っているかもしれないが。

Debian だと次のように epgwakealarm を /etc/init.d にコピーして登録すればよいらしい(未確認)。

cp init.d/epgwakealarm /etc/init.d
update-rc.d epgwakealarm defaults 99 01

Ubuntu 12.04 は upstart を使っているのでこれではうまくいかない。私は間違って上の設定をしてしまったので

update-rc.d -f epgwakealarm remove

で設定を削除する。epgwakealarm を upstart に登録するには /etc/init/epgwakealarm.conf というファイルを作り

# epgwakealarm

description "epgwakealarm"

start on started mysql
stop on stopping mysql

post-start script
exec /var/www/epgrec/epgwakealarm.php start
end script
post-stop script
exec /var/www/epgrec/epgwakealarm.php stop
end script

と書く。テストのために適当な時間の録画を登録しておく。

reboot

で再起動してから

initctl stop epgwakealarm

で /sys/class/rtc/rtc0/wakealarm に時間が書き込まれていれば良い。

ruby -e "p Time.at(File.read('/sys/class/rtc/rtc0/wakealarm').to_i)"

でその時間を確認する。

ディスクのチェック

起動時にディスクのチェックを行うと録画開始の時間に間に合わないかもしれないので、 起動時のディスクの自動チェックを止める。/etc/fstab で

UUID=ABCDEFG /               ext4    errors=remount-ro 0       1
UUID=ABCDEFG none            swap    sw              0       0
UUID=ABCDEFG /home ext4 defaults 0 2

のようになっているが、6番目をすべて 0 にする。

UUID=ABCDEFG /               ext4    errors=remount-ro 0       0
UUID=ABCDEFG none            swap    sw              0       0
UUID=ABCDEFG /home ext4 defaults 0 0

自動でチェックしないので、時間があるときに

touch /forcefsck
reboot

として手動でディスクのチェックを行う。

私の環境では / とは異なるハードディスクを /home に割り当てているが、 /forcefsck によるディスクチェックの対象にならないようだ。 こちらのハードディスクも時間があるときに SSH で Ubuntu にアクセスしてディスクのチェックを手動で実行している。 私の環境では対象となるハードディスクは/dev/sdb1 で、それをアンマウントして fsck を実行する。

ssh user@<IP ADDRESS>
cd /
su -
umount /home
fsck -y /dev/sdb1

apache2 の .htaccess

認証の設定をしないと epgrec に誰でもアクセスできるようになっている。 LAN 内ならあまり心配しなくて良いのだが、念のため Digest 認証をかける (もし、自宅サーバで外部からアクセスできるようになっているなら認証をかけないと危険)。 認証の設定は apache の問題で epgrec や PT3 は関係ない。 まず、認証の設定に限らず、apache の設定を各ディレクトリの .htaccess で変更できるようにする。 /etc/apache2/sites-available/default の /var/www のところで

AllowOverride All

とする。次に、認証の設定に移る。ユーザとパスワードを保存したファイルを

mkdir /var/epgrec
htdigest -c /var/epgrec/epgrec-htdigest private epgrec

で作り、/var/epgrec/epgrec-htdigest にファイルができたことを確認する。 /var/www/epgrec/.htaccess に Digest 認証の設定を

AuthType Digest
AuthName "private"
AuthDigestDomain /epgrec/
AuthUserFile /var/epgrec/epgrec-htdigest
require valid-user

と書く。ここで、apache を再起動する。

service apache2 restart

これで、epgrec にアクセスしたときに認証が必要になっていればよい。

Grub のデフォルトのカーネル

apt-get で linux-image を更新したら recpt1 がきちんと動かなくなった。 PT3 のドライバをコンパイルし直せば良いはずだが、カーネルの更新のたびに行うのが面倒なので Grub で古いカーネルをデフォルトで起動するようにした。

http://linux.ikoinoba.net/index.php?UID=1341233514 にあるように

grep menuentry /boot/grub/grub.cfg

でカーネルを探して /etc/default/grub の GRUB_DEFAULT を設定する。 私の環境ではバージョン 3.2.0-32-generic を使っていたので

GRUB_DEFAULT="Ubuntu, with Linux 3.2.0-32-generic"

のように文字列で指定して

update-grub

とすれば良いと思ったのだが Grub のサブメニュー Previous Linux versions 以下のカーネルだとうまくいかない。 これは http://ubuntuforums.org/showthread.php?p=10720316 にあるように

GRUB_DEFAULT="Previous Linux versions>Ubuntu, with Linux 3.2.0-32-generic"

のように指定する。

update-grub

を実行してから再起動して

uname -a

で指定したカーネルで起動しているかを確認する。

[注意] 復号の失敗

しばらく使用していると複数の番組を同時に録画するときに復号がうまくいかないことがあった。 http://baalzephon.dyndns.org/tech/index.php?Linux%2F%E3%83%86%E3%83%AC%E3%83%93%E9%96%A2%E9%80%A3%2FPT2 などにカードリーダ関係のパッケージをダウングレードして使うという話もあるが、私は試していない。 録画した複合されていないファイルは b25 コマンドで

b25 input.ts output.ts

のようにして変換すれば視聴することができる。 とりあえずは、復号に失敗した場合は手動で複合することにして様子を見ている。

[追記 2013/02/06] /etc/init.d/pcscd の修正

http://aqua-linux.blog.so-net.ne.jp/2012-03-21http://baalzephon.dyndns.org/tech/index.php?Linux%2F%E3%83%86%E3%83%AC%E3%83%93%E9%96%A2%E9%80%A3%2FPT2 にあるように /etc/init.d/pcscd の43行目の

exit 0

#exit 0

としてコメントアウトすれば復号を失敗しなくなる。

epgrec で録画済一覧から削除できない場合

録画したファイルを epgrec 以外で操作して削除しているのが悪いのかもしれないが、 epgrec の録画済一覧で「削除」を選択してもうまく動かないことがある。 こういうとき、私は mysql のデータベースから直接削除している (本当は epgrec を直すべきなのだが)。

mysql -u root -p epgrec

で epgrec データベースに接続して

delete from Recorder_reserveTbl where id=9999;

というように該当の録画 ID を指定して削除する。 録画 ID を「録画済一覧」から取得するには「変更」を押すと表示される。

参考

Tags of current page

, ,