针对Linux的Rust工具链的最低要求将随着Rust 1.64.0的发布(预计在2022年9月22日)而提高。新的最低要求是:
- glibc >= 2.17 (之前的glibc >= 2.11)
- 内核 >= 3.2 (之前的内核 >= 2.6.32)
这些要求既适用于运行Rust编译器本身(以及其他Rust工具,如Cargo或Rustup),也适用于运行由Rust产生的二进制文件,如果它们使用libstd的话。
如果你的目标不是旧的长期支持的发行版,或者运行旧的Linux版本的嵌入式硬件,这个变化不太可能影响你。否则,请继续阅读!
受影响的目标
原则上,新的内核要求影响所有*-linux-* ,而glibc要求影响所有*-linux-gnu* 。在实践中,许多目标已经需要更新的内核或glibc版本。对这些目标的要求并没有改变。
在分发了Rust主机工具链的目标中,下列目标受到影响:
i686-unknown-linux-gnu(Tier 1)x86_64-unknown-linux-gnu(第1层)x86_64-unknown-linux-musl(带有主机工具的第2级)powerpc-unknown-linux-gnu(带主机工具的第二级)powerpc64-unknown-linux-gnu(带有主机工具的第2级)s390x-unknown-linux-gnu(带有主机工具的第2级)
以下情况不受影响,因为它们已经有较高的glibc/kernel要求:
aarch64-unknown-linux-gnu(第1层)aarch64-unknown-linux-musl(带有主机工具的第2级)arm-unknown-linux-gnueabi(带主机工具的第2级)arm-unknown-linux-gnueabihf(带主机工具的第2级)armv7-unknown-linux-gnueabihf(带主机工具的第2级)mips-unknown-linux-gnueabihf(第2级带主机工具)powerpc64le-unknown-linux-gnueabihf(第2级,带主机工具)riscv64gc-unknown-linux-gnueabihf(带主机工具的第2级)(Tier 2 with host tools)
对于其他没有分发Rust工具链的二级或三级目标,我们没有准确地跟踪最低要求,它们可能会也可能不会受到这一变化的影响。*-linux-musl* 目标只受到内核要求的影响,而不是glibc要求。只使用libcore而不使用libstd的目标则不受影响。
支持的目标及其要求的列表可以在平台支持页面找到。然而,该页面还没有更新到这里宣布的变化。
受影响的系统
用于新基线要求的glibc和内核版本已经接近十年了。因此,这一变化应该只影响那些以长期支持的旧Linux发行版为目标的用户,或者运行旧版本Linux的嵌入式硬件。
在新的要求下,以下Linux发行版仍然受到支持:
- RHEL 7 (glibc 2.17, kernel 3.10)
- SLES 12-SP5 (glibc 2.22, kernel 4.12.14)
- 蝶变8 (glibc 2.19, kernel 3.16.7)
- Ubuntu 14.04 (glibc 2.19, kernel 3.13)
以下发行版在新要求下不被支持:
- RHEL 6 (glibc 2.12, kernel 2.6.32)
- SLES 11-SP4 (glibc 2.11.3, kernel 3.0.101)
- 蝶变6(glibc 2.11,内核2.6.32),蝶变7(glibc 2.13,内核3.2.41)。
- Ubuntu 12.04 (glibc 2.15, kernel 3.2)
在第二个列表中的发行版中,只有RHEL 6仍有有限的供应商支持(ELS)。
为什么要提高要求?
我们希望Rust,以及由Rust产生的二进制文件,能够尽可能广泛地使用。同时,Rust项目只有有限的资源来维持与旧环境的兼容性。
工具链的要求有两部分。在主机系统上运行Rust编译器的最低要求,以及交叉编译的二进制文件的最低要求。
对主机工具链的最低要求影响了我们的构建系统。Rust CI为几十个不同的目标产生二进制工件。创建支持旧glibc版本的二进制文件需要在具有旧glibc的操作系统上构建(对于本地构建)或使用具有旧glibc版本的构建根(对于交叉编译的构建)。
同时,Rust依靠LLVM进行优化和代码生成,这就定期增加了它的工具链要求。LLVM 16将需要GCC 7.1或更新的版本(而LLVM 15仅在名义上支持GCC 5.1)。随着时间的推移,创建一个既有非常老的glibc又有最新的编译器的构建环境变得越来越难。crosstool-ng(我们用它来满足大多数交叉编译的需要)不支持既针对glibc 2.11,又使用满足LLVM新要求的编译器。
对交叉编译的二进制文件的要求有一个不同的动机。增加内核要求可以让 libstd 使用更新的系统调用,而不必维护和测试不支持这些系统调用的内核的兼容性。
新的基线要求是作为长期支持的发行版中最小的共同点来挑选的,这些发行版仍有活跃的支持。目前是RHEL 7,glibc 2.17和内核3.10。内核要求被选为3.2,因为这是glibc本身的最低要求,而且这些版本之间几乎没有相关的API差异。
我应该做什么?
如果你或你的组织受到这一变化的影响,根据你的情况,有一些可行的选择:
- 升级你的目标系统,或者提高你的软件的最低要求,以满足新的约束。
- 如果你在一个旧的主机上运行Rust编译器,可以考虑从一个较新的主机上进行交叉编译。
- 如果你的目标是一个旧的glibc版本,考虑用musl来代替。
- 如果你的目标是一个旧的内核版本,并且使用libstd,你可能就不走运了:在这种情况下,你可能不得不冻结你当前的Rust版本,或者维护一个支持旧内核的libstd的分叉。