在x86电脑上模拟银河麒麟V10 SP3(ARM64)编译 Tendis 2.8.tx 实战记录-redis信创替代
环境:Windows + Intel i5-13600K + QEMU 全系统模拟 ARM64
目标:验证 Tendis 是否能够在银河麒麟 V10 SP3 + 鲲鹏环境下离线部署运行
结论:可以编译,但需要少量兼容性修复和手工操作
一、为什么要做这件事?
项目最终部署环境为:
银河麒麟高级服务器操作系统 V10 SP3 2403
CPU:鲲鹏(ARM64)
但开发机器只有:
Windows 11
Intel i5-13600K(x86)
没有真实鲲鹏服务器。
由于项目后续需要离线部署 Tendis,因此希望提前验证:
- 是否能够在银河麒麟 ARM64 环境编译成功;
- 是否存在架构兼容问题;
- 需要哪些额外依赖;
- 后续离线部署时需要准备哪些步骤。
性能测试不在考虑范围内,仅验证可部署性。
二、方案选择
最初考虑了两种方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 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 验证的场景,这种方案成本极低,而且非常接近真实环境。
整个过程最大的收获不是把软件编译成功,而是提前发现了未来正式部署时可能遇到的所有问题,把风险留在开发阶段解决。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)