Linux是什么,Linux简介(新手必看)
Linux 是使用最广泛的操作系统,从移动设备到云都在使用。
你可能不熟悉操作系统的概念,也可能正在使用微软 Windows 等操作系统,而没有考虑太多,或者你可能是 Linux 的新手。为了让你有一个正确的心态,我们将在本节鸟瞰操作系统和 Linux。
“现代”可以指任何东西,从云计算到树莓派。此外,最近 Docker 的崛起和基础设施方面的相关创新极大地改变了开发人员和基础设施运营商的格局。
让我们来仔细看看这些现代环境以及 Linux 在其中扮演的重要角色。
如果你对开发 Android 应用程序感兴趣,可以考虑访问 Android 开发者网站获取更多信息。
此外,它们甚至可能不是一直在运行,例如,每天只运行一次以传输一些数据。这些环境的另一个重要方面是实时功能。
虽然英特尔仍然广泛应用于台式计算机和笔记本计算机系统,但随着移动设备的兴起,我们看到了 ARM 架构的日益普及和最近的 RISC-V。与此同时,多架构编程语言和工具(如 Go 或 Rust)正变得越来越广泛,创造了一场完美风暴。
所有这些环境都是我认为的现代环境的例子,而且大多数(如果不是全部的话)都以某种形式运行在 Linux 上或使用 Linux。
现在我们了解了现代(硬件)系统,你可能想知道我们是如何走到这一步的,以及 Linux 是如何形成的。
从代码行数(LOC)和采用情况来看,这个爱好项目很快就开始流行起来。例如,在不到三年的时间里,Linux 1.0.0 发布的 LOC 超过了 176 000。至此,已经很好地实现了能够运行大多数 UNIX/GNU 软件这一最初目标。
此外,第一个商业产品在 20 世纪 90 年代出现:Red Hat Linux。
在这段时间内,我们还目睹了大公司对 Linux 的大量且不断增长的购买,Google、Amazon、IBM 等都采用 Linux。这也是发行版战争的高峰期,导致企业改变了其方向。
在快速回顾了 Linux 的发展历史后,有必要了解一下 Linux 的发展背景,下面我们将转向一个看似无关的问题:为什么有人需要 Linux,或者一个操作系统?
从技术上讲,操作系统并不是严格需要的。有些系统没有操作系统。这些通常是占用空间很小的嵌入式系统:想想物联网信标。除了一个应用程序之外,它们根本没有可用的资源来保留其他任何东西。例如,在 Rust 中,你可以使用它的核心和标准库在裸机上运行任何应用程序。
操作系统承担了所有这些无差别的繁重工作,将不同的硬件组件抽象出来,并为你提供一个(通常)干净和设计良好的应用程序编程接口(API)。
例如,我们后续仔细研究的 Linux 内核,我们通常将操作系统公开的这些 API 称为系统调用(syscall)。高级编程语言(如 Go、Rust、Python 或 Java)构建在这些系统调用之上,可能将它们包装在库中。
所有这些都可以让你专注于业务逻辑,而不必自己管理资源,还可以照顾到你想要在上面运行应用程序的不同硬件。
当然,你可以自己完成所有这些工作:你可以下载并编译内核,选择包管理器,等等,并创建(或滚出)你自己的发行版。很多人一开始就是这么做的。
多年来,人们发现把这个打包(以及安全补丁)留给专家(无论是私人的还是商业的)并只使用最终的 Linux 发行版,是更好地利用他们的时间的方式。
如果你倾向于构建自己的发行版,也许是因为你是一个修补匠,或者因为某些业务限制而不得不这样做,我建议你仔细看看 Arch Linux,你可以使用它轻松创建一个自定义的 Linux 发行版。
你可能听说过这样一种说法:在 UNIX(扩展为 Linux)中,所有东西都是一个文件。在这里,我们认为资源是任何可以用来帮助软件执行的东西,包括硬件及其抽象(如 CPU 和 RAM、文件)、文件系统、硬盘驱动器、固态硬盘(SSD)、进程、与网络相关的东西(如设备或路由表)以及代表用户的凭证。
Linux 中并非所有资源都是文件或通过文件接口表示。然而,也有一些系统,比如 Plan 9,在这方面做得更进一步。
让我们看一些 Linux 资源的具体示例。首先,我们想要查询一个全局属性(Linux 版本),然后查询关于正在使用的 CPU 的特定硬件信息:
通过前面的命令,我们了解到这个系统有四个 Intel i7 核可供使用。当使用不同的用户登录时,你希望看到相同数量的 CPU 吗?
让我们考虑一种不同类型的资源:文件。例如,如果用户 troy 在 /tmp/myfile 下创建了一个有权限的文件,那么另一个用户 worf 会看到这个文件,甚至能够对它进行写操作吗?
或者以进程为例,也就是说,内存中的程序具有运行所需的所有资源,如 CPU 和内存。Linux 使用进程 ID(简称 PID)来标识进程:
Linux 中可以有多个具有相同 PID 的进程吗?这个听起来很傻很没用的问题其实是容器的基础。答案是肯定的,可以有多个具有相同 PID 的进程,在不同的上下文中称为命名空间。这可能发生在容器化的设置中,比如当你在 Docker 或 Kubernetes 中运行应用程序时。
每个单独的进程都可能认为它是特殊的,具有 PID 1,在更传统的设置中,PID 1 是为用户空间进程树的根保留的。
从这些观测中我们可以了解到,给定资源上可以有一个全局视图(两个用户在完全相同的位置看到一个文件),也可以有一个本地或虚拟化视图,例如进程示例。
这就提出了一个问题,Linux 中的所有东西都是默认全局的吗?剧透一下:不是的。
让多个用户或进程并行运行的部分错觉是对资源的(受限的)可见性。在 Linux 中提供本地视图(某些受支持的)的方法是通过命名空间。
第二个独立的方面是隔离。例如,考虑进程隔离的一种方法是限制内存消耗,以便一个进程不能占用其他进程的内存。假设我给你的应用程序使用 1GB 的 RAM,如果它使用了更多,它就会因内存不足而停止响应。这提供了一定程度的保护。在 Linux 中,我们使用一个叫作 cgroups 的内核特性来提供这种隔离。
另外,完全隔离的环境会让应用程序看起来完全独立。例如,虚拟机(VM)可以用来为你提供完全隔离。
你可能不熟悉操作系统的概念,也可能正在使用微软 Windows 等操作系统,而没有考虑太多,或者你可能是 Linux 的新手。为了让你有一个正确的心态,我们将在本节鸟瞰操作系统和 Linux。
什么是现代环境
在进入技术细节之前,先带大家了解“现代Linux”是什么意思。“现代”可以指任何东西,从云计算到树莓派。此外,最近 Docker 的崛起和基础设施方面的相关创新极大地改变了开发人员和基础设施运营商的格局。
让我们来仔细看看这些现代环境以及 Linux 在其中扮演的重要角色。
1) 移动设备
现在很多手机和平板电脑都运行 Linux 的变体 Android。这些环境对功耗和鲁棒性有严格的要求,因为我们每天都依赖它们。如果你对开发 Android 应用程序感兴趣,可以考虑访问 Android 开发者网站获取更多信息。
2) 云计算
对于云,我们在规模上看到了与移动和微空间类似的模式。有新的、强大的、安全的、节能的 CPU 架构,如成功的基于 ARM 的 AWS Graviton 产品,以及已向云提供商建立的繁重外包,特别是在开源软件的上下文中。3) 物联网(智能)
我相信你已经看到很多与物联网(IoT)相关的项目和产品,从传感器到无人机。我们中的许多人已经接触过智能电器和智能汽车。这些环境对功耗的要求甚至比移动设备更具挑战性。此外,它们甚至可能不是一直在运行,例如,每天只运行一次以传输一些数据。这些环境的另一个重要方面是实时功能。
4) 处理器架构的多样性
在过去 30 年左右的时间里,英特尔一直是领先的 CPU 制造商,主导着微型计算机和个人计算机领域。英特尔的 x86 架构被认为是黄金标准。IBM 采取的开放方法(发布规范并允许其他人提供兼容设备)很有前途,导致 x86 克隆也使用英特尔芯片,至少最初是这样。虽然英特尔仍然广泛应用于台式计算机和笔记本计算机系统,但随着移动设备的兴起,我们看到了 ARM 架构的日益普及和最近的 RISC-V。与此同时,多架构编程语言和工具(如 Go 或 Rust)正变得越来越广泛,创造了一场完美风暴。
所有这些环境都是我认为的现代环境的例子,而且大多数(如果不是全部的话)都以某种形式运行在 Linux 上或使用 Linux。
现在我们了解了现代(硬件)系统,你可能想知道我们是如何走到这一步的,以及 Linux 是如何形成的。
Linux的发展史
Linux 在 2021 年迎来了它的 30 岁生日。Linux 项目拥有数十亿用户和数千名开发人员,毫无疑问,它是一个世界性的(开源)成功故事。但这一切是如何开始的,我们又是如何走到这一步的?1) 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。
2) 2000年至2010年
作为一个“少年”,Linux 不仅在功能和支持的硬件方面已经成熟,而且超出了 UNIX 所能做的。在这段时间内,我们还目睹了大公司对 Linux 的大量且不断增长的购买,Google、Amazon、IBM 等都采用 Linux。这也是发行版战争的高峰期,导致企业改变了其方向。
3) 2010年至今
Linux 确立了自己在数据中心和云计算以及任何类型的物联网设备和电话中的主力地位。在某种意义上,我们可以认为发行版战争结束了(现在,大多数商业系统都是基于 Red Hat 或 Debian的),从某种意义上说,容器的兴起(从 2014 或 2015 年开始)是这种发展的原因。在快速回顾了 Linux 的发展历史后,有必要了解一下 Linux 的发展背景,下面我们将转向一个看似无关的问题:为什么有人需要 Linux,或者一个操作系统?
为什么要使用操作系统
假设你没有可用的操作系统(OS),或者出于某种原因不能使用操作系统。然后,你将自己完成几乎所有的事情:内存管理、中断处理、与 I/O 设备通信、管理文件、配置和管理网络栈,等等。从技术上讲,操作系统并不是严格需要的。有些系统没有操作系统。这些通常是占用空间很小的嵌入式系统:想想物联网信标。除了一个应用程序之外,它们根本没有可用的资源来保留其他任何东西。例如,在 Rust 中,你可以使用它的核心和标准库在裸机上运行任何应用程序。
操作系统承担了所有这些无差别的繁重工作,将不同的硬件组件抽象出来,并为你提供一个(通常)干净和设计良好的应用程序编程接口(API)。
例如,我们后续仔细研究的 Linux 内核,我们通常将操作系统公开的这些 API 称为系统调用(syscall)。高级编程语言(如 Go、Rust、Python 或 Java)构建在这些系统调用之上,可能将它们包装在库中。
所有这些都可以让你专注于业务逻辑,而不必自己管理资源,还可以照顾到你想要在上面运行应用程序的不同硬件。
Linux发行版
当提到“Linux”时,我们的意思可能并没有表达清楚:- 当指系统调用和设备驱动程序集时,我们会说“Linux内核”,或者仅仅是“内核”;
- 当提到 Linux 发行版(或简称为发行版)时,我们指的是内核和相关组件的具体捆绑,包括包管理、文件系统布局、init 系统和一个预先为你选择的 shell。
当然,你可以自己完成所有这些工作:你可以下载并编译内核,选择包管理器,等等,并创建(或滚出)你自己的发行版。很多人一开始就是这么做的。
多年来,人们发现把这个打包(以及安全补丁)留给专家(无论是私人的还是商业的)并只使用最终的 Linux 发行版,是更好地利用他们的时间的方式。
如果你倾向于构建自己的发行版,也许是因为你是一个修补匠,或者因为某些业务限制而不得不这样做,我建议你仔细看看 Arch Linux,你可以使用它轻松创建一个自定义的 Linux 发行版。
Linux资源的可见性
在良好的 UNIX 传统中,Linux 拥有默认的全局资源视图。这就引出了一个问题:什么是全局视图(相对于什么?),什么是所谓的资源?你可能听说过这样一种说法:在 UNIX(扩展为 Linux)中,所有东西都是一个文件。在这里,我们认为资源是任何可以用来帮助软件执行的东西,包括硬件及其抽象(如 CPU 和 RAM、文件)、文件系统、硬盘驱动器、固态硬盘(SSD)、进程、与网络相关的东西(如设备或路由表)以及代表用户的凭证。
Linux 中并非所有资源都是文件或通过文件接口表示。然而,也有一些系统,比如 Plan 9,在这方面做得更进一步。
让我们看一些 Linux 资源的具体示例。首先,我们想要查询一个全局属性(Linux 版本),然后查询关于正在使用的 CPU 的特定硬件信息:
$ cat /proc/version ① Linux version 5.4.0-81-generic (buildd@lgw01-amd64-051) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #91~18.04.1-Ubuntu SMP Fri Jul 23 13:36:29 UTC 2021 $ cat /proc/cpuinfo | grep "model name" ② model name : Intel Core Processor (Haswell, no TSX, IBRS) model name : Intel Core Processor (Haswell, no TSX, IBRS) model name : Intel Core Processor (Haswell, no TSX, IBRS) model name : Intel Core Processor (Haswell, no TSX, IBRS)
- ❶ 输出 Linux 版本;
- ❷ 输出 CPU 相关信息,过滤模型。
通过前面的命令,我们了解到这个系统有四个 Intel i7 核可供使用。当使用不同的用户登录时,你希望看到相同数量的 CPU 吗?
让我们考虑一种不同类型的资源:文件。例如,如果用户 troy 在 /tmp/myfile 下创建了一个有权限的文件,那么另一个用户 worf 会看到这个文件,甚至能够对它进行写操作吗?
或者以进程为例,也就是说,内存中的程序具有运行所需的所有资源,如 CPU 和内存。Linux 使用进程 ID(简称 PID)来标识进程:
$ cat /proc/$$/status | head -n6 ① Name: bash Umask: 0002 State: S (sleeping) Tgid: 2056 Ngid: 0 Pid: 2056❶ 输出进程状态(即当前进程的详细信息)并限制输出,只显示前六行。其中,$$ 是一个特殊的变量,指的是当前进程。注意,在 shell 上下文中,$$ 是你在其中键入命令的 shell(例如 bash)的进程 ID。
Linux 中可以有多个具有相同 PID 的进程吗?这个听起来很傻很没用的问题其实是容器的基础。答案是肯定的,可以有多个具有相同 PID 的进程,在不同的上下文中称为命名空间。这可能发生在容器化的设置中,比如当你在 Docker 或 Kubernetes 中运行应用程序时。
每个单独的进程都可能认为它是特殊的,具有 PID 1,在更传统的设置中,PID 1 是为用户空间进程树的根保留的。
从这些观测中我们可以了解到,给定资源上可以有一个全局视图(两个用户在完全相同的位置看到一个文件),也可以有一个本地或虚拟化视图,例如进程示例。
这就提出了一个问题,Linux 中的所有东西都是默认全局的吗?剧透一下:不是的。
让多个用户或进程并行运行的部分错觉是对资源的(受限的)可见性。在 Linux 中提供本地视图(某些受支持的)的方法是通过命名空间。
第二个独立的方面是隔离。例如,考虑进程隔离的一种方法是限制内存消耗,以便一个进程不能占用其他进程的内存。假设我给你的应用程序使用 1GB 的 RAM,如果它使用了更多,它就会因内存不足而停止响应。这提供了一定程度的保护。在 Linux 中,我们使用一个叫作 cgroups 的内核特性来提供这种隔离。
另外,完全隔离的环境会让应用程序看起来完全独立。例如,虚拟机(VM)可以用来为你提供完全隔离。