在 Windows11 下使用 WSL 编译 Tikv9.0
作者: 有猫万事足原文来源:https://tidb.net/blog/8194774b
前言
在 tidb 的所有组件中,使用 rust 编写的 tikv 是比较有代表性的一个组件。
rust 目前使用的人比较少,再加上 tikv 编译过程中使用的工具比较多,在论坛上经常碰到一些 tikv 的编译问题,难以解决。
另外在 windows 环境下,开发和学习 tikv 也不如 linux 环境下便利,WSL 对这个问题有很大的改善,也兼顾着介绍一下。
文本希望提供一种一步接一步的方式,让任何没有编译安装经验的人,都能成功编译 tikv。
WSL(Windows Subsystem for Linux)
在 windows 环境下,要使用 linux 的一些工具是比较麻烦的,以前的做法基本都是通过虚拟机(VMware, Hyper-V), 不过这类虚拟机产品一般会有资源固定,随用随扩的能力比较差,网络设置复杂(特别是现在很多开发工作不科学上网根本寸步难行,本来就别扭的网络设置还要考虑代理的问题,就更复杂),访问虚拟机内外的资源互通困难,等等问题。微软在这种情况下,推出了 WSL。
这里不介绍 WSL 的具体安装,具体的安装方法可以看
https://www.bilibili.com/video/BV1tW42197za
而 WSL 的官方文档地址:https://learn.microsoft.com/zh-cn/windows/wsl/
需要系统了解的,可以翻看。
另外需要准备好科学上网的工具,后面离不开它。
我们从已经装好了 WSL 开始。
当你安装好了 WSL,直接在运行 -》cmd 之后,打开的命令行界面里,就可以

另外需要详细了解 wsl 命令包含那些参数,可以使用 wsl --help
查看
看到上面这个界面。之后使用

这就是当前支持的分发版本。如果需要 rocky,或者 centos,参考官方文档
https://learn.microsoft.com/zh-cn/windows/wsl/use-custom-distro
这部分内容。本文使用的分发版本是 ubuntu-24.04。
上面的列出的 linux 分发版本都可以使用wsl --install <Distro>
直接安装(需要科学上网),但如果你的 c 盘和我一样不富裕的话,还是建议使用
这种安装方式,location 后面就是这个 wsl 存储文件的所在地址。


值得一提的是,这里的存储是随用随扩的,上限可以在 wsl settings 里面设置。没用到的时候,实际的文件并不大,到编译完成,这个空间会用到 10g 左右。
等待下载结束,安装之后设置好用户名密码,就可以进入 ubuntu24 的环境里面了。

前面的提示符会变化,无缝进入 linux 环境。

WSL 的网络设置
因为使用了科学上网,在 wsl 里面也是需要访问外网的。所以还要做一番网络设置。

直接找 wsl settings
,

把网络模式从 NAT,改成 Mirrored。在我这个 wsl 版本下我没有做其他修改,如果不能访问,对着这个界面看看哪里设置不一致。
编译 Tikv
安装工具和必要的库
rustup
首先是 rustup,

中途会问你是否需要定制化安装,这里不需要定制化安装,直接回车。

装完了提示你要修改一些环境变量,以便能在 PATH 中找到 rustup。
最后rustup -V
之后能看到类似的输出就是设置的没问题了。
编译工具
主要是 make,cmake,clang,llvm,gcc-9,g++-9,apt 安装前,需要先 sudo apt update 一下,之后
最后安装版本如下:

gcc,g++ 的版本安装的时候就指定了,就是 9。
其他必要的库
这些必要的库,也需要提前装好。
开始编译
先把代码弄下来

我把 tikv 放在了 /mnt/e 下面。这个 /mnt/e 值得提一下,其实这里访问的是 windows 系统下的 e 盘。使用 wsl 的时候,你的系统里面的每个盘符都会自动被 wsl 挂在 /mnt 目录下面。

也就是说,我把编译工具和编译的库,装在一个 ubuntu24 的虚拟机里面,但是把 tikv 代码放在了 windows 的存储里面。两者通过 /mnt 目录可以实现相互访问。只在 ubuntu24 里面放不得不在 linux 下运行的文件。
当然你也可以放在其他目录, 比如 /opt,,只要是非 /mnt/{盘符}这样的路径,你其实是把 tikv 的代码放在了安装 ubuntu24 指定的 location 参数指向的那个文件里面,上面可以看到是d:\wsl\ubuntu24\ext4.vhdx
。这会导致这个文件随着使用而增大,而且你通过 wsl –unregister 删除这个 ubuntu24 的分发版本的时候,这个 tikv 的代码也就跟着d:\wsl\ubuntu24\ext4.vhdx
文件的删除一起没了。
WSL 的优势就是让 linux 和 windows 有一种浑然一体的感觉。相互访问非常方便。
现在万事具备,直接
注意这里不要使用 cargo build。rust 项目会使用 cargo build 是没错。但是 make 脚本里面需要设置 rustc 的版本,如果你第一次运行 make build,发现卡住一阵,没有任何输出,你 top 一下就能看到 rustc/rustup 占用的 cpu 最高。这就是在设置 rustc 的版本,如果对应的 rustc 版本没有安装,会自动安装,设置好 rustc 的版本继续编译。
以前在论坛上碰到过一些因为 rustc 版本设置不正确导致的莫名报错。当时我还不知道怎么解决,我现在意识到,这可能就是直接使用 cargo build 而没有使用 make build 造成的。
然而并不顺利,编译会这附近停止,

然后跳出一个几千行的报错。没错,是几千行。初次见到会有点吓人。不要慌,冷静看看有什么值得注意的信息。
类似这种前面带[ 9%]
,其实是正常的编译进度信息,只是报错了以后才打印出来,用于排除错误的,可以直接忽略。继续往下翻,
值得注意的上面这种信息,这说明编辑器着急的快要亲自下场教你该怎么改了。
把上述报错贴给 deepseek,给出的方法是 gcc 的版本可能设置的不对。gcc9 我们上面已经装了,gcc –version 显示还是 13.
所以需要通过环境变量设置一下
之后继续 make build,就没有这个错误了。
直到最后一步 link 的时候又报错了。这次报错没有前面那么离谱,也有 1-200 行,不过前面大部分是告诉你具体是怎么 link 的。不用管。直奔最后
这个提示比较明确是找不到undefined symbol: rocksdb::encryption::NewKeyManagedEncryptedEnv(rocksdb::Env*, std::shared_ptrrocksdb::encryption::KeyManager&)
,这个函数。
同样是丢给 deepseek,给出的方法是
建议设置环境变量
设置好,需要 make clean,再 make build,不 make clean 直接 make build 还是会报错的。

编译完成后是这个样子的,有些警告,但不影响编译成功。
进入 target/x86_64-unknown-linux-gnu/debug 目录下就能看到我们的编译成果。

主要是 tikv-ctl 和 tikv-server,这两个。

用./tikv-server –version 查看版本信息,如上所示。
大功告成。
总结
1,在 windows 系统下使用 linux 的相关工具,WSL 提供了很大的便利。正在渐渐成为主流选择。
2,编译 tikv 的过程有很多工具的版本和库在原始的文档上写的不清楚,
https://github.com/tikv/tikv/blob/master/CONTRIBUTING.md

当然这是没问题,因为在不同 linux 发行版和版本下,这些要求都不一样,没法继续细化,真细化下去这个文档就会长的离谱。没有必要。但这些问题对一个从来没有接触过编译的人,确实存在障碍。
在 WSL 的 ubuntu24 下,编译环境被严格限定,我就能特别细化一下这部分。希望对初学者有所帮助。
3,AI 时代善用 deepseek 这类工具,这类工具解决编译错误的效率非常高。只是 AI 如果给出让你修改代码类的提示,你要慎重,这不太可能是正确答案。回头看,通过调整环境变量来完成编译是最佳选择。
整体看 tikv 的编译难度并不高。有机会,大家可以踊跃尝试。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/8e68737ee2c5cbb560aa03590】。文章转载请联系作者。
评论