Kotaro7750's Gehirn
Home About
  • Home
  • Category
  • About

PX-MLT5PEを用いたMirakurunコンテナをAnsibleで自動構築する

2024-03-31

背景

以前の記事で、PLEX社のPX-S1UDというチューナーを用いてMirakurunコンテナをUbuntuマシンにAnsibleで自動構築しました。

ただこのチューナーは同時に1番組しか録画できないため、より上位機種であるPX-MLT5PE(同じPLEX社製)を用いて同じことを行います。

このチューナーは、PCIe接続の拡張カードの形をしていますが、PCIeからは電気のみを取り、データ自体はUSB(画像では見えていませんがマザーボードのUSBヘッダに指すためのケーブルが生えています) また、画像のようにB-CASカードを刺せるスロットもありますが、うまく動作しないので大人しくPX-S1UDのときと同じくカードリーダーを用意します。 PX-MLT5PE

環境(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コンテナにするのは少し問題なので、いずれ直したいですが今のところはこれで運用することにします。

Related Posts

スケーラブルなOpenTelemetry CollectorパイプラインをKubernetes上に構築する

スケーラブルなOpenTelemetry CollectorパイプラインをKubernetes上に構築する

2025-04-14

KorbでKubernetesの既存PVのStorage Classを変更する

KorbでKubernetesの既存PVのStorage Classを変更する

2024-12-15

Synology DS1522+を買ったので宅鯖用に仮想化環境をIaCでセットアップする ~VM編~

Synology DS1522+を買ったので宅鯖用に仮想化環境をIaCでセットアップする ~VM編~

2024-09-28

New Posts

スケーラブルなOpenTelemetry CollectorパイプラインをKubernetes上に構築する

スケーラブルなOpenTelemetry CollectorパイプラインをKubernetes上に構築する

2025-04-14

OpenTelemetry Certified Associate ( OTCA ) を取得した

OpenTelemetry Certified Associate ( OTCA ) を取得した

2025-04-13

Golangのnet/httpの実装からHTTP1.1クライアントでのTCPコネクションの挙動を確かめる

Golangのnet/httpの実装からHTTP1.1クライアントでのTCPコネクションの挙動を確かめる

2025-03-21

ToC

  • 背景
  • 環境(PX-S1UD版とほぼ同じ)
  • Ansibleプレイブック
  • tasks
  • handlers
  • files
  • 実行結果
  • Mirakurunコンテナ作成時の指定について

Ads

Ads

Privacy Policy