關于 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 端出現的問題
問題分析:配置的 yum 源中沒有 rpmdevtools 的工具包
步驟一:找到華為開源鏡像站 ( 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 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 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
(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
(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
(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. 編譯
cd /root/soft/ wget https://github.com/hyperic/sigar/archive/sigar-1.6.4.zip unzip sigar-1.6.4.zip
cd /root/soft/sigar-sigar-1.6.4/bindings/java ant
[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
/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
Error:致命錯誤
解決方法:
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. 構建
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
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
在有pom的目錄下執行:
cd /root/soft/sigar-lib-sigar-lib-1.6.4 mvn clean package mvn package
【ERROR】Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
解決方法一:修改配置文件 pom.xml
vim pom.xml
在profiles標簽下,添加如下內容:
解決方法二:為指令添加參數跳過檢測
在使用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
JAR yum 代碼遷移 鯤鵬
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。