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
这里面主要注意两点:
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无法启动。