当前位置: 首页 > 工具软件 > Genivi > 使用案例 >

编译Yocto GENIVI Baseline

慕容恩
2023-12-01

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无法启动。

 类似资料: