写点什么

在 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 --version
复制代码



另外需要详细了解 wsl 命令包含那些参数,可以使用 wsl --help 查看


看到上面这个界面。之后使用


wsl -l --online
复制代码



这就是当前支持的分发版本。如果需要 rocky,或者 centos,参考官方文档


https://learn.microsoft.com/zh-cn/windows/wsl/use-custom-distro


这部分内容。本文使用的分发版本是 ubuntu-24.04。


上面的列出的 linux 分发版本都可以使用wsl --install <Distro> 直接安装(需要科学上网),但如果你的 c 盘和我一样不富裕的话,还是建议使用


wsl --install Ubuntu-24.04 --location D:\wsl\Ubuntu24
复制代码


这种安装方式,location 后面就是这个 wsl 存储文件的所在地址。




值得一提的是,这里的存储是随用随扩的,上限可以在 wsl settings 里面设置。没用到的时候,实际的文件并不大,到编译完成,这个空间会用到 10g 左右。


等待下载结束,安装之后设置好用户名密码,就可以进入 ubuntu24 的环境里面了。



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


WSL 的网络设置

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



直接找 wsl settings



把网络模式从 NAT,改成 Mirrored。在我这个 wsl 版本下我没有做其他修改,如果不能访问,对着这个界面看看哪里设置不一致。

编译 Tikv

安装工具和必要的库

rustup

首先是 rustup,


curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
复制代码



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



装完了提示你要修改一些环境变量,以便能在 PATH 中找到 rustup。


最后rustup -V之后能看到类似的输出就是设置的没问题了。

编译工具

主要是 make,cmake,clang,llvm,gcc-9,g++-9,apt 安装前,需要先 sudo apt update 一下,之后


sudo apt install build-essential cmake clang llvm gcc-9 g++-9
复制代码


最后安装版本如下:



gcc,g++ 的版本安装的时候就指定了,就是 9。

其他必要的库

sudo apt install libssl-dev pkg-config libsnappy-dev librocksdb-dev libgrpc++-dev
复制代码


这些必要的库,也需要提前装好。

开始编译

先把代码弄下来


git clone https://github.com/tikv/tikv.gitcd tikv
复制代码



我把 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 有一种浑然一体的感觉。相互访问非常方便。


现在万事具备,直接


make build
复制代码


注意这里不要使用 cargo build。rust 项目会使用 cargo build 是没错。但是 make 脚本里面需要设置 rustc 的版本,如果你第一次运行 make build,发现卡住一阵,没有任何输出,你 top 一下就能看到 rustc/rustup 占用的 cpu 最高。这就是在设置 rustc 的版本,如果对应的 rustc 版本没有安装,会自动安装,设置好 rustc 的版本继续编译。


以前在论坛上碰到过一些因为 rustc 版本设置不正确导致的莫名报错。当时我还不知道怎么解决,我现在意识到,这可能就是直接使用 cargo build 而没有使用 make build 造成的。


然而并不顺利,编译会这附近停止,



然后跳出一个几千行的报错。没错,是几千行。初次见到会有点吓人。不要慌,冷静看看有什么值得注意的信息。


[  9%] Building C object third_party/cares/cares/CMakeFiles/c-ares.dir/ares_parse_mx_reply.c.o[  9%] Building C object third_party/cares/cares/CMakeFiles/c-ares.dir/ares_parse_naptr_reply.c.ogmake[4]: Entering directory '/mnt/e/tikv/target/x86_64-unknown-linux-gnu/debug/build/grpcio-sys-45d0a6dfc49c8631/out/build'
复制代码


类似这种前面带[ 9%] ,其实是正常的编译进度信息,只是报错了以后才打印出来,用于排除错误的,可以直接忽略。继续往下翻,


    336 | constexpr FormatConversionCharSet FormatConversionCharSetUnion(        |           ^~~~~~~~~~~~~~~~~~~~~~~        |           FormatConversionCharInternal  /home/yao/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/grpcio-sys-0.10.3+1.44.0-patched/grpc/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h:342:11: error: 'FormatConversionCharSet' does not name a type; did you mean 'FormatConversionCharInternal'?    342 | constexpr FormatConversionCharSet FormatConversionCharSetUnion(        |           ^~~~~~~~~~~~~~~~~~~~~~~        |           FormatConversionCharInternal  /home/yao/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/grpcio-sys-0.10.3+1.44.0-patched/grpc/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h:349:11: error: 'uint64_t' does not name a type
复制代码


值得注意的上面这种信息,这说明编辑器着急的快要亲自下场教你该怎么改了。


把上述报错贴给 deepseek,给出的方法是 gcc 的版本可能设置的不对。gcc9 我们上面已经装了,gcc –version 显示还是 13.


所以需要通过环境变量设置一下


export CC=gcc-9export CXX=g++-9
复制代码


之后继续 make build,就没有这个错误了。


直到最后一步 link 的时候又报错了。这次报错没有前面那么离谱,也有 1-200 行,不过前面大部分是告诉你具体是怎么 link 的。不用管。直奔最后


= note: some arguments are omitted. use --verbose to show all linker arguments= note: rust-lld: error: undefined symbol: rocksdb::encryption::NewKeyManagedEncryptedEnv(rocksdb::Env*, std::shared_ptrrocksdb::encryption::KeyManager&)>>> referenced by c.cc>>>               fe2781a27f0c2488-c.o:(crocksdb_key_managed_encrypted_env_create) in archive /mnt/e/tikv/target/x86_64-unknown-linux-gnu/debug/deps/liblibrocksdb_sys-5c81777902031447.rlibcollect2: error: ld returned 1 exit statuserror: could not compile tikv-server (bin "tikv-server") due to 1 previous errormake: *** [Makefile:200: build] Error 101
复制代码


这个提示比较明确是找不到undefined symbol: rocksdb::encryption::NewKeyManagedEncryptedEnv(rocksdb::Env*, std::shared_ptrrocksdb::encryption::KeyManager&) ,这个函数。


同样是丢给 deepseek,给出的方法是


链接器无法找到符号 NewKeyManagedEncryptedEnv 表明 RocksDB 未正确编译加密模块。TiKV 的加密功能需要 RocksDB 编译时启用 LIBROCKSDB_ENABLE_ENC=1 标志。
复制代码


建议设置环境变量


export LIBROCKSDB_ENABLE_ENC=1
复制代码


设置好,需要 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 的编译难度并不高。有机会,大家可以踊跃尝试。


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
在Windows11下使用WSL编译Tikv9.0_安装 & 部署_TiDB 社区干货传送门_InfoQ写作社区