Ubuntu Desktop 18.10 に PT2 と epgrec UNA を使った録画サーバーを構築する（アプリケーション構築編）3 / 4

# 必要なパッケージのインストール

    apt install ntp at nginx php7.2-fpm php7.2-cli mysql-server php7.2-mysql php7.2-xml php-mbstring

# 各種インストール

### at

録画予約に使用するatコマンドをwww-dataユーザーで実行できるように書き換えます。

    sed -i".org" 's/www-data//g' /etc/at.deny

### MySQL

MySQLの設定ファイルに設定を追記します。

    vi /etc/mysql/mysql.conf.d/mysqld.cnf

    👉[mysqld]セクションに以下を追加
    character-set-server = utf8
    sql_mode             = ''

    👉MySQLを再起動
    service mysql restart

epgrecUNA用のデータベースを作成します。

    👉-u（ユーザーは）root。-p（パスワードは）root
    mysql -uroot -proot

    👉文字コード設定を確認
    mysql> show variables like "char%";
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.02 sec)

    👉epgrecという名前のデータベースを作成
    mysql> create database epgrec;

    👉epgrecというデータベースに、epgrecというユーザーがepgrecというパスワードで操作できるようにする
    mysql> grant all on epgrec.* to epgrec@localhost identified by 'epgrec';

    👉終了
    mysql> exit

### PHP

    👉disable_functions設定を無効に、タイムゾーンを日本に変更する
    sed -i".org" 's/^disable_functions/;disable_functions/g' /etc/php/7.2/fpm/php.ini
    find /etc/php/7.2/ -name "php.ini" | xargs sudo sed -i".org" 's/^;date.timezone =/date.timezone = "Asia\/Tokyo"/g'

    👉PHP-FPM再起動
    service php7.2-fpm restart

### nginx

epgrecUNA用の設定を追加します。

    👉nginxのフォルダーに移動
    cd /etc/nginx/

    👉デフォルトのルーティング設定を削除
    rm sites-enabled/default

    👉epgrecUNA用のルーティング設定を追記
    vi sites-available/epgrec

    👉以下を記述して保存
    server {
        listen 80 default_server;
        server_name localhost;

        root /var/www/epgrec;

        charset utf-8;
        index index.php index.html;

        location ~ [^/]\.php {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }
    }

    👉設定を有効化
    cd sites-enabled/
    ln -s ../sites-available/epgrec

    👉nginx再起動
    service nginx restart

### epgdump

    👉epgdumpフォルダーに移動
    cd ~/work/epgdump

    👉epgdumpをビルド＆インストール
    make && make install

### epgrecUNA

    👉epgrecフォルダーをコピー
    cd ../
    cp -a epgrec /var/www/

    👉epgrecフォルダーの所有者と権限を変更
    cd /var/www/epgrec/
    chown -R www-data:www-data ../
    chmod -R 755 *
    chmod 777 templates_c thumbs settings cache

    👉録画データを保存するvideoフォルダーは別ディスクにするので、一旦削除
    rm -rf video/

# 録画データ保存用ドライブを接続する
ここまで設定できたら、一旦PCの電源を切り、録画データ保存用ドライブを接続します。
再びPCの電源を入れ、Ubuntuを立ち上げます。

#### 録画データ保存用ドライブのフォーマット
UbuntuのGUIを使ってディスクをフォーマットします。詳しい手順は割愛。[^1]
[^1]: 実は今回使用した録画データ保存用ドライブは一旦Ubuntuを入れて、ぶっ壊れた古いディスクからデータを救出しておいたので、フォーマット単体で実行したことがないため、詳しい手順は知らないのだ…。

#### 改めてマウント
マウント用の場所を作成します。

    mkdir -p /mnt/share_video

録画データ保存用ドライブのパーティションを確認します。

    fdisk -l
      ディスク /dev/sda: 2.7 TiB, 3000592982016 バイト, 5860533168 セクタ
      :
      デバイス   開始位置   最後から     セクタ サイズ タイプ
      /dev/sda1      2048    1050623    1048576   512M EFI システム
      /dev/sda2   1050624 5860532223 5859481600   2.7T Linux ファイルシステム

今回マウントするパーティションは/dev/sda2でした。sda1とかsda2とかは環境によって変わります。
パーティションが分かったら、マウントします。

    mount /dev/sda2 /mnt/share_video

録画データを保存するフォルダーを作成します。

    mkdir /mnt/share_video/video

録画データをepgrecUNAが保存できるよう所有者と権限を変更します。

    chown -R www-data:www-data /mnt/share_video
    chmod 777 /mnt/share_video/video

扱いやすいよう、epgrec内にvideoのシンボリックリンクを作ります。

    cd /var/www/epgrec/
    ln -s /mnt/share_video/video video

    👉シンボリックリンクの所有者をwww-dataに変更
    chown -h www-data:www-data video

このままだと、再起動すると録画データ保存用ドライブのマウントが解除されてしまうので、自動でマウントするように設定します。

    👉録画データ保存用ドライブのUUIDを確認
    blkid
      /dev/loop0: TYPE="squashfs"
      :
      /dev/sda2: UUID="英数字の羅列" TYPE="ext4" PARTUUID="英数字の羅列"

    👉UUIDの部分を控えておき、設定ファイルの一番下に以下を追記する
    vi /etc/fstab

      UUID=上で控えておいたUUIDの文字列。ダブルコーテーションはいらない。 /mnt/share_video ext4 defaults 0 0

    👉一旦再起動して本当に自動マウントされているか確認する
    reboot

    👉再起動後、以下のようになっていればOK
    ls -la /mnt/share_video/
      drwxrwxrwx 2 www-data www-data  4096 11月 10 21:59 video

# epgrecUNAのセットアップ

後は`http://localhost`にアクセスし、epgrecの設定を進めていきます。
変更が必要な項目を以下に記載します。

#### MySQLデータベース設定
<table>
<tr>
  <th>MySQLホスト名</th>
  <td>localhost</td>
</tr>
<tr>
  <th>MySQL接続ユーザー名</th>
  <td>epgrec</td>
</tr>
<tr>
  <th>MySQL接続パスワード</th>
  <td>epgrec</td>
</tr>
<tr>
  <th>使用データベース名</th>
  <td>epgrec</td>
</tr>
<tr>
  <th>テーブル接頭辞</th>
  <td>Recorder_</td>
</tr>
</table>

#### デジタルチューナー設定
<table>
<tr>
  <th>地デジチューナーの台数</th>
  <td>2</td>
</tr>
<tr>
  <th>BSチューナーの台数</th>
  <td>2</td>
</tr>
<tr>
  <th>CS録画の有無</th>
  <td>行わない</td>
</tr>
</table>

#### 録画関連設定[^2]
<table>
<tr>
  <th>録画ファイル名の形式</th>
  <td>%TITLE%_%YEAR%%MONTH%%DAY%%HOUR%</td>
</tr>
</table>
[^2]: ここはお好みで

EPGの初回受信中はカードリーダーのアクセスランプが点滅していること、受信終了後に改めて`http://localhost`にアクセスすると、番組表が表示されることを確認します。

もし番組表が正しく表示されない場合は、受信に失敗しているので以下の項目をチェックしましょう。

- デバイスが認識されていない

```
ls -la /dev/pt1*
  ls: '/dev/pt1*' にアクセスできません: そのようなファイルやディレクトリはありません
```
　→　一旦PT2を抜いて起動、もう一回PT2をしっかり挿して起動してみよう。

    modprobe pt1_drv

　→ ドライバーを読み込んで再起動してみよう。
　　それでもだめなら、地獄の始まりだ・・・。

- チューナーが反応しない

````
checksignal --device /dev/pt1video0 --lnb 15 211
  Cannot tune to the specified channel

checksignal --device /dev/pt1video1 --lnb 15 211
  Cannot tune to the specified channel

checksignal --device /dev/pt1video2 16
  Cannot tune to the specified channel

checksignal --device /dev/pt1video3 16
  Cannot tune to the specified channel
````
　→　再起動してみよう。それでもだめなら、地獄の始まりだ・・・。

これまでの手順を実施していればハードウェアの異常以外で正常動作しなかったことがないので、イレギュラーが発生したら地獄の始まりですね・・・。

# cron.dに登録

    👉定期的に番組表を更新するためのcron設定をコピー
    cp -a /var/www/epgrec/cron.d/shepherd /etc/cron.d/

    👉必要性は分からないが他と合わせるために所有者と権限を変更
    cd /etc/cron.d/
    chown root:root shepherd
    chmod 644 shepherd

    👉どの頻度で番組表を更新するか設定
     　私は１日１回でいいと思うので、無難な時間（13:00）に実施するようにしています。
    vi shepherd
      0 13 * * *   www-data   /var/www/epgrec/shepherd.php

    👉定期的に再起動する設定を追加
    　 なぜか私の環境では暫くするとチューナーが反応しなくなるので、１日１回OSを再起動するようにしています。
    cp -a shepherd reboot
    vi reboot
      0 14 * * *   root       reboot

# 2020/4/26追記 録画に失敗することが度々あったため試行錯誤の末

毎クール必ず１・２回録画に失敗することがあり、どうにかならないか試行錯誤しました。（最終回の録画に失敗したときはお腹が痛くなりますよね）
色々試した結果、2020年冬アニメを乗り切り、2020年春アニメも今の所録画に失敗していないので方法を記載します。
※１日２本録画する程度の使い方での結果なので、ヘビーに使うと結局録画失敗するのかもしれませんが、私の環境では今の所有効かも？という方法です。

## 概要

毎日ubuntuのアップデートと再起動を行い、dkmsの再設定を行います。

### スクリプトを格納するフォルダーを作成

````
# 面倒なので私はworkフォルダーに放り込んでいます
mkdir -m 777 work
cd work/
````

### Ubuntuのアップデートを行うスクリプトを作成

````
vi update.sh
～
内容は以下の通り
～
chmod 777 update.sh
````
```bash:update.sh
#!/bin/bash

nowdt=$(date)
echo "------------------------"
echo "update開始 - ${nowdt}"
apt update
apt upgrade -y
apt autoremove -y
echo "終了 - ${nowdt}"
reboot
```

### modproveを再設定するスクリプトを作成

````
vi modprove.sh
～
内容は以下の通り
～
chmod 777 modprove.sh
````
```bash:modprove.sh
#!/bin/bash

nowdt=$(date)
echo "dkms再インストール開始 - ${nowdt}"
dkms remove -m pt1 -v 17b4f7b5dccb --all
dkms status
dkms add -m pt1 -v 17b4f7b5dccb
/usr/lib/dkms/dkms_autoinstaller start
dkms status
modprobe pt1_drv
lsmod | grep pt1_drv
ls -la /dev/pt1*
recpt1 --b25 --strip 103 10 /tmp/test.ts --device /dev/pt1video0
recpt1 --b25 --strip 103 10 /tmp/test.ts --device /dev/pt1video1
recpt1 --b25 --strip 16 10 /tmp/test.ts --device /dev/pt1video2
recpt1 --b25 --strip 16 10 /tmp/test.ts --device /dev/pt1video3
echo "終了 - ${nowdt}"
```


### cron.dに設定

````
cd /etc/cron.d
vi update
～
内容は以下の通り
````
```bash:update
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 15 * * *   root       /bin/bash       /root/work/update.sh >> /var/log/work/update.log 2>&1
```
````
cd /etc/cron.d
vi modprove
～
内容は以下の通り
````
```bash:modprove
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

15 15 * * *   root      /bin/bash       /root/work/modprove.sh >> /var/log/work/update.log 2>&1
```

### 何してるの？

どうもubuntuのカーネルバージョンが変わった場合、dkmsのpt1設定に新しいカーネルのバージョンが追加されるのですが、古い設定はそのままになるようです。この状態になるとエラーが発生するようになったので、常に新しいカーネルのバージョン設定のみになるようにしています。

また、

````
ls -la /dev/pt1*
  ls: '/dev/pt1*' にアクセスできません: そのようなファイルやディレクトリはありません
````

となっても、 `modprobe pt1_drv` を実行すると認識されることがあったため、cronで常にmodprobeを実行するようにしています。

（追記終わり）

### Ex.アップデートログを確認できるようにする

アップデートログを表示するPHPを作ります。

````
cd epgrecのフォルダーパス
vi update_log.php
～
内容は以下の通り
～
chown www-data:www-data update_log.php
chmod 777 update_log.php
````
```php:update_log.php
<?php
include('config.php');
include_once( INSTALL_PATH . '/Smarty/Smarty.class.php' );

$smarty = new Smarty();

// 4000バイト分表示します
$offset  = 4000;
$logPath = '/var/log/work/update.log';

// ファイルの内容が4000バイトに満たない場合は最初から表示します
if (filesize($logPath) < $offset) {
    $offset = 0;
} else {
    $offset = $offset * -1;
}

$t = file_get_contents($logPath, false, null, $offset);
$smarty->assign( 'log' , $t);
$smarty->display( 'updateLog.html' );
?>
```
````
cd templates/
vi updateLog.html
～
内容は以下の通り
～
chown www-data:www-data updateLog.html
chmod 777 updateLog.html
````
```html:updateLog.html
<!DOCTYPE html>
<meta charset="utf-8">
<title>アップデートログ</title>

<pre>{$log}</pre>
```

# 次

これで録画環境が整いました。
次はWindowsマシンから録画した番組を見られるよう、共有設定を行っていきます。

**次: [Ubuntu Desktop 18.10 に PT2 と epgrec UNA を使った録画サーバーを構築する（共有設定編）4 / 4](https://qiita.com/Uchida-Yuuki/items/809fc15b40aa3be8e4f1)**

# 参考文献
[epgrec UNAインストール手順（Ubuntu・Debian編）](https://www.jifu-labo.net/2015/09/ubuntu_epgrecuna/)