TV録画機の再構築 ~2.PX4ドライバーとDockerのインストール~

概要

この記事では、Rapberry Pi4へ以下を設定するために必要なことを記載する。

  • PX4のドライバー
  • Docker

全体の構成図

※ 赤枠部が本記事での対象

ソフトウェア一覧

  • Driver: px4_drv
  • OSS:
    • Docker: 20.10.17
    • Docker Compose: 2.6.0

作業の流れ

  1. PX4ドライバーのインストール
  2. Dockerの設定
    • Docker
    • Docker compose

PX4ドライバーのインストール

PX-W3U4がRaspberry Piに認識されているかを確認

Raspberry Pi に PX-W3U4 を挿して lsusb,dmesg を実行

$ lsusb
Bus 002 Device 002: ID 174c:235c ASMedia Technology Inc. Ugreen Storage Device
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0511:083f N'Able (DataBook) Technologies, Inc. PXW3U4
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ dmesg
~省略~
[26217.285425] usb 1-1.4: new high-speed USB device number 3 using xhci_hcd
[26217.390013] usb 1-1.4: New USB device found, idVendor=0511, idProduct=083f, bcdDevice= 1.00
[26217.390046] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[26217.390062] usb 1-1.4: Product: PXW3U4
[26217.390076] usb 1-1.4: Manufacturer: PLEX̀
[26217.390090] usb 1-1.4: SerialNumber: 000001912004551

ドライバーのビルドとインストール

ドライバーを配布しているGithub

$ sudo apt-get update
$ sudo apt-get -y install git
# $ sudo apt-get -y install raspberrypi-kernel-headers # Raspbrry Pi only(実行してはダメ。詳細後述。)

$ git clone https://github.com/nns779/px4_drv
$ cd px4_drv/fwtool/
$ make
$ curl -O http://plex-net.co.jp/plex/pxw3u4/pxw3u4_BDA_ver1x64.zip
$ unzip -oj pxw3u4_BDA_ver1x64.zip pxw3u4_BDA_ver1x64/PXW3U4.sys
$ ./fwtool PXW3U4.sys it930x-firmware.bin
$ sudo cp it930x-firmware.bin /lib/firmware/
$ cd ../

$ cd driver
$ make
$ sudo make install
$ sudo modprobe px4_drv

dmesgでドライバーを認識しているかを確認

$ dmesg
~省略~
[155711.304545] px4_drv: loading out-of-tree module taints kernel.
[155711.305795] px4_drv: px4_drv version 0.4.0, rev: 384, commit: 7fa9f05d2cbdf1d821f479248d561f9868051b8b @ develop
[155711.417307] px4_usb 1-1.4:1.0: Firmware loaded. version: 1.4.0.0
[155711.554069] px4_usb 1-1.4:1.0: /dev/px4video0
[155711.554318] px4_usb 1-1.4:1.0: /dev/px4video1
[155711.554414] px4_usb 1-1.4:1.0: /dev/px4video2
[155711.554500] px4_usb 1-1.4:1.0: /dev/px4video3
[155711.554679] usbcore: registered new interface driver px4_usb

$ lsmod
Module                  Size  Used by
px4_drv               131072  0

$ ls -al /dev/px4*
crw-rw-r-- 1 root video 509, 0  816 21:43 /dev/px4video0
crw-rw-r-- 1 root video 509, 1  816 21:43 /dev/px4video1
crw-rw-r-- 1 root video 509, 2  816 21:43 /dev/px4video2
crw-rw-r-- 1 root video 509, 3  816 21:43 /dev/px4video3

問題: カーネルカーネルヘッダーのバージョンが不一致

PX4の「ドライバーのビルドとインストール」のところの話。 当初、cd driver を実行したあと、makeした時に以下のようなエラーが発生。

$ make
'revision.h' was updated.
make[1]: *** /lib/modules/5.15.32-v8+/build: そのようなファイルやディレクトリはありません.  中止.
make: *** [Makefile:19: px4_drv.ko] エラー 2
# lib/modulesの中を見ると、2つディレクトリが存在。
$ ls -la /lib/modules/5.15.32-v8+/
合計 2416
drwxr-xr-x  3 root root   4096  44 23:27 .
drwxr-xr-x  4 root root   4096  816 20:45 ..
drwxr-xr-x 11 root root   4096  44 23:27 kernel
-rw-r--r--  1 root root 573953  41 04:40 modules.alias
-rw-r--r--  1 root root 596396  41 04:40 modules.alias.bin
-rw-r--r--  1 root root  15287  41 04:40 modules.builtin
-rw-r--r--  1 root root  28734  41 04:40 modules.builtin.alias.bin
-rw-r--r--  1 root root  16931  41 04:40 modules.builtin.bin
-rw-r--r--  1 root root  85796  41 04:40 modules.builtin.modinfo
-rw-r--r--  1 root root 185456  41 04:40 modules.dep
-rw-r--r--  1 root root 259114  41 04:40 modules.dep.bin
-rw-r--r--  1 root root    384  41 04:40 modules.devname
-rw-r--r--  1 root root  64283  41 04:40 modules.order
-rw-r--r--  1 root root    883  41 04:40 modules.softdep
-rw-r--r--  1 root root 272190  41 04:40 modules.symbols
-rw-r--r--  1 root root 330088  41 04:40 modules.symbols.bin

# 5.15.56-v8+のほうにはbuildのディレクトリがある
$ ls -la /lib/modules/5.15.56-v8+/
合計 8
drwxr-xr-x 2 root root 4096  816 20:45 .
drwxr-xr-x 4 root root 4096  816 20:45 ..
lrwxrwxrwx 1 root root   34  811 20:37 build -> /usr/src/linux-headers-5.15.56-v8+

原因は、以下のコマンドでカーネルヘッダーをアップデートしてしまっていたこと。 これによって、カーネルのバージョンとヘッダーのバージョンが食い違ったらしい。

$ sudo apt-get -y install raspberrypi-kernel-headers

以下の方法で、カーネルヘッダーを再インストール

# アンインストール
$ sudo apt-get --purge autoremove raspberrypi-kernel-headers

# kernel-headersの古いバージョンを取得
$ curl -O http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-kernel-headers_1.20220331-1_arm64.deb

# インストール
$ sudo dpkg -i raspberrypi-kernel-headers_1.20220331-1_arm64.deb

Docker/Docker-composeの設定

Docker

インストール

公式サイトによるインストール方法

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ chmod 744 get-docker.sh
# 次のDRY_RUNで実行権限がなくてエラーとなるので、644->744へ変更
$ DRY_RUN=1 sh ./get-docker.sh
# 実行する予定のコマンドが表示される
$ sudo sh get-docker.sh

下記のバージョンがインストールされたことがわかる

Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:02:34 2022
 OS/Arch:           linux/arm64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:01:01 2022
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.7
  GitCommit:        0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb
 runc:
  Version:          1.1.3
  GitCommit:        v1.1.3-0-g6724737
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

インストール後の設定

公式サイトによる設定方法

ルート以外のユーザーでもDockerを実行可能にする

この設定を行ったあとは、ログアウト/ログインをしないと有効にならない

# dockerグループを作成(cat /etc/group で確認して作成済みなら不要)
$ sudo groupadd docker
# dockerグループにユーザーを追加
$ sudo usermod -aG docker $USER

自動起動の設定

# 自動起動する設定
$ sudo systemctl enable docker
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker

# 自動起動をしない設定
$ sudo systemctl disable docker

# 今すぐ起動(1回だけ)
$ sudo systemctl start docker

# 今すぐ停止(1回だけ)
$ sudo systemctl stop docker

Docker compose

公式サイトによるインストール方法

convenience scriptでDockerをインストールしていれば、composeもインストールされているらしい。

$ sudo apt search docker-compose
ソート中... 完了
全文検索... 完了  
docker-compose/stable,stable 1.25.0-1 all
  Punctual, lightweight development environments using Docker

docker-compose-plugin/bullseye,now 2.6.0~debian-bullseye arm64 [インストール済み]
  Docker Compose (V2) plugin for the Docker CLI.

resource-agents/stable 1:4.7.0-1 arm64
  Cluster Resource Agents

aptコマンドで確認すると、compose(v1)は入っていないようだが、compose(v2)が入っている。
"docker-compose"だったv1のコマンド体系と比較して、"docker compose"となっているのがv2。
dockerとは別のコマンドとしてではなく、dockerのプラグインとして動作することがコマンド体系からもわかる。

バージョンを確認するコマンドは以下のコマンド。
aptでサーチした結果と同じバージョンが入っている。

$ docker compose version
Docker Compose version v2.6.0

lsp.hatenablog.jp