作者 | Tina
转自InfoQ
众所周知,Linux 是 C 语言的代言人。但是,时代变了,Rust 正在兴起并赢得越来越多人的支持,它开始逐渐扮演 Linux 系统语言的角色。
在今年的 Linux 基金会开源峰会上,Linus Torvalds 提到他希望看到在 Linux Kernel 5.20 中融入 Rust。内核发布周期一般是 9 到 10 周,这意味着我们可能会在 8 月初看到 5.19。然后,如果一切顺利的话,我们将在 10 月下旬或 2022 年 11 月上旬在 5.20 中看到 Rust。而仅在去年,Linus Torvalds 才刚对 Rust 发表过评论,表示自己绝不会推动 Linux 中的 Rust 运动,“Rust 优势的背后肯定存在复杂性,所以我会采取观望的态度,看看这些优势是否真的奏效。”
那么为什么 Rust 会如此快进入到 Linux 内核之中?这对社区、对使用 Linux 和 Rust 的公司来说意味着什么?对解答这些疑问,我们采访了跨云存储厂商达坦科技(DatenLord)的联合创始人施继成。
采访嘉宾:
施继成,达坦科技(DatenLord)联合创始人兼 CTO,曾供职于 Google、Alibaba 等国际知名科技公司。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有深入的研究。发表多篇操作系统内核相关论文,累计数百次引用。
InfoQ:几年前,有一些声音表示“是时候用 Rust 重写操作系统了”。以您的观察来看,这能够实现吗?为什么?
施继成:如果我们将“用 Rust 重写操作系统”定义为从零开始搭建一个基于 Rust 语言的操作系统且希望其能够商业化是不太现实的。原因就在于商业化的操作系统是需要应用场景的,某一个应用场景在相当长的时间内都会主流流行一个或几个操作系统,不轻易改变,比如桌面操作系统中的 Windows 和 MacOS,手机操作系统中的 Android 和 iOS,以及服务器操作系统 Linux,BSD 和 Windows Server 等。我们可以发现这些主流的操作系统是陪伴着该领域的发展成长起来的,往往都有长达几十年的历史,一旦形成主导地位不易撼动。
用户不愿意更换操作系统的原因主要是“生态依赖”—— 许许多多基于这些操作系统开发的应用程序和开发框架。如果说从零开始写一个操作系统还有可能由一家商业公司完成,那么完整迁移操作系统上层生态则是一个需要全人类参与的浩瀚工程。因此我认为用 Rust 语言从头写一个全新的基于现有成熟场景的操作系统是不现实的。
那么 Rust for Linux (以下简称 R4L)是另外一条可行的方案,该方法之所以可行,主要原因就是不改变 Linux 操作系统的接口,完全兼容现有 Linux 上的所有应用程序。R4L 仅仅是替换掉 Linux 内部的某些内核模块,这些用 Rust 完成的内核模块可以与其他内核组件完美结合,通过慢慢“蚕食”的方法,使得 Linux 中越来越多的组件使用 Rust 语言实现,最终达到提高 Linux 安全性的目的。当然现阶段 R4L 还在初级阶段,后续还有许多不确定性,需要社区和大家共同完善。
InfoQ:编写安全的 C 代码是可能的,那为什么还会很多人认为将 Rust 添加到 Linux 内核很重要?另外,将 Rust 添加到内核中,对社区、对贵司来说分别意味着什么?
施继成:“编写安全的 C 代码是可能的”这句话本身没有错,使用任何语言都有可能写出安全的代码,但程序员们为什么还要选择一种安全的语言呢?因为程序员也是人,是人就会犯错,程序员在代码中犯下的错就是众所周知的 Bug。优秀的程序员会使用各种方法避免或减少自己犯错,选择一种安全的语言,例如 Rust,就是这些努力中的一种。Rust 语言提供了一些特性,保证了程序员不犯内存错误和线程并发访问错误,而这些错误在内核开发中往往占据了大多数。以 Windows 操作系统为例,在微软 2019 年的一次演讲 (InfoQ - 促进软件开发及相关领域知识与创新的传播-极客邦 的安全漏洞有 70% 是内存安全问题,我相信 Linux 中的现象应该类似。基于此,将 Rust 添加到 Linux 内核中对提高其安全性至关重要。
R4L 项目对于 Rust 语言社区而言是重大利好,因为任何主流的语言都需要一个或几个应用场景来发展壮大,Rust 已经被证明可以用以构建浏览器—— Firefox,R4L 项目则证明了 Rust 可以被用来构建操作系统。随着这些主流应用场景的不断拓展,Rust 会被越来越多人使用,相应的 Rust 语言的生态也会越来越好,最终降低 Rust 语言的使用难度,吸引更多人来使用 Rust,这是一个正向循环。
对于我司( 北京达坦科技 )而言,R4L 项目也帮助我们更容易构建安全的存储系统。由于我司主打软硬件结合的存储系统,所以和 Linux 内核打交道是不可避免的,也需要写系统内核模块来完成硬件适配工作,R4L 让我们的安全相关工作变得更加简单了,也提高了系统层的安全性。由于 R4L 还处在初级阶段,我们在使用过程中也会向 Linux 社区提交 Patch,帮助 R4L 系统不断完善。
InfoQ:Rust for Linux 发展至今已经实现了哪些功能,还有哪些功能有待完善?
施继成:Rust for Linux 项目主要分为两个部分,第一个部分是将 Kernel 中原来的 C 语言接口用 unsafe 的 Rust 代码分装出来,我们俗称 binding,这一部分工作大部分由代码自动生成,相对比较简单。另外一部分是如何将 unsafe 的 Rust 代码封装成为 safe 的 Rust 代码,即如果通过 Rust 语言的特性来保证 Linux 中方法的安全性,这一部分的工作则完成度较低。
由于 kernel 模块实在过于繁杂,这里只能列举其中的一些来说明情况,已经部分完成功能的模块包括内存分配管理模块和链表等基础数据结构模块等,而未完成的模块包括内核线程抽象和异步任务执行器等。
InfoQ:这个发展历史当中,存在哪些权衡?
施继成:据我所知,在 R4L 项目中现在的主要权衡点仍然在安全性上。因为 Linux C 语言模块的安全性大多由良好的编程规范和调用范式来达到,所以很多安全性的保证都是隐含在代码逻辑中的;例如,内存被正确释放需要内存调用者自己来保证,大家往往采用的范式是在所有可能退出的地方都加上内存释放代码,或者将退出出口控制在一个地方。内核很多安全点比上述例子要复杂许多,如何将这些隐含的逻辑封装在 Rust 代码中有非常大的挑战,在安全的同时提供和 C 语言一样的性能则对功能实现者提出了更大的挑战。不过我坚信随着时间的推移和贡献者的增多,这些问题最终都能够得到完美的解决。
InfoQ:Linus 对 Rust 有一些态度上的转变,比如从最开始的“观望”,到承认 Rust 将出现在 Linux 中。主要原因,您认为是什么?
施继成:我个人觉得有以下几个原因:
Linus 早年间尝试用 C++ 写内核代码的体验不好,只尝试了两周时间,最终放弃使用 C++写内核。这一段经历会让 Linus 在接受新的语言上更加谨慎。R4L 的尝试在最开始让大家觉得风险很高,质疑声音也很多,不过随着这几年社区的不断努力,大家看到更多的希望,包括 Linus 在内的内核开发和维护者对 R4L 的信心也更充足。
InfoQ:您认为如果在 5.20 版本中出现 Rust,这其中还存在什么挑战?
施继成:当 R4L 进入主分支后,真正的故事才刚刚开始。就像之前我们介绍的一样,R4L 项目更多的是给内核开发搭建脚手架,真正的内核模块还需要一个一个替换和重写,例如文件系统和网络通信模块等等。这些模块有的历史悠久,代码结构的复杂性导致了任何语言级别的切换都不会是一个简单的任务。如何对这些大型模块进行平稳的迁移将会是整个社区面临的巨大挑战。
InfoQ:Rust 对开发者来说,难度还比较大,并且熟悉 Rust 的人目前还不多,如果下一个版本中出现了 Rust,对于维护者来说是否构成一些问题?
施继成:这个问题可以从两方面回答。首先,Rust 语言的使用者已经从 2020 年初的 60 万增长到 2022 年初的 220 万,语言使用者的增多意味着有更多人能够投入到内核开发和维护工作中,能为维护工作提供不少的帮助。另外一个方面,Linus 也从语言难度的角度讨论过 Rust,他认为比起 Rust 语言,系统内核的复杂度更大,因此 Rust 语言不应该成为内核开发中最困难的问题。同时 Linus 还以 Perl 语言举例,认为这是一门极难阅读的语言,不过这并不妨碍 Perl 语言在 Linux 项目中的使用。
InfoQ:说到 Rust 的现在和未来,您认为该语言现在处于什么位置?
施继成:Rust 语言已经连续 7 年蝉联 StackOverflow 网站(全球最大的编程问答网站)最受欢迎语言,Rust 语言的受欢迎程度是不言而喻的。现在随着 Rust 马上(Linus 原话是:“It's getting to the point where real soon now”)将成为 Linux 的官方第二语言,再一次验证了 Rust 语言的实用价值,必然会吸引更多的程序员来学习和尝试 Rust。我们看到了 Rust 非常好的增长势头,相信随着 Rust 社区的不断发展,其将会成为最主流的几门编程语言之一,就像现在的 C 和 C++ 一样。