编辑
2025-01-20
工作知识
0
请注意,本文编写于 137 天前,最后修改于 137 天前,其中某些信息可能已经过时。

目录

一、构建思路
二、EulerMaker工程构建原理
2.1 总结
三、EulerMaker镜像定制原理
3.1 总结
四、如何描述分层
五、总结

根据上面的文章,我们知道了EulerMaker(一)功能简介和EulerMaker(二)界面介绍,从功能上,我们知道了它是改进了标准发行版的系统构建工具,取yocto的分层思想而诞生的一个系统构建平台,从界面上,我们可以简单的点点就能完成软件包的构建和操作系统镜像的定制。本文主要根据其日志步骤来分析其基本原理

一、构建思路

系统构建有两条路,以自顶向下和自底向上,之前我解释过,如下:

自顶向下是描述操作系统默认是一个单独的发行版本,对于不同的需求,通过增加或移除软件包的方式来定制它。可以理解为减法 自底向上是描述一个操作系统版本,是根据其根本需求来从零逐步增加软件包来实现一个系统版本。可以理解为加法

可以知道,如果我们一味的选择自顶向下构建,那么我们需要具备一个全功能的操作系统,然后按照一个包一个包修改定制的方式来定制,类似于现在常见的发行版本,如debian,ubuntu,suse等。但它的缺点是定制能力不强,只能提供一个客户大而全的系统,而不是适用于客户业务场景的系统

而自底向上构建,我们需要针对每个源码,每个细节进行构建,然后整合成一个操作系统,类似于gentoo,yocto,buildroot等。它的缺点显而易见,从源码构建太慢,优点也十分突出,具备高定制能力,能够提供适用于客户场景的系统

目前来看,openeuler意识到了自顶向下的方式不太适用于当前市场,无论是服务器,桌面,手机,平板,电脑,车载还是嵌入式其他设备,都需要适合其场景的操作系统,而不是一个操作系统版本用在各个行业,所以openeuler提供了eulermaker来借鉴yocto的思维,实现自底向上构建,也就是俗称的:“搭积木的方式构建系统”

当前市场来看,所有受欢迎的电子设备产品,都是自底向上构建的,例如,安卓,苹果,特斯拉,鸿蒙,欧拉等,其因为良好的适配性,带来良好的用户体验,从而占领着各个软件行业市场。

二、EulerMaker工程构建原理

根据构建日志,我们可以分析其构建的原理

2024-10-09 17:05:42 starting DOCKER

根据此,我们可以知道EulerMaker默认在docker中构建

2024-10-09 17:06:19 RESULT_ROOT=/result/rpmbuild/2024-10-09/dc-64g/openeuler-24.03-lts-aarch64/aarch64-common-gitee.com-src-openeuler-bi/cbs.6536572

根据此,我们可以知道EulerMaker使用rpmbuild来执行软件包的构建

2024-10-09 17:06:48 Running transaction check 2024-10-09 17:06:48 Transaction check succeeded. 2024-10-09 17:06:48 Running transaction test 2024-10-09 17:06:48 Transaction test succeeded. 2024-10-09 17:06:48 Running transaction

根据此,我们可以知道其调用了yum/dnf来进行依赖拉包解决

2024-10-09 17:07:07 Complete! 2024-10-09 17:07:07 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.C1k8v5 2024-10-09 17:07:07 + umask 022 2024-10-09 17:07:07 + cd /home/lkp/rpmbuild/BUILD 2024-10-09 17:07:07 + cd /home/lkp/rpmbuild/BUILD 2024-10-09 17:07:07 + rm -rf binutils-2.41 2024-10-09 17:07:07 + /usr/lib/rpm/rpmuncompress -x /home/lkp/rpmbuild/SOURCES/binutils-2.41.tar.xz

根据此,我们可以大概率知道正在根据spec来运行构建操作,根据上面知道的,构建操作是通过rpmbuild来触发的。那么这个spec和文件如何获取呢?我们留意如下仓库:

https://gitee.com/src-openeuler/binutils

文件如下:

image.png 可以发现,这里存放了spec文件,源码tar.xz,补丁文件和服务于EulerMaker的binutils.yaml文件

2.1 总结

至此,我们可以知道,EulerMaker的构建工程是通过创建了一个docker环境,docker环境内部根据https://gitee.com/src-openeuler指定软件名的yaml文件来触发,通过spec文件来实施rpmbuild构建rpm包的

三、EulerMaker镜像定制原理

根据构建日志,我们可以分析其构建的原理

2024-09-26 09:35:08 starting DOCKER

这里还是使用docker

2024-09-26 09:35:47 + . /lkp/lkp/src/lib/chroot_libs.sh 2024-09-26 09:35:47 + trap restore_local_repo EXIT 2024-09-26 09:35:47 + make_ebs_iso 2024-09-26 09:35:47 ++ uname -m 2024-09-26 09:35:47 + ARCH=aarch64 2024-09-26 09:35:47 + '[' aarch64 '!=' aarch64 ']' 2024-09-26 09:35:47 + '[' '!' -n iso_normal ']' 2024-09-26 09:35:47 + '[' iso_normal == iso ']' 2024-09-26 09:35:47 + '[' iso_normal == embedded ']' 2024-09-26 09:35:47 + '[' '!' -n 2203sp2iso ']' 2024-09-26 09:35:47 + '[' '!' -n 1 ']' 2024-09-26 09:35:47 + '[' '!' -n https://repo.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP2/everything/aarch64/ ']' 2024-09-26 09:35:47 + yum install -y util-linux lsof

这里通过猜测可以发现和构建版本相关,make_ebs_iso是一个shell函数,描述iso的构建方式

2024-09-26 09:35:48 + backup_local_repo 2024-09-26 09:35:48 + '[' -d /etc/yum.repos.d ']' 2024-09-26 09:35:48 + rm -rf /etc/yum.repos.d.bak 2024-09-26 09:35:48 + mv /etc/yum.repos.d /etc/yum.repos.d.bak 2024-09-26 09:35:48 + config_ebs_repo 2024-09-26 09:35:48 + export yum_conf=/tmp/ebs-repo.conf 2024-09-26 09:35:48 + yum_conf=/tmp/ebs-repo.conf 2024-09-26 09:35:48 + rm -rf /tmp/ebs-repo.conf 2024-09-26 09:35:48 + touch /tmp/ebs-repo.conf 2024-09-26 09:35:48 + i=1 2024-09-26 09:35:48 + for repo in ${repo_url[@]} 2024-09-26 09:35:48 + cat 2024-09-26 09:35:48 + let i=i+1 2024-09-26 09:35:48 + '[' iso_normal == embedded ']' 2024-09-26 09:35:48 + '[' iso_normal == iso_normal ']' 2024-09-26 09:35:48 + chroot_run 'cd /lkp/lkp/src/tests/; bash make_iso_image.sh' 2024-09-26 09:35:48 + chroot_init 2024-09-26 09:35:48 + root_path=/usr1/openeuler

这里佐证了上面的猜测,在docker中实施了chroot命令,类似于运行chroot -c make_iso_image.sh

2024-09-26 09:36:33 Total 4.0 MB/s | 157 MB 00:38 2024-09-26 09:36:33 Running transaction check 2024-09-26 09:36:34 Transaction check succeeded. 2024-09-26 09:36:34 Running transaction test 2024-09-26 09:36:34 Transaction test succeeded. 2024-09-26 09:36:34 Running transaction

这里已经在chroot中通过yum安装二进制软件包了

2024-09-26 09:37:56 + pkgs='edk2-aarch64 2024-09-26 09:37:56 grub2-efi-aa64 2024-09-26 09:37:56 grub2-efi-aa64-modules 2024-09-26 09:37:56 kae-driver 2024-09-26 09:37:56 kae-openssl 2024-09-26 09:37:56 kae-zip 2024-09-26 09:37:56 uadk_engine 2024-09-26 09:37:56 libwd 2024-09-26 09:37:56 shim-aa64'

这里已经在制作grub2了

2024-09-26 09:48:46 + yumdownloader --resolve --installroot=/result/tmp/tmp --destdir=/result/tmp/iso/Packages/ yum.noarch xfsprogs.aarch64 wget.aarch64 vim-minimal.aarch64 util-linux.aarch64 uadk_engine.aarch64 tuned.noarch tmux.aarch64 systemd.aarch64 sysfsutils.aarch64 sudo.aarch64 sssd.aarch64 shim-aa64 shadow.aarch64 sg3_utils.aarch64 setup.noarch selinux-policy-targeted.noarch selinux-policy-mls.noarch security-tool.aarch64 rsyslog.aarch64 rpm.aarch64 rootfiles.noarch rng-tools.aarch64 realmd.aarch64 rdma-core.aarch64 procps-ng.aarch64 policycoreutils.aarch64 passwd.aarch64 parted.aarch64 openssh-server.aarch64 openssh-clients.aarch64 openssh.aarch64 openEuler-release.aarch64 openEuler-latest-release.aarch64 ncurses.aarch64 mdadm.aarch64 man-db.aarch64 lvm2.aarch64 lsscsi.aarch64 lshw.aarch64 lorax.aarch64 linux-firmware.noarch libwd.aarch64 libteam.aarch64 less.aarch64 kexec-tools.aarch64 kernel-tools.aarch64 kernel.aarch64 kdump-anaconda-addon.noarch kbd.aarch64 iscsi-initiator-utils irqbalance.aarch64 iputils.aarch64 iprutils.aarch64 iproute.aarch64 initscripts.aarch64 hostname.aarch64 grubby.aarch64 grub2-tools-extra.aarch64 grub2-tools.aarch64 grub2-efi-aa64-modules.noarch grub2-efi-aa64-cdboot.aarch64 grub2-efi-aa64.aarch64 glibc-all-langpacks.aarch64 glibc.aarch64 gfs2-utils.aarch64 firewalld.noarch filesystem.aarch64 fcoe-utils.aarch64 efibootmgr.aarch64 edk2-aarch64.noarch e2fsprogs.aarch64 dracut-network.aarch64 dracut-config-rescue.aarch64 dracut-config-generic.aarch64 dosfstools.aarch64 dnf-plugins-core.noarch dnf.noarch device-mapper-multipath curl.aarch64 cryptsetup.aarch64 cronie.aarch64 coreutils.aarch64 chrony.aarch64 bash.aarch64 basesystem.noarch authselect-compat.aarch64 authselect.aarch64 audit.aarch64 NetworkManager-config-server.noarch NetworkManager.aarch64 2024-09-26 09:48:47 Unable to detect release version (use '--releasever' to specify release version)

这里通过yumdownloader 批量拉包安装

2024-09-26 09:50:42 /opt/oemaker 2024-09-26 09:50:42 + cp /result/tmp/iso/GPG_tmp/etc/pki/rpm-gpg/RPM-GPG-KEY-openEuler /result/tmp/iso 2024-09-26 09:50:42 + rm -rf /result/tmp/iso/GPG_tmp 2024-09-26 09:50:42 + '[' 0 -ne 0 ']' 2024-09-26 09:50:42 + echo 'Waiting for lorax to finish...' 2024-09-26 09:50:42 + '[' standard == debug ']' 2024-09-26 09:50:42 + '[' standard == standard ']' 2024-09-26 09:50:42 + gen_standard_iso 2024-09-26 09:50:42 Waiting for lorax to finish... 2024-09-26 09:50:42 + '[' aarch64 == x86_64 ']' 2024-09-26 09:50:42 + '[' aarch64 == aarch64 ']' 2024-09-26 09:50:42 + mkisofs -R -J -T -r -l -d -joliet-long -allow-multidot -allow-leading-dots -no-bak -V 2203sp2iso-1-1-aarch64 -o /result/2203sp2iso-1-1-aarch64-dvd.iso -e images/efiboot.img -no-emul-boot /result/tmp/iso 2024-09-26 09:50:42 Warning: creating filesystem that does not conform to ISO-9660. 2024-09-26 09:50:42 Size of boot image is 14688 sectors -> No emulation

这里我们知道,通过oemaker封装了mkisofs来生成iso的镜像

3.1 总结

至此,我们可以知道,EulerMaker的镜像定制是通过创建了一个docker环境,docker环境内部沿用了常用的构建工具例如livebuild/koji,创建了chroot环境,在chroot中进行yum安装软件包,然后通过oemaker来制作iso镜像文件

四、如何描述分层

虽然我们上面可以发现EulerMaker好像和koji等其他构建平台相差无几,但是我们需要知道的是,分层是一种思想,也就意味着,在触发版本构建时,分层可以在网页中实施,所以我们日志分析不出来的。

不过我们需要明确知道的是,EulerMaker确实借鉴了yocto的分层思想,从而使得构建系统版本能够以搭积木的方式实施,而不是在原有的发行版本上增加和减少软件包。

五、总结

根据上面通过日志分析原理来看,我们可以发现,eulermaker通过封装了rpmbuild来实现了源码构建工程,在网页上通过设置的方式实现了分层概念,对于镜像定制,底层使用了oemaker来制作iso。其设计思路等价于如下:

koji+yocto分层思想

这样的设计是基于原有构建方案的优化,极大的改善了系统的碎片化问题,同时也降低了使用者的使用门槛,是真正意义上的全场景OS制作工具。