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