鲲鹏社区首页
EN
注册
练习:扫描修改兼容问题,完成X86应用重构

练习:扫描修改兼容问题,完成X86应用重构

应用重构

发表于 2023/04/27

0

尊敬的鲲鹏开发者你好,为了解决开发者在软件迁移过程中遇到的疑难问题,我们提供了DevKit迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移,您可以阅读本篇文档进行DevKit迁移工具的快速入门。

本篇文章主要介绍了以下知识:

(1)跨平台软件为何要进行迁移

(2)如何使用DevKit迁移工具实现软件的快速迁移

(3)以kafka软件包为待迁移案例展示软件的快速迁移过程

基础技能:

(1)具备基础的C/C++语言编程能力

(2)了解常用的Linux操作命令

(3)了解VS Code基础操作

跨平台软件为何要进行迁移

在了解DevKit代码迁移工具之前,您可能会有这样的疑问,我们为什么要进行软件迁移呢?不能直接下载软件使用?

为了让您更好的了解这个问题,我们可以从开发过程的一个常见场景中一窥究竟,我们开发者应该都在电脑上安装过软件,很多软件都提供了X86版本和Arm版本,如果你买的是苹果笔记本,是无法安装X86版本的软件,这其实就是芯片架构的问题,苹果笔记本使用的是和鲲鹏一样的芯片架构,是没有办法直接使用X86版本的软件的。

这就涉及到了我们鲲鹏架构和传统X86架构之间的差异。鲲鹏和传统X86的最根本的区别两者的指令集方面是不同的(X86是复杂指令集、鲲鹏使用精简指令集),一样的代码c=a+b,经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。相应的的编译选项,语言表现也有所差异。

如何使用DevKit迁移工具实现软件的快速迁移

为了解决平台差异问题,Devkit推出了迁移工具帮助用户进行迁移,迁移工具提供了五大迁移功能,帮助开发者简单方便的将软件迁移到鲲鹏平台上进行使用:

一个待迁移的系统往往是由很多个复杂的子组件组成的,除了自己开发的源代码,还有引用的各种依赖软件,使用Devkit迁移工具会使整个系统迁移工作更加简单高效,首先用户可以进行软件迁移评估,将待迁移的软件包传入,获取so依赖库兼容信息、工作量预估信息等多项关键数据,方便后续重构功能的使用。

之后再根据子组件的情况使用不同的重构功能,如果待迁移的子组件是C/C++编写的软件,同时可以获取到源码包,则可以使用源代码迁移功能进行源码级别迁移,迁移结束后还可以使用鲲鹏亲和分析进行扫描,修复其中的变量对齐、内存一致性等问题、提升软件的性能和稳定性;除了源码级的重构,迁移工具还提供了软件包重构功能,将用户的X86软件包重构为适用于鲲鹏平台的软件包;同时针对工程和科研领域的一些常用软件,用户可以直接使用专项软件迁移功能获取迁移好的软件包直接使用,一步到位完成迁移。

以kafka为例体验软件迁移过程

将kafka重构为适用于鲲鹏平台的软件包就需要用到图中提到的软件迁移评估功能和软件包重构功能,Kafka是一个分布式数据流处理平台,可以实时发布、订阅、存储和处理数据流,为了体验Kafka的软件包重构,我们需要进行以下几项工作:

(1)准备工作

1. 申请鲲鹏远程实验室资源

(2)软件包迁移工作

a. 使用软件迁移评估功能,获取kafka的可替换的依赖文件

b. 使用软件包重构功能,利用刚刚获取的替换依赖文件,对kafka软件包进行重构

c. 在鲲鹏平台验证重构后的kafka软件包

1. 准备工作

步骤一:申请鲲鹏远程实验室资源

软件包重构的过程需要在鲲鹏平台上完成,为了方便开发者在鲲鹏环境上进行开发,我们提供了鲲鹏远程实验室资源供大家免费申请。

为了兼顾所有鲲鹏开发者的开发体验,我们在鲲鹏远程实验室中提供了云开发环境(开发态模式)和远程服务器(黑框模式)。接下来的体验过程我们会在云开发环境上进行,开发者在申请云开发环境后可以直接通过在线IDE的方式打开页面进行操作。降低了开发者在鲲鹏上的开发门槛。

首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:

之后我们输入自己的邮箱地址,选择openEuler 20.03 LTS-SP1系统,申请成功后我们点击“打开在线IDE”按钮,进入云开发环境中,云开发环境给大家提供了在线Vscode页面,方便我们直接在鲲鹏上进行开发。

2. 软件包迁移工作

使用开发环境自带的kafka软件迁移例程讲述通过软件迁移工具软件包的迁移工作。 

步骤一:进行软件迁移评估,获取kafka可替换的依赖文件

点击”打开在线IDE”按钮进入云开发环境。我们点击鲲鹏代码迁移插件的图标,点击登录后勾选“我已阅读并同意”,点击“确认”,登录代码迁移工具。

我们先对kafka软件包进行软件迁移评估,扫描一下迁移过程可能需要哪些替换的依赖包,点击左上角的软件迁移评估旁边的按钮创建任务,勾选“分析软件包”,在输入框中选中预置在环境中的X86软件包kafka-2.4.1-1.el7.noarch.rpm,点击“开始分析”,等待分析结束后查看分析报告。

从报告中可以发现,一共有三个依赖文件被工具扫描出来,其中rocksdbjni-5.18.3.jar可以进行兼容替换,我们点击旁边的下载按钮将jar包下载到本地。

而zookeeper和bigtop-utils是需要用户在鲲鹏平台上验证的,这两个软件官方提供了鲲鹏架构版本,已经预置到了环境的demo目录中,我们可以直接在终端中执行命令进行安装。

点击侧边栏第一个图标后依次点击“终端”、“新建终端”。

之后在下方弹出的终端页面中输入命令ssh root@IP address后,输入yes进行指纹确认,再输入SSH密码,切换至root用户(环境申请成功后,会向申请邮箱中发送邮件,密码需要从邮件中获取),这里大家注意2个事情:

(1)IP地址要换成自己云开发环境的IP地址,打开终端后就会在下图中的对应位置上显示。

(2)服务器用户密码属于隐私信息,因此大家在输入的时候屏幕不会显示输入的信息,大家不必疑惑,正常完成输入后按下回车就好。

接下来部署bigtop-utils软件包,看到三个进度条都达到100%表示部署成功。

cd /opt/devkitdemo/kafka_rebuild
rpm -ivh bigtop-utils-3.0.0-1.el7.noarch.rpm

同理安装zookeeper依赖包,在终端输入

rpm -ivh zookeeper-3.4.14-1.el7.aarch64.rpm

此时我们的软件迁移评估工作就完成了,我们现在得到了可以兼容替换的依赖文件rocksdbjni-5.18.3.jar,同时成功安装了zookeeper和bigtop-utils这两个依赖软件。

步骤二:使用软件包重构功能对kafka软件包进行重构

现在我们创建软件包重构任务,在输入框中选中待重构软件包kafka-2.4.1-1.el7.noarch.rpm,点击“下一步”,进入“配置依赖文件”步骤,上传刚刚下载的依赖文件rocksdbjni-5.18.3.jar

勾选“授权访问外部网络获取重构软件包需要的依赖文件”,以允许工具在重构过程中自动连接到各OS发行版的官方网站或者鲲鹏Maven仓库在华为云镜像源上的下载地址下载需要的依赖文件。之后点击下一步进入“执行重构”步骤,这里需要再进行最后一次确认才能开始重构操作。

重构动作完成后,我们可以得到构建完成的软件包保存的路径,此时kafka软件的软件包重构就已经成功了。

步骤三:在鲲鹏平台对重构后的kafka软件包进行验证

现在我们对重构后的kafka软件包进行验证,我们从报告中可以看到重构后的软件包的存放路径。

首先,我们使用软件包安装命令尝试将重构后的软件包在鲲鹏云开发环境上进行安装,因为每次软件包重构都会根据当前时间戳建立子目录,所以我们需要复制报告中的软件包存放路径替换下面命令中的kafka-rpm-address:

rpm -ivh kafka-rpm-address

之后执行命令启动zookeeper,zookeeper启动是kafka启动的必须前置步骤

cd /usr/lib/zookeeper/bin
./zkServer.sh start

最后通过命令启动kafka

cd /usr/lib/kafka/bin
./kafka-server-start.sh ../config/server.properties

从终端执行结果中可以看到,重构后的kafka软件包成功在鲲鹏云开发环境中成功启动。

恭喜

到这里整个实验流程就已经结束了,通过上面的软件迁移动作我们拿到了重构好的kafka安装包,这个安装包可以直接在鲲鹏环境上安装运行。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的源码迁移、亲和分析等功能,成为更加优秀的鲲鹏开发者。

除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit迁移工具:

鲲鹏代码迁移工具介绍(课程):

https://www.hikunpeng.com/learn/courses-list/detail/1590560841222623234

手把手带你使用代码迁移工具实现源码迁移(课程):

https://www.hikunpeng.com/learn/courses-list/detail/1556841082254745602

鲲鹏代码迁移工具-快速入门(文档):

https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html

本页内容