はじめに
最近いろんなところで 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氏 から情報を頂きました。
他にも cgroups とか namespaces も必要なのかも? ZynqMP-FPGA-Linux では CONFIG_CGROUPS=y だが CONFIG_NAMESPACES is not set だ。https://t.co/ztbLLB4DZY
— 隠居したエンジニア (@ikwzm) 2022年3月21日
なるほど、カーネルのコンフィギュレーションが必要なようです。
さっそく、カーネルのコンフィギュレーションに挑戦してみました。
環境は 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 が動いてくれました。\(^^)/
最近は 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
としてみたところ、どうやら入ったように思えます。