2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Ultra96/Ultra96-V2 向け Ubuntu20.04で Lima を動かしてみた(Ubuntu Desktop ビルド編)

Posted at

はじめに

Lima とは Mali-400/450 用のオープンソースなグラフィックドライバです。筆者は Lima を Ultra96/Ultra96-V2 向け Ubuntu 20.04 で試験的に動かしてみました。動かすのに少々苦労したので、その方法を何回かに分けて説明します。

以下の URL に Ultra96/Ultra96-V2 用に Lima に対応した Ubuntu 20.04 Desktop Root File System を用意しています。

この記事では Ubuntu 20.04 Desktop のRoot File System のビルド方法について説明します。

なお、現時点(2021年4月)では、Ubuntu 20.04 の gnome-shell が動作するところまで確認していますが、すべてのアプリケーションで動作を確認したわけでは無いことに注意してください。

概要

Ubuntu 20.04 Desktop の Root File System をビルドするのは一筋縄ではいきませんでした。いろいろ試行錯誤した結果、次のように5ステップに分けてビルドしました。ちょっと面倒くさいです。他に良い方法があれば教えてください。

  1. Ubuntu(18.04) がインストールされたPCでQEMU を動かして、その上で Ubuntu 20.04 の Conole 版(Desktop 無しの CUI オンリー版) をビルドする。
  2. Ultra96 に 1. でビルドした Ubuntu 20.04 Console版をインストールする。
  3. Ubuntu 20.04 Console 版をインストールした Ultra96 上で、DDX Xlnx の Debian パッケージをビルドする。
  4. Ubuntu 20.04 Console 版をインストールした Ultra96 上で、DRI Lima の Debian パッケージをビルドする。
  5. Ubuntu 20.04 Console 版をインストールした Ultra96 上で、1.でビルドした Root File System を展開して chroot し、3.でビルドした Debian パッケージを含む Ubuntu 20.04 Desktop をインストールする。

ぶっちゃけ面倒くさいですが、Ubuntu なので、一度ビルドしてしまえばあとあと楽です。自分でビルドするのが面倒な人は前述の URL からダウンロードしてください。

1. Console 版のビルド

ビルド環境の準備

Ubuntu 20.04 Console 版をビルドするためには、QEUM(arm64 版) がインストールされた Linux が必要です。

shell$ apt-get install qemu-user-static debootstrap binfmt-support

Linux Kernel 用の Debian パッケージをダウンロードします。

shell$ git clone --depth 1 -b build git://github.com/ikwzm/ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96.git
shell$ cd ZynqMP-FPGA-Ubuntu20.04-Lima-Ultra96
shell$ git lfs pull

環境変数の設定

shell$ export targetdir=ubuntu20.04-console-rootfs
shell$ export distro=focal

ステージ1

shell$ mkdir                                               $PWD/$targetdir
shell$ sudo debootstrap --arch=arm64 --foreign $distro     $PWD/$targetdir
shell$ sudo cp /usr/bin/qemu-aarch64-static                $PWD/$targetdir/usr/bin
shell$ sudo cp /etc/resolv.conf                            $PWD/$targetdir/etc
shell$ sudo cp scripts/build-ubuntu20.04-console-rootfs.sh $PWD/$targetdir
shell$ sudo cp linux-*.deb                                 $PWD/$targetdir
shell$ sudo mount -vt proc proc                            $PWD/$targetdir/proc
shell$ sudo mount -vt devpts devpts -o gid=5,mode=620      $PWD/$targetdir/dev/pts

ステージ2

これ以降は QEMU(arm64版) と chroot を使って Root File System を構築します。

shell$ sudo chroot $PWD/$targetdir

ここから、次の2種類の方法があります。

  1. build-debian9-rootfs-with-qemu.sh を使って楽々構築
  2. 一歩一歩コマンドを打ち込みつつ構築

どちらもやってることは同じなので、ここでは一歩一歩コマンドを打ち込む方法を説明します。

 APT の設定

ubuntu20.04-rootfs# distro=focal
ubuntu20.04-rootfs# export LANG=C
ubuntu20.04-rootfs# /debootstrap/debootstrap --second-stage
ubuntu20.04-rootfs# cat <<EOT > /etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports focal-security main restricted universe multiverse
deb-src http://ports.ubuntu.com/ubuntu-ports focal-security main restricted universe multiverse
EOT
ubuntu20.04-rootfs# cat <<EOT > /etc/apt/apt.conf.d/71-no-recommends
APT::Install-Recommends "0";
APT::Install-Suggests   "0";
EOT

 パッケージの更新

ubuntu20.04-rootfs# apt-get -y update
ubuntu20.04-rootfs# apt-get -y upgrade

 基本的なアプリケーションのインストール

ubuntu20.04-rootfs# apt-get install -y locales dialog
ubuntu20.04-rootfs# dpkg-reconfigure locales
ubuntu20.04-rootfs# apt-get install -y net-tools openssh-server ntpdate resolvconf sudo less hwinfo ntp tcsh zsh file

 hostname の設定

ここでは ubuntu-fpga という名前をつけています。ここらへんはお好みに合わせてください。

ubuntu20.04-rootfs# echo ubuntu-fpga > /etc/hostname

 root のパスワードの設定

ubuntu20.04-rootfs# passwd

ここで rootのパスワードを何にするか聞かれるので適当に admin とか入力してください。

さらに、シリアルポートから root へのログインを許可しておきます。

ubuntu20.04-rootfs# cat <<EOT >> /etc/securetty
# Seral Port for Xilinx Zynq
ttyPS0
EOT

 FPGA ユーザーの追加

ubuntu20.04-rootfs# adduser fpga

ここで fpga ユーザーのパスワードを何にするか聞かれるので適当に fpga とか入力してください。

fpga ユーザーに sudo の実行許可を与えます。

ubuntu20.04-rootfs# echo "fpga ALL=(ALL:ALL) ALL" > /etc/sudoers.d/fpga

sshd config の設定

ubuntu20.04-rootfs# sed -i -e 's/#PasswordAuthentication/PasswordAuthentication/g' /etc/ssh/sshd_config

 Time Zone の設定

ubuntu20.04-rootfs# dpkg-reconfigure tzdata

または Time Zone を 非インタラクティブに Asia/Tokyoに設定したい時は次のようにしてください。

ubuntu20.04-rootfs# echo "Asia/Tokyo" > /etc/timezone
ubuntu20.04-rootfs# dpkg-reconfigure -f noninteractive tzdata

 fstab の設定

ubuntu20.04-rootfs# cat <<EOT > /etc/fstab
none            /config         configfs        defaults        0       0
/dev/mmcblk0p1  /mnt/boot       auto            defaults        0       0
EOT

Configuration File System を /config にマウントしておきます。Configuration File System は Device Tree Overlay で使います。

 /lib/firmware の設定

ubuntu20.04-rootfs# mkdir /lib/firmware
ubuntu20.04-rootfs# mkdir /lib/firmware/ti-connectivity
ubuntu20.04-rootfs# mkdir /lib/firmware/mchp

 各種アプリケーションのインストール

ubuntu20.04-rootfs# apt-get install -y build-essential
ubuntu20.04-rootfs# apt-get install -y pkg-config
ubuntu20.04-rootfs# apt-get install -y curl
ubuntu20.04-rootfs# apt-get install -y git
ubuntu20.04-rootfs# curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
ubuntu20.04-rootfs# apt-get install -y git-lfs
ubuntu20.04-rootfs# apt-get install -y kmod
ubuntu20.04-rootfs# apt-get install -y flex bison
ubuntu20.04-rootfs# apt-get install -y u-boot-tools device-tree-compiler
ubuntu20.04-rootfs# apt-get install -y libssl-dev
ubuntu20.04-rootfs# apt-get install -y socat
ubuntu20.04-rootfs# apt-get install -y ruby rake ruby-msgpack ruby-serialport
ubuntu20.04-rootfs# apt-get install -y python3 python3-dev python3-setuptools python3-wheel python3-pip python3-numpy
ubuntu20.04-rootfs# pip3 install msgpack-rpc-python

必要なアプリケーションはここでインストールします。何をインストールするかはお好みで。

 Wireless tools and firmware のインストール

Ultra96 は WiFi と Bluetooth を持っています。通常は WiFi でネットワークに接続します。すぐに WiFi と Bluetooth が使えるようにこの段階で必要なパッケージと firmware をインストールしておきます。

ubuntu20.04-rootfs# apt-get install -y wireless-tools
ubuntu20.04-rootfs# apt-get install -y wpasupplicant

Ultra96 に搭載されている WiFi Chip の firmware を TI のリポジトリからダウンロードして /lib/firmware/ti-connectivity にコピーします。

ubuntu20.04-rootfs# git clone git://git.ti.com/wilink8-wlan/wl18xx_fw.git
ubuntu20.04-rootfs# cp wl18xx_fw/wl18xx-fw-4.bin /lib/firmware/ti-connectivity
ubuntu20.04-rootfs# rm -rf wl18xx_fw/

Ultra96 に搭載されている Bluetooth Chip の firmware を TI のリポジトリからダウンロードして /lib/firmware/ti-connectivity にコピーします。

ubuntu20.04-rootfs# git clone git://git.ti.com/wilink8-bt/ti-bt-firmware
ubuntu20.04-rootfs# cp ti-bt-firmware/TIInit_11.8.32.bts /lib/firmware/ti-connectivity
ubuntu20.04-rootfs# rm -rf ti-bt-firmware

Ultra96-V2 に搭載されている WiFi Chip の firmware を Microchip のリポジトリからダウンロードして /lib/firmware/mchp にコピーします。

ubuntu20.04-rootfs# git clone git://github.com/linux4wilc/firmware  linux4wilc-firmware  
ubuntu20.04-rootfs# cp linux4wilc-firmware/*.bin /lib/firmware/mchp
ubuntu20.04-rootfs# rm -rf linux4wilc-firmware  

 Network-Manager のインストール

ubuntu20.04-rootfs# apt-get install -y network-manager

 その他のアプリケーションのインストール

ubuntu20.04-rootfs# apt-get install -y samba
ubuntu20.04-rootfs# apt-get install -y avahi-daemon
ubuntu20.04-rootfs# apt-get install -y haveged

 Linux Kernel Module のインストール

ubuntu20.04-rootfs# dpkg -i linux-image-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima_5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-1_arm64.deb

 Linux Kernel ヘッダーファイルのインストール

ubuntu20.04-rootfs# dpkg -i linux-headers-5.4.0-xlnx-v2020.2-zynqmp-fpga-lima_5.4.0-xlnx-v2020.2-zynqmp-fpga-lima-1_arm64.deb

 Debian パッケージを /home/fpga/debian に移動

ubuntu20.04-rootfs# mkdir              home/fpga/debian
ubuntu20.04-rootfs# mv *.deb           home/fpga/debian
ubuntu20.04-rootfs# chown fpga.fpga -R home/fpga/debian

 APT Cache の掃除

APT Cache に大量にダウンロードしたパッケージがキャッシュされていますが、そのままだと Root File System が大きくなるので、掃除して身軽にしておきます。

ubuntu20.04-rootfs# apt-get clean

 後始末

ubuntu20.04-rootfs# exit
shell$ sudo rm -f  $PWD/$targetdir/usr/bin/qemu-aarch64-static
shell$ sudo rm -f  $PWD/$targetdir/build-ubuntu20.04-console-rootfs.sh
shell$ sudo umount $PWD/$targetdir/proc
shell$ sudo umount $PWD/$targetdir/dev/pts

ubuntu20.04-console-rootfs.tgz のビルド

shell$ cd $PWD/$targetdir
shell$ sudo tar cfz ../ubuntu20.04-console-rootfs.tgz *

2. Console 版のインストール

SD-Card への書き込み

基本的にはインストール編で説明した内容と同じ要領で SD-Card に書き込みます。ただしRootFS Partition には、前章でビルドした ubuntu20.04-console-rootfs.tgz を使用します。

shell# tar xfz ubuntu20.04-console-rootfs.tgz -C /mnt/usb2

システムコンソールをシリアルポートに変更

ディスプレイとキーボードでも作業できますが、シリアルポートを使いたい場合は、uEnv.txt の linux_boot_args_console に "console=ttyPS0,115200" を指定します。

linux_boot_args_console=console=ttyPS0,115200

ネットワークの設定

後述の DDX Xlnx や DRI Lima の Debian パッケージをビルドするためには Ultra96/Ultra96-V2 がインターネットに接続されていなければなりません。ネットワークの設定は nmcli コマンド(Network-Manager の CUI 版)を使って行います。Desktop 版がまだなので GUI 版は使えません。

shell# nmcli device wifi con <SSID> password <password>

<SSID> と <password> は各自の環境にあわせて変更してください。

3. DDX Xlnx Debian パッケージのビルド

DDX Xlnx は、ZynqMP で DRM(Direct Rendering Manager) Xlnx を動かすための DDX(Device Dependent X) ドライバです。また、共有バッファ編ストライド問題編で説明したような変更が行われています。

ビルド環境の準備

DDX Xlnx をビルドするためには、インターネットに接続している Ubuntu 20.04 がインストールされた ZynqMPが必要です。インストール編で紹介した Ubuntu 20.04 Desktop 版か、前章で紹介した Ubunt20.04 Console版がインストールされた Ultra96/Ultra96-V2 を用意してください。

用意した Ubuntu 20.04(on Ultra96/Ultra96-V2) に、ビルドに必要なパッケージをインストールします。

fpga@ubuntu-fpga:~/work$ apt install libdrm-dev libudev-dev libxext-dev pkg-config x11proto-core-dev x11proto-fonts-dev x11proto-gl-dev x11proto-xf86dri-dev xutils-dev xserver-xorg-dev quilt dh-autoreconf debhelper

ダウンロード

共有バッファ編ストライド問題編で説明したような変更を反映した DDX Xlnx のソースコードを https://github.com/ikwzm/xf86-video-armsoc-xilinx からダウンロードします。まだ開発中のため、タグは v1.5-alpha8 のものを使います。

fpga@ubuntu-fpga:~/work$ git clone --branch v1.5-alpha8 https://github.com/ikwzm/xf86-video-armsoc-xilinx
fpga@ubuntu-fpga:~/work$ cd xf86-video-armsoc-xilinx

Configure と Makefile の生成

fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ ./autogen.sh
     :
fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ make distclean
     :

Debian パッケージのビルド

fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ sudo debian/rules binary  

これで xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb ができるはずです。

fpga@ubuntu-fpga:~/work/xf86-video-armsoc-xilinx$ dpkg --info ../xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb

4. DRI Lima Debian パッケージのビルド

DRI Lima はMesa の DRI(Direct Rendering Infrastructure)ドライバです。DRI Lima 編 で説明したように、DRI Lima は Mesa の DRI ドライバを xlnx に対応するように修正したものです。修正内容に関しては DRI Lima 編 を参照してください。

ビルド環境の準備

Mesa をビルドするためには、インターネットに接続している Ubuntu 20.04 がインストールされた ZynqMPが必要です。インストール編で紹介した Ubuntu 20.04 Desktop 版か、前章で紹介した Ubunt20.04 Console版がインストールされた Ultra96/Ultra96-V2 を用意してください。

用意した Ubuntu 20.04(on Ultra96/Ultra96-V2) に、Mesa のビルドに必要なパッケージをインストールします。

fpga@ubuntu-fpga:~/work$ sudo apt-get build-dep mesa
fpga@ubuntu-fpga:~/work$ sudo apt-get install cmake valgrind libunwind-dev libconfig-dev

ダウンロード

DRI Lima 編 で説明した修正内容は https://github.com/ikwzm/mesa-xlnx にパッチファイルとして提供しています。

fpga@ubuntu-fpga:~/work$ git clone --branch mesa-xlnx-20.2.6 https://github.com/ikwzm/mesa-xlnx
fpga@ubuntu-fpga:~/work$ cd mesa-xlnx

mesa-xlnx のディレクトリに Mesa のソースコードをダウンロードします。

fpga@ubuntu-fpga:~/work/mesa-xlnx$ apt-get source mesa=20.2.6-0ubuntu0.20.04.1
fpga@ubuntu-fpga:~/work/mesa-xlnx$ cd mesa-20.2.6

ソースコードの修正

DRI Lima 編 で説明した修正内容を Mesa のソースコードに反映します。

fpga@ubuntu-fpga:~/work/mesa-xlnx/mesa-20.2.6$ patch -p1 < ../files/mesa-xlnx-20.2.6.diff

Debian パッケージのビルド

fpga@ubuntu-fpga:~/work/mesa-xlnx/mesa-20.2.6$ sudo debian/rules binary  

Mesa のパッケージをまるごと全部ビルドすることになるので、かなりの時間がかかります。ビルドした Debian パッケージ達の中に libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb が含まれているはずです。これが DRI Lima 「だけ」を含んだ Debian パッケージです。

fpga@ubuntu-fpga:~/work/mesa-xlnx/mesa-20.2.6$ dpkg --info ../libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb

5. Desktop 版のビルド

ビルド環境の準備

Ubuntu 20.04 Desktop 版の Root File System をビルドするためは、インターネットに接続している Ubuntu 20.04 がインストールされた ZynqMPが必要です。インストール編で紹介した Ubuntu 20.04 Desktop 版か、前章で紹介した Ubunt20.04 Console版がインストールされた Ultra96/Ultra96-V2 を用意してください。Ubuntu 20.04 Desktop 版の Root File System をビルドするためは、以下のファイルが必要です。

  • 「1. Console 版のビルド」で作ったubuntu20.04-console-rootfs.tgz
  • 「3. DDX Xlnx Debian パッケージのビルド」で作ったxserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb
  • 「4. DRI Lima Debian パッケージのビルド」で作った libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb

環境変数の設定

fpga@ubuntu-fpga:~/work$ export targetdir=ubuntu20.04-rootfs
fpga@ubuntu-fpga:~/work$ export distro=focal

ステージ1

ubuntu20.04-console-rootfs.tgz を展開し、xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb とlibgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb を展開先のディレクトリにコピーしておきます。

fpga@ubuntu-fpga:~/work$ mkdir $PWD/$targetdir
fpga@ubuntu-fpga:~/work$ sudo tar xfz ubuntu20.04-console-rootfs.tgz -C $PWD/$targetdir 
fpga@ubuntu-fpga:~/work$ sudo cp  xserver-xorg-video-armsoc-xilinx_1.5-alpha2_arm64.deb $PWD/$targetdir/home/fpga/debian/
fpga@ubuntu-fpga:~/work$ sudo cp libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0.20.04.1_arm64.deb  $PWD/$targetdir/home/fpga/debian/
fpga@ubuntu-fpga:~/work$ sudo mount -vt proc proc                            $PWD/$targetdir/proc
fpga@ubuntu-fpga:~/work$ sudo mount -vt devpts devpts -o gid=5,mode=620      $PWD/$targetdir/dev/pts

ステージ2

これ以降は chroot を使って Root File System を構築します。

fpga@ubuntu-fpga:~/work$ sudo chroot $PWD/$targetdir

 Ubuntu Desktop パッケージのインストール

ubuntu20.04-rootfs# apt-get install -y ubuntu-desktop

 DDX Xlnx Debian パッケージのインストール

ubuntu20.04-rootfs# dpkg -i /home/fpga/debian/xserver-xorg-video-armsoc-xilinx_1.5-alpha8_arm64.deb

 DRI Lima Debian パッケージのインストール

ubuntu20.04-rootfs# dpkg -i /home/fpga/debian/libgl1-mesa-xlnx-dri_20.2.6-0ubuntu0~20.04.1_arm64.deb

 xorg.conf の編集

ubuntu20.04-rootfs#  cp cat <<EOT > /etc/X11
Section	"Device"
	Identifier	"ZynqMP"
	Driver		"armsoc"
	Option		"DRI"		"3"
	Option		"NoFlip"	"false"
	Option		"Debug"		"false"
EndSection
Section	"Screen"
	Identifier	"DefaultScreen"
	Device		"ZynqMP"
EndSection
EOT

 LightDM のインストール

現状、Gnome 標準の Display Manager は何故か動作しません(現在原因究明中)。そこで LightDM を Display Manager としてインストールします。

ubuntu20.04-rootfs# apt install -y libpam-gnome-keyring libpam-kwallet5
ubuntu20.04-rootfs# apt install -y lightdm lightdm-settings slick-greeter

 サスペンドを無効にする

現状、Ultra96/Ultra96-V2 では、一度サスペンドモードに入ると復帰する手段がありません。そのため、Gnome Desktop でサスペンドに入らないようにする必要があります。具体的には次のように systemctl で mask してしまいます。サスペンドモードを無効にする方法は wiki.debian.org/Suspend にありました。

ubuntu20.04-rootfs# systemctl mask sleep.target suspend.target hybrid-sleep.target

 Upower Service のワークアラウンド

ubuntu20.04-rootfs# sed -i -e 's/PrivateUsers=yes/#PrivateUsers=yes/g'             /usr/lib/systemd/system/upower.service
ubuntu20.04-rootfs# sed -i -e 's/RestrictNamespaces=yes/#RestrictNamespaces=yes/g' /usr/lib/systemd/system/upower.service

 Gtk アプリケーションクラッシュのワークアラウンド

Gtk アプリケーションがクラッシュすることがあります。詳細は以下の URL を参照してください。

ubuntu20.04-rootfs# update-mime-database /usr/share/mime
ubuntu20.04-rootfs# /usr/lib/aarch64-linux-gnu/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache

 APT Cache の掃除

APT Cache に大量にダウンロードしたパッケージがキャッシュされていますが、そのままだと Root File System が大きくなるので、掃除して身軽にしておきます。

ubuntu20.04-rootfs# apt-get clean

 後始末

ubuntu20.04-rootfs# exit
fpga@ubuntu-fpga:~/work$ sudo rm -f  $PWD/$targetdir/usr/bin/qemu-aarch64-static
fpga@ubuntu-fpga:~/work$ sudo umount $PWD/$targetdir/proc
fpga@ubuntu-fpga:~/work$ sudo umount $PWD/$targetdir/dev/pts

ubuntu20.04-desktop-rootfs.tgz のビルド

shell$ cd $PWD/$targetdir
shell$ sudo tar cfz ../ubuntu20.04-desktop-rootfs.tgz *

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?