编译Yocto GENIVI Baseline

博主在Ubuntu18.04.4上编译Yocto GENIVI Baseline时遇到诸多问题,如打包失败、系统无法启动等,重装系统后又有网卡驱动问题。之后用docker安装ubuntu16.04编译,完成Layer和Target配置后进行编译和模拟运行,发现Lifecycle三个服务中node - health - monitor.service无法启动。

2022.5.6
插曲:
五一前开始在我的Ubuntu18.04.4上编译Yocto GENIVI Baseline,刚开始MACHINE选的是qemux86-64,最后打包的时候一直失败无法解决,改为qemuarm64后终于成功了。不幸的是后面为了看node health monitor和node state manager的代码,由于有一部分代码是编译时动态生成的,我尝试在主机上编译上述代码,结果编到依赖systemd的时候不小心把systemd的输出文件安装到系统目录了,导致我的Ubuntu18.04.4无法启动。更悲催的是,当我尝试进recovery模式时发现由于systemd不能用,网络服务都启动不了,根本没法联网修复系统。接下来只好备份近百G的数据,做Ubuntu启动盘重装系统。重装后又是一堆麻烦事,首先网卡不能用,不能联网,系统默认没有make和gcc,需要通过启动盘安装。由于新装的ubuntu18.04小版本是6,内核版本跟之前还不一样,导致原来的网卡驱动源代码编译不了,在网上搜索好用的网卡驱动代码又花了将近一天的时间,真是折腾。。。

Host环境搭建
由于之前用ubuntu18.04编译Yocto GENIVI Baseline的时候被提示说ubuntu18.04是未被验证的主机版本,而Yocto GENIVI Baseline最后版本的时间大致是2018年,所以这次打算用docker安装ubuntu16.04来编译。
用docker安装和运行ubuntu16.04的指令:

docker_cmd

1.3 KB

其中ubuntu16.04的docker安装是基于 https://hub.docker.com/r/cdbishop89/docker-ubuntu-16.10 上的指令。
使用的Dockerfile,基于https://github.com/cdbishop/docker-ubuntu-16.04修改:

Dockerfile

958 Bytes

这里面主要注意两点:

  1. yocto编译不能以root身份进行,必须是一般的用户。而上述github项目提供的默认Dockerfile创建出来的ubuntu16.04默认是root用户登陆的,所以修改了Dokerfile,使得默认用户是当前用户(即$USER)
    2 yocto的bitbake执行时要求设置LOCAL,所以在docker运行ubuntu后要安装local并设置LOCAL,相关的命令参见上面的docker_cmd

Layer和Target配置

bblayers.conf

1.1 KB

local.conf

10.8 KB

MACHINE ?= “qemuarm64”
INCOMPATIBLE_LICENSE = “GPLv3”
DISTRO = “poky-ivi-systemd”
BB_NUMBER_THREADS = “4”
PARALLEL_MAKE = “-j 4”
CONNECTIVITY_CHECK_URIS = “https://www.baidu.com/”
编译
cd genivi_baseline
source poky/oe-init-build-env
bitbake ivi-image

Target模拟运行
初始状态
runqemu qemuarm64
结果卡死:

改为runqemu qemuarm64 nographic解决,启动画面如下:

用户名:root
密码:root
查看Lifecycle服务是否启动:
ps -e | grep -i node
没有任何输出
查找Lifecycle服务名:
ls /lib/systemd/system -la | grep -i node

可见Lifecycle服务分别为:
node-health-monitor.service
node-startup-controller.service
nodestatemanager-daemon.service
查看服务状态:
systemctl status node-health-monitor.service
发现服务为disabled + dead
systemctl status node-startup-controller.service
发现服务为enabled + dead
systemctl status nodestatemanager-daemon.service
发现服务为disabled + dead
启用服务:
systemctl enable node-health-monitor.service
systemctl enable nodestatemanager-daemon.service
reboot重启
再次查看服务状态:
systemctl status node-health-monitor.service
发现服务为enabled + dead
systemctl status node-startup-controller.service
发现服务为enabled + dead
systemctl status nodestatemanager-daemon.service
发现服务为running状态
手动启动服务:
systemctl start node-health-monitor.service
启动失败,错误为main loop exited
systemctl start node-startup-controller.service
可以启动。查看源代码发现该服务没有循环,所以执行完后会退出,属于正常。
至此,Lifecycle三个服务只剩下node-health-monitor.service无法启动。

Yocto 项目中,编译工具链和单独编译 U-Boot 是嵌入式 Linux 开发中的常见需求。以下是具体的步骤和方法: ### 编译工具链 Yocto 提供了用于构建交叉编译工具链的功能,可以通过以下方式生成工具链: 1. **构建完整的 SDK 工具链** 在构建完整的镜像时,可以通过指定 `TOOLCHAIN_TARGET_TASK` 来包含目标工具链。例如,执行以下命令来构建适用于目标设备的工具链: ```bash bitbake <image-name> -c populate_sdk ``` 其中 `<image-name>` 是你正在构建的镜像名称,如 `core-image-minimal`。该命令将生成一个 SDK 安装脚本,位于 `tmp/deploy/sdk/` 目录下。 2. **安装 SDK 工具链** 生成的 SDK 是一个自包含的安装包,可以通过运行以下命令进行安装: ```bash tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-armv7vehf-neon-toolchain-*.sh ``` 安装后,可以在宿主机上使用该工具链进行交叉编译。 3. **使用 `meta-toolchain` 构建最小工具链** 如果只需要构建工具链而不需要完整的镜像,可以使用 `meta-toolchain`: ```bash bitbake meta-toolchain ``` 该命令将生成一个仅包含工具链的 SDK,适用于需要轻量级开发环境的场景。 ### 单独编译 U-Boot Yocto 支持单独编译 U-Boot,而无需构建整个系统镜像。以下是具体步骤: 1. **确定 U-Boot 的配方名称** U-Boot 的配方名称通常为 `u-boot` 或带有特定供应商/平台后缀的版本,例如 `u-boot-stm32`。可以通过以下命令查找: ```bash bitbake-layers show-recipes u-boot ``` 2. **编译 U-Boot** 使用以下命令单独编译 U-Boot: ```bash bitbake u-boot ``` 该命令会下载源码、打补丁、配置并编译 U-Boot。编译生成的文件通常位于 `tmp/work/<machine>-poky-linux-gnueabi/u-boot/<version>/build/` 目录下。 3. **指定编译目标(可选)** 如果需要编译特定的 U-Boot 配置,可以在 `local.conf` 或机器配置文件中添加: ```bash UBOOT_CONFIG_append = " my_config" ``` 然后在 U-Boot 的 bbappend 文件中定义 `my_config` 的具体配置选项。 4. **获取编译结果** 编译完成后,U-Boot 的二进制文件(如 `u-boot.bin` 或 `u-boot.img`)可以在 `tmp/deploy/images/<machine>/` 目录下找到。 ### 示例:查看 U-Boot 编译日志 如果需要调试编译过程,可以查看任务日志: ```bash bitbake -c cleansstate u-boot bitbake -v u-boot ``` 上述命令将强制重新编译 U-Boot 并显示详细的编译信息,有助于排查问题。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值