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-21 や 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 にあるように /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 を「録画済一覧」から取得するには「変更」を押すと表示される。