Ryuz's tech blog

FPGAなどの技術ブログ

Ultra96V2のDebianでDocker動かしてみた

はじめに

最近いろんなところで Docker の活用を聞きますし、私自身も多少は使ったことはあったのですが、Raspberry PI4 のおかげで aarch64 での利用も増えてきているようですので、Ultra96 でも動かないか挑戦してみました。

例によって、ikwzm氏のDebainイメージで作業を進めております。

Docker のインストール

RaspberryPi4 向けの記事としてこちらを参考にさせて頂きました。

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

とすればインストールでき、

sudo usermod -aG docker <username>

とすればユーザーに実行権限が付けられます。

しかしながら、このままでは Dokcer は動きません。

カーネルコンフィギュレーション

Twitterで呟いていたところ、有難いことに ikwzm氏 から情報を頂きました。

なるほど、カーネルコンフィギュレーションが必要なようです。

さっそく、カーネルコンフィギュレーションに挑戦してみました。

環境は WSL2 上の Ubuntu 20.04 で行い、今回はもろもろあって v2020.2.1 を利用いたしました。

基本的にはこちらの手順に従ってカーネルビルドしていけばよいようです(こんなやり方でいいのかはよくわかりませんが)。

この時に

make xilinx_zynqmp_defconfig

の直前で、 linux-xlnx-v2020.2-zynqmp-fpga/arch/arm64/configs/xilinx_zynqmp_defconfig を書き換える、もしくは、後から

make menuconfig

として、メニュー形式でオプションを変更すれば目的の事がやれそうです。

こちらの記事を参考にさせて頂き必要なオプションを有効にしました。

この際、そのままやると名前に -dirty が付いてしまうようです。正攻法でやると 一度ちゃんとコミットするべきなのでしょうが、私はこちらを参考に

CONFIG_LOCALVERSION_AUTO=n

としたうえで、さらに環境変数 LOCALVERSION を空定義することで暫定回避しました(これがないと末尾に + がついてしまう模様)。

ビルドが終わったら、target/Ultra96-V2/boot 以下のファイルを SD カードの boot パーティーションにコピーし、また、新しくできた deb ファイルもコピーして、debian 起動後に dpkg でインストールすればよいようです。

ちなみに、起動後は

zcat /proc/config.gz

とすることで、カーネルコンフィギュレーションの状況が確認できるようです。

なお、ここで、カーネルビルド時にできた deb ファイルを持ってきて、

sudo dpkg -i linux-image-5.4.0-xlnx-v2020.2-zynqmp-fpga_5.4.0-xlnx-v2020.2-zynqmp-fpga-4_arm64.deb
sudo dpkg -i linux-headers-5.4.0-xlnx-v2020.2-zynqmp-fpga_5.4.0-xlnx-v2020.2-zynqmp-fpga-4_arm64.deb

も実行しておきます。

加えて、 fclkcfg と u-dma-buf もセルフコンパイルして入れなおしてました。

iptables の置き換え

ここまできてもなお起動してくれず

sudo dockerd --debug

などとして調べていると、どうやら iptables がエラーを出しているようです。

調べてみると、こちらの記事にたどりついたので、そのまま参考にさせて頂き

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

としたところ、無事に

sudo systemctl restart docker

がエラー無く通りました。

下記のように無事に hello-world が動いてくれました。\(^^)/

Dockerの動作確認

最近は Ultra96 側でもいろいろなセルフコンパイルをするので、docker で環境が作れれば嬉しいシーンがあるかもしれません。

公式ツールが PetaLinux しかなかった時代に、debian イメージのおかげで apt が使えるだけでもすごい衝撃だったのですが、本当になんでもできてしまいますね。ありがたや。

おまけ(イメージの保存場所をNASに変更)

こちらの記事などを参考にすると、Dockerイメージの保存場所を変えることができるようです。

以前の記事で、Ultra96からNASをマウントしていますので、SDカードに置かずにNASにイメージを置くこともできるようです。

しかし実際にやってみるとなぜか run が異様に遅く、使い物になりませんでした。 何か設定に問題もあるのかもしれませんが、結局 デフォルトの場所(/var/lib/docker/)に戻しました。

おまけ2

xilinx_zynqmp_defconfig に追加した部分はこんな感じです。

CONFIG_LOCALVERSION_AUTO=n

CONFIG_NAMESPACES=y
CONFIG_NET_NS=y
CONFIG_PID_NS=y
CONFIG_IPC_NS=y
CONFIG_UTS_NS=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y
CONFIG_CPUSETS=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_KEYS=y
CONFIG_VETH=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NF_NAT_IPV4=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_NETFILTER_XT_MATCH_IPVS=y
CONFIG_IP_NF_NAT=y
CONFIG_NF_NAT=y
CONFIG_NF_NAT_NEEDED=y
CONFIG_USER_NS=y
CONFIG_SECCOMP=y
CONFIG_OVERLAY_FS=y
CONFIG_NET_CORE=y
CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_PIDS=y

下記は元々定義されていたので、確認してもし y や m になっていなければ y にすればいいようです。

CONFIG_OVERLAY_FS=y
CONFIG_CGROUPS=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_BRIDGE=y
CONFIG_NET=y
CONFIG_NETFILTER=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m

個人的な都合でついでに書きも付け加えました。

CONFIG_FUSE_FS=y
CONFIG_USB_RTL8152=y

CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_FTDI_SIO=y

おまけ3 (docker-compose )

docker-compose を入れようとしたら普通には入ってくれなかった。

こちらを参考にさせて頂き

sudo curl -L --fail https://raw.githubusercontent.com/linuxserver/docker-docker-compose/master/run.sh -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

としてみたところ、どうやら入ったように思えます。