tv-recorder on Raspberry Pi 4B/8GB

Raspberry Pi 4Bと collelog/tv-recorder を用いた録画サーバー構築手順例を説明します。

microSDカードの準備

Raspberry Pi Imager を用いて、microSDカードに【Ubuntu Server 20.04.1.LTS(RPi3/4) 64 bit server OS】を書き込みます。

Raspberry Pi の起動

OSを書き込んだmicroSDカードを本体のmicroSDスロットに差し込み、Raspberry Piの電源を入れます。

初回起動時には起動処理の延長でmicroSDカードの最大容量まで自動でパーティション領域の拡張が行われます。OS起動後は ubuntu / ubuntu でログインしますが、ログインの際にパスワード変更が求められます。

IPアドレスの固定

OSインストール直後からSSH接続は可能ですが、IPアドレスがDHCPによる自動割り当てとなりますので、最初にIPアドレスを固定IPアドレスに変更します。

$ sudo vi /etc/netplan/99_config.yaml

例:192.168.0.4 に指定する場合

network:
    version: 2
    renderer: networkd
    ethernets:
        eth0:
            addresses: [192.168.0.4/24]
            gateway4: 192.168.0.1
            nameservers:
                addresses: [192.168.0.1]
            dhcp4: false
            dhcp6: false

システムへネットワーク設定を反映します。

$ sudo netplan generate
$ sudo netplan apply

以降はターミナルソフト(Windowsの場合は、RLogin, Tera Term 等)から指定したIPアドレスへSSH接続を行い、作業を実施します。

OS自動アップデートの無効化

$ sudo dpkg-reconfigure -p low unattended-upgrades

unattended-upgradesの設定画面が表示されますので No を選択します。

OS手動アップデートの実行

$ sudo apt update
$ sudo apt upgrade -y

WiFi の無効化

USB3.0(正確には「USB 3.1 Gen1」)はデータ転送が2.5GHzで行われるため、周波数帯の近い2.4GHz帯のWiFi電波と干渉を起こしますのでWiFiを無効化します。

$ sudo echo 'dtoverlay=pi3-disable-wifi' | sudo tee -a /boot/firmware/usercfg.txt >/dev/null

Bluetooth の無効化

BluetoothもWiFiと同様にUSB3.0と干渉を起こしますので無効化します。

$ sudo echo 'dtoverlay=pi3-disable-bt' | sudo tee -a /boot/firmware/usercfg.txt >/dev/null

ロケールの指定

$ sudo apt install -y language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF-8

タイムゾーンの指定

$ sudo timedatectl set-timezone Asia/Tokyo

NTPの設定

// NTPサーバーの指定
$ echo 'NTP=ntp.nict.jp' | sudo tee -a /etc/systemd/timesyncd.conf >/dev/null
$ echo 'FallbackNTP=ntp1.jst.mfeed.ad.jp ntp2.jst.mfeed.ad.jp ntp3.jst.mfeed.ad.jp' | sudo tee -a /etc/systemd/timesyncd.conf >/dev/null
// サービス再起動
$ sudo systemctl restart systemd-timesyncd
// 状態確認
$ systemctl status systemd-timesyncd | grep ntp.nict.jp

SWAP 無効化

$ sudo swapoff --all

再起動

$ sudo reboot

USBストレージの追加

以下はDocker資材と録画ファイルの管理をSSD1台で行う場合の例です。

ファイルシステムには XFS を採用します。

// 対象ディスクの確認
$ sudo fdisk -l | grep /dev/sda
ディスク /dev/sda: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
// パーティションの作成
$ sudo fdisk /dev/sda

fdisk (util-linux 2.36) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

デバイスには認識可能なパーティション情報が含まれていません。
新しい DOS ディスクラベルを作成しました。識別子は 0xbd94951a です。

コマンド (m でヘルプ): d
パーティションは何も設定されていません!

コマンド (m でヘルプ): p

ディスク /dev/sda: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: 2115
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xbd94951a

コマンド (m でヘルプ): n
パーティションタイプ
   p   基本パーティション (0 primary, 0 extended, 4 free)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p):

既定の回答 p であるものとみなします。
パーティション番号 (1-4, 既定値 1):
最初のセクタ (2048-976773167, 既定値 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-976773167, 既定値 976773167):

新しいパーティション 1 をタイプ Linux、サイズ 465.8 GiB で作成しました。

コマンド (m でヘルプ): p
ディスク /dev/sda: 465.76 GiB, 500107862016 バイト, 976773168 セクタ
Disk model: 2115
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xbd94951a

デバイス   起動 開始位置  最後から    セクタ サイズ Id タイプ
/dev/sda1           2048 976773167 976771120 465.8G 83 Linux

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。
// XFSフォーマット 
$ sudo mkfs.xfs /dev/sda -f
meta-data=/dev/sda               isize=512    agcount=4, agsize=30524162 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=122096646, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=59617, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
$ sudo mkdir /mnt/ssd1
$ sudo chmod 755 /mnt/ssd1
// UUIDの確認
$ sudo blkid /dev/sda
/dev/sda: UUID="6f6d25f9-eaa1-4463-8575-c2a20389e2ff" TYPE="xfs"

$ sudo vi /etc/fstab
// ファイル最終行に以下を追加
UUID="aff1e4a9-e366-4566-9388-4185a44ff45b"	/mnt/ssd1	xfs	defaults,noatime	0	2

/tmp のtmpfs化

$ sudo vi /etc/fstab
// ファイル最終行に以下を追加
tmpfs	/tmp	tmpfs	defaults,noatime	0	0

再起動

$ sudo reboot

log2ram インストール

/var/logをRAMディスク化する log2ram を導入する事でmicroSDカードへの書き込み処理を減らします。

$ echo "deb http://packages.azlux.fr/debian/ buster main" | sudo tee /etc/apt/sources.list.d/azlux.list
$ wget -qO - https://azlux.fr/repo.gpg.key | sudo apt-key add -
$ sudo apt update
$ sudo apt install -y log2ram
$ sudo vi /etc/log2ram.conf
-SIZE=40M
+SIZE=256MB

-USE_RSYNC=false
+USE_RSYNC=true

再起動

$ sudo reboot

マウント状態の確認

$ df -T
Filesystem     Type  1K-blocks    Used Available Use% Mounted on
tmpfs          tmpfs    781460    4004    777456   1% /run
/dev/mmcblk0p2 ext4   61217452 2150528  56530544   4% /
tmpfs          tmpfs   3907292       0   3907292   0% /dev/shm
tmpfs          tmpfs      5120       0      5120   0% /run/lock
tmpfs          tmpfs      4096       0      4096   0% /sys/fs/cgroup
tmpfs          tmpfs   3907292       0   3907292   0% /tmp
/dev/sda       xfs  479670976   73756 455161508   1% /mnt/ssd1
/dev/mmcblk0p1 vfat     258095  154835    103260  60% /boot/firmware
log2ram        tmpfs    262144   32140    230004  13% /var/log
tmpfs          tmpfs    781456       4    781452   1% /run/user/1000

nns779/px4_drv インストール

$ sudo apt install -y build-essential dkms unzip
$ mkdir -p /mnt/ssd1/work/src/px4_drv
$ cd /mnt/ssd1/work/src/px4_drv
$ curl -fsSL https://github.com/nns779/px4_drv/tarball/develop | tar -xz --strip-components=1
$ cd ./fwtool
$ make
$ curl -fsSLO http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip
$ unzip -oj pxw3u4_BDA_ver1x64.zip pxw3u4_BDA_ver1x64/PXW3U4.sys
$ ./fwtool PXW3U4.sys it930x-firmware.bin
$ sudo mkdir -p /lib/firmware
$ sudo cp it930x-firmware.bin /lib/firmware/
$ cd /mnt/ssd1/work/src/px4_drv/
$ sudo sed -i 's/make KVER=${kernelver} /make KVER=${kernelver} ITEDTV_BUS_USE_WORKQUEUE=1 /' /mnt/ssd1/work/src/px4_drv/dkms.conf
$ sudo cp -a ./ /usr/src/px4_drv-0.2.1
$ sudo dkms add px4_drv/0.2.1
$ sudo dkms install px4_drv/0.2.1
$ sudo modprobe px4_drv
$ lsmod | grep -e ^px4_drv

// デバイスファイルの確認
$ ls /dev/px4video*
$ ls /dev/pxmlt5video*
$ ls /dev/pxmlt8video*
$ sudo sed -i 's/$/ coherent_pool=4M/' /boot/firmware/cmdline.txt
$ echo 'SUBSYSTEM=="vchiq",GROUP="video",MODE="0666"' | sudo tee /etc/udev/rules.d/10-vchiq-permissions.rules
$ sudo vi /etc/modprobe.d/px4_drv.conf
options px4_drv urb_max_packets=1632 max_urbs=5 discard_null_packets=Y

再起動

$ sudo reboot

Docker インストール

$ sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

$ sudo apt update
$ sudo apt install -y docker-ce docker-ce-cli containerd.io

$sudo gpasswd -a ubuntu docker
$sudo systemctl restart docker

$ sudo sed -i 's/$/ cgroup_enable=cpu cgroup_enable=memory cgroup_memory=1 swapaccount=1/' /boot/firmware/cmdline.txt
$ sudo reboot

docker-compose インストール

$ sudo apt install -y python3-pip libffi-dev libssl-dev
$ sudo pip3 install -U docker-compose

Docker バージョン確認

$ docker -v
Docker version 19.03.12, build 48a6621
$  docker-compose -v
docker-compose version 1.26.2, build unknown

tv-recorder の導入

$ sudo mkdir /mnt/ssd1/docker
$ sudo chmod 755 /mnt/ssd1/docker
$ sudo ln -s /mnt/ssd1/docker /opt/docker

$ cd /opt/docker
$ sudo git clone https://github.com/collelog/tv-recorder.git
$ cd tv-recorder
$ sudo cp epgstation1-mirakc-rpi4-64.yml docker-compose.yml
$ sudo cp ./example-config/epgstation1-mysql/UNIXdomainsocket/config/config.json ./epgstation/config/
$ sudo docker-compose up -d

オプション:NAS共有フォルダのマウント

$ sudo apt install -y cifs-utils
$ sudo mkdir /mnt/NAS

//NAS共有フォルダのアカウント情報を外部ファイル化
$ sudo vi /root/.smbcredentials
username=id
password=pwd

$ sudo chmod 600 /root/.smbcredentials

$ sudo vi /etc/fstab
// ファイル最終行に以下を追加
\\NASのIPアドレスまたは名前解決できるホスト名\共有フォルダ	/mnt/NAS	cifs	credentials=/root/.smbcredentials,vers=3.1.1,noauto,x-systemd.automount,x-systemd.device-timeout=30,_netdev	0	0

$ sudo reboot