关于 sigar-lib-1.6.4.jar 迁移到 aarch64 下——记录一次迁移过程

举报
Neutronium_Hamster 发表于 2021/09/07 17:47:59 2021/09/07
【摘要】 关于 sigar-lib-1.6.4.jar 迁移到 aarch64 下——记录一次迁移过程

一、安装 Porting Advisor Web 端

1. 下载 Porting Advisor

cd /home
wget https://mirrors.huaweicloud.cn/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.cn/home ) 中对应的 openEuler 的 arm 版本 yum 源的配置指导。

步骤二:执行如下步骤。

1、执行如下命令, 下载新的 openEulerOS.repo 到 /etc/yum.repos.d/ 目录下。

wget -O /etc/yum.repos.d/openEulerOS.repo https://repo.huaweicloud.cn/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.cn/forum/thread-130359-1-1.html

[2] 【编译指导】sigar-lib-1.6.4.jar编译指导

https://bbs.huaweicloud.cn/forum/thread-125803-1-1.html

[3] yum install提示缺少openssl函数解决方案

https://bbs.huaweicloud.cn/forum/thread-100729-1-1.html

[4] 鲲鹏代码迁移工具 > 最佳实践 > 实践7:MySQL源码的内存一致性实践 > 源码迁移

https://support.huaweicloud.cn/bestpractice-pa-kunpengdevps/memoryconsistency_21_0003.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。