KRSをDockerコンテナに閉じる

KRSをビルドするために環境を汚したくないため、Dockerコンテナに閉じたい。 というわけで、Dockerfileを作成し、Kria KV260向けのKRSをビ …

npz35 Wed 05 October 2022

KRSをビルドするために環境を汚したくないため、Dockerコンテナに閉じたい。 というわけで、Dockerfileを作成し、Kria KV260向けのKRSをビルドするまでの手順を整理した。

動作環境

  • OS : Ubuntu 20.04.3 LTS(64 bit)
  • Vivado : 2022.1
  • Vitis : 2022.1
  • Vitis_HLS : 2022.1
  • ROS2 : Humble

KRSとは

KRS(Kria Robotic Stack)とは、Kriaボード向けにROS2のパッケージをビルドするツールのことである。 公式サイト には以下の記載がある。

Kria ロボティクス スタック (KRS) は、ハードウェアを使用して、産業用グレードのロボット ソリューションの開発、メンテナンス、商用展開を加速するためのロボット ライブラリとユーティリティの統合セットです。

今回作成したDockerfileの内容は、基本的には https://xilinx.github.io/KRS/sphinx/build/html/index.html の内容を踏襲した。 Dockerイメージのビルド手順は https://github.com/npz35/vitis_tutorial/blob/0.2.2/README_krs.md にまとめた。

acceleration_firmware_kv260 を見るとわかるが、KRSにはalphaとbetaと1.0がある。 ここでは1.0を使用する。

KRSのビルド(開発マシン向け)

上記の README_krs.md の手順で作成したDockerコンテナの中で、以下を実行する。

cd $HOME/krs_ws
colcon build --merge-install

ハードウェアプラットフォームファイル

FPGAバイナリ( xclbin ファイル)の生成には、プラットフォームファイル( xpfm ファイル)と、そこから参照されるハードウェアプラットフォームファイル( xsa ファイル)が必要となる。 これらのファイルは acceleration_firmware_kv260 パッケージに含まれている。 後述する colcon build の後に、KRSのワークスペースの中に展開される。 KRSのワークスペースの中で確認した時の例を以下に示す。

$ ls acceleration/firmware/kv260/platform/*
acceleration/firmware/kv260/platform/kv260_custom_platform.xpfm

acceleration/firmware/kv260/platform/hw:
kv260_hardware_platform.xsa

acceleration/firmware/kv260/platform/sw:
kv260_custom_platform  kv260_custom_platform.spfm

余談だが、ソフトウェアプラットフォームファイル( spfm ファイル)も含まれていることがわかる。

KRSのビルド(Kria KV260向け)

Dockerコンテナの中で以下のコマンドを実行して、KRSのパッケージ設定を読み込む。

cd $HOME/krs_ws
source install/setup.bash

次に、Kria KV260向けにKRSをビルドする。 まず、以下のコマンドを実行し、Kria KV260のファームウェアを選択する。

colcon acceleration select kv260

以下のコマンドを実行し、Kria KV260のファームウェアが選択されていることを確認する。

$ colcon acceleration list
kv260*

以下のコマンドを実行し、Kria KV260向けにKRSをビルドする。 なお、FPGAバイナリのビルドを含むため時間がかかる。

colcon build \
  --build-base=build-kv260 \
  --install-base=install-kv260 \
  --merge-install \
  --mixin kv260 \
  --packages-select \
    ament_acceleration \
    ament_vitis \
    vitis_common \
    simple_adder \
    offloaded_doublevadd_publisher

以下のコマンドを実行し、Dockerコンテナの中でビルドしたKRSを、ホスト側にコピーする。

mkdir -p $HOME/output/krs_ws
sudo cp -r -d acceleration $HOME/output/krs_ws/
cp -r -d src $HOME/output/krs_ws/
cp -r -d build-kv260 $HOME/output/krs_ws/
cp -r -d install-kv260 $HOME/output/krs_ws/

ホスト側で以下を実行し、ファームウェアの所有者を変更する。

cd $HOME/output/krs_ws/
sudo chown -R $USER acceleration

イメージの作成

イメージの作成には、imagebuilder を使用している。 imagebuilderはループデバイスを使用する。 そのため、イメージの作成はDockerコンテナの中で完結することが難しい。 Dockerコンテナの外でイメージを作成する。

colcon を使用するために、ホスト側で以下を実行する。

sudo apt install -y \
  python3-colcon-argcomplete \
  python3-colcon-bash \
  python3-colcon-cd \
  python3-colcon-cmake \
  python3-colcon-common-extensions \
  python3-colcon-core \
  python3-colcon-defaults \
  python3-colcon-devtools \
  python3-colcon-library-path \
  python3-colcon-metadata \
  python3-colcon-mixin \
  python3-colcon-notification \
  python3-colcon-output \
  python3-colcon-package-information \
  python3-colcon-package-selection \
  python3-colcon-parallel-executor \
  python3-colcon-pkg-config \
  python3-colcon-powershell \
  python3-colcon-python-setup-py \
  python3-colcon-recursive-crawl \
  python3-colcon-ros \
  python3-colcon-test-result \
  python3-colcon-zsh

以下のコマンドを実行し、KRSをビルドする。 なお、Vitisの cmake が使用されることを回避するために PATH を変更する。

cd $HOME/output/krs_ws/
export PATH=/usr/bin:$PATH
colcon build \
  --merge-install \
  --packages-select colcon-hardware-acceleration

以下のコマンドを実行して、KRSのパッケージ設定を読み込む。

source install/setup.bash

次に、Kria KV260向けにKRSをビルドする。 以下のコマンドを実行し、Kria KV260のファームウェアを選択する。

unlink acceleration/firmware/select
colcon acceleration select kv260

必要に応じて以下のコマンドを実行し、 BOOT.bin のシンボリックリンクを変更する。

BOOT_PATH=`readlink acceleration/firmware/select/BOOT.BIN | sed 's/.*krs_ws\///g'`
unlink acceleration/firmware/kv260/BOOT.BIN
ln -s `pwd`/${BOOT_PATH} acceleration/firmware/kv260/BOOT.BIN

以下のコマンドを実行し、イメージを作成する。

LANG=C
colcon acceleration linux vanilla --install-dir install-kv260

acceleration/firmware/kv260/sd_card.img が作成されていることを確認する。

$ fdisk -l acceleration/firmware/kv260/sd_card.img
Disk acceleration/firmware/kv260/sd_card.img: 4.24 GiB, 4548722688 bytes, 8884224 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xeba4fad3

Device                                   Boot   Start     End Sectors  Size Id Type
acceleration/firmware/kv260/sd_card.img1 *       2048 1120255 1118208  546M  c W95 FAT32 (LBA)
acceleration/firmware/kv260/sd_card.img2      1120256 8853503 7733248  3.7G 83 Linux

microSDカードにイメージを焼く

以下のコマンドを実行し、microSDカードをフォーマットする。 フォーマットすると、microSDカード上のデータは全て消去される。 ここでは、microSDカードのデバイスパスは /dev/sda であるとする。

sudo XAUTHORITY=~/.Xauthority gparted

右上のプルダウンから /dev/sda を選択し、全てのパーティションを消去し、チェックマークを押してフォーマットを実行する。 完了したら閉じる。

以下のコマンドを実行し、イメージを焼く。

cd $HOME/output/krs_ws/acceleration/firmware/kv260/
sudo dd if=sd_card.img of=/dev/sda bs=1M status=progress

デバイスツリーの差し替え

KRSで作成されるイメージのブート領域の中身は以下のようになっている。

  • BOOT.BIN
  • Image
  • boot.scr
  • ramdisk.cpio.gz.u-boot
  • system.dtb

このうち、デバイスツリーである system.dtbacceleration_firmware_kv260 v1.0.0 の時点で不整合を起こしている。 このままだと、PetaLinuxの起動時に以下のようなエラーが出て起動に失敗する。

Waiting for /dev/mmcblk1p2 to pop up (attempt 25)
Waiting for /dev/mmcblk1p2 to pop up (attempt 26)
Waiting for /dev/mmcblk1p2 to pop up (attempt 27)
Waiting for /dev/mmcblk1p2 to pop up (attempt 28)
Waiting for /dev/mmcblk1p2 to pop up (attempt 29)
Waiting for /dev/mmcblk1p2 to pop up (attempt 30)
Device /dev/mmcblk1p2 not found
udhcpc: SIOCGIFINDEX: No such device
ERROR: There's no '/dev' on rootfs.

sh: can't access tty; job control turned off

これを回避するために、 system.dtb を差し替える。

PetaLinux ToolsをDockerコンテナに閉じる の手順で作成した system.dtb を用意する必要がある。

上記のイメージを焼いたmicroSDカードを開発マシンに接続する。 ここでは、microSDカードのデバイスパスは /dev/sda であるとする。 以下のコマンドを実行し、microSDカードの第一パーティションをマウントする。

sudo mkdir -p /media/BOOT
sudo mount /dev/sda1 /media/BOOT

以下のコマンドを実行し、PetaLinux Toolsで生成した system.dtb で上書きする。

sudo cp system.dtb /media/BOOT/

以下のコマンドを実行し、microSDカードをアンマウントする。

sudo umount /media/BOOT/
sudo eject /dev/sda