0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PT3 chardev版で Mirakurun/Mirakc を docker で動かそうとしたら再起動時に起動せずはまった

Last updated at Posted at 2025-05-23

PT3 chardev版で Mirakurun/Mirakc を docker で動かそうとしたら再起動時に起動せずはまった

概要

chardev 版の PT3 を docker の Mirakurun/Mirakc で動かそうとしたが、
再起動時のみ起動しなかった。
ただし極稀に起動する。また手動で docker run で起動を試みると問題なく起動する。

前提

今回の環境は以下の通り

  • Proxmox 上のVMにPT3をパススルー(今回の事象とはあまり関係ない)
  • PT3のドライバはchardev版を使う
  • Mirakurun/Mirakc を dockerで動かす

Mirakurun/Mirakc の docker compose はそれぞれのドキュメントにある通り devices にチューナー(PT3)を指定している

compose.yml(mirakc の例)

services:
  mirakc:
    image: docker.io/mirakc/mirakc:alpine
    container_name: mirakc
    restart: always
    devices:
      - /dev/pt3video0:/dev/pt3video0

原因

docker の起動順に問題がありました。
Mirakurun/Mirakc の docker コンテナ起動時に chardev 版の PT3 が認識しておらず、Mirakurun/Mirakc から PT3 にアクセスできず落ちていた。

docker のコンテナ起動順を PT3 の chardev ドライバ認識後に変更することで問題解決しました。

原因調査

Mirakurun/Mirakc のコンテナはどちらとも status が Exited (128) になっていた。

それぞれのコンテナのログを確認すると以下のようなエラーが出ていた。

Mirakurun

info: TunerDevice#1 process has spawned by command `recisdb tune --device /dev/pt3video3 --channel TXX -` (pid=xx)
info: TunerDevice#1 streaming to user `Mirakurun:getEPG()` (priority=-1)
info: Network#32740 EPG gathering is resuming forcibly because reached maximum pause time (12 hours)
info: TSFilter#_standbyLogoData: waiting for logo data for 30 minutes... (networkId=xxxx, logoId=xx)
info: TunerDevice#0 process has closed with exit code=0 by signal `null` (pid=95)
info: TunerDevice#0 released
info: save db `/app-data/services.json` w/ integrity (xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=)
stopping... 80
exit.

mirakc

ERROR mirakc_core::epg::clock_synchronizer: Failed to synchronize clocks err=Tuner unavailable channel.name="NDxx"
 WARN actlet: Failed to send, the actor may be stopped, the message is lost actor="mirakc_core::epg::Epg<actlet::Address<mirakc_core::tuner::TunerManager>>" msg="mirakc_core::epg::UpdateClocks"
 INFO mirakc_core::epg::job: Done job="sync-clocks" elapsed=551us 966ns
 INFO mirakc_core::epg::job: Scheduled job="sync-clocks" datetime="2025-xx-xxTxx:xx:00+09:00"
 INFO mirakc_core::epg::job: Performing... job="update-schedules"
ERROR actlet: Send failed actor="mirakc_core::epg::eit_feeder::EitFeeder<actlet::Address<mirakc_core::tuner::TunerManager>, actlet::Address<mirakc_core::epg::Epg<actlet::Address<mirakc_core::tuner::TunerManager>>>>" msg="mirakc_core::epg::eit_feeder::FeedEitSections"
ERROR mirakc_core::epg::job: err=Failed to send a message job="update-schedules"
 INFO mirakc_core::epg::job: Done job="update-schedules" elapsed=21us 110ns
 INFO mirakc_core::epg::job: Scheduled job="update-schedules" datetime="2025-xx-xxTxx:xx:00+09:00"

両者ともチューナー周りがエラーになっている。

おそらく Mirakurun/Mirakc のコンテナ起動時に chardev 版の PT3 が認識しておらず、Mirakurun/Mirakc から PT3 にアクセスできず落ちていそうだった。

docker は systemd で起動しているが、定義ファイルを systemctl edit docker.service で以下のように変更し docker の起動を送らせてみるとVM起動時でも問題なくコンテナが起動した。

[Service]
ExecStartPre=/bin/sleep 10

ただ、これだと docker の起動が遅くなる問題がある。
そこで、chardev 版のドライバが udev で起動した後に docker を起動するようにした。

[Unit]
After=udev.service
Requires=udev.service

[Service]
ExecStartPre=/bin/sleep 1

docker の起動順を udev の後に変更し PT3 のデバイスを認識した後にコンテナを立ち上げるようにしたことで問題なく Mirakurun/Mirakc が起動するようになった。

※ 今回は docker を restart: always を設定していたが、/dev/pt3video0 のデバイスが認識された後に docker run を行うようなサービスを作成してもおそらく Mirakurun/Mirakc の起動は成功する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?