Yocto ProjectによるLinuxの作成 Vol.1

Petalinuxをお使いのみなさま、こんにちは。
本ブログではYocto ProjectによるLinuxの作成方法についてシリーズでご案内します。
今回は、ツール環境のインストールからLinuxレシピのダウンロード、評価ボードBSPを使ったLinuxのBuild、QEMUでの実行と実機での起動について紹介します。
なお、カーネルやRootFSのコンフィギュレーション、カスタムデザインへの対応方法については次回に解説します。
それではよろしくお願いします。
目次
- 1. ツール環境のインストール
- 2. Linuxレシピのダウンロード
- 3. 評価ボードBSPを使ったLinuxのBuild
- <手順1> 環境設定
- <手順2> SDカード書き込みイメージファイルの生成設定
- <手順3> LinuxのBuild実行
- MACHINEに使えるパラメータについて
- Linuxの種類について
- Linux Buildのログについて
- 4. QEMUでの実行と実機での起動
- QEMUによるLinuxの起動ログ
- SD BootによるLinuxの起動
- 5. おわりに
【ホストPCの環境】
OS | Ubuntu 22.04 |
---|---|
CPU | Intel® Core™ i9-10980XE CPU @ 3.00GHz |
Memory | 128GByte |
本ブログではこれらの手順を確認しながら補足します。
1. ツール環境のインストール
“Repo” repository management tools : git管理ツールです。
(~/bin/repoフォルダを作成します)
$ mkdir -p ~/bin/repo
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
上記によってホームディレクトリ内にrepo をインストールし、環境変数 PATHにてパスを通すという方法が公式ですが、OSによっては、以下でも可能です。
$ sudo apt install repo
- ※
- gitに対してuser.emailとuser.nameを求められたら以下を登録してください。
$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
その他のモジュールは以下が必要とされています。
sudo apt-get install -y gawk wget git-core diffstat unzip texinfo build-essential chrpath socat cpio python3 python3-pip
python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev
pylint xterm python3-subunit mesa-common-dev lz4
Petalinuxユーザでしたら、Petalinuxに必要なモジュールのインストールは完了していると思います。
筆者の環境では、lz4を追加で要求されました。
2. Linuxレシピのダウンロード
Yoctoはレシピに従ってLinuxをBuildします。
AMDではGitHubにYocto Project用にマニフェスト(Manifest)を用意しており、repoコマンドによってManifestに記載されているレシピをダウンロードします。(“rel-v2023.2”がマニフェストです)
任意のフォルダ(今回はyocto2023_2_zcu102)を作成し、その中で以下のコマンドを実行します。
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102$ repo init -u https://github.com/Xilinx/yocto-manifests.git -b rel-v2023.2
Downloading Repo source from https://gerrit.googlesource.com/git-repo
... A new version of repo (2.45) is available.
... New version is available at: /home/work//YOCTO/yocto2023_2_zcu102/.repo/repo/repo
... The launcher is run from: /usr/bin/repo
!!! The launcher is not writable. Please talk to your sysadmin or distro
!!! to get an update installed.
Your identity is: Masaharu Takizawa <masaharu_takizawa@paltek.co.jp>
If you want to change this, please re-run 'repo init' with --config-name
repo has been initialized in /home/work/YOCTO/yocto2023_2_zcu102
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102$ repo sync
... A new version of repo (2.45) is available.
... New version is available at: /home/work/YOCTO/yocto2023_2_zcu102/.repo/repo/repo
... The launcher is run from: /usr/bin/repo
!!! The launcher is not writable. Please talk to your sysadmin or distro
!!! to get an update installed.
Fetching: 100% (19/19), done in 19.854s
Fetching: 100% (1/1), done in 1.850s
Checking out: 95% (19/20), done in 2.480s
repo sync has finished successfully.
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102$ repo start rel-v2023.2 --all
... A new version of repo (2.45) is available.
... New version is available at: /home/work/YOCTO/yocto2023_2_zcu102/.repo/repo/repo
... The launcher is run from: /usr/bin/repo
!!! The launcher is not writable. Please talk to your sysadmin or distro
!!! to get an update installed.
Starting rel-v2023.2: 100% (20/20), done in 1.724s
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102$
ここでは、Linuxのバージョンを指定してレシピをダウンロードします。この中に、評価ボードのBSP(Board Support Package)が含まれています。ターゲットを指定するのはこれ以降になります。
作成されたディレクトリおよびファイルは以下です。
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102$ ls *
setupsdk
sources/
manifest meta-kria meta-openembedded meta-ros meta-virtualization meta-xilinx-tools
yocto-scripts meta-aws meta-mingw meta-petalinux meta-security meta-vitis
meta-xilinx-tsn meta-jupyter meta-openamp meta-qt5 meta-system-controller meta-xilinx
poky
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102$
3. 評価ボードBSPを使ったLinuxのBuild
<手順1> 環境設定
環境設定を上記“setupsdk”で行います。
$ cd ./yocto2023_2_zcu102
$ source setupsdk
ディレクトリは
$ ・・/yocto2023_2_zcu102/build
になります。このbuild/ フォルダでLinuxをBuildします。
再度Buildやカーネルコンフィグを実行する場合は、このコマンドで環境設定を行います。
<手順2> SDカード書き込みイメージファイルの生成設定
BuildによってSDカード書き込みイメージファイル(*.wic)が生成されるように、build/conf/local.confに以下の行を追加します。
# This sets the default machine to be qemux86-64 if no other machine is selected:
MACHINE ??= “zynqmp-generic”
IMAGE_FSTYPES:append=” wic”
<手順3> LinuxのBuild実行
ターゲットプラットフォームを指定してLinuxのBuildを実行します。
今回はターゲットプラットフォーム(MACHINE)にzcu102-zynqmpを使用します。
Linuxの内容は“petalinux-image-minimal”を使います。
…/yocto2023_2_zcu102/build$ MACHINE=zcu102-zynqmp bitbake petalinux-image-minimal
MACHINEに使えるパラメータについて
source/meta-xilinx/meta-xilinx-bsp/conf/machine/内に以下のxxx.confファイルが存在します。
ac701-microblazeel.conf vek280-versal.conf zcu102-zynqmp.conf
kc705-microblazeel.conf vhk158-versal.conf zcu104-zynqmp.conf
kcu105-microblazeel.conf vmk180-versal.conf zcu106-zynqmp.conf
microblazeel-v11.0-bs-cmp-mh-div-generic.conf vpk120-versal.conf zcu111-zynqmp.conf
microblazeel-v11.0-bs-cmp-ml-generic.conf vpk180-versal.conf zcu208-zynqmp.conf
vck190-versal.conf zc1254-zynqmp.conf zcu216-zynqmp.conf
vck5000-versal.conf zc702-zynq7.conf zcu670-zynqmp.conf
vcu118-microblazeel.conf zc706-zynq7.conf
Linuxの種類について
source/meta-petalinux/recipes-core/images/内にRootFSへ実装するパッケージを定義した***.incが存在します。
$ ls petalinux-i*
petalinux-image-common.inc petalinux-image-full.inc
petalinux-image-everything.bb petalinux-image-minimal.bb
petalinux-image-full.bb petalinux-initramfs-image.bb
petalinux-image-minimalはpetalinux-image-common.incを使用し、最低限のモジュールが実装されます。
petalinux-image-fullはpetalinux-image-full.incに登録されているOpenCV,python,V4L2,Gstreamerなども実装されます。
Linux Buildのログについて
- 右の「+ボタン」を押すと、Linux Buildのログがご覧いただけます。
-
左右にスクロールしてご覧ください
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102/build$ MACHINE=zcu102-zynqmp bitbake petalinux-image-minimal NOTE: Started PRServer with DBfile: /home/work/YOCTO/yocto2023_2_zcu102/build/cache/prserv.sqlite3, Address: 127.0.0.1:41237, PID: 318797 Loading cache: 100% | | ETA: --:--:-- Loaded 0 entries from dependency cache. Parsing recipes: 100% |######################################################################################################################| Time: 0:00:27 Parsing of 4423 .bb files complete (0 cached, 4423 parsed). 6362 targets, 344 skipped, 1 masked, 0 errors. NOTE: Resolving any missing task queue dependencies Build Configuration: BB_VERSION = "2.2.0" BUILD_SYS = "x86_64-linux" NATIVELSBSTRING = "ubuntu-22.04" TARGET_SYS = "aarch64-xilinx-linux" MACHINE = "zcu102-zynqmp" DISTRO = "petalinux" DISTRO_VERSION = "2023.2+snapshot-cc311829b3c9900c4a807b6c53041cade5bb9656" TUNE_FEATURES = "aarch64 armv8a crc cortexa72-cortexa53" TARGET_FPU = "" SOC_VARIANT = "eg" XILINX_RELEASE_VERSION = "v2023.2" XILINX_XSCT_VERSION = "2023.2" DISTRO_NAME = "PetaLinux" ROS_DISTRO = "humble" ROS_VERSION = "2" ROS_PYTHON_VERSION = "3" meta meta-poky = "rel-v2023.2:c572c1a1e0ea573e64a2864d8893800104d36a67" meta-microblaze meta-xilinx-core meta-xilinx-standalone meta-xilinx-bsp meta-xilinx-vendor = "rel-v2023.2:c6ae24ee38a69e4bcd463337aed43276d70845df" meta-xilinx-tools = "rel-v2023.2:4fbf7b158b6f72250212d024840636e30a9e34b8" meta-perl meta-python meta-filesystems meta-gnome meta-multimedia meta-networking meta-webserver meta-xfce meta-initramfs meta-oe = "rel-v2023.2:4c7ef6548bc26754243547b55d6d5844563e39a2" meta-xilinx-contrib = "rel-v2023.2:c6ae24ee38a69e4bcd463337aed43276d70845df" meta-virtualization = "rel-v2023.2:3eafe79389cb0a58a9c7fbeebcf215aad8903910" meta-openamp = "rel-v2023.2:aa1edd482265f0a29f3c269590da54141ceb228a" meta-kria = "rel-v2023.2:fdd40e2f62e5b419497148f8e8b7fda7dfb3f6af" meta-security meta-tpm = "rel-v2023.2:a4562b19126ab655869da6db40e8eff49f84c490" meta-xilinx-tsn = "rel-v2023.2:54d9d3801979451fc413d6dc6c09525c3fe9bb2a" meta-petalinux = "rel-v2023.2:cc311829b3c9900c4a807b6c53041cade5bb9656" meta-qt5 = "rel-v2023.2:1a917695e439d602ec85e1db4e0478533cfbfaa8" meta-aws = "rel-v2023.2:0b47914b4465257295dbf13f54f4026c5830cbbe" meta-ros-common meta-ros2 meta-ros2-humble = "rel-v2023.2:b937872e702d325e83b7b466783a5702ecec0f60" meta-jupyter = "rel-v2023.2:ad54a81a36e2734284709cee118c1944e6d510e7" meta-system-controller = "rel-v2023.2:129d09e66831ef49ed7a7200121b26fca8b479ad" meta-vitis = "rel-v2023.2:83a6ec4fa3f54974ea5eae4502baa172140cf82f" NOTE: Fetching uninative binary shim http://downloads.yoctoproject.org/releases/uninative/3.9/x86_64-nativesdk-libc-3.9.tar.xz;sha256sum=3dd82c3fbdb59e87bf091c3eef555a05fae528eeda3083828f76cd4deaceca8b (will check PREMIRRORS first) NOTE: Fetching xsct binary tarball from http://petalinux.xilinx.com/sswreleases/rel-v2023/xsct-trim/xsct-2023-2_1002.tar.xz;sha256sum=903c8853320e40ed0b23fdf735f88c5a14f945bf92b363f097b8290b523f4016;downloadfilename=xsct_2023.2.tar.xz NOTE: Extracting external xsct-tarball to sysroots Initialising tasks: 100% |###################################################################################################################| Time: 0:03:15 Sstate summary: Wanted 1601 Local 0 Mirrors 0 Missed 1601 Current 0 (0% match, 0% complete) NOTE: Executing Tasks NOTE: Tasks Summary: Attempted 4070 tasks of which 0 didn't need to be rerun and all succeeded. eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102/build$
Buildによって作成されたファイルは 以下に格納されています。
build/tmp/deploy/images/zcu102-zynqmp/
4. QEMUでの実行と実機での起動
QEMUでの実行と実機での起動において、筆者の環境では以下のコマンドが必要でした。
…/yocto2023_2_zcu102/build$ MACHINE=zcu102-zynqmp runqemu qemuparams='-serial mon:stdio' petalinux-image-minimal
QEMUの終了はCrtl-A xです。
QEMUによるLinuxの起動ログ
- 右の「+ボタン」を押すと、QEMUによるLinuxの起動ログがご覧いただけます。
-
左右にスクロールしてご覧ください
eng@eng-server-p1:~/YOCTO/yocto2023_2_zcu102/build$ MACHINE=zcu102-zynqmp runqemu qemuparams='-serial mon:stdio' petalinux-image-minimal runqemu - INFO - Running MACHINE=zcu102-zynqmp bitbake -e petalinux-image-minimal... runqemu - INFO - Continuing with the following parameters: KERNEL: [] DTB: [/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/devicetree/system-top.dtb] MACHINE: [zcu102-zynqmp] FSTYPE: [wic.qemu-sd] ROOTFS: [/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/petalinux-image-minimal-zcu102-zynqmp.wic.qemu-sd] CONFFILE: [/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/petalinux-image-minimal-zcu102-zynqmp.qemuboot.conf] runqemu - INFO - Setting up tap interface under sudo [sudo] password for eng: runqemu - INFO - Network configuration: ip=192.168.7.2::192.168.7.1:255.255.255.0::eth0:off:8.8.8.8 runqemu - INFO - Running /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-system-aarch64-multiarch -net nic -net nic -net nic -net nic,netdev=net0,macaddr=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=sd,index=1,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/petalinux-image-minimal-zcu102-zynqmp.wic.qemu-sd,format=raw -hw-dtb /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/qemu-hw-devicetrees/multiarch/zcu102-arm.dtb -global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true -device loader,addr=0xfffc0000,data=0x584c4e5801000000,data-be=true,data-len=8 -device loader,addr=0xfffc0008,data=0x0000000800000000,data-be=true,data-len=8 -device loader,addr=0xfffc0010,data=0x1000000000000000,data-be=true,data-len=8 -device loader,addr=0xffd80048,data=0xfffc0000,data-len=4,attrs-secure=on -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/arm-trusted-firmware.elf,cpu-num=0 -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/u-boot.elf -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/system.dtb,addr=0x100000,force-raw=on -boot mode=5 -pmu-args ' -M microblaze-fdt -display none -hw-dtb /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb -kernel /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/pmu-rom.elf -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/pmu-firmware-zcu102-zynqmp.elf -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4 -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4 ' -machine arm-generic-fdt -m 4096 -serial mon:stdio -serial mon:vc -display none runqemu - INFO - Host uptime: 2100398.62 PMU instance cmd: /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-system-microblazeel -M microblaze-fdt -display none -hw-dtb /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb -kernel /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/pmu-rom.elf -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/pmu-firmware-zcu102-zynqmp.elf -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4 -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4 -machine-path /tmp/tmp6l_u3wrb APU instance cmd: /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-system-aarch64 -net nic -net nic -net nic -net nic,netdev=net0,macaddr=52:54:00:12:34:02 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -drive if=sd,index=1,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/petalinux-image-minimal-zcu102-zynqmp.wic.qemu-sd,format=raw -hw-dtb /home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/qemu-hw-devicetrees/multiarch/zcu102-arm.dtb -global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true -device loader,addr=0xfffc0000,data=0x584c4e5801000000,data-be=true,data-len=8 -device loader,addr=0xfffc0008,data=0x0000000800000000,data-be=true,data-len=8 -device loader,addr=0xfffc0010,data=0x1000000000000000,data-be=true,data-len=8 -device loader,addr=0xffd80048,data=0xfffc0000,data-len=4,attrs-secure=on -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/arm-trusted-firmware.elf,cpu-num=0 -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/u-boot.elf -device loader,file=/home/work/YOCTO/yocto2023_2_zcu102/build/tmp/deploy/images/zcu102-zynqmp/system.dtb,addr=0x100000,force-raw=on -boot mode=5 -machine arm-generic-fdt -m 4096 -serial mon:stdio -serial mon:vc -display none -machine-path /tmp/tmp6l_u3wrb PMU Firmware 2023.2 Mar 18 2024 06:43:04 PMU_ROM Version: xpbr-v8.1.0-0 NOTICE: BL31: Non secure code at 0x8000000 NOTICE: BL31: v2.8(release):xlnx_rebase_v2.8_2023.2_ksb_aug NOTICE: BL31: Built : 12:21:43, Aug 31 2023 U-Boot 2023.01 (Mar 14 2024 - 11:48:04 +0000) CPU: ZynqMP Silicon: v3 Chip: unknown Model: ZynqMP ZCU102 Rev1.0 Board: Xilinx ZynqMP DRAM: 2 GiB (effective 4 GiB) PMUFW: v1.1 : See 'systemctl status nfsserver.service' for details. [ OK ] Reached target Multi-User System. Starting Record Runlevel Change in UTMP... [ OK ] Finished Record Runlevel Change in UTMP. PetaLinux 2023.2+snapshot-cc311829b3c9900c4a807b6c53041cade5bb9656 zcu102-zynqmp ttyPS0 zcu102-zynqmp login: petalinux You are required to change your password immediately (administrator enforced). New password: Retype new password: [ 685.052728] audit: type=1006 audit(1713689938.107:2): pid=380 uid=0 old-auid=4294967295 auid=1000 tty=(none) old-ses=4294967295 ses=1 res=1 [ 685.053490] audit: type=1300 audit(1713689938.107:2): arch=c00000b7 syscall=64 success=yes exit=4 a0=8 a1=ffffe9263a90 a2=4 a3=1 items=0 ppid=1 pid=380 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=1 comm="(systemd)" exe="/lib/systemd/systemd" key=(null) [ 685.054863] audit: type=1327 audit(1713689938.107:2): proctitle="(systemd)" zcu102-zynqmp:~$
SD BootによるLinuxの起動
buid/tmp/deploy/images/zcu102-zynqmp/petalinux-image-minimal-zcu102-zynqmp.wicをBalera EtcherツールなどでSDに書き込みます。
URL: https://etcher.balena.io/
SDカードBootモードでLinuxが起動します。
5. おわりに
いかがでしたでしょうか。
ここまでLinuxのビルド環境構築から、QEMUシミュレータと実機での起動確認まで、さまざまな作業を行ってきました。
評価ボード用のBSPを使い、Linux種別やビルドオプションなどを設定しながら、ビルド作業を進めていきました。SDカード書き込み用イメージの生成も行い、QEMUでのLinux起動を確認できました。そして実際の評価ボードでも、SDカードブートによりLinuxが起動することを確認しました。
各手順に沿って実践することで、組み込みLinuxのビルドプロセスをご理解いただけたのではないでしょうか。
いよいよここからが本番です。本ブログで構築したカスタムLinuxに、皆さんの作りたいアプリケーションの実装や、独自のデバイスドライバの組み込みなどを行い、目的の組み込みシステムに仕上げていってください!
弊社ではFPGA設計や回路図設計、レイアウト設計、ソフトウェア設計、筐体設計などを受託開発しています。
サービス内容をWEBサイトに掲載していますので、ぜひご覧ください。
FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。
最後までご覧いただきありがとうございました。
参考文献(AMDサイト)
- 最新のYoctoに関するサイト
Xilinx Wiki:Building Linux Images Using Yocto - PetalinuxからYoctoへの移行ガイド
Xilinx Wiki:PetaLinux to Yocto - Command Cross Reference