GNU/Linux 操作系统简介
本篇将带您了解 GNU/Linux 发行版。
什么是操作系统?
GNU/Linux、UNIX、BSD、Windows 和 MacOS 都是操作系统。
作为资源管理的一部分,操作系统必须:
- 管理 物理 或 虚拟 内存。
- 物理内存是用于执行程序的内存条和处理器缓存组成。
- 虚拟内存是硬盘上的一个位置( swap 分区),它允许在计算机断电期间取下物理内存的情况下,能够保存系统的当前状态。
- 拦截 访问外设。软件很少被允许直接访问硬件(除了用于非常特殊需求的显卡)。
- 为应用程序提供适当的 任务管理。操作系统负责调度进程以充分使用处理机。
- 保护文件 不受未经授权的访问。
- 收集有关正在使用或正在进行的程序信息 。
UNIX – GNU/Linux 概述
历史
下文介绍了 UNIX 到 GNU/Linux 的发展历史。
UNIX
- 20 世纪 60 年代:麻省理工大学希望对当时的兼容分时系统 CTSS (Compatible Time-Sharing System) 进行升级,做出一套面向大众提供服务的信息处理工具,于是找到了著名的硬件公司——美国通用电气公司。
-
1964 年:AT&T 的贝尔实验室加入到由美国麻省理工学院(MIT)和通用电气公司(CE)合作的计划中去,准备联合启动一个叫做 MULTICS (MULTiplexed Information and Computing System,多功能信息和计算服务) 的工程项目,项目目标是开发一个具有多用户(Multi-user)、多任务(Multi-processor)、多层级(Multi-level)的操作系统,以完成对 CTSS 的升级。计划跑在由美国通用电气公司生产的 GE-645 大型机上,目的是连接 1000 部终端设备并支持 300 个用户同时上线。
-
1969 年:经过了几年的开发,MULTICS 因追求的目标过于庞大且复杂、项目进度远远落后于计划(当时并没有现在这种完善的项目管理)、项目资金(1969 年发生金融危机)等等各方面问题,最终导致贝尔实验室宣布退出该项目,但美国麻省理工学院和通用电气则继续开发着 MULTICS。
-
1969 年:当时参与 MULTICS 项目的肯·汤姆森(一名贝尔实验室工程师)在工作期间为跑在大型机 GE-645 上的 MULTICS 编写了一款游戏 —— 「space travel」(星际旅行)。游戏画面为二维画面,由黑色背景以及白色线条组成,玩家需要控制太空船在宇宙中的不同行星和卫星之间着陆,没有特定的目标。
在贝尔实验室退出 MULTICS 后,昂贵的大型机 GE-645 依然被留在实验室。肯·汤姆森将自己的游戏代码转化成了 fortran 语言,以便让游戏可以继续在 GE-645 已有的 GECOS 操作系统上运行。肯·汤姆森和贝尔实验室的其他员工(如拉维·塞西和丹尼斯·里奇)都在该操作系统上游玩着这款游戏。然而,GECOS 采用的是 「交互式批处理」模式,即当几个计算机终端同时连接到中央计算机时,每个终端的程序作业必须以队列的形式提交,这也导致了当 GE-645 为其他终端处理作业时,游戏会出现长时间的暂停;GECOS 要求用户输入命令而不是按下按钮,这导致飞船难以控制;游戏在 GECOS 系统上的表现还不如 MULTICS 系统;在当时,计算机都属于非常昂贵的产品,只有少部分的科研机构、实验室以及高校才拥有,是的,当时采用收费系统来统计计算机的使用情况,这意味着每次游玩该游戏的成本大约在 50~75 美元。
为了解决上面提到的运行效率、游戏控制、游玩成本、大型机 GE-645 被搬走等问题,需要找到更好的办法运行「space travel」。方法之一是找实验室申请购买 DEC PDP-10 大型机,这既能完成自己新操作系统的开发,也能将这款游戏更好的运行,但当时的贝尔实验室刚刚退出 MULTICS 项目,不会再花钱对操作系统的开发感兴趣,肯·汤姆森的申请被驳回。8 月份,肯·汤姆森找到了实验室里一台老旧的、很少使用的、只有 16 KB 内存的 DEC PDP-7 小型计算机,该机器于 1964 年出产,在当时已过去了 5 年,属于过时的设备,但好在其配备了图形终端且拥有出色的图形功能,于是他决定使用 GECOS 系统上的交叉编译器将「space travel」移植到该平台,将生成的机器码写入到打孔纸带中并将其加载到 DEC PDP-7 上。在移植期间,肯·汤姆森没有利用任何已在 DEC PDP-7 上的代码,而是决定重新从头开始写一个新程序,包括浮点库和其他低级工具;肯·汤姆森为 DEC PDP-7 编写了汇编器,来减少繁重的体力劳动;肯·汤姆森根据 丹尼斯·里奇 (Dennis Ritchie) 和 鲁德-卡纳迪 (Rudd Canaday) 的一些黑板想法设计了自己的简单文件系统,以提升游戏的运行速度,这些想法都源自于他们在 MULTICS 文件系统上的经验。在团队合作下(当时有六七个贝尔实验室的工程师参与项目),经过一系列的功能添加与改进后,这套东西变成了一个简单的操作系统——使用汇编语言编写的 UNIX 雏形。于此同时,在丹尼斯·里奇的帮助下,肯·汤姆森使用 DEC PDP-7 上的汇编语言重写了「space travel」游戏并使其在 DEC PDP-7 上正常运行。
团队将 Uniplexed Information and Computing Service 命名为 UNICS,与 MULTICS 相比,UNICS 更加的小且每个部件只限完成一件事并把它做好。
-
1970 年初:面对硬件性能羸弱且过时的 DEC PDP-7,其无法发挥 UNICS 的全部实力,所以当务之急就是换上性能更好的计算机。在当时,肯·汤姆森看上了各个高校以及科研机构最受欢迎的 DEC PDP-10,其性能强悍,肯·汤姆森于是向贝尔实验室申请购买 DEC PDP-10,但因高达 50 w 美元的高昂价格,申请最终被驳回。要想换高性能的计算机,必须首先证明 UNICS 是有用的。
-
1970 年:贝尔实验室是一个巨大的科研机构,每年都会产出大量的专利,专利申请的文档有非常严格的格式要求,现有的计算机系统无法满足要求,贝尔实验室只能通过购买专门的硬件进行处理,但有些格式与功能依旧无法实现。于是开发小组提议购买一台 DEC PDP-11 并在其上面编写专门用来申请专利的程序。 DEC PDP-11 是当时 DEC 公司新推出的计算机,拥有 24 KB 内存以及 512 KB 的磁盘,但价格只有 PDP-10 的十分之一,相对便宜的价格使领导们通过了小组的提议。开发小组利用 UNICS 创造了许多文档编辑工具,不仅提高了专利申请的效率,还帮助自家技术书籍的出版,这也被证明 UNICX 是有用的。同年,UNICS 被改名为 UNIX。
-
1971 年:肯·汤姆森和丹尼斯·里奇把之前在 PDP-7 上使用汇编语言编写的 UNIX 雏形移植到了 DEC PDP-11 上。UNIX V1(UNIX 第一版)诞生,11 月 3 日出版了《Unix 程序员手册》(UNIX Programmer’s Manual),将 1970-01-01 定义为 UNIX 起始的纪元日期(参考日期)。
-
1971 年:丹尼斯·里奇开始改进肯·汤姆森的 B 语言。B 语言是一门诞生于 1969 年前后的语言,它是肯·汤姆森在丹尼斯·里奇的支持下被设计出来的。
-
1972 年:改进的 B 语言被称为 C 语言。UNIX V2(UNIX 第二版) 发布。
-
1973 年 10 月:在 IBM 举办的操作系统原理专题研讨会上,肯·汤姆森与丹尼斯·里奇发表了一篇论文并展示了 UNIX,这是 UNIX 操作系统首次正式对外界进行展示。
-
1973 年:C 语言主体完成,这一年,UNIX V4 系统绝大部分都被 C 语言进行重写,这也为后来 UNIX 的可移植性打下了基础(注:早先使用汇编语言编写的 UNIX 特别依赖硬件)。
-
1974 年 7 月:UNIX 发展到第 5 个版本,肯·汤姆森与丹尼斯·里奇合作在 ACM 通信上发表了一篇关于 UNIX 的论文,UNIX 第 5 个版本以「仅用于教育目的」的协议提供给各大高校作为教学使用,成为当时操作系统课程的范例教材。各大学与公司开始通过 UNIX 源码对 UNIX 进行了各种各样的改进和拓展,这也就是我们现在称呼「UNIX 变体」名称的由来。
-
1974 年:美国司法部再次起诉AT&T违法《反垄断法》。
-
1975 年:UNIX 第 6 版发布,这是第一个在贝尔实验室之外被广泛使用的版本。肯·汤姆森从贝尔实验室休假回来,以客座教授来到了自己的毕业大学——加州大学伯克利分校,开始教授操作系统的课程。肯·汤姆森帮助安装了 UNIX 的第 6 版,并开始为该系统实现 Pascal 编程语言。在教授操作系统课程期间,研究生查克·哈利(Chuck Haley)和比尔·乔伊(Bill Joy)帮忙改进了 Pascal 以及文本编辑器。
-
1977 年: 其他大学对伯克利软件(Berkeley Software)感兴趣,于是比尔·乔伊开始编译第一个伯克利软件发行版(the first Berkeley Software Distribution,1 BSD)。
-
1978 年 3 月 9 日:1 BSD 发布,大约发出了 30 多份拷贝。请注意!这里的 1 BSD 并不是一个完整的操作系统,而是以一个 UNIX 的附加组件存在,和 AT&T 的代码交织在一起。
-
1979 年 5 月:2 BSD(the second Berkeley Software Distribution) 发布,大约发出了 75 份的拷贝,包含 1 BSD 软件的更新以及比尔·乔伊开发的两个新程序,这两个新程序依旧被保留在现如今的 UNIX 变体以及各种 GNU/Linux 发行版中——
vi
编辑器和C Shell
。现如今,人们普遍将 1979 年看做 BSD 诞生的年份。
C Shell
、vi
等程序的原始作者,SUN微系统公司的建立者之一,设计了Sparc微处理器,是JAVA以及Jini/JAVASpaces的主要作者之一。-
1979 年:UNIX 第 7 版发布,该版本是第一个真正意义上的完整 UNIX 操作系统。
-
1980 年:微软从 AT&T 那里获得授权,准备为英特尔的处理器开发一个全新的操作系统——Xenix,以在个人电脑和微型计算机中使用。
-
1981 年末:AT&T 的 UNIX 系统组(UNIX System Group,USG)发布了 System III,并于次年对外发布商业版。该版本是各种 AT&T UNIX 系统的混合体。之所以称为 System III(不存在称为 System I 或 System II 的 Unix 版本),是因为这是 UNIX/TS 3.0.1 和 CB UNIX 3 的外部版本,而在之前,UNIX/TS 3.0.1 和 CB UNIX 3 只存在于贝尔实验室 UNICS 内部。
-
1982 年:从法庭败诉后的新 AT&T 意识到 UNIX 的商业价值,于是开始停止提供 UNIX 的源代码,发布商业版的 UNIX System III,收取高昂的授权费。同时,不再授权高校可以使用免费 UNIX。此时的 UNIX 发展成了两条线路——AT&T 的官方 UNIX 商业版以及 BSD 版。
- 20 世纪 80 年代中期:为了让程序可以在不同的「UNIX 变体」都能运行,需要统一操作系统接口 API。1988 年,IEEE(美国电气电子工程师学会)将这些标准汇总为 POSIX(Portable Operating System Interface),正式成为行业规范。
UNIX 是一种开放且不断发展的操作系统,在计算机的历史上发挥了重要作用。它已成为许多其他系统的基础,如 GNU/Linux、BSD、Mac OSX 等。直到今天,它仍然很重要。
GNU 计划
-
1971 年:理查德·马修·斯托曼(Richard Mathew Stallman)开启了他在 MIT 的职业生涯,工作在一个专门使用自由软件的工作小组。在当时,不仅计算机公司经常发布自由软件,而且程序员之间也经常自由相互地合作(如果你对别人的代码感兴趣但不太熟悉,你总是可以得到一份源代码,你可以自由的阅读源代码、修改源代码乃至把代码拆分并用来构建新程序)
-
1983 年:理查德·马修·斯托曼发起了 GNU(GNU’s Not Unix) 计划并成立自由软件基金会。GNU 计划的目的在于建立一个自由的、开放的 Unix 系统,其中比较重要的工具有:gcc 编译器、bash shell、Emacs 编辑器等。
-
1990 年:我们找到或写出了一个类似 UNIX 操作系统所需的所有主要组件,但唯独缺少一成熟的、自由的内核。
-
1991 年-1992 年:1991 年,林纳斯·托瓦兹在 1991 年开发了一个类似 UNIX 的 Linux 内核,并在 1992 年将其变成自由软件。将 GNU 的组件与 Linux 内核结合,就形成了一个完整的操作系统——GNU/Linux 系统(也称 GNU/Linux 发行版)。
GNU 计划不仅是开源事业的基石,其特有的 GPL 开源许可证协议 也帮助了开源软件的发展,今天我们熟知的 RHEL 就采用了该开源许可证协议。
MINIX
- 1987:由前面可知,1982 年,AT&T 的 UNIX 就化身成了商业版,不仅需要付费购买,而且不允许自由传播以及复制。受 BSD 的影响,民间高手纷纷写出自己的类 UNIX。出于教授操作系统课程的教学目的,荷兰大学的一位教授 Andrew S. Tanenbaum 开发出了 MINIX(一种简化版的 UNIX,参考了当时 UNIX 的第 7 个版本),学生可以阅读并完全获取该操作系统的源代码。现如今,你依旧可以下载到最新版本的 MINIX —— http://www.minix3.org/
Linux
- 1991 年:一名芬兰赫尔辛基大学的大学生林纳斯·托瓦兹(Linus Torvalds),专业为计算机,当时学习的操作系统是 MINIX。后来,Linus 和一些爱好者,以 MINIX 为模板,利用 bash、gcc 等工具,结合自己的补丁和其他人的补丁,写出了第一版本的 Linux 内核(符合 POSIX 标准),同时放到网上供人们下载、学习、改进等。9 月,Linux 内核版本 0.01 在芬兰大学和研究网络(FUNET)的 FTP 服务器(ftp. Funet. Fi)上发布,它有 10239 行代码。10 月,0.02 版本的内核发布了。12 月,0.11 版本的内核发布。
- 1992 年 2 月:发布 0.12 版本并采用了 GNU 通用公共许可证(GPL),而在此之前的版本是不允许商业再分发的。
- 1994 年 3 月 14 日:Linux 内核 1.0.0 版本发布。
把 Linus 叫做 Linux 之父其实并不准确,确切的说法是 Linus 对 Linux 内核的贡献度最大。
-
1993: 创建 Debian 发行版。 Debian 是一个基于社区的非商业发行版。最初是为了在服务器上使用而开发的,其非常适合这一角色;然而,它是一个通用的系统,所以也可以在个人计算机上使用。 Debian 是许多其他发行版的基础,比如 Mint 或 Ubuntu 。
-
1994:商业发行版 Red Hat 是由 Red Hat 公司创建的,该公司现在是 GNU/Linux 操作系统的领先经销商。Red Hat 公司支持社区版 Fedora 以及最近的免费发行版 CentOS。
-
1997:创建 KDE 桌面环境。它基于 Qt 组件库和 C++ 开发语言。
-
1999:创建 GNOME 桌面环境。它基于 GTK+ 组件库。
-
2002:创建 Arch 发行版。它的独特之处在于它提供滚动发布(持续更新)。
-
2004:Canonical 公司(Mark Shuttleworth)创建 Ubuntu。它基于 Debian,但包括自由和专有软件。
-
2021:基于 Red Hat 发行版创建 Rocky Linux。
架构设计
-
kernel 是首要的软件组件。
- 它是 GNU/Linux 系统的核心。
- 它管理系统的硬件资源。
- 其他软件组件必须通过它才能访问硬件。
-
shell 是一个解释并执行用户命令的工具。
- 主要的 shell:Bourne shell、C shell、Korn shell 和 Bourne-Again shell (bash)。
-
Applications 是用户程序,包括但不限于:
- 互联网浏览器
- 文字处理程序
- 电子表格
多任务
GNU/Linux 属于分时操作系统家族。它在几个程序之间分配处理时间,以对用户透明的方式从一个程序切换到另一个程序。这意味着:
- 同时执行多个程序。
- 调度程序分配 CPU 时间。
- 减少由失败的应用程序导致的问题。
- 在程序运行过多的情况下降低性能。
多用户
MULTICS 的目的是允许多个用户在一台计算机上(当时非常昂贵)通过多个终端(屏幕和键盘)工作。受这种操作系统的启发,GNU/Linux 保留了这种同时让多用户一起独立工作的能力,每个用户都有自己的用户帐户、内存空间以及对文件和软件的访问权限。
多处理器
GNU/Linux 能够在多处理器计算机或多核处理器上工作。
多平台
GNU/Linux 是用高级语言编写的,在编译过程中可以适应不同类型的平台。这允许它运行在:
- 家用电脑(个人电脑或笔记本电脑)
- 服务器(数据、应用程序)
- 便携式电脑(智能手机或平板电脑)
- 嵌入式系统(车载电脑)
- 有源网络元件(路由器、交换机)
- 家用电器(电视、冰箱)
开放
GNU/Linux 基于 POSIX、TCP/IP、NFS 和 Samba 等公认的标准,这些标准允许 GNU/Linux 与其他应用程序系统共享数据和服务。
UNIX/Linux 哲学
- 一切皆文件。
- 重视移植性。
- 做一件事且把它做好。
- KISS 原则:保持简单化和傻瓜化。
- "UNIX 基本上是一个简单的操作系统,但你必须是一个天才才能理解它的简单性。" (Dennis Ritchie)
- "UNIX 对用户是友好的,只不过他在对哪个用户友好的问题上,用情比较专一而已。" (Steven King)
桌面环境
有许多图形环境,如 GNOME、KDE、LXDE、XFCE、Unity、Mate、Cinnamon 等。每个桌面环境都有自己的东西,它们的人机交互设计可与微软或苹果系统相媲美。
自由/开源
Microsoft 或 Mac 操作系统的用户必须购买许可证才能使用其操作系统。尽管许可证通常是透明的(许可证的价格包含在电脑的价格中),但它是有成本的。
在GNU/Linux世界中,自由软件运动提供了大部分的自由发行版。
自由 并不意味着免费!
开源:可获取源代码,因此可以在特定条件下查阅和修改它。
自由软件必然是开源的,但反之则不然,因为开源软件与 GPL 开源许可所提供的自由是分开的。
GNU GPL (GNU 通用公共许可证)
GPL 保证软件的作者拥有其知识产权,但允许第三方修改、再分发或转售软件,前提是软件需要包含源代码。 GPL 是来自 GNU(GNU is Not UNIX)项目的许可证,该项目在创建 Linux 时起到了重要作用。
这暗示着使用者可以:
- 有出于任何目运行程序的自由。
- 研究程序如何工作并根据需要进行调整的自由。
- 重新分发副本的自由。
- 为了整个社区的利益,有改进且发布这些改进的自由。
另一方面,即使是在 GPL 许可下的产品也可以有付费。但这并不是为产品本身付费,而是 保证开发团队将继续致力于该产品,以使其发展和排除错误,甚至为用户提供支持 。
使用领域
GNU/Linux 发行版在以下方面表现出色:
- 服务器:HTTP、电子邮件、群件、文件共享等。
- 安全:网关、防火墙、路由器、代理等。
- 中央计算机:银行、保险、工业等。
- 嵌入式系统:路由器、网络盒子、智能电视等。
简而言之,GNU/Linux 几乎可以做任何事情,这也就解释了特定发行版的数量。
Shell
概述
shell 称为 命令接口,允许用户向操作系统发送命令。由于图形界面的实现,它在如今已经不是那么明显了,但在 GNU/Linux 系统上仍然是一种特权手段,GNU/Linux 系统并非都具有图形界面,并且其服务并不总是存在设置界面。
它提供了一种真正的编程语言,包括经典结构(循环、选择)以及常见组成部分(变量、参数传递和子程序)。它允许创建脚本以自动执行某些操作(如备份、创建用户、系统监控等)。
根据用户的喜好,平台上有几种类型的 shell 可供使用和配置: 以下是一些例子:
- sh,POSIX 标准 shell
- csh,C 语言中面向命令的 shell
- bash,Bourne-Again Shell,Linux shell
- zsh
- ps, PowerShell
- tcsh
功能
- 命令执行(检查给定的命令并执行它)。
- 输入/输出重定向(将数据返回到文件而不是将其打印在屏幕上)。
- 连接过程(管理用户的连接)。
- 解释型编程语言(允许创建脚本)。
- 环境变量(在操作期间访问系统特定的信息)。
参考资料
- CTSS — https://en.wikipedia.org/wiki/Compatible_Time-Sharing_System
- UNIX — https://en.wikipedia.org/wiki/Unix
- Linux kernel — https://en.wikipedia.org/wiki/Linux_kernel
- space travel — https://en.wikipedia.org/wiki/Space_Travel_(video_game)
- The Open Group — https://unix.org/what_is_unix/history_timeline.html
- about RockyLinux — https://rockylinux.org/about
- RockyLinux docs — https://docs.rockylinux.org/zh/books/admin_guide/01-presentation/
- GNU history — https://www.gnu.org/gnu/gnu-history.en.html
好文章,用心了