环境:Windows + Intel i5-13600K + QEMU 全系统模拟 ARM64
目标:验证 Tendis 是否能够在银河麒麟 V10 SP3 + 鲲鹏环境下离线部署运行
结论:可以编译,但需要少量兼容性修复和手工操作

一、为什么要做这件事?

项目最终部署环境为:

银河麒麟高级服务器操作系统 V10 SP3 2403
CPU:鲲鹏(ARM64)

但开发机器只有:

Windows 11
Intel i5-13600K(x86)

没有真实鲲鹏服务器。

由于项目后续需要离线部署 Tendis,因此希望提前验证:

  1. 是否能够在银河麒麟 ARM64 环境编译成功;
  2. 是否存在架构兼容问题;
  3. 需要哪些额外依赖;
  4. 后续离线部署时需要准备哪些步骤。

性能测试不在考虑范围内,仅验证可部署性。

二、方案选择

最初考虑了两种方案:

方案 优点 缺点
Docker + QEMU 简单 偏向容器环境,与真实部署环境有差异
QEMU 全系统模拟 ARM64 环境最真实 配置略复杂

最终选择:

Windows
↓
QEMU
↓
银河麒麟 V10 SP3 ARM64
↓
Tendis

这样可以最大程度接近未来实际部署环境。

三、安装银河麒麟 ARM64

下载:

QEMU for Windows:
qemu-w64-setup-20260501.exe

银河麒麟:
Kylin-Server-V10-SP3-2403-Release-20240426-ARM64.iso

创建虚拟硬盘:

qemu-img.exe create -f qcow2 D:\Dev\Env\kylin-arm64.qcow2 100G

启动命令:

qemu-system-aarch64.exe ^
-M virt ^
-cpu cortex-a72 ^
-m 8192 ^
-smp 8 ^
-bios D:\Dev\Tools\qemu\share\edk2-aarch64-code.fd ^
-drive if=virtio,file=D:\Dev\Env\kylin-arm64.qcow2,format=qcow2 ^
-cdrom D:\Dev\Projects\ISO\Kylin-Server-V10-SP3-2403-Release-20240426-ARM64.iso ^
-device virtio-gpu-pci ^
-device qemu-xhci ^
-device usb-kbd ^
-device usb-mouse ^
-display gtk

其中:

-device qemu-xhci
-device usb-kbd
-device usb-mouse

非常关键。

否则安装界面:

鼠标不能动
键盘方向键无效

四、系统安装选择

软件选择:

带 UKUI GUI 的服务器

原因:

开发调试阶段
GUI 更方便

正式生产环境:

最小安装

即可。

五、网络配置踩坑

安装完成后:

ip a

发现:

emp0s1
没有 IP 地址

Ping 外网:

ping 223.5.5.5

报错:

Network is unreachable

查看 NetworkManager:

nmcli device status

结果:

DEVICE  TYPE      STATE
emp0s1  ethernet  disconnected

执行:

nmcli connection show

发现连接名称:

emp0s1

启动连接:

nmcli connection up 'emp0s1'

成功:

Connection successfully activated

再次查看:

ip a

得到:

inet 10.0.2.15/24

网络恢复正常。


六、验证系统环境

确认架构:

uname -m

输出:

aarch64

确认系统:

cat /etc/os-release

输出:

Kylin Linux Advanced Server V10 (Halberd)

确认内核:

uname -a

结果:

Linux 4.19.90
aarch64

七、安装基础依赖

安装开发工具:

yum install -y \
gcc gcc-c++ \
make \
cmake \
git \
wget \
curl \
tar unzip zip \
openssl-devel \
zlib-devel

八、第一个坑:GCC 版本太低

默认 GCC:

gcc --version

输出:

gcc (GCC) 7.3.0

执行:

cmake ..

报错:

Require at least gcc-8

原因:

Tendis 2.8.tx
要求:

C++17
GCC >= 8

最终手工安装:

GCC 8.4.0

安装路径:

/usr/local/gcc-8.4

重新指定:

cmake \
-DCMAKE_C_COMPILER=/usr/local/gcc-8.4/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/local/gcc-8.4/bin/g++ \
..

九、第二个坑:Submodule 没拉完整

第一次编译:

googletest
rapidjson
rocksdb

不存在

解决:

git submodule update --init --recursive

十、第三个坑:C_STANDARD=17 不兼容

报错:

C_STANDARD is set to invalid value '17'

定位:

set(CMAKE_C_STANDARD 17)

修改:

set(CMAKE_C_STANDARD 11)

原因:

项目实际上:

C++17
C11

即可正常工作。

Lua、LZ4 等第三方库并不需要 C17。


十一、第四个坑:缺少 <iomanip>

编译到:

82%

报错:

error: 'setw' is not a member of 'std'
error: 'setfill' is not a member of 'std'

源码:

src/tendisplus/tools/ldb_tendis.cpp

缺少:

#include <iomanip>

修复:

sed -i '1i #include <iomanip>' \
src/tendisplus/tools/ldb_tendis.cpp

十二、第五个坑:ldb_tendis 链接失败

错误:

undefined reference to:

rocksdb::Iterator
rocksdb::LDBCommand

问题模块:

ldb_tendis

实际上:

ldb_tendis
只是辅助工具
不是 Tendis Server

因此可以直接:

make tendisplus

绕过。


十三、第六个坑:缺少 tendis_extension.h

编译:

make tendisplus

报错:

fatal error:

rocksdb/tendis_extension.h

No such file or directory

搜索:

find . -name tendis_extension.h

没有结果。

但:

grep -R tendis_extension.h .

发现:

src/thirdparty/patch/
0002-add-latency-statistic-log.patch

里面包含:

create mode:

include/rocksdb/tendis_extension.h

说明:

RocksDB Patch
没有自动应用

十四、手工打 Patch

进入:

cd src/thirdparty/rocksdb/rocksdb

执行:

patch -p1 \
< ../../patch/0002-add-latency-statistic-log.patch

输出:

patching file CMakeLists.txt
patching file db/db_impl/db_impl_write.cc
patching file db/memtable.cc
patching file env/tendis_extension.cc
patching file include/rocksdb/tendis_extension.h
patching file table/block_fetcher.cc

问题解决。

十五、目前得到的结论

经过完整验证:

✓ 银河麒麟 V10 SP3

✓ ARM64 (鲲鹏兼容)

✓ GCC 8.4

✓ CMake 3.16

✓ Tendis 2.8.tx

✓ RocksDB

✓ QEMU 全系统模拟环境

基本可以确认:Tendis 2.8.tx 可以在银河麒麟 V10 SP3 + 鲲鹏环境下运行,但需要少量兼容性修复。

十六、最终踩坑总结

问题 原因 解决方案
鼠标键盘失效 未添加 USB 设备 增加 usb-kbd/usb-mouse
网络不通 NetworkManager 未激活 nmcli connection up
GCC 7.3 不支持 C++17 升级 GCC 8.4
Submodule 缺失 未初始化 git submodule update
C_STANDARD=17 兼容问题 改为 C11
缺少 iomanip 源码遗漏 手工添加
ldb_tendis 链接失败 辅助工具问题 跳过编译
tendis_extension.h 不存在 Patch 未应用 手工 patch RocksDB

十七、后续优化建议

如果后续正式部署,可以考虑:

1、提前制作离线 RPM 包

例如:

gcc-8.4
cmake
openssl-devel
zlib-devel

统一打包。


2、维护内部 Patch

例如:

0001-fix-c-standard.patch

0002-add-iomanip.patch

0003-apply-rocksdb-extension.patch

避免人工修改源码。


3、增加 ARM64 CI

例如:

GitHub Actions

ubuntu-arm64

QEMU ARM

提前发现兼容问题。


十八、总结

虽然整个过程踩了不少坑,但最终证明了一件事:

即使没有真实鲲鹏服务器,也完全可以利用 QEMU 在 x86 环境下提前完成国产化软件兼容验证。

对于需要离线部署、信创适配、国产 CPU 验证的场景,这种方案成本极低,而且非常接近真实环境。

整个过程最大的收获不是把软件编译成功,而是提前发现了未来正式部署时可能遇到的所有问题,把风险留在开发阶段解决。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐