文章分两部分,第一部分为编译安装qemu仿真器,用于后面测试编译出来的嵌入式镜像。第二部分为编译嵌入式镜像。编译环境的操作系统版本为openEuler 22.03 LTS, 运行在aarch64架构的虚拟机上。

编译qemu

安装依赖

安装编译qemu仿真器所需的依赖包。命令如下:

yum -y install flex glib2 glib2-devel libcap-ng-devel libattr-devel

不安装glib2执行依赖执行./configure可能会有如下报错:

ERROR: glib-2.48 gthread-2.0 is required to compile QEMU

不安装libca-ng-devel 和libattr-devel执行./configure --enable-virtfs可能会有如下报错:

ERROR: VirtFS requires libcap-ng devel and libattr devel

下载qemu源码并编译安装

openEuler Embedded官方文档要求qemu版本是5.0以上的。这里从qemu官网下载,命令如下:

wget https://download.qemu.org/qemu-5.0.0.tar.xz

tar xvJf qemu-5.0.0.tar.xz # 解压源码包

cd qemu-5.0.0 # 切换到源码目录

./configure  --enable-virtfs # 执行配置,过程如果报错缺少包,用yum安装相应的包即可。

make -j16        # 开16个编译任务,这一步在虚拟机上编译有点慢,耐心等待

make install # 执行安装

安装完成后,查看版本

安装完成后查看qemu的相关可执行文件

制作openEuler Embedded镜像

安装依赖包

缺少依赖包会导致编译过程中出现各种奇怪错误,建议先确保如下安装包已经安装上

yum install -y chrpath g++ patch rpcgen python rpmdevtools libtool* sqlite* bison cmake ninja* gettext* texinfo* meson* createrepo_c

下载yocto-meta-openEuler源码

命令如右:git clone https://gitee.com/openeuler/yocto-meta-openeuler.git -b openEuler-22.03-LTS -v src/yocto-meta-openeuler

我个人的下载路径为/mnt/embedded,下载完成后切换到scripts目录

cd ./src/yocto-meta-openeuler/scripts

 为脚本增加可执行权限:chmod +x compile.sh download_code.sh

下载打包文件: ./download_code.sh

这个过程比较久,耐心等待。

完成之后再下载gcc交叉编译工具,命令如下:

wget https://repo.openeuler.org/openEuler-22.03-LTS/EPOL/main/aarch64/Packages/gcc-cross-1.0-0.oe2203.aarch64.rpm

解压:

rpm2cpio gcc-cross-1.0-0.oe2203.aarch64.rpm | cpio -id

解压后可以看到当前路径下会有tmp目录,编译链存放于该目录下

ARM 32位工具链: openeuler_gcc_arm32le.tar.xz

ARM 64位工具链: openeuler_gcc_arm64le.tar.xz

再解压相应的要编译的版本的tar 包,这里我选择的是 openeuler_gcc_arm64le.tar.xz

解压完成后如下图所示:

注意:如果个人测试环境版本不是22.03 LTS的,需要自己编译一个交叉编译工具。该工具路径为src/yocto-embedded-tools/cross_tools,如何编译请查看该路径下README.md。

编译

切换到scripts工作目录:cd /mnt/embedded/src/yocto-meta-openeuler/scripts/

执行命令:

. ./compile.sh aarch64-std /mnt/build /mnt/tmp/openeuler_gcc_arm64le

注意:前面两个点之间有空格

接着按提示执行命令:bitbake openeuler-image openeuler-image-tiny

该命令会检查当前用户是否为root用户,如果是root用户会失败,可以通过注释掉相应的检查代码的方式让检查通过。

src/yocto-poky/meta/classes/sanity.bbclass:791: raise_sanity_error("Do not use Bitbake as root.", d)

这个编译过程比较久,请耐心等侯。编译完成之后在build路径下会生成我们测试需要的镜像,如下图所示:

测试镜像

现在就可以用第一步安装的qemu仿真器来测试这些镜像了。

注意这里编译出来的镜像是没有包括initrd文件的,可以用openEuler 21.09官网提供的,链接如下:

https://repo.openeuler.org/openEuler-21.09/embedded_img/qemu-aarch64/initrd

启动命令:

qemu-system-aarch64 -M virt-4.0 -cpu cortex-a57 -nographic -kernel zImage -initrd initrd -device virtio-9p-device,fsdev=fs1,mount_tag=host -fsdev local,security_model=passthrough,id=fs1,path=/      #这里path设置为/用于将host机的根目录映射到嵌入式仿真环境内。

创建挂载路径:mkdir /host 用于将host机的根目录挂载到它上面。

mount -t 9p -o trans=virtio,version=9p2000.L host /host

参考资料

1. 嵌入式linux之yocto(一)简述和目录

嵌入式linux之yocto(一)简述和目录_lljwork2021的博客-CSDN博客_linux yocto

2. openEuler Embedded使用与开发手册

https://openeuler.gitee.io/yocto-meta-openeuler/index.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐