見出し画像

開発日誌: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をインストールしていきます。

うまく行くといいなぁ・・・

それでは、また明日ありがとうございました。


この記事が気に入ったらサポートをしてみませんか?