1. 株式会社PALTEK
  2. TECHブログ
  3. 技術情報
  4. Yocto ProjectによるLinuxの作成 Vol.1

TECHブログ

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

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

Petalinuxをお使いのみなさま、こんにちは。
本ブログではYocto ProjectによるLinuxの作成方法についてシリーズでご案内します。

今回は、ツール環境のインストールからLinuxレシピのダウンロード、評価ボードBSPを使ったLinuxのBuild、QEMUでの実行と実機での起動について紹介します。
なお、カーネルやRootFSのコンフィギュレーション、カスタムデザインへの対応方法については次回に解説します。

それではよろしくお願いします。

目次

【ホスト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
ポイント
qemuparams='-serial mon:stdio'で、このオプションによって標準入出力の設定が必要だった

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サイトに掲載していますので、ぜひご覧ください。

設計受託・ODMの概要については
こちら

FPGAの活用に際して設計検討などありましたら、お気軽にお問い合わせください。

FPGAの活用・設計検討の
お問い合わせはこちら

最後までご覧いただきありがとうございました。

参考文献(AMDサイト)

このブログのシリーズ

関連ブログ