关于 sigar-lib-1.6.4.jar 迁移到 aarch64 下——记录一次迁移过程
一、安装 Porting Advisor Web 端
1. 下载 Porting Advisor
cd /home
wget https://mirrors.huaweicloud.com/kunpeng/archive/Porting_Dependency/Packages/Porting-advisor_2.2.T4_Kunpeng-linux.tar.gz
2. 解压 Porting Advisor
tar -zxvf Porting-advisor_2.2.T4_Kunpeng-linux.tar.gz
3. 安装 Porting Advisor Web 端
cd Porting-advisor_2.2.T4_Kunpeng-linux/
./install web
注意:在安装前需要关闭 SELinux
setenforce 0
4. 安装 Porting Advisor Web 端出现的问题
1)rpmdevtools installation failed!
问题分析:配置的 yum 源中没有 rpmdevtools 的工具包
解决办法一:重新配置 yum 源
步骤一:找到华为开源镜像站 ( https://mirrors.huaweicloud.com/home ) 中对应的 openEuler 的 arm 版本 yum 源的配置指导。
步骤二:执行如下步骤。
1、执行如下命令, 下载新的 openEulerOS.repo 到 /etc/yum.repos.d/ 目录下。
wget -O /etc/yum.repos.d/openEulerOS.repo https://repo.huaweicloud.com/repository/conf/openeuler_aarch64.repo
2、清除原有 yum 缓存。
yum clean all
3、生成新的缓存。
yum makecache
第三步:重新编译安装
./install web
解决办法二:yum 源配置完好时检查 yum 本身
步骤一:执行 yum install xxx 命令时,提示错误信息
ImportError: /lib64/libcurl.so.4: symbol SSLv3_client_method version OPENSSL_1_1_0 not defined in file libssl.so.1.1 with link time reference
从提示信息可以看出 SSLv3_client_method 应该是 Openssl 1.1.0 版本动态库中的一个函数。
1、执行 ldd /lib64/libcurl.so.4 查看其对应的 Openssl 动态库路径:
ldd/lib64/libcurl.so.4
2、确认 ssl 动态库路径后,执行 nm 命令确认动态库中是否定义了 SSLv3_client_method :
nm /lib64/libssl.so.1.1 | grep SSLv3_client_method
果然没有,查找openssl源码,该函数是存在的,只是用宏隔离了。
vi openssl-1.1.1a/ssl/method.c
# ifndef OPENSSL_NO_SSL3_METHOD
...
const SSL_METHOD *SSLv3_client_method(void)
{
return sslv3_client_method();
}
# endif
步骤二:解决问题
1、编译 openssl 增加 enable-ssl3 与 enable-ssl3-method 选项:
cd openssl-1.1.1a
./config shared enable-ssl3 enable-ssl3-method
make
make install
2、生成的动态库默认路径为 /usr/local/lib,确认新的动态库中已经有 SSLv3_client_method :
nm /usr/local/lib/libssl.so.1.1 | grep SSLv3_client_method
3、替换 /lib64 下的 openssl 动态库:
rm -rf /lib64/libssl
#注意删除动态库前确认是否有链接该动态库的应用程序正在运行,避免出现应用或系统异常。
cp /usr/local/lib/libssl* /lib64/
步骤三:验证
重新执行 yum install xxx ,问题解决。
二、扫描 sigar-lib-1.6.4.jar
我们使用 Porting Advisor 迁移扫描工具扫描 sigar-lib-1.6.4.jar 包。
三、编译打包 sigar-lib-1.6.4.jar
1. 安装依赖工具
方法一:直接使用 yum 源安装
yum install -y wget gcc gcc-c++ make cmake libtool autoconf automake ant unzip java-1.8.0-openjdk java-1.8.0-openjdk-devel maven
方法二:使用 wget 下载解压安装
1)安装 OpenJDK
(1) 下载解压软件包,本文档将文件解压到 /root/soft/ 目录,请根据实际需要选择解压目录。
cd /root/soft/
wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/OpenJDK8U-jdk_aarch64_linux_hotspot_jdk8u242-b08.tar.gz
tar -zxvf OpenJDK8U-jdk_aarch64_linux_hotspot_jdk8u242-b08.tar.gz
(2) 配置环境变量。
vi /etc/profile
#文档末尾添加如下内容
export JAVA_HOME=/root/soft/jdk8u242-b08
export PATH=$JAVA_HOME/bin:$PATH
(3) 生效环境变量
source /etc/profile
(4) 检查版本信息
java -version
2)安装Maven
(1) 下载 & 解压软件包
#方式一:
cd /root/soft/
wget https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz
#方式二:(建议)
cd /root/soft/
wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz
(2) 替换 Maven 仓-在国内访问 Maven 仓库,连接速度太慢,可以替换为国内仓库
wget https://sandbox-experiment-resource-north-4.obs.cn-north-4.myhuaweicloud.com/netty-praxis/settings.xml
rm -rf /root/soft/apache-maven-3.6.3/conf/settings.xml
cp settings.xml /root/soft/apache-maven-3.6.3/conf/
(3) 配置环境变量。
vi /etc/profile
#文档末尾添加如下内容
export MAVEN_HOME=/root/soft/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
(4) 生效环境变量
source /etc/profile
(5) 检查版本信息
mvn -v
3)安装 Ant
(1) 下载 & 解压软件包
cd /root/soft/
wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.6-bin.tar.gz
tar -zxvf apache-ant-1.10.6-bin.tar.gz
(2) 配置环境变量。
vi /etc/profile
#文档末尾添加如下内容
export ANT_HOME=/root/soft/apache-ant-1.10.6
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
(3) 生效环境变量
source /etc/profile
(4) 检查版本信息
ant -version
2. 编译
1)下载 sigar 源码并解压
cd /root/soft/
wget https://github.com/hyperic/sigar/archive/sigar-1.6.4.zip
unzip sigar-1.6.4.zip
2)使用 ant 进行编译
cd /root/soft/sigar-sigar-1.6.4/bindings/java
ant
(1) 问题一:编译时报错,鲲鹏平台不支持 -m64 编译选项
[cc]gcc: error:unrecongnized command line option '-m64'
解决方法:将鲲鹏平台对应的编译选项设置为 -mabi=lp64 。
#查询m64出现的地方
grep -r "m64" ./
#进入查询出来的文件
vi hyperic_jni/src/org/hyperic/jni/ArchNameTask.java
#将文件原 -m64 改为 -mabi=lp64
(2) 问题二:编译时报错,major和minor函数未找到
/root/dev/sigar-sigar-1.6.4/src/os/linux/linux_sigar.c:1148:22: 错误:called object ‘major’ is not a function or function pointer
解决方法:
a. 在系统头文件路径下搜索关键字 major 和 minor ,查看头文件名。
grep -r "major(" /usr/include/
grep -r "minor(" /usr/include/
b. 将文件 sigar-sigar-1.6.4/src/os/linux/linux_sigar.c 中,引入头文件 sys/sysmacros.h 。
vi /root/soft/sigar-sigar-1.6.4/src/os/linux/linux_sigar.c
/*添加头文件*/
#include <sys/sysmacros.h>
(3) 问题三:编译时报错,出现致命错误<rpc/rpc.h>:没有那个文件或目录
Error:致命错误<rpc/rpc.h>:没有那个文件或目录
解决方法:
a. 下载 rpc 源码。
cd /root/soft/
wget https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz
b. 解压缩 rpc 源码包。
tar -zxvf rpcsvc-proto-1.4.tar.gz
c. 进入到源码目录。
cd rpcsvc-proto-1.4
d. 执行项目构建。
./configure
e. 执行项目编译。
make
f. 完成项目安装。
make install
g. 将rpc复制到指定目录。
cp /usr/include/gssrpc/rpc.h /usr/include/rpc/
3. 构建
1)下载 sigar-lib-1.6.4 并解压
cd /root/soft/
#下载
wget https://github.com/gridkit/sigar-lib/archive/sigar-lib-1.6.4.tar.gz
#解压
tar -zxvf sigar-lib-1.6.4.tar.gz
2)so库替换
cd /root/soft/sigar-sigar-1.6.4/bindings/java/sigar-bin/lib/
cp libsigar-aarch64-linux.so /root/soft/sigar-lib-sigar-lib-1.6.4/src/main/resources/sigar-1.6.4
cd /root/soft/sigar-lib-sigar-lib-1.6.4/src/main/resources/sigar-1.6.4/
rm -rf libsigar-x86-linux.so
3)重新构建包
在有pom的目录下执行:
cd /root/soft/sigar-lib-sigar-lib-1.6.4
mvn clean package
mvn package
(1) 问题一:构建失败
【ERROR】Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
解决方法一:修改配置文件 pom.xml
vim pom.xml
在profiles标签下,添加如下内容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
解决方法二:为指令添加参数跳过检测
在使用mvn package进行编译、打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
#示例
mvn clean package -DskipTests
mvn package -DskipTests
-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。
#示例
mvn clean package -Dmaven.test.skip=true
mvn package -Dmaven.test.skip=true
四、扫描新构建的 sigar-lib-1.6.4.jar
将新构建的包拷贝至扫描路径下:
cd /root/soft/sigar-lib-sigar-lib-1.6.4/target/
cp sigar-lib-1.6.4.jar /opt/portadv/portadmin/package/
修改文件目录权限:
chmod -R 777 /opt/portadv/portadmin/package/
软件迁移再次扫描,结果显示:
我们发现仅解决了 libsigar-x86-linux.so 这个 so 库的问题,其他的 so 库依旧存在。这是因为 java 应用通过 JNI 访问动态库时,会根据当前服务器的架构来判断调用哪个库。比如,鲲鹏是 aarch64 架构,它就会去找 aarch64 的 so 。如果运行在 x86 服务器上,就会找 x86 命名的对应的 so 。即在源码中删除以上检测对应的 so 库后进行打包,对于这个 Jar 包的正常使用不构成任何问题。
注意,在针对这些 so 库进行移动时,需要将其移出该源码包,而不是仅将后缀名改为 ".bak" 就可以,如下图所示:
最终结果如下:
参考资料:
[1] 【编译指导】sigar-lib环境搭建-OpenEuler 20.03
https://bbs.huaweicloud.com/forum/thread-130359-1-1.html
[2] 【编译指导】sigar-lib-1.6.4.jar编译指导
https://bbs.huaweicloud.com/forum/thread-125803-1-1.html
[3] yum install提示缺少openssl函数解决方案
https://bbs.huaweicloud.com/forum/thread-100729-1-1.html
[4] 鲲鹏代码迁移工具 > 最佳实践 > 实践7:MySQL源码的内存一致性实践 > 源码迁移
https://support.huaweicloud.com/bestpractice-pa-kunpengdevps/memoryconsistency_21_0003.html
- 点赞
- 收藏
- 关注作者
评论(0)