工具:PetaLinux 2017.1
*20170918:找到了缩短Checking sstate mirror时间的方法。
1.按照本篇内容配置本地的sstate-cache中的arm/sstate-cache和downloads
2.在petalinux-build之前,断开linux的网络连接。
这样Checking sstate mirror这个步骤可能仅仅需要不到十秒钟。
*20170908:重新安装了2017.2的petalinux,并在第一个工程就使用了sstate-cache,在Checking sstate mirror这一步速度飞快,不到10秒。
不知道是跟2017.2这个版本有关系,还是说因为我在2017.1时候用了很久后才添加的sstate-cache,总之4~6秒的时间跟5分钟的时间比起来还是太快了。~*
使用PetaLinux的petalinux-build指令编译kernel和rootfs时候,跟2016.3一前的版本比较起来运行的特别慢,下图是控制台输出
那是因为PetaLinux从2016.4的版本开始使用了基于Yocto的工程,百度百科:Yocto
其实我还没有仔细学习它到底是个什么东东,只是些许明白Xilinx基于Yocto创建了一个貌似是全功能支持的PetaLinux,已经包含了全部的petalinux-image shared sstate-cache,Yocto将其分为了各个小块。
从Xilinx官网下载PetaLinux安装包时候,里面包含了最小配置的shared sstate-cache。当使用petalinux-build命令时,Yocto会先检查本地的state-cache来确认是否满足编译要求。如果本地的资源或者文件缺失,它会通过网络从Xilinx提供的一个网络地址上下载缺少的sstate-cache来补齐本地的数据,最终完成编译。下载地址可以在ug1144中找到,或者是通过petalinux-config –> Yocto Settings -> Network sstate feeds URL下看到,地址是:
http://petalinux.xilinx.com/sswreleases/rel-v2017.1/arm/sstate-cache
那么问题来了,每次新建一个工程都会有不同的rootfs配置,那么petalinux-build命令都需要在后台从Xilinx官网提供的网址去下载数据。。。。本来网速就不咋滴,还要去下载,只有两个词来形容这个过程: 慢,好慢。。而且每次petalinux-build都要重新进行Checking sstate mirror object availability检查,不知道是不是在线检查,好慢。。我只好分别针对kernel rootfs device-tree分别进行build来减少编译的时间。
所以没有办法,只能从官网去下载好。
Xilinx官网的Downloads -> Embedded Development页面下:网址。可以看到有一个sstate cache的文件。
就是它了,看起来好大,需要11.08GB。而我顺眼看了一下2017.2的版本需要18.66GB,天啊,我还是赶紧两个都提前下好吧。经过了好几天的下载,总是失败,终于在晚上没有关机的情况下下载速度达到了4MB/s的情况下下载完成。
顺便下载README看一下怎么使用。内容如下:
Setting local sstate-cache mirrors
1) Extract the downloaded tar contents of sstate-cache at any location
2) run petalinux-config
-> Yocto Settings
->Local sstate feeds settings
->local sstate url
(press Enter)
3) Provide the path of sstate-cache from above
Ex: //aarch64/sstate-cache for ZynqMP projects
//arm/sstate-cache for Zynq projects
//mb-lite/sstate-cache for MB AXI lite projects
//mb-full/sstate-cache for MB AXI full projects
4) Save the configurations to use the sstate-cache
5) verify the changes in build/conf/plnxtool.conf
6) petalinux-build
Setting download mirrors
1) Extract the downloaded tar contents of sstate-cache at any location
2) run petalinux-config
-> Yocto Settings
-> YOCTO SOURCE MIRROR URL
(X) external path
-> External Source Mirror url settings
() external source mirrors url path
(press Enter)
3) Provide the path of sstate-cache from above
file:////downloadsfor all projects
4) Save the configurations to use the download mirrors
5) verify the changes in build/conf/plnxtool.conf
6) petalinux-build
下面在一个工程中测试一下。
首先将下载好的state-rel-v2017.1.tar.gz解压,在其目录中即可看到sstate-cache,其中包括了4种,分别是针对zynq的arm文件夹,针对ultrascale+的aarch64文件夹,针对microblaze的mb-full和mb-lite文件夹。
$ petalinux-config
Yocto Settings --->
YOCTO SOURCE MIRROR URL (external path) --->
External Source Mirror url settings --->
() external source mirrors url path ---> enter
file:///home/vacajk/Development/software/sstate-rel-v2017.1/downloads
Local sstate feeds settings --->
() local sstate feeds url ---> enter
/home/vacajk/Development/sstate-rel-v2017.1/arm/sstate-cache
保存,退出。
打开工程中的文件:./build/conf/plnxtool.conf验证是否成功修改了sstate-cache的目标地址。
PREMIRRORS_prepend = "git://.*/.* file:///home/vacajk/Development/sstate-rel-v2017.1/downloads \n \
ftp://.*/.* file:///home/vacajk/Development/sstate-rel-v2017.1/downloads \n \
http://.*/.* file:///home/vacajk/Development/sstate-rel-v2017.1/downloads \n \
https://.*/.* file:///home/vacajk/Development/sstate-rel-v2017.2/downloads \n"
SIGGEN_UNLOCKED_RECIPES += "arm-trusted-firmware busybox"
IMAGE_CLASSES_remove = "xilinx-bootbin"
UNINATIVE_DLDIR = "/opt/pkg/petalinux/components/yocto/source/arm/downloads/uninative"
SSTATE_MIRRORS = "file://universal/(.*) file:///opt/pkg/petalinux/components/yocto/source/arm/sstate-cache/universal-4.8/\1\n"
SSTATE_MIRRORS .= "\nfile://.* file:///opt/pkg/petalinux/components/yocto/source/arm/sstate-cache/PATH\n"
SSTATE_MIRRORS_append = " \
file://.* file:///home/vacajk/Development/sstate-rel-v2017.1/arm/sstate-cache/PATH \n \
file://.* http://www.author.xilinx.com/sswreleases/rel-v2017.1/arm/sstate-cache/PATH;downloadfilename=PATH \n \
file://.* http://petalinux.xilinx.com/sswreleases/rel-v2017.1/arm/sstate-cache/PATH;downloadfilename=PATH \n \
"
MACHINE = "plnx_arm"
PACKAGE_CLASSES = "package_rpm"
EXTERNAL_TOOLCHAIN_microblaze = "/opt/pkg/petalinux/tools/linux-i386/microblazeel-xilinx-linux-gnu"
DL_DIR = "${TOPDIR}/downloads"
SSTATE_DIR = "${TOPDIR}/sstate-cache"
XILINX_SDK_TOOLCHAIN = "/opt/pkg/petalinux/tools/hsm"
IMAGE_LINGUAS = " "
TMPDIR = "/home/vacajk/Development/petalinux/zed_video/zed_video/build/tmp"
看起来说是有了,试一下petalinux-build。
$ petalinux-build
因为我这个工程比较稳定了,编译了很多次了,看起来也没什么加速,但对于有新需求的肯定有加速,尤其是需要使用PetaLinux中rootfs内自带的库时,肯定加速效果明显。
编译过一次后,petalinux-build指令主要消耗的时间是在Checking sstate mirror object availability上,我的工程里没有加任何其他内容,这个过程有两次,每次一般需要使用4分钟左右(我的i9神机。。。跑的CentOS 7.3虚拟机)。
先这样吧,之后准备使用PetaLinux中rootfs自带的OpenCV试一试。