基于RK3568的Yocto环境搭建与优化实践

基于RK3568的Yocto环境搭建与优化实践 1. 从零开始搭建RK3568的Yocto环境第一次接触RK3568和Yocto的时候我完全被各种术语和工具链搞晕了。后来在实际项目中摸爬滚打了几次才发现只要把环境搭建好后面的开发就会顺利很多。这里分享下我的经验希望能帮你少走弯路。首先得准备一台64位的Ubuntu主机我推荐用22.04 LTS版本稳定性有保障。记得安装前检查下磁盘空间建议至少预留100GB因为Yocto编译过程中会产生大量中间文件。安装完系统后第一件事就是配置编译环境sudo apt update sudo apt install -y gawk wget git-core diffstat unzip texinfo gcc \ multilib build-essential chrpath socat cpio python3 python3-pip \ python3-pexpect xz-utils debianutils iputils-ping python3-git \ python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm g \ libstdc6 lib32stdc6 libpulse-dev libevent-dev ninja-build \ rpm2cpio libswitch perl这个命令看起来很长但其实就是在安装各种编译工具和依赖库。我建议直接复制粘贴执行避免手动输入出错。安装完成后最好检查下关键工具的版本git --version # 需要1.8.3.1或更高 tar --version # 需要1.27.1或更高 python3 --version # 需要3.6.0或更高 gcc --version # 需要5.0或更高如果发现版本不达标可以通过apt升级或者手动编译安装新版。接下来要配置repo工具这是管理Yocto源码的关键mkdir -p ~/.bin echo export PATH${HOME}/.bin:${PATH} ~/.bashrc source ~/.bashrc curl https://storage.googleapis.com/git-repo-downloads/repo ~/.bin/repo chmod arx ~/.bin/repo这里有个小技巧把PATH配置写入.bashrc这样每次打开终端都会自动加载。我曾经忘记配置PATH结果每次都要手动指定repo路径特别麻烦。2. 获取和配置Yocto源码有了基础环境接下来就是获取Yocto源码。Rockchip官方提供了针对RK3568的BSP层我们需要先初始化repomkdir rk3568-yocto cd rk3568-yocto repo init -u https://github.com/rockchip-linux/manifests -b master -m rk356x_linux_release.xml repo sync -j$(nproc)这个过程可能会比较久取决于你的网络状况。我建议在晚上执行第二天早上就能用上。第一次同步时我遇到了几个坑网络中断导致同步失败需要重新执行repo sync磁盘空间不足建议至少预留50GB给源码权限问题确保你有足够的权限在目标目录操作同步完成后你会看到一个完整的Yocto目录结构。接下来初始化构建环境source poky/oe-init-build-env build这个命令会创建一个build目录并设置好各种环境变量。第一次执行时可能会报错通常是因为缺少某些依赖根据提示安装即可。3. 配置RK3568的BSP层Rockchip的BSP层包含了很多针对RK3568的优化和驱动支持。我们需要在local.conf中启用这些配置echo MACHINE rk3568-evb conf/local.conf echo DISTRO poky conf/local.conf echo PACKAGE_CLASSES package_rpm conf/local.conf echo EXTRA_IMAGE_FEATURES debug-tweaks conf/local.conf echo USER_CLASSES buildstats image-mklibs image-prelink conf/local.conf echo PATCHRESOLVE noop conf/local.conf echo BB_DISKMON_DIRS STOPTASKS,${TMPDIR},1G,100K WARN,${TMPDIR},512M,40K conf/local.conf这些配置做了几件事指定目标设备为rk3568-evb使用poky发行版启用RPM包管理添加调试功能设置磁盘空间监控我强烈建议在第一次构建前检查下BBLAYERS变量确保包含了Rockchip的BSP层bitbake-layers show-layers如果缺少某些层可以通过bitbake-layers add-layer命令添加。4. 构建基础镜像现在可以开始构建第一个镜像了。对于初次尝试建议从最小镜像开始bitbake core-image-minimal这个命令会启动构建过程可能需要几个小时取决于你的硬件配置。我的经验是16核CPU32GB内存的机器大约需要2小时8核CPU16GB内存的机器大约需要4小时笔记本上可能需要8小时以上构建过程中可能会遇到各种错误最常见的是网络问题导致下载失败可以手动下载放到downloads目录依赖冲突需要检查layer的兼容性内存不足可以尝试减少并行任务数-j参数第一次构建成功后可以尝试更复杂的镜像比如带Weston桌面的bitbake core-image-weston这个镜像包含了图形界面可以用来测试RK3568的GPU性能。5. 优化构建速度Yocto的构建速度是个老大难问题特别是全量构建时。经过多次实践我总结出几个有效的优化方法首先配置本地缓存sstate-cacheecho SSTATE_DIR ${TOPDIR}/sstate-cache conf/local.conf echo SSTATE_MIRRORS file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilenamePATH conf/local.conf这样构建产物会被缓存起来下次构建时可以直接复用。我专门用了一块SSD来存放sstate-cache效果很明显。其次调整并行任务数echo BB_NUMBER_THREADS 8 conf/local.conf echo PARALLEL_MAKE -j 8 conf/local.conf这个数字应该根据你的CPU核心数来设置一般设为核心数的1.5倍左右。第三使用预下载的源码包bitbake -c fetchall core-image-minimal这个命令会下载所有需要的源码包但不会开始构建。适合在网速好的时候先准备好。最后可以考虑使用构建服务器。我搭建了一台专门的构建服务器配置了ECC内存和高速SSD构建速度比笔记本快5倍以上。6. 常见问题排查在实际项目中我遇到过各种奇怪的问题这里分享几个典型案例问题1构建过程中报错no space left on device解决检查tmp目录空间可以通过修改local.conf调整echo TMPDIR /path/to/larger/disk/tmp conf/local.conf问题2包依赖冲突解决使用bitbake-gui可视化查看依赖关系bitbake-gui问题3构建成功后镜像无法启动解决检查机器配置是否正确特别是uboot和kernel的版本是否匹配。问题4网络代理导致下载失败解决配置wget和git的代理设置echo export http_proxyhttp://proxy.example.com:8080 ~/.bashrc echo export https_proxyhttp://proxy.example.com:8080 ~/.bashrc7. 进阶技巧当你熟悉了基本流程后可以尝试一些进阶操作自定义镜像创建自己的image recipe只包含需要的软件包。例如创建一个只包含Qt5的镜像inherit core-image IMAGE_INSTALL qtbase qtdeclarative qtquickcontrols2添加新软件包通过创建bb文件来添加自定义软件包。基本结构如下DESCRIPTION My custom package LICENSE MIT SRC_URI git://github.com/user/repo.git;branchmain S ${WORKDIR}/git inherit cmake调试构建问题使用devshell交互式调试bitbake -c devshell package-name这个命令会进入一个包含所有构建环境的shell方便调试。分析构建时间生成构建统计报告bitbake -m perf image-name这个报告会显示每个任务的耗时帮助找到性能瓶颈。8. 实际项目经验在最近的一个RK3568项目中我们遇到了一个棘手的问题系统启动后WiFi模块无法正常工作。经过排查发现是内核配置缺少必要的驱动支持。解决方法是在kernel recipe中添加SRC_URI file://enable-wifi.cfg然后在enable-wifi.cfg中配置CONFIG_CFG80211y CONFIG_MAC80211y CONFIG_RTL8XXXUy重新编译内核后问题解决。这个案例让我深刻体会到Yocto灵活性的价值但也反映出学习曲线确实比较陡峭。另一个经验是关于版本控制的。我强烈建议把整个Yocto目录包括downloads和sstate-cache之外的部分纳入版本控制。我们使用git管理通过.gitignore排除大文件和临时文件downloads/ sstate-cache/ tmp/ build/这样团队协作时能确保环境一致减少在我机器上是好的这类问题。