发帖互助解决各类问题
Build bishengJDK-rpm package | linux服务器操作系统
从0到1构建bishengJDK-rpm包(基于openeuler和树莓派)
bishengJDK是Huawei内部OpenJDK定制版Huawei JDK的开源版本,是一个高性能、可用于生产环境的OpenJDK发行版。HuaweiJDK运行在华为内部500多个产品上,HuaweiJDK团队积累了丰富的开发经验,解决了业务实际运行中遇到的多个问题,并在ARM架构上进行了性能优化,毕昇JDK运行在大数据等场景下可以获得更好的性能。
RPM软件包管理器(RPM)是在Red Hat Enterprise Linux,CentOS和Fedora上运行的软件包管理系统,RPM可以更轻松地分发,管理和更新为Red Hat Enterprise Linux,CentOS和Fedora创建的软件。将软件打包到RPM软件包中有如下优点:安装、重新安装、删除、升级和验证软件包、将原始软件源打包为源包和二进制包、将软件包添加到Yum repositories、对packages进行数字签名等
本文通过两部分,分别在装有openEuler系统的虚拟机及装有openEuler系统的树莓派中对openjdk-1.8.0对rpm包构建过程进行解析。
一、基于openEuler的bishengJDK-rpm包构建过程解析
1、openEuler系统安装
openEuler系统镜像文件下载
openEuler是一款开源操作系统。当前openEuler内核源于Linux,支持鲲鹏及其它多种处理器,能够充分释放计算芯片的潜能,是由全球开源贡献者构建的高效、稳定、安全的开源操作系统,适用于数据库、大数据、云计算、人工智能等应用场景。同时,openEuler是一个面向全球的操作系统开源社区,通过社区合作,打造创新平台,构建支持多处理器架构、统一和开放的操作系统,推动软硬件应用生态繁荣发展。
进入openeuler官网https://www.openeuler.org/en/download/选择所需版本进行下载,这里选择openEuler 20.03 LTS,openEuler 20.03 LTS版的生命周期为四年,是一种标准发行版,可以满足开放方案的要求
![image-openEuler-version](/assets/1.1.b3395aa8.png)
选择好对应版本后点击Download,在版本Download界面选择ISO/进行镜像文件的下载,ISO文件为光盘的镜像文件,刻录软件可以直接把ISO文件刻录成可安装的系统光盘,ISO文件一般以iso为扩展名
![image-openEuler-20.03-LTS](/assets/1.2.220940a5.png)
在ISO/界面选择版本的所要下载的系统,openEuler 20.03 LTS的ISO下载列表有提供AArch64架构的ISO、x86_64架构的ISO及openEuler源码ISO,这里选择x86_64架构的ISO
![image-openEuler-ISO](/assets/1.3.db061cc8.png)
在/openEuler-20.3-LTS/ISO/x86_64/界面按照需求下载对应的ISO文件,这里下载openEuler-20.03-LTS-x86_64-dvd.iso
![image-openEuler-x86_64](/assets/1.4.158b8bf3.png)
新建虚拟机
通过VMware Workstation软件或者Oracle VM软件新建虚拟机,使用的ISO映像文件为下载的openEuler-20.03-LTS-x86_64-dvd.iso文件
![image-VMware](/assets/1.5.4736a080.png)
可在 openEuler INSTALLATION SUMMARY界面按需进行相关安装设置,如Keyboard、Language Support、Time&Date、Installation Destination等
![image-INSTALLATION SUMMARY](/assets/1.6.2b6c0634.png)
在“INSTALLATION SUMMARY”页面中选择“Installation Destination”,按需设置操作系统的安装磁盘及分区
![image-INSTALLATION Destination](/assets/1.7.3642a2fb.png)
对虚拟机的Root用户Password进行设置,root帐户是尝用来执行关键系统管理任务,不建议在日常工作及系统访问时使用root帐户
![image-CONFIGURATION](/assets/1.8.f857dff6.png)
![image-reroot](/assets/1.9.e543a6a5.png)
创建用户
useradd zhangsan //创建个人用户
passwd zhangsan //修改个人密码
su - zhangsan //切换至个人用户
![image-newuser](/assets/1.10.00a31127.png)
用户设置的root用户密码或新创建用户的密码均需要满足密码复杂度要求,否则会导致密码设置或用户创建失败。设置密码的复杂度的要求如下:口令长度至少8个字符、口令至少包含大写字母、小写字母、数字和特殊字符中的任意3种、口令不能和账号一样、口令不能使用字典词汇
连接远程网络工具MobaXterm
MobaXterm是进行远程计算的工具箱,MobaXterm专注于一个简单的目标:提供一个直观的用户界面,可以通过不同的网络或系统有效地访问远程服务器,虚拟机创建配置完成后,就可通过远程网络工具MobaXterm进行完成连接,虚拟机的IP地址由创建虚拟机后分配产生
![image-MobaXterm](/assets/1.11.845b6a20.png)
通过IP地址及用户名密码对openEuler虚拟机进行远程连接
![image-MobaXterm-SSH](/assets/1.12.5432b3f1.png)
2、安装依赖及源文件下载
rpm构建工具包安装
yum install rpm-build rpm-devel rpmdevtools
![image-rpmbuildtools](/assets/1.13.7d40e3d6.png)
查看软件包所提供的打包RPM的实用程序:rpm -ql rpmdevtools | grep bin
rpm -ql rpm-devel | grep bin
rpm -ql rpm-build | grep bin
![image-rpm -ql rpm-devel](/assets/2.28.05570c03.png)
其中rpmdev-setuptree:创建构造rpm打包空间的目录布局、rpmdev-newspec:创建一个未填充的SPEC文件、rpmbuild:从SPEC文件创建实际的rpm软件包、rpmspec:用于规格查询已解析输出的新命令
生成rpmbuild目录及相关子目录
进入个人文件夹下执行rpmdev-setuptree
自动生成rpmbuild目录及相关子目录
生成的rpmbuild目录及相关子目录如下图,BUILD目录:构建软件包时,%buildroot
将在此处创建各种目录。如果日志输出未提供足够的信息,这对于调查失败的构建很有用,RPMS目录:在不同体系结构的子目录中创建二进制RPM,例如在子目录x86_64
和中noarch
,SOURCES:在这里放置压缩的源代码存档和补丁,该rpmbuild
命令在此处查找,SPECS:存放SPECS文件,SRPMS:当rpmbuild
用于构建SRPM而不是二进制RPM时,将在此处创建结果SRPM
![image-rpmdev-setuptree-filelist](/assets/1.15.883e77b2.png)
源码包及spec文件准备
在/rpmbuild/SOURCES/文件夹下,进行需要构建rpm包的jdkSource文件下载git clone https://gitee.com/src-openeuler/openjdk-1.8.0.git
(若要构建其他版本jdk,则更换url即可),该openjdk的url:https://gitee.com/src-openeuler/openjdk-1.8.0
![.image-git clone jdk source](/assets/1.16.17a529f0.png)
将下载的jdk文件中的.spec文件移动到SPECS目录下mv ./openjdk-1.8.0/*spec ../SPECS/
![image-spec-preaparelist](/assets/1.18.2ff5dd45.png)
将余下的jdk文件中的其他文件移动至SOURCE文件夹下mv ./openjdk-1.8.0/* ./
![image-source-preparelist](/assets/1.20.e9b2029d.png)
jdk8安装及配置
可通过yum list | grep openjdk
查看openEuler附带的yum源内可安装的jdk版本,并进行安装,若没有所需jdk,则需要另行安装或者更新yum源
![image-yum list grep openjdk](/assets/2.23.38640445.png)
安装命令:yum install java-1.8.0-openjdk.x86_64
检查jdk是否安装成功java -version
![image-java -version](/assets/2.24.33c1519e.png)
Openjdk各个yum源所提供的版本如下:
https://repo.openeuler.org/openEuler-20.03-LTS/OS/x86_64/Packages/
![image-openEuler-21.03-os](/assets/2.25.4aba4075.png)
https://repo.openeuler.org/openEuler-20.03-LTS/everything/x86_64/Packages/
![image-openEuler-everything](/assets/2.26.70355813.png)
https://repo.openeuler.org/openEuler-21.03/everything/x86_64/Packages/
![image-openEuler-everything-jdk11](/assets/2.27.32365db4.png)
安装依赖
yum install alsa-lib-devel cups-devel elfutils-devel fontconfig-devel freetype-devel giflib-devel harfbuzz-devel lcms2-devel nss-devel
![image-reliant package](/assets/1.21.89bcf7ba.png)
若后续还存在其他依赖未安装,则使用yum install package
进行安装即可
3、rpm包构建
进入SPECS文件夹下,按需输入对应指令即可进行构建
rpmbuild -bi java-1.8.0-openjdk.spec //执行到install阶段
rpmbuild -bb java-1.8.0-openjdk.spec //生成rpm二进制包
rpmbuild -bs java-1.8.0-openjdk.spec //生成rpm源码包
rpmbuild -ba java-1.8.0-openjdk.spec //生成rpm二进制包和源码包
完成rpm包构建
![image-successful result](/assets/1.22.2c24c240.png)
文件列表
![tree](/assets/2.32.4937341e.png)
4、常见报错及解决方案
There are no enabled repositories in "/etc/yum.repos.d"
![image-there are no enabled repositories](/assets/1.23.3cb8abac.png)
解决方法:
cd /etc/yum.repos.d
vi openEuler_x86_64.repo
(若为arrch64系统则为vi openEuler_aarch64.repo
)
添加内容:
#generic-repos is licensed under the Mulan PSL v2.
#You can use this software according to the terms and conditions of the Mulan PSL v2.
#You may obtain a copy of Mulan PSL v2 at:
# http://license.coscl.org.cn/MulanPSL2
#THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
#PURPOSE.
#See the Mulan PSL v2 for more details.
[OS]
name=OS
baseurl=http://repo.openeuler.org/openEuler-20.03-LTS/OS/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler
[everything]
name=everything
baseurl=http://repo.openeuler.org/openEuler-20.03-LTS/everything/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS/everything/$basearch/RPM-GPG-KEY-openEuler
[EPOL]
name=EPOL
baseurl=http://repo.openeuler.org/openEuler-20.03-LTS/EPOL/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler
[debuginfo]
name=debuginfo
baseurl=http://repo.openeuler.org/openEuler-20.03-LTS/debuginfo/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS/debuginfo/$basearch/RPM-GPG-KEY-openEuler
[source]
name=source
baseurl=http://repo.openeuler.org/openEuler-20.03-LTS/source/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS/source/RPM-GPG-KEY-openEuler
[update]
name=update
baseurl=http://repo.openeuler.org/openEuler-20.03-LTS/update/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://repo.openeuler.org/openEuler-20.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler
该yum源来自于码云,链接如下:https://gitee.com/src-openeuler/openEuler-repos/blob/openEuler-20.03-LTS/generic.repo#
Failed build dependencies: packages is needed by java-1.8.0-openjdk-1:1.8.0.282.b08-17.x86_64
![image-packages is needed by java-1.8.0-openjdk](/assets/1.24.94ce09fe.png)
问题原因:specs文件中构建rpm包所需相应包未进行安装
解决方法:通过yum install packages
对对应包进行安装
yum install gdb java-1.8.0-openjdk-devel libX11-devel libXext-devel libXi-devel libXinerama-devel libXrender-devel libXt-devel libXtst-devel libjpeg-devel openssl-devel
![image-yum install packages](/assets/1.25.f1895230.png)
error:java-8-openjdk-devel is is needed by xxx
报错原因:spec文件中BuildRequires要求了openjdk-devel,当前安装的openjdk版本未满足要求
解决方法:若确定安装openjdk版本可以满足构建需求,则可将该行要求注释掉或者修改版本要求,若不确定当前版本是否满足构建需求,则可安装配置其要求的openjdk版本
![image-java-8-openjdk-devel is needed by xxx](/assets/1.26.6ea2dd11.png)
error:tzdate-java>=2020a is needed by xxx
报错原因:spec文件中BuildRequires要求了tzdate-java的版本,当前安装的版本未满足要求
解决办法:若确定安装tzdate-java版本可以满足构建需求,则可将该行要求注释掉或者修改版本要求,若不确定当前版本是否满足构建需求,则可安装配置其要求的版本
![image-tzdate-java](/assets/2.29.3676fac4.png)
error:Bad exit status from /var/tmp/rpm-tem.f4PLQX(%build)
原因:jdk8已经在系统配置完成,但是下载的spec文件还未进行修改,需进入spec文件把jdk的路径修改为本地jdk-8的路径
vim /root/rpmbuild/SPECS/java-1.8.0-openjdk.spec
?configure
找到configure配置位置,将jdk的路径改为自己本地安装的jdk8的路径
![image-Bad exit status from](/assets/1.27.c71da62d.png)
5、其他jdk版本rpm包构建
其他jdk版本,如果jdk11、jdk15等rpm包构建仅需要在源码包处下载对应版本的jdk源码包,更换对应的url,后续的jdk路径改成相应的jdk路径即可,其他构建过程与jdk8的rpm包构建相同,如有报错等信息都可参考jdk8的rpm包的构建过程
二、openEuler系统树莓派rpm包构建过程解析
1、openEuler系统iso镜像安装
安装要求
在树莓派环境上安装 openEuler 操作系统,则树莓派需要满足如下的硬件兼容性和最小硬件要求:树莓派版本3B、3B+、4B,内存:为了获得更好的应用体验,建议至少 4GB,硬盘:为了获得更好的应用体验,建议至少8GB,树莓派官网https://www.raspberrypi.org/,openEuler社区网站https://www.openeuler.org/en/download/
获取安装源
获取openEuler 发布的树莓派镜像及其校验文件,登录openEuler社区网站https://www.openeuler.org/en/download/,单击卡片 openEuler 20.03 LTS SP1 上的“download”按钮
![image-get iso](/assets/2.1.47cc7db8.png)
单击“raspi_img”,进入树莓派镜像的下载列表
![image-get rasp_img](/assets/2.2.9c0e504f.png)
单击“openEuler-20.03-LTS-SP1-raspi-aarch64.img.xz”,将 openEuler 发布的树莓派镜像下载到本地
![image-get img](/assets/2.3.b42fafc1.png)
格式化SD卡
下载并安装格式化SD卡工具,以下操作以DiskGenius磁盘格式化工具为例
选中需要格式化的SD卡的对应盘符,删除内容并保存
![image-formatting SD card](/assets/2.4.fd4c6bb2.png)
选中刚刚删除内容并保存的磁盘,建立新分区,文件系统类型选择FAT32,并保存格式化
![image-save the formatting](/assets/2.5.149e97e2.png)
格式化后的磁盘如图所示
![image-the success of formatting](/assets/2.6.862a61d8.png)
镜像文件写入SD卡
下载并安装刷写镜像的工具,以下操作以 Win32 Disk Imager 工具为例
镜像文件选择镜像文件下载路径下的openEuler-20.03-LTS-SP1-raspi-aarch64.img,设备选择SD卡的盘符后点击写入即可
![image-write iso in SD card](/assets/2.7.ea64fcb8.png)
说明:镜像文件写入后,会显示SD卡的磁盘容量减少,原因为Windows下认不出ext文件系统,为正常现象
启动系统
将写入镜像后的 SD 卡插入树莓派,通电启用
登录系统
登录树莓派有以下两种方式:本地登录和ssh远程登录
本地登录:树莓派连接显示器、键盘、鼠标后,启动树莓派,可以看到树莓派启动日志输出到显示器上。待树莓派启动成功,输入用户名(root)和密码(openeuler)登录
ssh远程登录:如果树莓派连接已知路由器,可登录路由器查看,新增的 IP 即为树莓派 IP,或者通过IP扫描工具来将树莓派IP进行扫描获取,这里以advanced_ip_scanner为例
![image-log in system](/assets/2.8.7589c5ac.png)
例如,树莓派对应 IP 为:192.168.1.9,则可以使用远程网络工具MobaXterm进行访问,MobaXterm专注于一个简单的目标:提供一个直观的用户界面,可以通过不同的网络或系统有效地访问远程服务器
![image-use the moba log](/assets/2.9.d9ad842c.png)
远程访问成功,输入用户名(root)和密码(openeuler)登录,通过MobaXterm远程网络访问工具访问树莓派openEuler系统界面如下
![image-the success of log](/assets/2.10.426f1b28.png)
2、树莓派openEuler安装yum
进入系统,进行yum进行包及依赖安装,会提示-bash:yum:command not found
需要自动手动安装下载yum-4.2.23-3.oe1.noarch.rpm
并上传
URL:https://repo.openeuler.org/openEuler-20.03-LTS-SP1/everything/aarch64/Packages/yum-4.2.23-3.oe1.noarch.rpm,在同目录下执行rpm -ivh --force --nodeps yum-4.2.23-3.oe1.noarch.rpm
![image-yum rpm](/assets/2.12.fc6c1427.png)
3、安装依赖及源文件下载
rpm构建工具包安装
yum install rpm-build rpm-devel rpmdevtools
![image-rpmbuildtools](/assets/2.13.8fd24b50.png)
生成rpmbuild目录及相关子目录
进入个人文件夹下执行rpmdev-setuptree
自动生成rpmbuild目录及相关子目录
生成的rpmbuild目录及相关子目录如下图,BUILD目录:构建软件包时,%buildroot
将在此处创建各种目录。如果日志输出未提供足够的信息,这对于调查失败的构建很有用,RPMS目录:在不同体系结构的子目录中创建二进制RPM,例如在子目录x86_64
和中noarch
,SOURCES:在这里放置压缩的源代码存档和补丁,该rpmbuild
命令在此处查找,SPECS:存放SPECS文件,SRPMS:当rpmbuild
用于构建SRPM而不是二进制RPM时,将在此处创建结果SRPM
![image-success of setuptree](/assets/2.15.cff379b4.png)
源码包及spec文件准备
在/rpmbuild/SOURCES/文件夹下,进行需要构建rpm包的jdkSource文件下载git clone https://gitee.com/src-openeuler/openjdk-1.8.0.git
(若要构建其他版本jdk,则更换url即可),该openjdk的url:https://gitee.com/src-openeuler/openjdk-1.8.0
![image-prepare the src package](/assets/2.16.de7d85a1.png)
将下载的jdk文件中的.spec文件移动到SPECS目录下mv ./openjdk-1.8.0/*spec ../SPECS/
![image-the result of move the spec](/assets/2.18.26df3460.png)
将余下的jdk文件中的其他文件移动至SOURCE文件夹下mv ./openjdk-1.8.0/* ./
jdk8安装及配置
可通过yum list | grep openjdk
查看openEuler附带的yum源内可安装的jdk版本,并进行安装,若没有所需jdk,则需要另行安装或者更新yum源
![yum openjdk rasp](/assets/2.38.0b9696f1.png)
安装命令:yum install java-1.8.0-openjdk.aarch64
检查jdk是否安装成功java -version
安装依赖
yum install alsa-lib-devel cups-devel elfutils-devel fontconfig-devel freetype-devel giflib-devel harfbuzz-devel lcms2-devel
![image-yum install reliant package](/assets/2.20.06787936.png)
若后续还存在其他依赖未安装,则使用yum install package
进行安装即可
4、rpm包构建
进入SPECS文件夹下,按需输入对应指令即可进行构建
rpmbuild -bi java-1.8.0-openjdk.spec
执行到install阶段 rpmbuild -bb java-1.8.0-openjdk.spec
生成rpm二进制包 rpmbuild -bs java-1.8.0-openjdk.spec
生成rpm源码包 rpmbuild -ba java-1.8.0-openjdk.spec
生成rpm二进制包和源码包
完成rpm包构建图如下
![raspberry success](/assets/2.34.25fc82e6.png)
文件列表如下:
![tree](/assets/2.33.2c66be93.png)
5、常见问题及解决方案
树莓派无法使用远程连接:
SSH连接,需要确认的是:①树莓派有没有连接网络、②使用软件时,填写的IP、用户名和密码是否正确、③有没有打开SSH,若确认已经连接到网络并且ip用户名和密码都正确,依旧无法正确使用远程连接,则为SSH未开启
解决方案:外界显示器情况下,可连接到系统显示界面情况下:检查安装系统时是否已经安装SSH服务端软件包rpm -qa|grep openssh
若显示结果中包含openssh-server-
,则说明已经安装,直接启动sshd服务就可以了service iptables start
![images-openssh](/assets/2.31.6bc411a3.png)
未外界显示器,无法连接到系统显示界面:SD卡内,新建ssh文件(无后缀),即可开启远程访问
![.image-ssh](/assets/2.30.263c5678.png)
-bash:yum:command not found
使用yum指令,会提示-bash:yum:command not found
需要自动手动安装下载yum-4.2.23-3.oe1.noarch.rpm
并上传
URL:https://repo.openeuler.org/openEuler-20.03-LTS-SP1/everything/aarch64/Packages/yum-4.2.23-3.oe1.noarch.rpm,在同目录下执行rpm -ivh --force --nodeps yum-4.2.23-3.oe1.noarch.rpm
![yum rpm](/assets/2.12.fc6c1427.png)
Failed build dependencies: xxx is needed by java-1.8.0-openjdk-1:1.8.0.282.b08-17.aarch64
![failed build dependencied](/assets/2.37.9ffb03fc.png)
问题原因:specs文件中构建rpm包所需相应包未进行安装
解决方法:通过yum install xxx
对对应包进行安装
yum install gdb java-1.8.0-openjdk-devel libX11-devel libXext-devel libXi-devel libXinerama-devel libXrender-devel libXt-devel libXtst-devel libjpeg-devel openssl-devel
error:java-8-openjdk-devel is needed by xxx
报错原因:spec文件中BuildRequires要求了openjdk-devel,当前安装的openjdk版本未满足要求
解决方法:若确定安装openjdk版本可以满足构建需求,则可将该行要求注释掉或者修改版本要求,若不确定当前版本是否满足构建需求,则可安装配置其要求的openjdk版本
![image-java-8-openjdk-devel is needed by xxx](/assets/2.29.3676fac4.png)
error:Bad exit status from /var/tmp/rpm-tem.f4PLQX(%build)
原因:jdk8已经在系统配置完成,但是下载的.spec文件还未进行修改,需进入.spec文件把jdk的路径修改为本地jdk-8的路径
vim /root/rpmbuild/SPECS/java-1.8.0-openjdk.spec
?configure
找到configure配置位置,将jdk的路径改为自己本地安装的jdk8的路径
![image-Bad exit status from](/assets/2.22.7c65b4e7.png)
5、其他jdk版本rpm包构建
其他jdk版本,如果jdk11、jdk15等rpm包构建仅需要在源码包处下载对应版本的jdk源码包,更换对应的url,后续的jdk路径改成相应的jdk路径即可,其他构建过程与jdk8的rpm包构建相同,如有报错等信息都可参考jdk8的rpm包的构建过程
References
How to create an RPM package:https://fedoraproject.org/wiki/How_to_create_an_RPM_package/zh-cn#.25files_.E9.83.A8.E5.88.86
RPM Packaging Guide:https://rpm-packaging-guide.github.io/
bishengJDK 8 user guide:https://gitee.com/openeuler/bishengjdk-8/wikis/Home?sort_id=2879418
Raspberry pi:https://www.raspberrypi.org/