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