一、介绍

Checkso脚本能扫描出压缩包中含有X86的so、二进制文件以及含有X86 so的jar包,并输出so、二进制文件和jar包到结果文件。
Checkso脚本下载路径:
https://mirrors.huaweicloud.com/kunpeng/archive/kunpeng_solution/bigdata/Tools/checkSo.zip

二、执行扫描

  1. 将要检查的目录或者压缩文件统一放到一个单独的文件夹中(不要放在脚本所在目录)。下面以扫描Spark为例。
    mv spark-2.3.0-bin-hadoop2.7.tgz /opt/test_dir/
    mv checkSo /opt/
  2. 进入脚本目录。cd /opt/checkSo
  3. 执行扫描脚本。./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和二进制文件,旨在说明分析方法。

  1. 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
  2. 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
  3. 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
  4. tmp_unzip/ambari-release-2.4.1-aarch64-dist.tar.gz/ambari-release-2.4.1-aarch64/ambari-server/target/rpm/

四、分析扫描结果

JarResult.log

  1. 确认jar包来源,找到生成该jar包的源码。
  2. 查看扫描结果的扫描结果多个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包。
  3. 依据此思路,分析到最终需要编译的依赖包如表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 |

  4. 而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。

  5. 编译完成后,需要替换到用户自己搭建的远程仓。如果本地仓有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
  1. 初步找到so或二进制文件所属的模块,从哪个压缩包或者rpm包扫描出来的。
  2. 分析对应压缩包或rpm包源码,是否存在依赖其它模块的so或二进制文件。例如:
    1. 查看ambari-server源码,发现该_speedups.so来源于ambari-common。
    2. ambari-common源码也不生成该so,查看src/main/python/ambari_simplejson/README.txt文档,发现该so是c语言生成。

checkso工具使用 - 图1

c. 上网搜索_speedups.so来源,发现来源于markupsafe模块。

  1. 依据此思路,分析得出表2中需要重新编译的模块如表3所示。

表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