概要
この記事では、Rapberry Pi4へ以下を設定するために必要なことを記載する。
- PX4のドライバー
- Docker
全体の構成図
※ 赤枠部が本記事での対象
ソフトウェア一覧
- Driver: px4_drv
- OSS:
- Docker: 20.10.17
- Docker Compose: 2.6.0
作業の流れ
- PX4ドライバーのインストール
- 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
ドライバーのビルドとインストール
$ 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 8月 16 21:43 /dev/px4video0 crw-rw-r-- 1 root video 509, 1 8月 16 21:43 /dev/px4video1 crw-rw-r-- 1 root video 509, 2 8月 16 21:43 /dev/px4video2 crw-rw-r-- 1 root video 509, 3 8月 16 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 4月 4 23:27 . drwxr-xr-x 4 root root 4096 8月 16 20:45 .. drwxr-xr-x 11 root root 4096 4月 4 23:27 kernel -rw-r--r-- 1 root root 573953 4月 1 04:40 modules.alias -rw-r--r-- 1 root root 596396 4月 1 04:40 modules.alias.bin -rw-r--r-- 1 root root 15287 4月 1 04:40 modules.builtin -rw-r--r-- 1 root root 28734 4月 1 04:40 modules.builtin.alias.bin -rw-r--r-- 1 root root 16931 4月 1 04:40 modules.builtin.bin -rw-r--r-- 1 root root 85796 4月 1 04:40 modules.builtin.modinfo -rw-r--r-- 1 root root 185456 4月 1 04:40 modules.dep -rw-r--r-- 1 root root 259114 4月 1 04:40 modules.dep.bin -rw-r--r-- 1 root root 384 4月 1 04:40 modules.devname -rw-r--r-- 1 root root 64283 4月 1 04:40 modules.order -rw-r--r-- 1 root root 883 4月 1 04:40 modules.softdep -rw-r--r-- 1 root root 272190 4月 1 04:40 modules.symbols -rw-r--r-- 1 root root 330088 4月 1 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 8月 16 20:45 . drwxr-xr-x 4 root root 4096 8月 16 20:45 .. lrwxrwxrwx 1 root root 34 8月 11 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