CentOS 6.4 を用いた PT2 サーバーの構築

注意

  • 個人名などが入っている項目は書き換えている部分もあるので、ご自分の環境に合わせて適宜読み替えてください。
  • ここに書かれていることを信用したせいで何が起こっても私は知りません。

構成

  • CentOS 6.4 i386
  • Intel Atom CPU N270 @ 1.60GHz * 2
  • 2GB/1TB
  • 筐体はこれ。2年ぐらい使ってみたけど、熱で不安定になることもあるので、正直ファンレスはやめといたほうがいい。

参考サイト

CentOS インストール

CPU が hoge なので i386 を選択。通常のインストール

  • Install or upgrade an existing system
  • Basic Server

の設定を使いました。

初期設定

まずは eth0 を起動時に起動させるようにする。また、ルーターDMZ を使うために IP を固定する。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
- ONBOOT=no
+ ONBOOT=yes
- BOOTPROTO=dhcp
+ BOOTPROTO=static
+ IPADDR=192.168.11.10
+ NETMASK=255.255.255.0
+ GATEWAY=192.168.11.1
# service network restart 

ユーザーを追加して ssh で接続できるようにする。Basic Server でインストールしているので ssh サーバーは既に稼働している。

2016-07-16 追記:公開鍵を貼り付ける作業は、クライアント側で ssh-copy-id コマンドを利用するとパーミッションも含めてよしなに行ってくれるらしい。下の $ mkdir ~/.ssh から $ chmod 600 .ssh/authorized_keys まではこれで一発でやったほうが楽かと。

# useradd hoge
# passwd hoge
# su hoge
$ mkdir ~/.ssh
$ chmod 700 .ssh
$ vi ~/.ssh/authorized_keys
公開鍵を貼り付ける
$ chmod 600 .ssh/authorized_keys
$ exit
# vi /etc/ssh/sshd_config
PermitRootLogin を no に変更
PasswordAuthentication を no に変更
# service sshd restart
# usermod -G wheel hoge
# visudo
%wheel  ALL=(ALL)       ALL  の行のコメントアウトを解除
# su hoge
$ vi ~/.bash_profile  次のパスを追加
PATH=$PATH:/sbin
PATH=$PATH:/usr/sbin
PATH=$PATH:/usr/local/sbin
.bash_profile を読み込むために再ログインする 

システムをアップデートする。

$ sudo yum update

epel リポジトリを利用可能にする。まずは ここ にアクセスして Packages の下にあるリンクを取得。それをコマンドに利用する。

$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
$ yum repolist | grep epel  # to check if epel is installed correctly.

tmux をインストールする

$ sudo yum install tmux

PT2 をセットアップ

CentOS6.1にアースソフトPT2をセットアップ を見ながら行う。kernel-devel に関しては ここ を参照。autoconf, automake は recpt1 のインストール時に必要。

$ sudo yum install pcsc-lite pcsc-lite-devel pcsc-lite-libs
$ sudo yum install ccid
$ sudo yum install gcc-c++
$ sudo yum install perl-Gtk2
$ sudo yum install yum-priorities
$ sudo yum install kernel-devel
$ sudo yum install autoconf automake

pcsc-perl, pcsc-tools は fedoraリポジトリから持ってくる必要があるらしい。最新版を使ったほうが良いかとも思ったが、依存関係とか面倒だったら嫌なので元記事にあるように Fedora13のものを利用。動けば良かろうなのだ。

$ wget ftp://ftp.kddlabs.co.jp/033/Linux/packages/fedora.archive/releases/13/Everything/i386/os/Packages/pcsc-perl-1.4.8-2.fc13.i686.rpm
$ wget ftp://ftp.kddlabs.co.jp/033/Linux/packages/fedora.archive/releases/13/Everything/i386/os/Packages/pcsc-tools-1.4.16-1.fc13.i686.rpm

$ sudo rpm -ivh pcsc-perl-1.4.8-2.fc13.i686.rpm
$ sudo rpm -ivh pcsc-tools-1.4.16-1.fc13.i686.rpm
$ sudo service pcscd start
$ chkconfig pcscd on  # messagebus, haldaemon との起動順の設定が面倒だと書かれているが、とりあえずこれでいいのでは?
$ pcsc_scan

Your card is not present in the database. というエラーメッセージが出た。 $ vi /usr/share/pcsc/smartcard_list.txt してみると、

3B F0 12 00 FF 91 81 B1 7C 45 1F 03 99
        Japanese Chijou Digital B-CAS Card (pay TV)

と書いてあるが、私のカードは

ATR: 3B F0 12 00 FF 91 81 B1 7C 45 1F 01 9B

である。BonCasLinkのサーバーをLinuxに立ててB-CASカードを共有する によればこれは B-CAS カードの種類の相違だろうということなのでとりあえずはほっておく。

次に復号ツール b25 のインストールを行う。元記事の方法ではなく、github から最新版をダウンロードしてくる。

$ wget https://github.com/stz2012/libarib25/archive/master.zip
$ unzip master
$ cd libarib25-master/src/
$ make
$ sudo make install

続いて PT2 ドライバのインストールを行う。まずはデフォルトのものを無効化してから最新版をダウンロードしてインストール。

$ sudoedit /etc/modprobe.d/blacklist.conf
+ blacklist earth_pt1
$ sudo reboot
$ wget http://hg.honeyplanet.jp/pt1/archive/tip.tar.bz2
$ tar -xvlf tip.tar.bz2
$ cd pt1-hogehoge/driver
$ make
$ sudo make install
$ sudo modprobe pt1_drv
$ ls /etc/udev/rules.d/  # 99-pt1.rules があることを確認。
$ ls -l /dev/pt1*  # pt1video[0-3] があることを確認。

yum update でカーネルのバージョンが上がるとこのドライバを再インストールする必要がある。その時は make install と modprove pt1_drv を繰り返せば良い。

最後に recpt1 をインストールする。

$ cd pt1-hogehoge/recpt1
$ ./autogen.sh
$ ./configure -enable-b25
$ make
$ sudo make install
$ sudo su -  # 次のコマンドは root として発行しないとダメ。
# echo "/usr/local/lib" > /etc/ld.so.conf.d/recpt1.conf 
# exit
$ sudo ldconfig

録画テスト。ts ファイルが作成されて、それを再生することができることを確認。 (2013-10-17: デバイス名を指定しない場合に加えて、video[0-3] の全てについて録画テストを追加)

$ recpt1 --strip --b25  27 10 test.ts
$ recpt1 --strip --b25 101 10 test-video0.ts --device /dev/pt1video0
$ recpt1 --strip --b25 101 10 test-video1.ts --device /dev/pt1video1
$ recpt1 --strip --b25  27 10 test-video2.ts --device /dev/pt1video2
$ recpt1 --strip --b25  27 10 test-video3.ts --device /dev/pt1video3

ネットワーク配信テスト。

$ recpt1 --udp --addr IP_TO_BROADCAST --port 1234 --strip --b25 27 - /dev/null 

VLC を開いて、ネットワークストリーム udp://@:1234/ を再生して確認。配信は Ctrl-C で終了する。

LAMP 環境の導入

CentOS6.0でLAMP環境①webサーバ構築(Apache), CentOS6.0でLAMP環境②データベースサーバ構築(MySQL) を見ながら行う。

$ sudo yum install httpd php php-mbstring
$ sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
$ sudoedit /etc/httpd/conf/httpd.conf
+ ServerTokens Off
+ UseCanonicalName Off  # 元記事では On にしているが、Indexes を表示させたいときに困る。
+ KeepAlive On
+ MaxKeepAliveRequests 500
+ ServerName www.サーバのホスト名.ドメイン名:80
<Directory />
    Options FollowSymLinks
    AllowOverride None
+     Order Deny,Allow
+     Deny from all
</Directory>
+ Options FollowSymLinks
+ ServerSignature Off
+ AddHandler cgi-script .cgi .pl 
$ httpd -t  # syntax check
$ sudo cp -p /etc/php.ini /etc/php.ini.org
$ sudoedit /etc/php.ini
+ post_max_size = 20M
+ upload_max_filesize = 16M  
$ sudo service https start
$ sudo chkconfig httpd on 
$ sudo iptables -L --line-number 
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination        
1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere           
3    ACCEPT     all  --  anywhere             anywhere           
4    ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
5    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination        
1    REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  

5行目で REJECT されているので、その直前に http への許可を入れる。

$ sudo iptables -I INPUT 5 -p tcp --dport http -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp --dport https -j ACCEPT
$ sudo iptables -L --line-number  # check
$ sudo service iptables save
$ sudo yum install mysql-server
$ sudo service mysqld start
$ sudo chkconfig mysqld on
$ mysqladmin -u root password PASSWORD   
$ sudo yum install php-mysql php-process php-ldap php-pear

ここで同時に php 関係の必要なものをインストールした。このへん を参考にした。 ついでに /etc/php.ini を更新しておく。

$ sudoedit /etc/php.ini
- ;date.timezone =
+ date.timezone = Asia/Tokyo

epgrec の導入

CentOS6.2+PT2にepgrecをインストール を見ながら行う。必要なファイルなどは、SourceForge のリポジトリ から最新版を DL してきたほうがよさそうだ。

$ tar xvzf epgdumpr2_20111001.tar.gz
$ cd epgdumpr2
$ make clean
$ make
$ sudo cp epgdump /usr/local/bin
$ sudoedit /etc/passwd
- apache:x:48:48:Apache:/var/www:/sbin/nologin
+ apache:x:48:48:Apache:/var/www:/bin/bash

$ wget "http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fepgrec%2F53387%2Fepgrec_20111001.tar.gz"
$ sudo tar xvzpf epgrec_20111001.tar.gz -C /var/www/html/
$ sudo chown hoge:hoge /var/www/html/epgrec/  
$ cp /var/www/html/epgrec/config.php.sample /var/www/html/epgrec/config.php
$ vi /var/www/html/epgrec/config.php
+         "GR20" => "20",         // MX TV
+ //      "GR30" => "30",         // 千葉 (コメントアウト)
+ define( "BS_EPG_CHANNEL",  "101"  );    // BS:受信状態が悪かったので。
$ cp /var/www/html/epgrec/do-record.sh.pt1 /var/www/html/epgrec/do-record.sh
$ vi /var/www/html/epgrec/do-record.sh

元記事を参考に、 elif [ ${MODE} = 1 ]; then 以下の場合分けを以下のように変更。

elif [ ${MODE} = 1 ]; then
   if [ ${CHANNEL} = "24" ] || [ ${CHANNEL} = "23" ]; then
       # テレビ朝日とテレビ東京はFullTS
       $RECORDER --b25 --strip $CHANNEL $DURATION ${OUTPUT} >/dev/null
   else
       # 目的のSIDのみ残す
       $RECORDER --b25 --strip --sid $SID $CHANNEL $DURATION ${OUTPUT} >/dev/null
   fi
$ sudoedit /etc/httpd/conf.d/epgrec.conf
+ AddType video/mpeg .ts 
<Directory /var/www/html/epgrec>
   Options Indexes FollowSymLinks
   Order deny,allow
   Allow from all
</Directory>
$ sudo service httpd restart 

保存先のディレクトリを作成し、シンボリックリンクを張る。

$ sudo mkdir /home/share
$ sudo chmod 777 /home/share/
$ sudo mkdir /home/share/video
$ sudo chmod 777 /home/share/video
$ sudo rm -r /var/www/html/epgrec/video 
$ sudo ln -s /home/share/video /var/www/html/epgrec/video

mysql にデータベースとユーザーを作成する。

$ mysql -u root -p
mysql> grant all privileges on PT2.* to USERNAME@localhost identified by 'PASSWORD';
mysql> exit
$ mysql -u USERNAME -p
mysql> create database PT2;
mysql> exit

http://ipaddress/epgrec/ にアクセスし、初期設定。言われる通りにパーミッションを整える。

$ sudo chmod 777 /var/www/html/epgrec/templates_c 
$ sudo chmod 777 /var/www/html/epgrec/thumbs
$ sudo chmod 777 /var/www/html/epgrec/settings
$ sudo chmod 777 /var/www/html/epgrec/cache

ファイル文字列はこれを利用した。ビミョーに ISO 8601 からずれているのは Windows におけるファイル名の制約(コロン使用不可)のため。 %YEAR%-%MONTH%-%DAY%T%HOUR%%MIN%%SEC%_%TYPE%%CH%_%TITLE%

$ sudo cp /var/www/html/epgrec/cron.d/getepg /etc/cron.d/
$ sudo chmod 644 /etc/cron.d/getepg
$ sudoedit /etc/cron.d/getepg
29 */3 * * *   apache   /var/www/html/epgrec/getepg.php  # 3時間おきの実行に変更、www-data を apache に変更

http://hostname/epgrec/logViewer.php からログが見られるので確認。 手動で番組表を取得したい場合は /var/www/html/epgrec/getepg.php を実行。時間がかかる(20分ほど)ので別窓でやること。

SELinux を無効化しないと Web 予約からの録画が失敗するので無効化しましょう。

$ sudo setenforce permissive

$ sudoedit /etc/sysconfig/selinux
- SELINUX=enforcing
+ SELINUX=disabled

Web から録画してみてできるかどうか確認。

あとは時間を合わせるために ntp の設定。

$ sudo yum install ntp 
$ sudo service ntpd start 
$ sudo chkconfig ntpd on
$ ntpq -p  # syncing to the server with * mark, takes about 10 min. to sync.

sftp でアクセスしたときに素早く video ディレクトリに移動できるように、user directory にシンボリックリンクを張る。

$ ln -s /home/share/video ~/video

外から繋げるようにするために ddns を自動アップデートするようにする。 ieserver 公式のスクリプト を使う。

$ wget http://ieserver.net/ddns-update.txt
$ mv ddns-update.txt ddns-update.pl
$ vi ddns-update.pl  # configure
$ chmod 775 ddns-update.pl
$ sudo mkdir /usr/local/ddns
$ sudo mv ddns-update.pl /usr/local/ddns/
$ sudo su -
# crontab -e
3,23,43 * * * * /usr/local/ddns/ddns-update.pl
# exit

Digest 認証の導入

epgrec に Digest 認証をかける を参考に。LAN からはパスワード無しで、外からはパスワードありで epgrec を使えるようにする。

$ cd /etc/httpd/
$ sudo htdigest -c .htdigest_epgrec 'epgrec' USERNAME
$ sudoedit /etc/httpd/conf.d/epgrec.conf
AddType video/mpeg .ts  
<Directory /var/www/html/epgrec>
    Options Indexes FollowSymLinks
    AuthType Digest
    AuthName "epgrec"
    AuthDigestDomain /epgrec/
    AuthUserFile /etc/httpd/.htdigest_epgrec
    Require valid-user

    Order deny,allow
    Deny from all
    Allow from 192.168.11.0/24 127.0.0.1

    Satisfy Any
</Directory>

mediatomb の導入

とかすると DLNA で未来を感じることができて楽しいのでしょうけれども、体力がないのでこのへんで。追記するかもしれません。

追記:メンテナンス

ちょっとおかしいな? と思ったら、epgrec の「環境設定」から「動作ログを見る」に飛んで、なにか変なエラーが出ていないか確認しましょう。

2013-06-12 追記:epgrec UNA

epgrec UNA という、epgrec に機能拡張がされている版があるので、次回インストール時にはこちらを試してみてもいいかもしれない。

2013-06-25 追記:データベースの初期化

そろそろ期が変わるので、いままでの録画ファイルをストレージ用のディスクに移行しようと思う。ファイルは普通に mv すればいいのだが、epgrec の録画済み情報をすべて削除しなければならない。

公式 にあるように、$ /var/www/epgrec/initdb.php を実行してやれば データベースが初期化されるのでこれで問題ないと思われる。このあとに $ /var/www/epgrec/getepg.php を実行(30分ぐらいかかる)してやれば番組表も取得される。

でもこれっておそらく録画予約情報も消えてしまうよね。前期から継続で録画したい番組もあるので、できれば録画済み情報のみを消したいのだけれど。でも手動でSQL叩いて変になられても困るしなぁ。情報をお持ちの方はぜひコメントください!

2013-09-06 追記:この問題に対して 先人の知恵 がある。次の構文で 2012-02 分の項目を消せるらしい。後日テストしてみる予定。

mysql> delete from Recorder_reserveTbl where starttime like '2012-02%';

2013-07-01 追記:デフォルトで「録画ファイルも削除する」にチェック

こちらのサイト を参考に、epgrec/templates/recordedTable.html の21行目(録画ファイルも削除する の行)に checked="checked" を追加。

2013-10-17 追記:/dev/pt1video2 のみで録画できなくなった

$ recpt1 --b25 --strip 27 5 test-video2.ts --device /dev/pt1video2
...
Cannot tune to the specified channel: /dev/pt1video2

となってしまって録画できない。配線・デバイス接続などを確認してみたのだが原因不明。Reboot したら直った。

2013-10-17 追記:Chinachu

EPGREC の代替として、Chinachu なるソフトが存在する。次回はこれの導入を検討してみるのもいいかもしれない。何より名前が気に入った。

2014-02-13 追記:ntpd のモニタ機能の無効化

ntpd の monlist 機能を使った DDoS 攻撃に関する注意喚起 などにあるように、ntpd が DDoS 攻撃の踏み台に使われる脆弱性を持っているようだ。これを回避するために、/etc/ntp.conf の最終行に disable monitor を追加して ntpd を再起動する。

2015-03-31 追記:番組タイトルに半角スペースがあるとファイルが正常に作成されない問題への対策

EPGrec 予約録画失敗 の謎の奇病 の原因特定? 2 にあるように、番組タイトルに半角スペースが入っていると、作成されるファイル名がそこで切られてしまって、ストリーミング再生などに支障が出る。これを回避するために、リンク先にある対策を施す。

Reservation.class.php

// あると面倒くさそうな文字を全部_に
//$filename = preg_replace("/[ \.\/\*:<>\?\\|()\'\"&]/u","_", trim($filename) );

+ mb_regex_encoding ('UTF-8');
// preg_replaceがUTF-8に対応できない環境があるようなのでmb_ereg_replaceに戻す
$filename = mb_ereg_replace("[ \./\*:<>\?\\|()\'\"&]","_", trim($filename) );

2015-04-08 追記:ニュースを定期的に録画して、いつでも最新のニュースを観られるようにする。

知人から「常識がなさすぎる、テレビぐらい観ろ」とたいへん有難いご示教をいただいたので、毎日のニュースを自動で録画して LAN から見られるようにした。

19時から30分間録画する(cron は秒単位で正確というわけではないので、1分前から始めて31分間=1860秒間録画する)。 ほんとは /dev/null に捨てるのはよくないので cronlog とかを使うべきなのだと思うが、まぁ今のところは捨ておく。

$ crontab -e
59 18 * * * /usr/local/bin/recpt1 --strip --b25 27 1860 /home/share/video/news.ts >/dev/null 2>&1

クライアント側では、http://SERVER_IP_ADDR/epgrec/video/nhknews7.tsVLC で開いて、すぐに停止。表示されている項目をプレイリストからメディアライブラリに D&D すれば次回起動時からはそれを再生するだけで最新のニュースを観ることができる。

2015-09-10 追記:yum update 実行後に録画可能かをチェックする。

yum update をしたあとは、録画可能かを確認。いったん reboot してから確認するとよい(reboot すると /dev/pt1* が消えたりするため)。

$ sudo reboot
$ recpt1 --b25 --strip 27 5 test-video2.ts --device /dev/pt1video2
...
Cannot open tuner device: /dev/pt1video2

問題がある場合は以下を実行する。

$ cd pt1-hogehoge/driver
$ make
$ sudo make install
$ sudo modprobe pt1_drv
$ ls /etc/udev/rules.d/  # 99-pt1.rules があることを確認。
$ ls -l /dev/pt1*  # pt1video[0-3] があることを確認。