背景
以前の記事で、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.ymltasks
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では以下のように再起動を行うようにしています。
- name: Reboot ansible.builtin.reboot: become: truefiles
コンテナの起動時に実行されるスクリプトは以下のようになっています。 有志によって作成された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 installfi
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 installfiMirakurun自体の設定ファイルは以下のようになっています。
今回は5つあるチューナーを全て地デジにしていますが、BS・CSに割り振ることも可能です。
- 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サーバーの設定とチャンネルの設定はここでは深く説明しませんが以下のようにしています。
logLevel: 2path: /var/run/mirakurun.sockport: 40772- 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 pxpx4_drv 172032 0
localadmin@shiva:~$ ls /devautofs 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-vsockblock 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 zerobsg 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 zfsbtrfs-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 vfiobus 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_arbiterchar 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 vhciconsole 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-net2回目以降はきちんとスキップされています。
[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=0Mirakurunコンテナ作成時の指定について
初めは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.tsusing B25...enable B25 stripusing device: pxmlt5video4pid = 8460Cannot open tuner device: /dev/pxmlt5video4コンテナを動かすホストで直接実行したところ問題なく動いたので、コンテナに渡すデバイスが不足していたか何かだと思います。
localadmin@shiva:~$ /tmp/recpt1/recpt1/recpt1 --device /dev/pxmlt5video0 26 10 hoge.tsusing device: /dev/pxmlt5video0pid = 97811device = /dev/pxmlt5video0C/N = 28.000155dBRecording...Recorded 10secprivilegedコンテナにするのは少し問題なので、いずれ直したいですが今のところはこれで運用することにします。