一、介绍
Checkso脚本能扫描出压缩包中含有X86的so、二进制文件以及含有X86 so的jar包,并输出so、二进制文件和jar包到结果文件。
Checkso脚本下载路径:
https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/bigdata/Tools/checkSo.zip
二、执行扫描
- 将要检查的目录或者压缩文件统一放到一个单独的文件夹中(不要放在脚本所在目录)。下面以扫描Spark为例。
mv spark-2.3.0-bin-hadoop2.7.tgz /opt/test_dir/
mv checkSo /opt/ - 进入脚本目录。cd /opt/checkSo
- 执行扫描脚本。./main.sh /opt/test_dir
三、查看扫描结果
扫描文件说明
扫描结果保存在JarResult.log和NonJarResult.log两个文件中,表1解释了两个文件的格式和内容。
表1 扫描结果文件说明
文件名 | 说明 |
---|---|
JarResult.log | 存放含有X86 so的jar文件,包括jar包名称、jar包中的so名称。 |
NonJarResult.log | 存放含有X86 so的二进制文件,包括so或二进制文件完整路径。 |
JarResult.log文件说明
本例Spark扫描结果中只有JarResult.log含有有用信息,说明Spark中只含有X86 so的Jar文件,无单独的so文件。详情见表2。
表2 JarResult.log文件说明
jar包 | so文件 |
---|---|
commons-crypto-1.0.0.jar | libcommons-crypto.so |
jline-2.12.1.jar | libjansi.so |
leveldbjni-all-1.8.jar | libleveldbjni.so |
netty-all-4.1.17.Final.jar | libnetty_transport_native_epoll_x86_64.so |
scala-compiler-2.11.12.jar | libjansi.so |
spark-2.3.0-yarn-shuffle.jar | libcommons-crypto.so |
spark-2.3.0-yarn-shuffle.jar | libleveldbjni.so |
spark-2.3.0-yarn-shuffle.jar | libnetty_transport_native_epoll_x86_64.so |
NonJarResult.log文件说明
该模块以分析ambari压缩包为例,列举了部分so和二进制文件,旨在说明分析方法。
tmp_unzip/ambari-release-2.4.1-aarch64-dist.tar.gz/ambari-release-2.4.1-aarch64/ambari-metrics/ambari-metrics-assembly/target/embedded/hadoop-2.7.1.2.3.4.0-3347/lib/native/libhadoop.so
tmp_unzip/ambari-release-2.4.1-aarch64-dist.tar.gz/ambari-release-2.4.1-aarch64/ambari-metrics/ambari-metrics-assembly/target/embedded/hadoop-2.7.1.2.3.4.0-3347/lib/native/libsnappy.so.1
tmp_unzip/ambari-release-2.4.1-aarch64-dist.tar.gz/ambari-release-2.4.1-aarch64/ambari-metrics/ambari-metrics-grafana/target/grafana/grafana-2.6.0/bin/grafana-server
tmp_unzip/ambari-release-2.4.1-aarch64-dist.tar.gz/ambari-release-2.4.1-aarch64/ambari-server/target/rpm/
四、分析扫描结果
JarResult.log
- 确认jar包来源,找到生成该jar包的源码。
- 查看扫描结果的扫描结果多个jar包同时含有相同so,需要查看源码是否存在jar包之间的相互依赖。例如:spark-2.3.0-yarn-shuffle.jar由spark的代码编译生成,生成该jar包的pom.xml文件中有依赖commons-crypto-1.0.0.jar、leveldbjni-all-1.8.jar、netty-all-4.1.17.Final.jar这三个jar包,因此得出结论:spark-2.3.0-yarn-shuffle.jar中的so实际来源于依赖的这三个jar包。
依据此思路,分析到最终需要编译的依赖包如表1所示。表1 需要编译的依赖包 | jar包 | so文件 | | —- | —- | | commons-crypto-1.0.0.jar | libcommons-crypto.so | | jline-2.12.1.jar | libjansi.so | | leveldbjni-all-1.8.jar | libleveldbjni.so | | netty-all-4.1.17.Final.jar | libnetty_transport_native_epoll_x86_64.so | | scala-compiler-2.11.12.jar | libjansi.so |
而jline-2.12.1.jar和scala-compiler-2.11.12.jar中都含有libjansi.so,实际来源于jline-2.12.1.jar,因此需要先编译jline-2.12.1.jar,替换到Maven仓库后,再编译scala-compiler-2.11.12.jar。
- 编译完成后,需要替换到用户自己搭建的远程仓。如果本地仓有X86版本,则需要删除本地仓对应jar包,编译时将自动获取远程仓jar包(或者手动替换到本地仓)。
NonJarResult.log
按照查看扫描结果中扫描出的部分so和二进制文件,分析该so和二进制文件的所属模块如表2所示。
表2 so和二进制文件的所属模块
所属模块 | so文件 |
---|---|
hadoop-2.7.1.2.3.4.0-3347 | libhadoop.so |
hadoop-2.7.1.2.3.4.0-3347 | libsnappy.so.1 |
grafana-2.6.0 | grafana-server |
ambari-server-2.4.1.0-0.aarch64.rpm | _speedups.so |
- 初步找到so或二进制文件所属的模块,从哪个压缩包或者rpm包扫描出来的。
- 分析对应压缩包或rpm包源码,是否存在依赖其它模块的so或二进制文件。例如:
- 查看ambari-server源码,发现该_speedups.so来源于ambari-common。
- ambari-common源码也不生成该so,查看src/main/python/ambari_simplejson/README.txt文档,发现该so是c语言生成。
c. 上网搜索_speedups.so来源,发现来源于markupsafe模块。
表3 需要重新编译的模块
所属模块 | so文件 |
---|---|
hadoop-2.7.1.2.3.4.0-3347 | libhadoop.so |
libsnappy.so.1 | |
grafana-2.6.0 | grafana-server |
markupsafe-1.1.1 | _speedups.so |