背景
以前の記事で、PLEX社のPX-S1UDというチューナーを用いてMirakurunコンテナをUbuntuマシンにAnsibleで自動構築しました。
ただこのチューナーは同時に1番組しか録画できないため、より上位機種であるPX-MLT5PE(同じPLEX社製)を用いて同じことを行います。
このチューナーは、PCIe接続の拡張カードの形をしていますが、PCIeからは電気のみを取り、データ自体はUSB(画像では見えていませんがマザーボードのUSBヘッダに指すためのケーブルが生えています)
また、画像のようにB-CASカードを刺せるスロットもありますが、うまく動作しないので大人しくPX-S1UDのときと同じくカードリーダーを用意します。
環境(PX-S1UD版とほぼ同じ)
今回も前回と同じく以下のような環境を想定します。
物理Ubuntuマシン上にMirakurunのpodmanコンテナ(docker版は前回記事に記載しています)を構築しています。 EPGStationの部分は、別途構築するkubernetesクラスタの上で動作させるため、この記事のスコープ外となっています。
使用している機材・ソフトウェアは、以下のとおりです。
- 物理マシン
- CPU:Intel Core i7-8700K
- メモリ:16GB
- OS:Ubuntu 22.04.3 LTS(カーネルバージョン:5.15.0-101-generic)
- B-CASカードリーダー:SCR3310/v2.0
Ansibleプレイブック
前回はPodmanのインストールとMirakurunコンテナの作成のプレイブックを紹介しましたが、Podmanのインストール部分は共通しているためこの記事ではMirakurun部分のみを取り扱います。 Podman部分が気になる方は前回記事をみてください。
公式のドライバもありますが、今回は有志が作ったドライバを使った手順を紹介します。
Mirakurunはansibleのロールとして作成しており、次のようなディレクトリ構成をとっています。
roles/mirakurun
├── files
│ ├── config
│ │ ├── channels.yml
│ │ ├── server.yml
│ │ └── tuners.yml
│ └── startup
├── handlers
│ └── main.yml
└── tasks
└── main.yml
tasks
tasks/main.yml全体
# tasks/main.yml
- name: Install required package
become: true
ansible.builtin.apt:
name:
- unzip
- gcc
- make
- dkms
- udev
- name: Check if PX-MLT5PE tuner driver is installed
changed_when: false
failed_when: false
ansible.builtin.shell: "lsmod | grep px4_drv"
register: px_mlt5pe_installed
- name: Install PX-MLT5PE tuner driver
when: px_mlt5pe_installed.rc != 0
block:
- name: Create temporary directory
ansible.builtin.tempfile:
state: directory
suffix: px_mlt5pe-driver
register: driver_directory
changed_when: false
- name: Clone unofficial driver repository
ansible.builtin.git:
repo: 'https://github.com/nns779/px4_drv'
version: '7fa9f05d2cbdf1d821f479248d561f9868051b8b'
dest: "{{ driver_directory.path }}"
- name: Make fwtool
community.general.make:
chdir: "{{ driver_directory.path }}/fwtool"
- name: Download and unarchive tuner driver
ansible.builtin.unarchive:
src: http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip
remote_src: true
dest: "{{ driver_directory.path }}/fwtool"
- name: Extract firmware
ansible.builtin.command:
chdir: "{{ driver_directory.path }}/fwtool"
argv:
- ./fwtool
- ./pxw3u4_BDA_ver1x64/PXW3U4.sys
- it930x-firmware.bin
- name: Locate tuner driver to firmware directory
become: true
ansible.builtin.copy:
src: "{{ driver_directory.path }}/fwtool/it930x-firmware.bin"
remote_src: true
dest: /lib/firmware
- name: Locate tuner driver for dkms
become: true
ansible.builtin.copy:
src: "{{ driver_directory.path }}/"
remote_src: true
dest: /usr/src/px4_drv-0.2.1/
- name: Check if px4_drv is installed
become: true
ansible.builtin.shell: "dkms status -m px4_drv/0.2.1 | grep px4_drv"
changed_when: false
failed_when: false
register: add_check
- name: DKMS add
become: true
ansible.builtin.command:
argv:
- dkms
- add
- px4_drv/0.2.1
when: add_check.rc != 0
- name: Check if px4_drv is added
become: true
ansible.builtin.shell: "dkms status -m px4_drv/0.2.1 | grep px4_drv | grep installed"
changed_when: false
failed_when: false
register: install_check
- name: DKMS install
become: true
register: debug
ansible.builtin.command:
argv:
- dkms
- install
- px4_drv/0.2.1
when: install_check.rc != 0
notify: Reboot
- name: Locate Mirakurun related files
block:
- name: create dedicated directory
ansible.builtin.file:
path: "{{ ansible_env.HOME }}/mirakurun"
state: directory
register: mirakurun_directory
changed_when: false
- name: Copy files
block:
- ansible.builtin.copy:
src: ../files/startup
dest: "{{ mirakurun_directory.path }}/startup"
mode: '755'
- ansible.builtin.copy:
src: ../files/config
dest: "{{ mirakurun_directory.path }}"
- name: Run container
become: true
containers.podman.podman_container:
name: mirakurun
image: docker.io/chinachu/mirakurun:3.9.0-rc.4
restart_policy: always
privileged: true
publish:
- 40772:40772
volume:
- "{{ mirakurun_directory.path }}/startup:/opt/bin/startup:ro"
- "{{ mirakurun_directory.path }}/config:/app-config"
全体は長いので部分毎に説明すると、
まず必要なツールをインストールします。
- name: Install required package
become: true
ansible.builtin.apt:
name:
- unzip
- gcc
- make
- dkms
- udev
次にドライバがインストールされているかをチェックします。 手順としては必要ないですが、複数回実行した時にインストール部分をスキップするために用います。
- name: Check if PX-MLT5PE tuner driver is installed
changed_when: false
failed_when: false
ansible.builtin.shell: "lsmod | grep px4_drv"
register: px_mlt5pe_installed
そしてチューナードライバをインストールします。 この手順はドライバのGitHubで紹介されている方法を再現しただけなので細かく説明しません。 notifyを用いてドライバがインストールされたら再起動するようにしています。
- name: Install PX-MLT5PE tuner driver
when: px_mlt5pe_installed.rc != 0
block:
- name: Create temporary directory
ansible.builtin.tempfile:
state: directory
suffix: px_mlt5pe-driver
register: driver_directory
changed_when: false
- name: Clone unofficial driver repository
ansible.builtin.git:
repo: 'https://github.com/nns779/px4_drv'
version: '7fa9f05d2cbdf1d821f479248d561f9868051b8b'
dest: "{{ driver_directory.path }}"
- name: Make fwtool
community.general.make:
chdir: "{{ driver_directory.path }}/fwtool"
- name: Download and unarchive tuner driver
ansible.builtin.unarchive:
src: http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip
remote_src: true
dest: "{{ driver_directory.path }}/fwtool"
- name: Extract firmware
ansible.builtin.command:
chdir: "{{ driver_directory.path }}/fwtool"
argv:
- ./fwtool
- ./pxw3u4_BDA_ver1x64/PXW3U4.sys
- it930x-firmware.bin
- name: Locate tuner driver to firmware directory
become: true
ansible.builtin.copy:
src: "{{ driver_directory.path }}/fwtool/it930x-firmware.bin"
remote_src: true
dest: /lib/firmware
- name: Locate tuner driver for dkms
become: true
ansible.builtin.copy:
src: "{{ driver_directory.path }}/"
remote_src: true
dest: /usr/src/px4_drv-0.2.1/
- name: Check if px4_drv is installed
become: true
ansible.builtin.shell: "dkms status -m px4_drv/0.2.1 | grep px4_drv"
changed_when: false
failed_when: false
register: add_check
- name: DKMS add
become: true
ansible.builtin.command:
argv:
- dkms
- add
- px4_drv/0.2.1
when: add_check.rc != 0
- name: Check if px4_drv is added
become: true
ansible.builtin.shell: "dkms status -m px4_drv/0.2.1 | grep px4_drv | grep installed"
changed_when: false
failed_when: false
register: install_check
- name: DKMS install
become: true
register: debug
ansible.builtin.command:
argv:
- dkms
- install
- px4_drv/0.2.1
when: install_check.rc != 0
notify: Reboot
次にMirakurun用の設定ファイルを配置します。 このファイルの中身は後述します。
- name: Locate Mirakurun related files
block:
- name: create dedicated directory
ansible.builtin.file:
path: "{{ ansible_env.HOME }}/mirakurun"
state: directory
register: mirakurun_directory
changed_when: false
- name: Copy files
block:
- ansible.builtin.copy:
src: ../files/startup
dest: "{{ mirakurun_directory.path }}/startup"
mode: '755'
- ansible.builtin.copy:
src: ../files/config
dest: "{{ mirakurun_directory.path }}"
最後にMirakurunコンテナを起動します。 ここが前回と大きく変わったところで、前回参考にしていた公式のdocker composeからデバイス指定とcapabilityの指定をやめてprivileged指定をしています。 これについても後述します。
- name: Run container
become: true
containers.podman.podman_container:
name: mirakurun
image: docker.io/chinachu/mirakurun:3.9.0-rc.4
restart_policy: always
privileged: true
publish:
- 40772:40772
volume:
- "{{ mirakurun_directory.path }}/startup:/opt/bin/startup:ro"
- "{{ mirakurun_directory.path }}/config:/app-config"
handlers
handlersでは以下のように再起動を行うようにしています。
# handlers/main.yml
- name: Reboot
ansible.builtin.reboot:
become: true
files
コンテナの起動時に実行されるスクリプトは以下のようになっています。 有志によって作成されたrecpt1という録画コマンドと地上波復号ライブラリをインストールします。
#!/bin/bash
if !(type "b25" > /dev/null 2>&1); then
apt update
apt install -y build-essential pkg-config git cmake libpcsclite-dev
cd /tmp
git clone https://github.com/stz2012/libarib25.git
cd libarib25
cmake .
make
make install
fi
if !(type "recpt1" > /dev/null 2>&1); then
cd /tmp
apt install -y git autoconf
git clone https://github.com/stz2012/recpt1.git
cd recpt1/recpt1
./autogen.sh
./configure --enable-b25
make
make install
fi
Mirakurun自体の設定ファイルは以下のようになっています。
今回は5つあるチューナーを全て地デジにしていますが、BS・CSに割り振ることも可能です。
# files/config/tuners.yml
- name: PX-MLT5PE-0
types:
- GR
command: recpt1 --b25 --device /dev/pxmlt5video0 <channel> - -
isDisabled: false
- name: PX-MLT5PE-1
types:
- GR
command: recpt1 --b25 --device /dev/pxmlt5video1 <channel> - -
isDisabled: false
- name: PX-MLT5PE-2
types:
- GR
command: recpt1 --b25 --device /dev/pxmlt5video2 <channel> - -
isDisabled: false
- name: PX-MLT5PE-3
types:
- GR
command: recpt1 --b25 --device /dev/pxmlt5video3 <channel> - -
isDisabled: false
- name: PX-MLT5PE-4
types:
- GR
command: recpt1 --b25 --device /dev/pxmlt5video4 <channel> - -
isDisabled: false
サーバーの設定とチャンネルの設定はここでは深く説明しませんが以下のようにしています。
# files/config/server.yml
logLevel: 2
path: /var/run/mirakurun.sock
port: 40772
# files/config/channels.yml
- name: TOKYO MX
type: GR
channel: '16'
- name: フジテレビ
type: GR
channel: '21'
- name: TBS
type: GR
channel: '22'
- name: テレビ東京
type: GR
channel: '23'
- name: テレビ朝日
type: GR
channel: '24'
- name: 日テレ
type: GR
channel: '25'
- name: NHKEテレ
type: GR
channel: '26'
- name: NHK総合
type: GR
channel: '27'
- name: チバテレ
type: GR
channel: '30'
実行結果
初回は適切にインストールがされています。
[feat/mirakurun] M koutarou@koutarou-desktop/INS> ansible-playbook -i envirionments/production/inventory.yaml physical_servers.yaml
PLAY [Install Mirakurun] *****************************************************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [podman : Install Podman] ***********************************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Install required package] **********************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Check if PX-MLT5PE tuner driver is installed] **************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Create temporary directory] ********************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Clone unofficial driver repository] ************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Make fwtool] ***********************************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Download and unarchive tuner driver] ***********************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Extract firmware] ******************************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Locate tuner driver to firmware directory] *****************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Locate tuner driver for dkms] ******************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Check if px4_drv is added] *********************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : DKMS add] **************************************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Check if px4_drv is added] *********************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : DKMS install] **********************************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
RUNNING HANDLER [mirakurun : Reboot] *****************************************************************************************************************************************************************************************************************************************************************************************
changed: [shiva.lab.kotaro7750.net]
PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************************************************************
shiva.lab.kotaro7750.net : ok=16 changed=10 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
localadmin@shiva:~$ lsmod | grep px
px4_drv 172032 0
localadmin@shiva:~$ ls /dev
autofs core dri hpet i2c-4 loop-control loop6 net ptp0 random sdb sde1 sg2 stderr tty1 tty16 tty22 tty29 tty35 tty41 tty48 tty54 tty60 ttyS0 ttyS15 ttyS21 ttyS28 ttyS6 uinput vcs4 vcsa4 vcsu4 vhost-vsock
block cpu drm_dp_aux0 hugepages i2c-5 loop0 loop7 null pts rfkill sdb1 sde2 sg3 stdin tty10 tty17 tty23 tty3 tty36 tty42 tty49 tty55 tty61 ttyS1 ttyS16 ttyS22 ttyS29 ttyS7 urandom vcs5 vcsa5 vcsu5 zero
bsg cpu_dma_latency drm_dp_aux1 hwrng initctl loop1 mapper nvram pxmlt5video0 root-vg sdc sde3 sg4 stdout tty11 tty18 tty24 tty30 tty37 tty43 tty5 tty56 tty62 ttyS10 ttyS17 ttyS23 ttyS3 ttyS8 userio vcs6 vcsa6 vcsu6 zfs
btrfs-control cuse ecryptfs i2c-0 input loop2 mcelog port pxmlt5video1 rtc sdc1 sdf sg5 tpm0 tty12 tty19 tty25 tty31 tty38 tty44 tty50 tty57 tty63 ttyS11 ttyS18 ttyS24 ttyS30 ttyS9 vcs vcsa vcsu vfio
bus disk fd i2c-1 kmsg loop3 mei0 ppp pxmlt5video2 rtc0 sdd sdf1 shm tpmrm0 tty13 tty2 tty26 tty32 tty39 tty45 tty51 tty58 tty7 ttyS12 ttyS19 ttyS25 ttyS31 ttyprintk vcs1 vcsa1 vcsu1 vga_arbiter
char dm-0 full i2c-2 kvm loop4 mem psaux pxmlt5video3 sda sdd1 sg0 snapshot tty tty14 tty20 tty27 tty33 tty4 tty46 tty52 tty59 tty8 ttyS13 ttyS2 ttyS26 ttyS4 udmabuf vcs2 vcsa2 vcsu2 vhci
console dma_heap fuse i2c-3 log loop5 mqueue ptmx pxmlt5video4 sda1 sde sg1 snd tty0 tty15 tty21 tty28 tty34 tty40 tty47 tty53 tty6 tty9 ttyS14 ttyS20 ttyS27 ttyS5 uhid vcs3 vcsa3 vcsu3 vhost-net
2回目以降はきちんとスキップされています。
[03/30/24 15:24]/home/koutarou/develop/Lab
[feat/mirakurun] M koutarou@koutarou-desktop/INS> ansible-playbook -i envirionments/production/inventory.yaml physical_servers.yaml
PLAY [Install Mirakurun] *****************************************************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [podman : Install Podman] ***********************************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Install required package] **********************************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Check if PX-MLT5PE tuner driver is installed] **************************************************************************************************************************************************************************************************************************************************************
ok: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Create temporary directory] ********************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Clone unofficial driver repository] ************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Make fwtool] ***********************************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Download and unarchive tuner driver] ***********************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Extract firmware] ******************************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Locate tuner driver to firmware directory] *****************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Locate tuner driver for dkms] ******************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Check if px4_drv is added] *********************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : DKMS add] **************************************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : Check if px4_drv is added] *********************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
TASK [mirakurun : DKMS install] **********************************************************************************************************************************************************************************************************************************************************************************************
skipping: [shiva.lab.kotaro7750.net]
PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************************************************************
shiva.lab.kotaro7750.net : ok=4 changed=0 unreachable=0 failed=0 skipped=11 rescued=0 ignored=0
Mirakurunコンテナ作成時の指定について
初めはPX-S1UDでの指定を見習って、以下のようにデバイスファイルやcapabilityの指定を明示する方法でプレイブックを作成しました。
- name: Run container
become: true
containers.podman.podman_container:
name: mirakurun
image: docker.io/chinachu/mirakurun:3.9.0-rc.4
restart_policy: always
cap_add:
- SYS_ADMIN
- SYS_NICE
device:
- /dev/bus
- /dev/pxmlt5video0
- /dev/pxmlt5video1
- /dev/pxmlt5video2
- /dev/pxmlt5video3
- /dev/pxmlt5video4
publish:
- 40772:40772
volume:
- "{{ mirakurun_directory.path }}/startup:/opt/bin/startup:ro"
- "{{ mirakurun_directory.path }}/config:/app-config"
しかし上の方法だと少なくとも私の環境ではコンテナ内で録画することができませんでした。
root@0f77f5b493e6:/app# recpt1 --b25 --strip --device /dev/pxmlt5video4 13 20 ./hoge.ts
using B25...
enable B25 strip
using device: pxmlt5video4
pid = 8460
Cannot open tuner device: /dev/pxmlt5video4
コンテナを動かすホストで直接実行したところ問題なく動いたので、コンテナに渡すデバイスが不足していたか何かだと思います。
localadmin@shiva:~$ /tmp/recpt1/recpt1/recpt1 --device /dev/pxmlt5video0 26 10 hoge.ts
using device: /dev/pxmlt5video0
pid = 97811
device = /dev/pxmlt5video0
C/N = 28.000155dB
Recording...
Recorded 10sec
privilegedコンテナにするのは少し問題なので、いずれ直したいですが今のところはこれで運用することにします。