
作者:HiiragiKano(Github)
1.准备仓库
参考该文档的2.Prerequisites 和4.Syncing and Building software stack
repo init -u https://git.linaro.org/landing-teams/working/arm/arm-reference-platforms-manifest.git -m juno-yocto.xml -b refs/tags/JUNO-2020.08.28
出现SyntaxError: invalid syntax错误**
原因是需要python3版本,但是修改Ubuntu的默认python为python3仍有后续问题.
解决:
Download last version of repo :
curl https://storage.googleapis.com/git-repo-downloads/repo-1 > repo
Change right to make it executable :
chmod a+x repo
Run your repo init with python3 and the “repo” you just download :
python3 repo init -u [email protected]:xxx/xx_manifest.git -b xxx
因此最终使用如下命令初始化yocto仓库:
1 | mkdir <workspace> |
2.定制yocto
所有路径都假设当前在
workspace
目录下
增加包管理工具
在./conf/juno/local.conf
添加如下参数:
1 | IMAGE_FEATURES += "package-management" |
编译镜像
之后执行下面的那条命令开始编译一个带基本内核开发环境的镜像。
1 | bitbake core-image-kernel-dev |
该命令之后会自动下载所有的依赖源代码,包括内核,并编译。需要大量的时间,请耐心等待。当第一次成功后会建立cache,以后就很快了。
有时会出现个别task failed的问题。出现该问题的原因是因为网络问题导致下载的包源码错误,如遇到该问题,请根据终端的提示,确定失败的包,例如Binutil-2.30失败,则执行以下命令:
1 | bitbake -c cleanall Binutil-2.30 |
完成后再重新执行,会从上次进度继续
1 | bitbake core-image-kernel-dev |
配置Linux内核
当编译镜像步骤成功后,会在./build-poky/tmp-poky/deploy/images/juno
生成我们需要的内核和根文件系统。但此时的内核还无法启动,直接放到juno板上会出现**starting kernel
**卡死的问题。
因此我们需要config内核的编译选项。这里基于原版OE源码中的linux内核编译.config
为基础修改进行了配置,下载该newconfig
重命名后覆盖linux内核源码编译目录,例如./build-poky/tmp-poky/work/juno-poky-linux/linux-yocto/5.4.50+gitAUTOINC+416566e1f0_94667198aa-r0/linux-juno-standard-build
下的.config
。
之后按以下命令可以根据需求进一步配置,并编译和部署。
1 | #config |
3.安装
固件与内核
在./build-poky/tmp-poky/deploy/images/juno下,将固件firmware-image-juno.tar.gz下的所有内容解压到Juno Board的MMC SDcard。也可以继续用官方原版的固件,感觉没啥区别。
从./build-poky/tmp-poky/deploy/images/juno下找到编译出来的内核,例如Image--5.4.50+git0+416566e1f0_94667198aa-r0-juno-20210304043237.bin
,重命名为Image
并替换juno sdcard SOFTWARE
目录中的内核
根文件系统
按官方文档的根文件系统制作方法无效,在juno启动时会出现kernel panic.
因此手动准备一个U盘或硬盘。假设U盘为/dev/sdb,参考如下的格式和大小将U盘分为两个分区并格式化
1 | /dev/sdb/sdb1 fat16 100MB |
找到image下的rootfs压缩包,例如core-image-kernel-dev-juno-20210302135408.rootfs.tar.bz2
,解压所有文件到sdb2下,可能需要用到sudo。
4.配置包管理环境
按以上步骤成功进入系统后,开始配置包管理环境。Yocto的包管理机制是利用yocto的host主机作为服务器端来成为repo 源,在target机器使用dnf工具来进行安装。
Juno端配置
1 | 1.编辑/etc/dnf/dnf.conf,设置gpgcheck=0 |
Host端配置
1 | 1.初始化包索引 |
Juno端使用
1 | #更新缓存 |
5.安装sysdig
在安装前,先提前配置juno的环境。
1.使用dnf 安装实验所需工具cmake, git, pkgconfig, openssh-sftp-server, python3-pip, gdb,vim
2.配置linux kernel编译环境
1 | #忽略 |
3.编译安装sysdig
- 参考sysdig的安装说明文档,使用如下命令安装。
1 | mkdir build |
在make执行到编译最后一个依赖grpc时,会出现编译失败的问题。因juno安装的系统的glibc库是2.3版本,sysdig使用到的grpc是1.8版本,该旧版本的gettid()函数和新版本的glibc2.3有冲突,需手动修复。而grpc的src会在make命令开始后才会下载,因此无法提前修改。请按以下链接的commit操作对三个相应的grpc源码文件进行修改。https://github.com/grpc/grpc/pull/18950/commits/57586a1ca7f17b1916aed3dea4ff8de872dbf853
修改完成后重新执行
make
,会继续接着编译,最后应该就能顺利完成sysdig的构建。在Ubuntu主机交叉编译juno的驱动module。下载Arm官方的最新x86交叉编译工具链,至少9.3以上。yocto的交叉工具链gcc9.3在
./build-poky/tmp-poky/sysroots-components/x86_64/gcc-cross-aarch64/usr/bin/aarch64-poky-linux/
,但是缺少as,无法使用。将sysdig 的/driver文件夹单独拷贝到Ubuntu主机,修改
/src/Makefile
,将KERNELDIR
改为yocto仓库下的linux kernel目录,例如
KERNELDIR ?= /home/dog/Downloads/codework/yocto-juno/build-poky/tmp-poky/work/juno-poky-linux/linux-yocto/5.4.50+gitAUTOINC+416566e1f0_94667198aa-r0/linux-juno-standard-build/
- 手动指定下载的交叉编译工具链,进行sysdig驱动编译,命令可参考如下:
make ARCH=arm64 CROSS_COMPILE=/home/dog/Downloads/codework/cross-gcc-compile/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
- 将编译好的驱动.ko拷到juno上,加载驱动,运行sysdig!
1 | console=ttyAMA0,115200n8 root=/dev/sda2 rw rootwait earlycon=pl011,0x7ff80000 debug user_debug=31 androidboot.hardware=juno loglevel=9 iommu=memaper=3 |