信创改造项目.md

总控部署适配信创平台技术预研

背景

客户环境复杂,目前总控平台只适合ubuntu20.04,x86架构。需要研制出适合arm64架构的总控,让总控平台更具生存力。

解决方案

找到对应组件的可执行文件进行替换

适用场景

arm64的linux平台,例如:麒麟银河系列
##难点
其他服务的可执行文件都不支持arm架构,都需要找到对应的文件进行替换。

未知因素

引擎机器上的组件(envoy等)是不是也得替换?

Mysql改造-已完成

提取mysqld 和 mysql文件进行替换。操作步骤如下:

  1. arm64的mysql安装包链接

  2. mysql安装目录部分文件替换

    1
    2
    3
    4
    wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz
    tar -xvf mysql-5.7.27-aarch64.tar.gz -C /data/
    cp -f /data/mysql-5.7.27-aarch64/bin/mysql /opt/mysql/bin/mysql
    cp -f /data/mysql-5.7.27-aarch64/bin/mysqld /opt/mysql/bin/mysqld

    最后,正常执行安装脚本即可(/opt/mysql/hack/install.sh)

  3. 安装过程有报错误,但不影响安装。解决方式如下:

    1
    2
    mkdir -p /opt/mysql/share
    cp -f /data/mysql-5.7.27-aarch64/share/english/errmsg.sys /opt/mysql/share/errmsg.sys

SC代码-已完成

util/common/cpuid.go中存在两个空方法体的函数,目前无法在arm64的linux环境中编译通过。

1
2
3
func cpuid(leaf uint32) (uint32, uint32, uint32, uint32)
func IsHypervisor() bool

解决方案:
将util/common/cpuid_linux_amd64.s 替换,先达到可用,业务逻辑后续再补

SC所使用的系统命令

1
2
3
4
5
dmidecode -t processor
systemctl daemon-reload
pgrep -f "/opt/sc/bin/sc"
sed -i -r xxx
df -h

SC Makefile文件改造-已完成

新增适配目标机器的编译参数:GOARCH=arm64 GOOS=linux,新增部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
build-sc-arm: pre-build
CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build -trimpath -ldflags $(flags) -o $(BIN_DIR)/sc cmd/main.go
cp config/config.ini $(TEMPLATE_DIR)
cp -r config/cert $(CONFIG_DIR)
cp hack/depends/* $(DEPENDS_DIR)
cp hack/sc.service $(SYSTEMD_DIR)
cp hack/mysql-bin-install/cfg_mysqlpkg.sh $(HACK_DIR) && chmod +x $(HACK_DIR)/cfg_mysqlpkg.sh
cp hack/mysql-bin-install/uncfg_mysqlpkg.sh $(HACK_DIR) && chmod +x $(HACK_DIR)/uncfg_mysqlpkg.sh
cd hack/mysql-bin-install && CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build -o reset_mysql main.go
mv hack/mysql-bin-install/reset_mysql $(HACK_DIR)
cd hack/reset && CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build reset_password.go
mv hack/reset/reset_password $(BIN_DIR)
cd hack/deploy && CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build -o init_database main.go
mv hack/deploy/init_database $(HACK_DIR)
cd hack/deploy && CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build -o seeder seeder.go
mv hack/deploy/seeder $(HACK_DIR)
cp hack/deploy/install.sh $(HACK_DIR) && chmod +x $(HACK_DIR)/install.sh
cp hack/deploy/uninstall.sh $(HACK_DIR) && chmod +x $(HACK_DIR)/uninstall.sh
cp hack/deploy/cover.sh $(HACK_DIR) && chmod +x $(HACK_DIR)/cover.sh
cp hack/deploy/update_ui.sh $(HACK_DIR) && chmod +x $(HACK_DIR)/update_ui.sh
cp hack/deploy/config $(HACK_DIR)
cp doc/help_document.docx $(DOCS_DIR)
cp doc/SMTP服务启用帮助文档.pdf $(DOCS_DIR)

其他代码服务-已完成

打包平台机器,编译参数增加:GOARCH=arm64 GOOS=linux

NSQ可执行文件改造-已完成

可执行文件(/opt/nsq/bin/nsqd,/opt/nsq/bin/nsqlookupd,版本nsqd v1.2.1),执行报错(格式不支持)。需要改造。
Dec 15 10:01:29 IC22-04-007 systemd[43186]: nsqlookupd.service: Failed to execute command: Exec format error
Dec 15 10:01:29 IC22-04-007 systemd[43186]: nsqlookupd.service: Failed at step EXEC spawning /opt/nsq/bin/nsqlookupd: Exec format error
解决方案:
https://github.com/nsqio/nsq/releases/

  1. 下载对应版本的压缩包,解压,将bin目录下的文件全部替换原有文件。

ETCD可执行文件改造-已完成

可执行文件(/opt/etcd/bin/etcd,版本etcd Version: 3.4.9),执行报错(格式不支持)。需要改造。
解决方案:
https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-arm64.tar.gz

  1. 下载压缩包,解压。替换原有的etcd。
  2. 在/opt/etcd/config/etcd.conf文件里面追加:ETCD_UNSUPPORTED_ARCH=arm64
    1
    2
    3
    4
    ETCD_OPTS="--name single \
    ...
    "
    ETCD_UNSUPPORTED_ARCH=arm64

Redis可执行文件改造-已完成

可执行文件(/opt/redis/bin/redis-server,版本Redis server v=6.2.10),执行报错(格式不支持)。需要改造。
解决方案:
https://download.redis.io/releases/

  1. 下载压缩包,上传至arm架构的linux服务器上。解压。然后 make。
  2. 将得到的redis-server 替换原有的文件即可。
    Mongodb可执行文件改造-已完成
    可执行文件(/opt/mongodb/bin/mongod,版本db version v5.0.9),执行报错(格式不支持)。需要改造。
    Dec 15 10:30:44 IC22-04-007 systemd[46509]: mongod.service: Failed to execute command: Exec format error
    Dec 15 10:30:44 IC22-04-007 systemd[46509]: mongod.service: Failed at step EXEC spawning /opt/mongodb/bin/mongod: Exec format error
    解决方案:
    https://www.mongodb.com/download-center/community/releases/archive
    1.下载对应版本和架构的压缩包,解压,将bin目录下的 mongod,mongo替换原有的文件

api-gov 可执行文件改造-已完成

hyperscan 可执行文件改造-已完成

暂时将原有目录拷贝至目标机器

installer可执行文件改造-已完成

cd /root/code/installer && make release

sv可执行文件改造-已完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装编译依赖工具和依赖库
yum install gcc gcc-c++ hyperscan-devel

# 进入sv源码目录执行编译
cd /path/to/sv/
rm -rf 3rdparty/hyperscan
cp -rf /usr/local/lib/hyperscan 3rdparty/
cp -fP /usr/lib64/libhs* 3rdparty/hyperscan/lib/
make build

# 查看编译的sv版本
./streamvisualization -v
# 查看sv的依赖动态库列表
ldd streamvisualization

引擎服务改造-待完成

Dam可执行文件改造 - 已完成
可以在本地交叉编译或在目标机器直接编译
/opt/dam/bin/dam -version

Kube-apiserver可执行文件改造 - 已完成
已在目标机器直接编译
https://github.com/kubernetes/kubernetes/archive/refs/tags/v1.23.4.tar.gz
make WHAT=cmd/kube-apiserver

webserver可执行文件改造-已完成

可以在本地交叉编译或在目标机器直接编译
/opt/webserver/bin/webserver

nuclei可执行文件改造-已完成

可以在本地交叉编译或在目标机器直接编译
/opt/nuclei/bin/nuclei

风险

如果整体集成测试出现单个组件问题,该如何解决?
SC的命令行依赖需要通过代码审计的方式识别

  • 如果组件在代码的运行期中嵌入 执行某个 Ubuntu os 有而 kylin os 没有的命令,这种在构建和启动时很可能检查不出来,甚至只有在已经部署上经过测试才发现,应该由每个组件负责人全局检查代码。

信创改造项目.md
https://abrance.github.io/2024/09/12/domain/信创/信创改造项目/
Author
xiaoy
Posted on
September 12, 2024
Licensed under