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 の起動は成功する。