開発日誌:LXD 録画サーバドライバー連携まで
何年前に買った覚えてないくらいに前に買ったPT3で録画サーバの再構築をしました。
以前作った時はWindows7だった気がします。
その後、Linuxサーバを触り出したのLinux移行しようとしたのですがドライバーのインストールがわからず。
どうにもならずにPT3お飾りPCIカードになってました。
放置理由
PT3を放置していた理由は、インストールに失敗したり詰まった時にOSの再インストールをしていたからです。
当時の私に(今もそこまで出来てないと思いますが)原因のパッケージを探し出し完全に削除して戻るっということはできなかったためです。
しかし何度もOSインストールしていると流石に飽きる上に、同じサーバでKVMでの仮想マシン化も着手していたのでそうやすやすとやり直しができない状況になっていました。
再開の理由
再開をしようと思ったきっかけは、コンテナをやり始めたからです。
コンテナであればその上でインストールしたものは、そのコンテナ内のみでの変更なのでコンテナを廃棄するだけで元に戻せます。
それ以前にKVMでハードウェアパススルーという手段も考えたのですがこれもまたIOMMU対応のハードウェアを揃えないと行けないなどで、ついこの間別のサーバで実装できる様になったばかりでした。
今日の作業
今日の作業は、録画に必要なハードウェアのLXDへのパススルー設定になります。
使用するソフトウェアは、mirakurun chinachuを使います。
https://github.com/Chinachu/Mirakurun
なので録画用のLXDにdockerとdocker-composeをインストールする必要があります。
パッケージのインストールに関してはcloud-initでLXDコンテナインストール時にインストールを完了しています。
使用したのLXDのprofile用のyamlファイルは、これです。
config:
security.nesting: "true"
security.privileged: "true"
user.user-data: |
#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
package_upgrade: true
users:
- name: ubuntu
uid: 1000
shell: /bin/bash
- name: masahiro
uid: 1001
groups: sudo
shell: /bin/bash
packages:
- openssh-server
- docker.io
- docker-compose
runcmd:
description: "docker compose"
devices: {}
name: docker_compose
used_by: []
初期プロファイルを作成
lxc profile create docker
lxc profile list
作っておいたyamlファイルの設定に変更
cat docker.yaml | lxc profile edit docker
lxc profile show docker
Ubuntu20.04のコンテナイメージで作成します。Ubuntuを利用したのは、公式が推奨しているのがこのディストリビューションだからです。
コンテナ名は、ubutRECにして作成します。
lxc launch ubuntu:20.04 ubutREC -p default -p docker
cloud-init実行状態を確認
lxc exec ubutREC -- tail -f /var/log/cloud-init-output.log
cloud-initの実行画完了したら作成したコンテナを確認
lxc list
コンテナが作成されますが稼働はしていません
+---------+---------+----------------------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+---------+---------+----------------------+------+-----------+-----------+
| ubutREC | RUNNING | 10.244.41.168 (eth0) | | CONTAINER | 0 |
+---------+---------+----------------------+------+-----------+-----------+
コンテナに接続してDockerとcomposeのバージョンを確認します。
lxc exec ubutREC bash
dockerとdocker-composのインストール確認
docker version
docker-compose --version
確認観点は次の条件です。
Docker Engine のバージョンが 18.06.0 以降であるか
Docker Compose のバージョンが 1.22.0 以降であるか
バージョンが問題なければ作っておいた一般ユーザーのパスワードを設定
passwd masahiro
合わせてDokcerグループに所属させてDcoker実行を可能にします。
gpasswd -a masahiro docker
これで下処理が完了です。
次にGPUデバイスを使える様にする。
LXDコンテナから各種録画に必要なハードウェアのデバイスファイルを参照することはできません。
なのでこれをLXDコンテナからアクセスできる様に対象のデバイスファイルをIDマッピングと合わせてLXDコンテナに設定します。
まずは、GPU関係の設定
lxc config device add ubutREC hostgpu gpu \
gid=`getent group video | cut -d: -f3`
接続に参考にしたサイト
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0532?page=3
次にUSB関係の設定(カードリーダー
lxc config device add ubutREC SCR3310 usb vendorid=04e6 productid=511a
こちらは次のサイトを参考にしました。
PT3関係の設定
lxc config device add ubutREC rec0demux unix-char path=/dev/dvb/adapter0/demux0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec0dvr unix-char path=/dev/dvb/adapter0/dvr0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec0frontend unix-char path=/dev/dvb/adapter0/frontend0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec1demux unix-char path=/dev/dvb/adapter1/demux0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec1dvr unix-char path=/dev/dvb/adapter1/dvr0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec1frontend unix-char path=/dev/dvb/adapter1/frontend0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec2demux unix-char path=/dev/dvb/adapter2/demux0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec2dvr unix-char path=/dev/dvb/adapter2/dvr0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec2frontend unix-char path=/dev/dvb/adapter2/frontend0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec3demux unix-char path=/dev/dvb/adapter3/demux0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec3dvr unix-char path=/dev/dvb/adapter3/dvr0 gid=`getent group video | cut -d: -f3`
lxc config device add ubutREC rec3frontend unix-char path=/dev/dvb/adapter3/frontend0 gid=`getent group video | cut -d: -f3`
めっちゃ多いです。PT3はデバイスが4つでそれがそれぞれ、demux,dvr,frontendというキャラクターファイルを持っているのでそれらを全て登録します。
追加したLXDコンフィグを確認
lxc config device show ubutREC
実際にコンテナ側からも観れるか確認します。
lxc exec ubutREC -- ls -l /dev/dri
lxc exec ubutREC -- ls -lR /dev/dvb
実行結果がホストと同じにななります。
GPUドライバーをインストール
次にLXDで利用可能になったNVIDIA製のGPUデバイスを専用のドライバーをインストールして使える様にします。
この設定には、ホスト側にも事前にNVIDIA製ドライバーをインストールしておく必要があります。
ホスト側のインストールは、割愛
利用可能なドライバーの確認
X11関連パッケージが不要なサーバー向けに依存関係を調整した「nvidia-headless-XXX」パッケージを使用します。後述になりますが実際は、全ての依存関係を解決してくれなかった感じです(私のやり方がまずかったのか?)。
インストールするドライバーは、ホストのものと同じものとなる。
まずはリポジトリを登録
add-apt-repository ppa:graphics-drivers/ppa
aptデータベースを更新
apt update
ホストにはすでにバージョン470ドライバーをインストールしています。
apt install nvidia-headless-470
システムを再起動
reboot
バージョンを確認
nvidia-smi
実行すると以下のエラーとなる
Command 'nvidia-smi' not found, but can be installed with:
apt install nvidia-340 # version 340.108-0ubuntu5.20.04.2, or
apt install nvidia-utils-390 # version 390.144-0ubuntu0.20.04.1
apt install nvidia-utils-450-server # version 450.142.00-0ubuntu0.20.04.1
apt install nvidia-utils-460 # version 460.91.03-0ubuntu0.20.04.1
apt install nvidia-utils-470 # version 470.57.02-0ubuntu0.20.04.1
apt install nvidia-utils-435 # version 435.21-0ubuntu7
apt install nvidia-utils-440 # version 440.82+really.440.64-0ubuntu6
apt install nvidia-utils-418-server # version 418.211.00-0ubuntu0.20.04.1
apt install nvidia-utils-460-server # version 460.91.03-0ubuntu0.20.04.1
apt install nvidia-utils-470-server # version 470.57.02-0ubuntu0.20.04.2
Ubuntuの詳細なバージョンを確認
cat /etc/os-release | grep -i VERSION
VERSION="20.04.2 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
詳細なバージョンが確認出来たらそれにあったパッケージをインストールする。
今回の場合なら次のものとなる
apt install nvidia-utils-470-server # version 470.57.02-0ubuntu0.20.04.2
加えてこのパッケージには依存関係で以下のパッケージが必要となる。
libnvidia-compute-470-server
それでは、それぞれをインストールします。
依存関係でlibnvidia-compute-470-serverが先になります。
apt install libnvidia-compute-470-server
apt install nvidia-utils-470-server
改めてバージョンを確認
nvidia-smi
今度はきちんと実行出来ました。
Sun Aug 8 17:09:20 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:1D:00.0 N/A | N/A |
| 50% 42C P0 N/A / N/A | 0MiB / 978MiB | N/A Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
以上が今日の作業でした。
実際には、先に作っていたLXDのGUI環境へのドライバーのインストールしています。
なのでホスト側には、X11対応のドライバーを入れてあります。この辺は、別に合わせなくてもいいようですね。
明日はこの続きでdockerを使ってmirakurunをインストールしていきます。
うまく行くといいなぁ・・・
それでは、また明日ありがとうございました。