Linux在2021年迎来了它的30岁生日( https://oreil.ly/fkMyT )。Linux项目拥有数十亿用户和数千名开发人员,毫无疑问,它是一个世界性的(开源)成功故事。但这一切是如何开始的,我们又是如何走到这一步的?
20世纪90年代
我们可以将1991年8月25日Linus Torvalds写给comp.os.minix新闻组的电子邮件视为Linux项目的诞生,至少在公开记录方面是这样。从代码行数(LOC)和采用情况来看,这个爱好项目很快就开始流行起来。例如,在不到三年的时间里,Linux 1.0.0发布的LOC超过了176 000。至此,已经很好地实现了能够运行大多数UNIX/GNU软件这一最初目标。此外,第一个商业产品在20世纪90年代出现:Red Hat Linux。
2000年至2010年
作为一个“少年”,Linux不仅在功能和支持的硬件方面已经成熟,而且超出了UNIX所能做的。在这段时间内,我们还目睹了大公司对Linux的大量且不断增长的购买,Google、Amazon、IBM等都采用Linux。这也是发行版战争( https://oreil. ly/l6X4Q )的高峰期,导致企业改变了其方向。
2010年至今
Linux确立了自己在数据中心和云计算以及任何类型的物联网设备和电话中的主力地位。在某种意义上,我们可以认为发行版战争结束了(现在,大多数商业系统都是基于Red Hat或Debian的),从某种意义上说,容器的兴起(从2014或2015年开始)是这种发展的原因。
在快速回顾了Linux的发展历史后,有必要了解一下Linux的发展背景和本书的写作动机,下面我们将转向一个看似无关的问题:为什么有人需要Linux,或者一个操作系统?
假设你没有可用的操作系统(OS),或者出于某种原因不能使用操作系统。然后,你将自己完成几乎所有的事情:内存管理、中断处理、与I/O设备通信、管理文件、配置和管理网络栈,等等。
从技术上讲,操作系统并不是严格需要的。有些系统没有操作系统。这些通常是占用空间很小的嵌入式系统:想想物联网信标。除了一个应用程序之外,它们根本没有可用的资源来保留其他任何东西。例如,在Rust中,你可以使用它的核心和标准库在裸机上运行任何应用程序( https://oreil.ly/zW4j7 )。
操作系统承担了所有这些无差别的繁重工作,将不同的硬件组件抽象出来,并为你提供一个(通常)干净和设计良好的应用程序编程接口(API),例如,我们将在第2章中仔细研究的Linux内核。我们通常将操作系统公开的这些API称为系统调用(syscall)。高级编程语言(如Go、Rust、Python或Java)构建在这些系统调用之上,可能将它们包装在库中。
所有这些都可以让你专注于业务逻辑,而不必自己管理资源,还可以照顾到你想要在上面运行应用程序的不同硬件。
让我们看一个系统调用的具体例子。假设我们想要识别(并输出)当前用户的ID。
首先,我们看一下Linux系统调用getuid(2)( https://oreil.ly/md15Z ):
这个getuid系统调用是我们可以从库中以编程方式使用的。我们将在2.3.6节中更详细地讨论Linux系统调用。
你可能想知道(2)在getuid(2)中是什么意思。这是man实用程序(想想内置的帮助页)用来指示在man中所分配的命令部分的术语,类似于邮政代码或国家代码。这是UNIX遗产显而易见的一个例子,你可以在1979年的UNIX Programmer's Manual第七版第1卷中找到它的起源。
在命令行(shell)上,我们将使用等效的id命令,该命令反过来使用getuid系统调用:
既然你已经基本了解了为什么在大多数情况下使用操作系统是有意义的,那么让我们继续讨论Linux发行版的主题。
当我们说“Linux”时,我们的意思可能并没有表达清楚。在本书中,当指系统调用和设备驱动程序集时,我们会说“Linux内核”,或者仅仅是“内核”。此外,当提到Linux发行版( https://oreil.ly/U9luq ,或简称为发行版)时,我们指的是内核和相关组件的具体捆绑,包括包管理、文件系统布局、init系统和一个预先为你选择的shell。
当然,你可以自己完成所有这些工作:你可以下载并编译内核,选择包管理器,等等,并创建(或滚出)你自己的发行版。很多人一开始就是这么做的。多年来,人们发现把这个打包(以及安全补丁)留给专家(无论是私人的还是商业的)并只使用最终的Linux发行版,是更好地利用他们的时间的方式。
如果你倾向于构建自己的发行版,也许是因为你是一个修补匠,或者因为某些业务限制而不得不这样做,我建议你仔细看看Arch Linux( https://oreil.ly/UBSHM ),你可以使用它轻松创建一个自定义的Linux发行版。
要想感受一下众多的发行版,包括传统的发行版(Ubuntu、Red Hat Enterprise Linux [RHEL]、CentOS等,如第6章所讨论的)和现代的发行版(如Bottlerocket和Flatcar,参见第9章),可以看看DistroWatch( https://oreil.ly/DWmrr )。
结束发行版主题之后,让我们转向一个完全不同的主题:资源及其可见性和隔离。