第一章 运维必备技能:操作系统基础与Linux发展全解析

1.2 操作系统和 Linux

1.2.1 操作系统功能

OS: Operating System 操作系统,通用目的的软件程序。

操作系统,其本质乃是一款软件,英文称之为Operating System(简称OS)。它并非自始至终就存在,并非天生固有,而是随着技术的发展逐渐诞生的。在初期,并没有操作系统的概念。那时候,只有硬件,比如我们之前提到的世界上的第一台计算机,它最初被发明出来时,其硬件是专门为了运行一个特定的弹道导弹计算程序而设计的。换句话说,那款硬件的开发目标,就是为了支撑那一个特定软件的运行。

t1-48

图1-48 操作系统结构

在正常情况下,若想在硬件上运行软件,早年间的做法是直接让软件在硬件上运行。比如,最早的计算机就是用来运行弹道导弹计算软件的。但那时候,软件得直接与硬件打交道,得关注硬件的各种资源,像指令集、存储方式,还有输入输出等。

然而,我们都知道,电脑不可能永远只运行这一个弹道导弹软件。将来我们可能还想运行其他软件,比如软件2,或者开发一些新功能软件来运行。如果这些软件也都要直接与硬件打交道,那就会遇到个大问题:每个软件都得去关心硬件的特性,得了解CPU的指令集,得管理存储,可能还得操心硬盘的IO,包括各种资源的访问、安全控制,还有文件系统等等。

这样一来,每个软件都得操心这些事,实在是太麻烦了。其实,这些功能几乎每个软件都需要。那怎么办呢?干脆我们换个思路,把这些通用的功能提取出来,比如文件操作、网络通信、安全控制等,用一个通用软件来实现。这个通用软件,就是我们常说的操作系统。

操作系统把这些每个软件都需要用到的功能都抽取出来,统一来实现。网络功能、文件系统管理、内存分配等,都由操作系统来完成。这样,每个软件就不需要再直接与硬件打交道了,它们只需要通过操作系统来申请所需资源即可。

操作系统就像一道屏障,把软件和硬件隔离开来。通用功能由操作系统来完成,这就是操作系统的核心功能。

t1-49

图1-49 操作系统工作架构

主要功能:

  • 硬件驱动
  • 进程管理
  • 内存管理
  • 网络管理
  • 安全管理
  • 文件管理

图1-49展示了操作系统工作的基本架构。在硬件之上,操作系统稳健运行,而操作系统之上,则是各式各样的应用程序各司其职。用户通过操作这些应用程序来完成各项任务。对于一个操作系统而言,它内置了诸多通用功能,这些功能是大多数软件都不可或缺的,比如硬件驱动、应用程序的进程管理、内存分配、网络管理、安全管理以及文件管理等。

OS分类:

  • 服务器OS:RHEL,CentOS,Rocky,Ubuntu,Windows Server,AIX
  • 桌面OS:Windows 11,Mac OS,Fedora
  • 移动设备OS:Andriod,IOS,AliOS,HarmonyOS

如今,操作系统版本历经发展,已呈现出多样化的面貌。在服务器领域,我们常见的有Rocky、Ubuntu等操作系统版本,当然,还有微软的Windows服务器系统。而在桌面端,用户则能体验到如Windows 11、Mac OS、Fedora等丰富的操作系统。此外,移动领域也不甘示弱,手机上的Android、iOS、AlisOS、HarmonyOS等操作系统同样广为人知。这些都是业界著名的操作系统,而我们的重点在于深入掌握服务器操作系统。

1.2.2 操作系统相关概念

**接口:**interface,来源于电气工程学科,指的是插座与插头的连接口,起到将电与电器连接起为的功能。后来延伸到软件工程里指软件包向外提供的功能模块的函数接口。所以接口是用来连接两个东西、信号转换和屏蔽细节。

操作系统通过接口的方式,建立了用户与计算机硬件的沟通方式。用户通过调用操作系统的接口来使用计算机的各种计算服务。

为操作系统一般会提供两个重要的接口,来满足用户的一些一般性的使用需求:

  • 命令行(CLI):实际是一个叫shell的终端程序提供的功能,该程序底层的实质还是调用一些操作系统提供的函数。
  • 窗口界面(GUI):通过编写的窗口程序接收来自操作系统消息队列,比如:鼠标、键盘动作,进而做出一些响应。

接口这个词,其实并非计算机领域的专属术语,它的源头可以追溯到电气工程学科。在电气工程中,接口指的就是插座和插头之间的连接部分,比如我们家里的电源插座和电源插头之间的连接,就是接口的一种体现。接口的作用,就是用来连接两个不同的物件。比如,我们要把家里的电器插到电源插座上给它供电,或者手机和电脑之间连一条数据线进行数据传输,这些都是接口在发挥作用。

在计算机领域,我们同样需要接口来控制和管理计算机,以便我们能够顺利地使用它。这些使用接口主要分为两种:一种是命令行接口,另一种是图形界面接口。

命令行接口,是传统的、早期的命令操作方式。我们需要在终端窗口里输入命令来操作计算机,这种方式呈现的是一个字符界面,看起来相对酷炫,但操作难度可能稍大一些,因为我们需要记住一些命令。

而图形界面接口,则是我们大部分普通用户更喜欢的方式。它就像Windows系统那样,通过鼠标点击菜单就可以轻松操作,使用起来相对简单直观。

这两种接口风格各有千秋,在生产环境中,专业人员可能更多地使用命令行接口。而如果涉及到视频处理等任务,图形界面接口可能会更受欢迎。作为运维人员,我们平时可能更多地使用命令行接口。不过,有时候我们也会开发自动化运维平台,这些平台通常采用Web界面,让我们可以通过鼠标点击的方式来控制和管理计算机。

**ABI:**Application Binary Interface,应用程序二进制接口,ABI描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。

运行程序格式:

  • Windows: PE(portable executable)格式, .dll(dynamic link library),.lib。
  • Linux: ELF(Executable and Linking Format)格式, .so(shared object),.a。

接下来,我们来探讨一个概念,那就是ABI,全称是应用程序的二进制接口。那么,这个ABI究竟是何方神圣呢?其实,每个不同的操作系统,在对外提供应用程序运行环境时,都有一套自己的规矩。

比如,在Windows系统里,我们经常运行各种软件,记事本就是一个典型的例子。这个记事本程序,它的文件后缀是.exe,就躺在Windows系统的C盘windows文件夹下,名字叫做notepad.exe。这个文件,它是个二进制文件,你如果用文本编辑器去打开它,看到的只会是一堆乱码,因为它里面存储的是二进制格式的数据。

这个二进制文件,它的格式可不是随便来的,而是有严格规范的。比如,文件的前几个字节要放什么信息,中间几个字节又要放什么,这些都是操作系统规定好的。就像notepad.exe是Windows的程序,那它就必须遵守Windows对文件格式的规定。

同样的道理,在Linux系统里也有这样的规范。比如,/bin目录下有很多可以运行的二进制程序,我们常用的vi编辑器,其实它的完整程序是放在/usr/bin目录下的vim。这个vim程序,它也是个二进制文件,但它遵守的是Linux的二进制格式,所以在Windows里是运行不了的。

你看,不同的系统对程序的要求就是各不相同。为了让程序能在某个操作系统上顺利运行,操作系统就制定了一套所谓的应用程序运行环境,也就是我们说的ABI。简单来说,就是你的应用程序要想在我的操作系统上跑,就得遵守我的ABI标准。

t1-50

图1-50 ABI接口

图1-50所阐述的是,在Windows操作系统上若要运行某些软件,就必须遵循Windows的ABI(应用程序二进制接口)标准。若不遵守这一标准,软件便无法正常运行。同样地,Linux操作系统也有其应用程序运行的ABI接口。每个操作系统都对外提供了一套标准的服务接口,而不同的操作系统,其接口自然也不尽相同。接口的差异意味着应用程序需要遵循的规范也会有所不同。因此,我们刚才提到的vim编辑器可以在Linux上运行,但若是将其直接复制到Windows上,则是无法运行的。同理,将Windows上的notepad.exe记事本程序复制到Linux上,同样也无法运行。

范例9:验证windwos的记事本文件notepad.exe能不能在linux上运行

# Rocky系统默认没有安装lrzsz命令,安装lrzsz命令
[root@rocky10 ~]# dnf -y install lrzsz

# 把windows里的notepad.exe文件传到Linux上
[root@rocky10 ~]# rz -E
rz waiting to receive.

[root@rocky10 ~]# chmod +x notepad.exe 
[root@rocky9 ~]# ./notepad.exe 
-bash: ./notepad.exe: cannot execute binary file: Exec format error
# 提示可以执行文件格式错误,因为它不遵守Linux的ABI标准,它的格式错误,运行不起来。

[root@rocky10 ~]# file notepad.exe 
notepad.exe: PE32+ executable (GUI) x86-64, for MS Windows
# 用file命令可以查看文件格式,可以看到notepad.exe是一个Windows的格式叫PE32+。

[root@rocky10 ~]# file /usr/bin/vim
/usr/bin/vim: cannot open `/usr/bin/vim' (No such file or directory)
# Rocky系统默认没有安装vim命令

# 安装vim命令
[root@rocky10 ~]# dnf -y install vim

[root@rocky10 ~]# file /usr/bin/vim
/usr/bin/vim: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0a9f31c21c3e2839483246b797e12023e62007a0, for GNU/Linux 3.2.0, stripped
# 而Linux系统运行的文件格式是ELF,这意味着Windows和Linux的ABI(应用程序二进制接口)标准存在差异,文件格式各不相同,因此它们各自只能在对应的系统上运行,无法实现相互兼容。若想让某个软件既能在Windows上运行,又能在Linux上运行,那该怎么办呢?除非为这两个系统分别开发各自版本的软件。换句话说,比如我想在Windows上也运行vim编辑器,那就需要专门针对Windows系统重新开发一个Windows版的vim。

**API:**Application Programming Interface,应用程序开发接口,API定义了源代码和库之间的接口,因此同样的源代码可以在支持这个API的任何系统中编译。

API 应用程序接口是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。

还有一个概念叫做API,全称是应用程序的开发接口。提到开发,大家可能会说:“我也不懂开发。”其实,在IT领域,有一个专门的岗位叫开发工程师,通俗点说就是程序员。这些程序员写程序,那他们到底在写什么呢?实际上,他们在编写一些具有特定格式的文档,这些文档是按照某种语法来撰写的。编写完成后,还需要将这些文档的内容转化成计算机能够真正执行的程序。

之前我们讲过冯·诺依曼体系,提到计算机内部都是基于二进制进行处理的。计算机的CPU只能识别0和1的组合,它不懂什么a、b、c、d这些字母,更不支持声音和图片。所以,程序员在写程序时,虽然用的是英文单词、字母和各种符号组合起来的文档,但这个文档直接交给计算机是无法运行的。我们需要把它转化成机器的二进制语言,也就是0和1的组合,计算机才能执行。

那么,程序员写完程序后,里面的功能都是自己开发出来的吗?比如,我们想实现一个简单的电商网站功能,这个网站的所有功能难道都是程序员自己写的吗?其实不一定。因为每个程序员通常只负责其中的某一个核心功能,比如电商网站的核心购物流程。至于一些非主要的功能,或者通用功能,很多软件都会提供一些现成的库。

这些库就像我们生活中的半成品一样,拿过来就能用。就像你做饭时,并不是所有的原材料都是自己种出来的。你想吃肉,难道还要自己养猪吗?你想吃菜,难道还要自己去种菜吗?通常都是去菜市场买菜、买肉,然后组合起来就能做出一顿美餐。同样地,程序员在开发软件时,也不是从零开始的,都是借助于别人做好的半成品,或者是在别人的基础之上进行下一步的工作,逐渐形成了一个完整的产品。

所以,软件程序员在做开发时,虽然这个软件是他们做出来的,但里面的很多通用功能并不是他们自己都需要亲自做的。比如,有个软件需要加密功能,加密其实是非常复杂的,要想实现非常安全的加密,要求非常高,往往会涉及到各种加密算法。然而,并不是每个程序员都精通算法,绝大多数程序员并不了解加密。那怎么办呢?有专门的程序员已经把这些功能实现了,并放在一个所谓的库里。将来我们这些用户只需要调用这个库,就可以直接启用这个功能了。

t1-51

图1-51 API接口

比方说,图1-51中的“lib”就是“库”的意思。这个库里头实现了很多实用的功能,它包含了各种各样的模块和库,比如加密库、图形处理库、网络通信库等等,这些库都是由技术高手们开发出来的。如果你的软件需要用到这些功能,直接调用这个库就方便了。

就像你在家里想做一个小家具,不必从零开始制作,而是可以买一些现成的工具,比如斧子、锯子等,买回来直接用这些工具就行。同样地,软件开发也是这样,我们不需要把所有功能都自己实现,而是可以把一些通用功能做成库,然后直接调用。这样,程序员就可以把更多的精力集中在软件本身的开发上,而不需要重复造轮子。

但是,大家有没有想过,别人做好的东西,就像是一个已经实现好的软件功能,你要用的话,是不是得遵守人家的规范呢?就像我们家里买了个电器,比如高压锅,我想用它来做饭,那我是不是得先看看说明书,看看按哪个按钮,做饭要做多长时间,都得遵守它的使用规范。

同样地,使用库也要遵守一种规范,这个规范就是API,也就是应用程序的开发接口。开发程序员在调用库的时候,就是通过API来进行的。API是程序和库之间的接口,而我们之前提到的ABI,则是应用程序和操作系统之间的接口。

它们的差别在于,我们的应用程序到底在和谁打交道。如果是和库打交道,那就是API;如果是和操作系统进行连接,那就是ABI。ABI是由编译器来负责的,而API则是程序员在开发程序、需要调用库时需要关心的。

POSIX:

  • Portable Operating System Interface 可移植的操作系统接口。

  • IEEE在操作系统上定义的一系列API标准

  • POSIX兼容的程序可在其它POSIX操作系统编译执行

POSIX 是 Portable Operating System Interface(可移植操作系统接口)的缩写,由 IEEE(电气电子工程师协会)制定,旨在统一 Unix-like 操作系统(如 Linux、macOS、BSD)的接口标准,确保软件在不同平台上具有可移植性。

用户态和内核态:

t1-52

图1-52 内存空间

我们的系统,从其架构空间及运行逻辑上,可以划分为用户态与内核态。那么,用户态和内核态具体是何意呢?当我们的应用程序在运行时,其数据与程序本身均需载入内存之中。这内存空间,可以形象地分为两大块,如图1-52所示。其中一部分,专为操作系统运行而设,我们称之为内核空间;另一部分,则是供我们的应用程序运行之用。

假设我们只有一颗CPU,当CPU需要执行内核空间中的指令时,它会将这些指令调入并执行,此时CPU处于内核态,专注于处理内核的指令。而若CPU要执行的是应用程序的指令,同样地,它会将这些指令调入并运行,此时CPU则处于用户态,主要负责处理用户空间中的数据,比如进行一些不涉及特权操作的任务。

相较于用户态,内核态的权限要更大。为何如此说呢?因为内核态拥有执行更多高级、特权操作的能力。

t1-53

图1-53 操作系统结构

应用程序与硬件的交互,都是通过操作系统来实现的。比如,当一个软件想要在硬盘上写入一个文件时,它并不能直接连接到硬件去完成这个操作。因为硬盘并不是由软件直接控制的,而是通过操作系统来管理的。换句话说,如果我们的应用程序想要在硬盘上写入文件,就必须通过操作系统来协助完成。

在这个过程中,应用程序会向操作系统发送一个请求,说:“操作系统,请帮我在硬盘上写入一个文件。”然后,操作系统就会负责完成这个任务。而在操作系统执行对硬件的操作时,它使用的是内核中的功能,需要调用内核中的特权指令才能完成。这些特权指令是软件本身所不具备的,也没有相应的权限去执行。

这样的设计,相当于在软件和硬件之间设置了一道隔离层。这道隔离层带来的好处是,软件由于无法直接控制硬件,因此更加安全。如果软件能够直接操作硬件,那么可能会因为操作不当而导致硬件故障或产生bug。毕竟,每个程序员开发的软件质量都难以保证,而操作系统则是由全世界最顶尖的工程师团队开发出来的,相对来说更加优秀,出现问题的几率要小很多。

因此,由操作系统来负责软件和硬件之间的交互,可以有效地避免一些不可预知的故障,减少出错的几率。

t1-54

图1-54 用户态和内核态

计算机硬件资源都是操作系统内核进行管理的,目前操作系统都是基于多任务、多用户的。如果每个用户进程都可以随便访问操作系统内核的模块,改变状态,那整个操作系统的稳定性、安全性都大大降低为了将内核程序与用户程序隔离开,在硬件层面上提供了一次机制,将程序执行的状态分为了不同的级别,从0到3,数字越小,访问级别越高。0代表内核态,在该特权级别下,所有内存上的数据都是可见
的,可访问的。3代表用户态,在这个特权级下,程序只能访问一部分的内存区域,只能执行一些限定的指令。

用户应用程序中的指令在CPU上执行时,我们称之为用户态。其实,这个指令的执行过程还可以进一步细分为多个环节,即0层、1层、2层、3层。关于这些层次的详细划分,我们在后续学习虚拟化技术时再深入探讨,现阶段暂时无需过多关注。

系统调用system call和函数库Library function

t1-55

图1-55 系统调用和函数库

对于非一般性使用需求,操作系统提供了一系列的函数调用给软件开发者,由软件开发者来实现一些用户需要的功能。这些函数调用由于是操作系统内核提供的,为了有别于一般的函数调用,被称为系统调用。比如使用C语言进行软件开发时,经常用的printf函数,它的内部实际就是通过write这个系统调用,让操作系统内核把字符打印在屏幕上的。

应用程序若需访问硬件,则需将请求发送至内核。那么,这一过程是如何实现的呢?答案是通过调用系统调用。系统调用,你可以理解为,当应用程序想要使用操作系统的一些核心功能时,它会调用的一个函数库。换句话说,系统调用就是我们刚才提到的库调用的一个API(应用程序编程接口)。

这个API实际上包含两种类型:一种是应用程序调用第三方的库;另一种是操作系统自身提供的一些库。应用程序可以调用操作系统提供的这些库,这就是系统调用。这些都是通过API调用来实现的。

不过,直接进行系统调用的情况相对较少。因为操作系统层面较为底层,我们通常不会直接调用操作系统。在大多数情况下,我们所说的API调用,指的是应用程序调用我们的函数库,而不是直接调用操作系统。当然,操作系统上也提供了这样的接口,只是我们一般很少直接这么做而已。

t1-56

图1-56 系统调用和函数库

实际上,操作系统对外提供了一个重要的接口,那就是系统调用库。这个系统调用库,你可以把它理解为我们常说的“库”,只不过它是操作系统专门提供的。我们确实可以直接调用操作系统的这个库,但在实践中,我们很少这么做。

为什么呢?因为直接调用操作系统库会带来一个大问题:应用程序会直接依赖于特定的操作系统。一旦你的应用依赖于某个操作系统,那将来如果你想换个操作系统去开发,就可能会遇到麻烦。因为不同的操作系统,它们的系统调用库可能是不一样的。如果换了操作系统,原来的库可能就不存在了,那你的应用程序还怎么运行呢?是不是就得重新写代码了?这样依赖性就太强了。

所以,我们更多的时候,是选择让应用程序去调用函数库。那函数库又是干什么的呢?函数库其实就是起到了一个中间层的作用,它去调用系统调用。我们自己做软件的时候,也是先调用函数库,然后函数库再去调用系统调用,而不是让我们的程序直接去调用系统调用。

为什么我们推荐这种“程序调用函数库,函数库再调用系统调用”的方式呢?主要就是为了让程序更加通用。因为将来即使是不同的系统,我们只要保证函数库是一致的,那程序就能运行。比如现在是Linux系统,将来可能还有Windows系统。Windows也有自己的系统调用,如果我们的应用程序直接依赖于Linux的系统调用库,那将来要运行在Windows上,是不是就得重新改了?

但现在,如果我们都是调用的函数库,那函数库就可以帮我们解决这个问题。比如在Linux上的函数库,它会自动去调用Linux的系统调用;在Windows上的函数库,它会自动去调用Windows的系统调用。这样,我们作为程序员,就不需要直接和操作系统打交道了,开发代码就更加方便,而且程序也具有了通用性。这样一来,跨平台就变得非常方便了。

用户和内核空间

t1-57

图1-57 用户和内核空间

用户空间:User space

用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃,内核也不受影响。

只能执行简单的运算,不能直接调用系统资源,必须通过系统接口( system call),才能向内核发出指令。

内核空间:Kernel space

是 Linux 内核的运行空间。

可以执行任意命令,调用系统的一切资源。

我们的应用程序在运行时,能够直接调用函数库,而函数库则会进一步去调用系统调用。当然,应用程序也可以直接调用系统调用,但这种方式在实际应用中较为罕见,我们通常采用间接的方式来实现。这里所提到的是用户空间,而内核空间则是操作系统发挥其特定功能的领域。

操作系统不仅对外提供系统调用,还负责管理文件系统,以及硬件、内存、进程等多方面的资源。比如内存分配调度、驱动管理、网络通讯等,这些都是内核所具备的功能。这些功能可以说是一种通用服务,均由操作系统来完成。

我们可以将操作系统比作一个国家,计算机就如同这个国家一样,内部存在着众多不同的组织和公司。而一个应用程序,就可以看作是这个国家中的一个公司。我们的电脑上可以运行众多应用程序,就如同一个国家中有许多公司和组织一样。

这些公司和组织都需要依赖一些通用功能来运作,比如水、电、公路,以及统一的政策支持。同样地,应用程序也需要一些公共资源来支持其运行,这个公共资源就是操作系统。我们可以将操作系统理解为政府,政府提供统一的管理和服务,而这些公司(应用程序)则是在政府提供的公共服务基础上进行运作的。

**范例10:**用户空间和内核空间

str = "www.baidu.com" 	// 用户空间
x = x + 100 			// 用户空间
file.write(str) 		// 切换到内核空间
y = x + 200 			// 切换回用户空间

说明:第一行和第二行都是简单的赋值运算,在 User space 执行。第三行需要写入文件,就要切换到Kernel space,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回 User space。

str是一个字符串变量,我们给它赋予了一个特定的值——www.baidu.com。这个过程,就像我们初中时学习的变量赋值一样,比如x等于1,y等于2。只不过在这里,我们赋的是一个字符串。这个赋值操作是在应用程序的用户空间中完成的。

接下来,如果我们执行x加100再赋给x的操作,这同样是在用户空间内就可以轻松完成的。但是,当我们遇到“file.write(str)”这样的指令时,事情就变得不一样了。这个指令的意思是将str这个字符串写入到文件中。那么,文件存放在哪里呢?当然是硬盘上。而硬盘,是属于硬件的范畴。

用户空间的软件,是没有权限直接去访问硬件的。所以,如果我们想要把字符串写入文件,就必须通过操作系统这个“中介”来间接完成。这时候,CPU就需要将这个写硬盘的操作,通过内核空间来执行。因为写硬盘这个操作,需要用到内核里的特权指令,这是用户空间无法直接完成的。

为了执行这个特权指令,CPU需要从用户空间切换到内核空间,也就是从我们的“生活态”切换到“工作态”。这个过程,就像我们下班回家,从工作状态切换到生活状态一样。当然,执行完这个指令后,我们还需要切换回用户空间,继续我们的其他操作。

在这个过程中,CPU会在用户空间和内核空间之间来回切换。为了确保切换后能够继续之前的操作,CPU会保留我们当前的状态,比如应用程序执行到哪里了等等。这个切换和状态保留的过程,都是需要消耗资源的。

因此,如果我们能够想办法减少这种状态切换的次数,就可以提高系统的效率。用户态和内核态,就像我们的两种生活状态一样,一种是轻松自在的生活态,一种是紧张忙碌的工作态。它们之间需要来回切换,但每次切换都会有一定的损耗。所以,我们应该尽量优化我们的操作,减少不必要的切换,让系统更加高效、流畅地运行。

编程语言

  • 低级语言:计算机能理解的语言,二进制

    • 机器语言:0和1

    • 汇编语言:和机器语言一一对应,与硬件相关的特有代码、驱动程序开发

  • 高级语言:

    • java,python,go,php,Objective-C,C#,易语言(中文),应用级程序开发,人类语言实现
    • C 语言,系统级应用、驱动程序

范例11:各种语言示例

C语言:

#include <stdio.h>

int main(void)
{
  printf("Hello,World\n");
}

Go语言:

package main

import "fmt"

func main () {
    fmt.Println("Hello,World")
}

Java语言:

class Hello{
    public static void main(String[] args)
	{
	    System.out.println("Hello,World");
	}
}

Python语言:

#!/usr/bin/python
# Filename : hello.python
print 'Hello,World'

1.2.3 各种操作系统

服务器三大操作系统

  • Windows:

  • Linux:GNU/Linux

  • Unix:1969年 Ken Thompson

    • System: Bell Lab
      • AIX (IBM)
      • Solaris (SUN)
      • HP-UX (HP)
    • BSD: (BSRG)Berkeley System Distribution
      • NetBSD
      • OpenBSD
      • FreeBSD

目前,操作系统的版本种类繁多,服务器上的操作系统主要可以分为三大类:Windows、Linux以及Unix。

服务器操作系统市场

t1-58

图1-58 服务器操作系统市场

在服务器领域,Linux系统已蔚然成风,成为不可阻挡的趋势。对比2013年与2017年的统计数据,可以清晰地看到这一变化:2017年时,无论是付费版还是免费版的Linux系统,其市场份额已高达58%;而Windows系统则占据了41%的份额;至于Unix系统,其市场份额仅剩1%。

1.2.4 UNIX

t1-59

图1-59 Unix发展史

Unix堪称现代操作系统的鼻祖,诞生于1969年左右。随后,在其基础上衍生出了众多版本。我们目前所见的各种主流操作系统,基本上都是从Unix演化而来的,比如Windows、MacOS以及Linux,它们的血脉中都流淌着Unix的基因。

兼容分时系统 Multics

t1-60

图1-60 兼容分时系统 Multics

为了进一步强化大型主机的功能,让主机的资源可以提供更多的使用者来利用,所以在1964年, 由贝尔实验室(Bell)、麻省理工学院(MIT)及奇异公司(GE美国通用电气公司)共同发起了Multics(多路信息计算系统)的计划, Multics计划的目的是让大型主机可以同时支持300个以上的终端机连线使用。不过,到了1969年前后,由于计划进度缓慢,资金也短缺,所以该计划虽然继续在研究,但最终贝尔实验室还是选择了退出。

Unix的起源颇具故事性。早在1969年之前,有一个雄心勃勃的大型项目孕育而生。这个项目始于1965年,由贝尔实验室、麻省理工和奇艺公司携手合作,共同推进。当时,硬件巨头通用公司与软件先锋贝尔实验室联手,旨在打造一台前所未有的大型主机。这台主机设计独特,能够支持众多终端连接,想象一下,一台物理服务器上竟能接入数百个键盘和显示器,让众多用户共享这台计算机资源,实现一台机器服务多用户的壮举。在当时,这样的规模堪称复杂至极,无疑是一个庞然大物般的项目。

自1964年立项以来,这个项目历经了五年的艰辛探索。然而,随着项目规模的不断扩大,开发进度逐渐变得缓慢,甚至一度停滞不前。贝尔实验室眼见项目前景渺茫,便选择了退出。但故事并未就此终结,经过后续团队的不懈努力,这个项目最终还是得以完成。即便到了1980年代、1990年代,Multics(该项目最终成果的名称)仍在某些特定场合下被使用,尽管贝尔实验室早已提前离场。不过,贝尔实验室的退出并未影响Multics在历史上的地位与影响。

Unix的诞生

1966年从加州大学伯克利分校毕业的Kenneth Thompson(肯尼斯·汤普森)加入了贝尔实验室。参与了Multics系统的研发。他基于Multics开发了“star travel”游戏。不幸的是,1969年由于贝尔实验室退出Multics项目,这同时意味着Ken将没有机器可以再玩这个游戏了。面对此情此景,Ken作为一个创造者的本性立即体现了出来,于是他决定自己写一个操作系统来满足他玩游戏的需要,Ken找到了一台废弃已久的老式计算机PDP-7,并在这台只有16K内存的机器上重写了他的游戏。在这个过程中,Ken有了一个主意,要开发一个全新的操作系统。利用PDP-7上的汇编语言,Ken只花了一个月就编写完了操作系统的内核,在这不到一个月时间中,他一周一个内核,一个文件系统,一个编辑器和一个编译程序的完成。

t1-61

图1-61 Ken Thompson(肯·汤普逊)和Dennis Ritchie(丹尼斯·里奇)

t1-62

图1-62 Ken Thompson(肯·汤普逊)和Dennis Ritchie(丹尼斯·里奇)

肯·汤普逊 - 维基百科详情页:“https://zh.wikipedia.org/wiki/肯·汤普逊”,此链接将带您进入维基百科对肯·汤普逊的全面而详尽的介绍。

丹尼斯·里奇 - 维基百科专属页面:“https://zh.wikipedia.org/wiki/丹尼斯·里奇”,点击此处,即可浏览维基百科为丹尼斯·里奇打造的详细介绍专页。

UNIX系统 - 维基百科权威解读:“https://zh.wikipedia.org/wiki/UNIX”,此链接直指维基百科对Unix系统的深入剖析与权威介绍。

问题出在一位大牛人身上,这位大牛人名叫肯·汤普森,1966年毕业于伯克利大学。同年,他加入了贝尔实验室,并成为了Multics项目研发团队的一员。然而,贝尔实验室后来决定退出该项目,这意味着肯·汤普森无法再继续参与Multics的开发工作,也就失去了接触Multics的机会。

之前,肯·汤普森曾在Multics上开发了一个小游戏,名叫“星际旅行”。由于无法再接触Multics,这个游戏也就没了运行平台。这让他感到非常郁闷,毕竟谁不想在工作之余玩玩游戏放松一下呢?

面对这样的困境,肯·汤普森一气之下决定自己动手写一个操作系统。毕竟他参与过Multics项目,对操作系统的理解远超一般人。他借鉴了Multics的设计理念,但进行了大量的精简,只保留了核心功能,如文件系统、内核、编辑器等。仅仅用了3周时间,他就完成了一个简洁小巧的操作系统。

在开发这个操作系统时,他需要一台计算机来进行测试。但由于已经退出了Multics项目,他手上并没有性能强劲的计算机。于是,他找到了一台单位里废弃的老电脑——PDP-7。这台电脑从发布到他使用时已经过了5年,性能早已落后,可以说是一台老掉牙的旧电脑了。

为了在这台旧电脑上运行他的小操作系统,肯·汤普森可谓是费尽了心思。他极力节省资源,能省则省,每一位都精打细算。要知道,当时这台电脑的内存只有16K,大家想想看,16K的内存能运行什么东西呢?放在现在,随便一个小软件都不止16K吧。但肯·汤普森就是凭借着这样的毅力和智慧,成功地在这台旧电脑上运行起了他的操作系统。

  • 1969 Unix 雏形 UNICS
    • Ken Thompson(肯尼斯·汤普森) 汇编语言 B语言
  • 1973 正式命名为 Unix
    • Dennis Ritchie(丹尼斯·里奇) C语言重写了UNIX,从此Unix和C语言成为CP
  • 1977 BSD
    • Berkeley Software Distribution 伯克利大学
  • 1979 System V架构 版权声明
    • HP-UNIX IBM AIX “不对学生提供源码” 收回版权
  • 1984年 Minix操作系统
    • Andrew Stuart “Andy” Tanenbaum(安德鲁·斯图尔特·塔能鲍姆) 荷兰阿姆斯特丹自由大学计算机科学系

1969年,一个名为UNICS的操作系统问世了。丹尼斯·里奇,这位C语言的缔造者,后来也投身到了Unix的开发大军中,不断对其进行改进和完善。早期的Unix是用汇编语言和B语言编写的,但汇编语言有个弊端,就是不支持跨平台。到了1973年,丹尼斯·里奇决定用C语言重新编写Unix。

为什么等到1973年才动手呢?这背后其实有着摩尔定律的推动。摩尔定律指出,每隔两年,计算机的性能就会翻倍。因此,从1969年发布到1973年,计算机的性能已经提升了四倍。这时的电脑比以前强大多了,存储成本也大幅下降,内存也不再那么捉襟见肘。这样,C语言编写的Unix就能更好地运行了,因为早期的硬件条件还无法满足C语言的需求。

1973年之后,随着硬件条件的不断改善,丹尼斯·里奇用C语言重新编写了Unix,实现了跨平台的突破。从此,Unix开始风靡一时,因为它能支持各种硬件平台。Unix和C语言也因此结下了不解之缘,成为了人们口中的“黄金搭档”,简称CP。

起初,操作系统的诞生并不是为了打造一个多么强大的系统,而更多地是出于兴趣和探索。由于代码相对自由,且初期并未考虑盈利,Unix代码在各个学校和研究领域广泛传播。大家纷纷拷贝、学习和改进,逐渐对这个系统产生了浓厚的兴趣。

1975年左右,肯·汤普森回到了他的母校伯克利大学担任兼职教师,为学生们讲授操作系统原理和计算机专业知识。在他的培养下,涌现出了一批计算机高手。其中,有一位特别热心于Unix的学习和开发。后来,这位高手在Unix的基础上进行了大量修改,发布了一个新的流派——BSD(伯克利软件分发版),这是基于早期贝尔实验室Unix版本研发出来的一个新分支。

值得一提的是,这位高手后来还成立了一家自己的公司——SUN公司。SUN公司不仅生产自己的硬件,还拥有自己的Unix操作系统——Solaris。虽然SUN公司如今已被Oracle公司收购,但它在IT领域曾留下了辉煌的篇章。我们熟知的JAVA程序就是SUN公司的杰作。

贝尔实验室也有自己的Unix分支。起初,他们并未打算收费,但随着Unix的日益完善和商业价值的凸显,他们开始考虑收费。经过十年的不断开发和完善,Unix已经变得非常强大,满足了商业需求。因此,贝尔实验室开始收取版权费,这使得许多学生和研究者望而却步。

为了教学需要,让更多人了解如何编写操作系统,一位名叫Andrew S. Tanenbaum(安德鲁·斯图尔特·塔嫩鲍姆)的大学教师开发了一个名为Minix的操作系统。Minix于1984年问世,主要用于教学目的,并不能在商业环境中使用。然而,Minix的问世对后期Linux的诞生产生了深远影响。

不过,在Unix的发展过程中,也存在着一些分歧和版权纠纷。伯克利大学在Unix的基础上进行了开源和二次开发,而贝尔实验室也有自己的版本。这两个版本形成了两大流派,都源自Unix。由于版权问题,贝尔实验室曾对伯克利大学提起诉讼,这在一定程度上影响了Unix的发展。许多人为了避免卷入官司,不敢轻易使用Unix。这使得Unix在那个年代的发展受到了一定的阻碍。

尽管如此,Unix仍然是现代操作系统的鼻祖。在70年代和80年代,Unix的商业化趋势非常明显,也影响了一批追求自由的技术爱好者。

1.2.5 GNU

t1-63

图1-63 Richard Stallman(理查德·斯托曼)

理查德·斯托曼 - 维基百科:https://zh.wikipedia.org/wiki/理查德·斯托曼,前面是维基百科对理查德·斯托曼的详细介绍。

GNU - 维基百科:https://zh.wikipedia.org/wiki/GNU,前面是维基百科对GNU的详细介绍。

GNU:GNU is Not Unix

1984年由Richard Matthew Stallman(理查德·马修·斯托曼)发起并创建

目标是编写大量兼容于Unix系统的自由软件

官方网站:http://www.gnu.org

GPL:GNU General Public License

自由软件基金会:Free Software Foundation

允许用户任意复制、传递、修改及再发布

基于自由软件修改再次发布的软件,仍需遵守GPL

LGPL:Lesser General Public License,LGPL相对于GPL较为宽松,允许不公开全部源代码。

GNU操作系统:

Hurd:Hird(Hurd of Interfaces Representing Depth) of Unix-Replacing Daemons

官网:http://www.gnu.org/software/hurd/hurd.html

richard Stallman 为了无止境寻找完美内核,而忘记了HURD的原本目的:能用的操作系统。

在西方学术界,有些人对自由崇尚至极。你让我花钱买这些软件?我当然不情愿。这时,有位人物挺身而出,他察觉到商业化趋势愈发严重,于是决定倡导免费与开源的理念。这位人物发起了一个专项项目,名为GUN项目。

GUN项目诞生于1984年,由Richard Matthew Stallman(理查德·马修·斯托曼),即RMS发起。项目的初衷是让大众能够免费使用软件,因此得名GUN,寓意为“GUN is not Unix”(GUN非Unix),强调其免费与开放的特性。为了让大家无需破费就能使用软件,他投身于大量的软件开发工作。

这些开发出来的软件希望以免费的形式提供给用户,但免费使用需遵循一定的许可约定。于是,他发布了一个名为GPL的许可协议,你可以将其理解为一份合同。合同中明确规定,只要遵守GPL许可,软件即可免费使用,且源代码开放。

为了支撑这个项目,他成立了一个基金会,名为自由软件基金会。这个基金会吸引了众多大公司的捐赠,每年都有不少收入用于支持这个免费项目的持续开发。当然,GPL后来也衍生出了一些版本,比如LGPL。

这个项目确实做得非常出色,让大家能够免费使用软件。然而,遗憾的是,虽然它开发了许多免费且开源的软件,但这些软件仅仅是应用程序而已。应用程序需要运行在操作系统上,而遗憾的是,这些软件需要依赖Unix操作系统来运行。而Unix是收费的,这确实令人惋惜。

有人提出,为什么不基于GUN项目自己开发一个操作系统呢?要知道,开发一个操作系统并非易事。Unix之初也并非一蹴而就,而是经过了近10年的不断完善才成为一个相对完整的操作系统。因此,基于GUN项目开发一个操作系统同样困难重重。

实际上,GUN项目确实有一个名为Hurd的操作系统。这个项目成立得非常早,大约在1990年左右就有了。然而,项目负责人过于追求完美,他坚持要么不做,要做就要做到最好。经过多年的努力,这个项目至今仍未推出正式版,目前仍停留在0.9版本。看来,这个项目可能永远也无法面世了。这位负责人犯了一个重大的错误,那就是过于追求完美。

1.2.6 开源 Open Source

1998 年的 2 月 5 日,一场小型聚会在美国加州的 VA 研究中心举行,与会的人包括了 一众信息技术领域的知名学者和工程师。正是在这场会上,大家同意了 Christine Peterson 女士提出的用“开放源代码”(Open Source)一词来替代容易在英语人士中引起歧义的“自由软件”(Free Software)一词,表达的是同样的软件和意思,但更方便理解更容易获取更多支持。从那一天开始,“开源”正式诞生。

t1-64

图1-64 开源软件

开源 Open Source

软件和源代码提供给所有人,自由分发软件和源代码,free 自由,不是免费的意思。

能够修改和创建衍生作品。

开放源代码 —— 维基百科详解:请访问“https://zh.wikipedia.org/wiki/开放源代码”,该页面详尽阐述了开放源代码的相关概念。在该页面中,维基百科为读者提供了关于开放源代码的全面而深入的介绍。

软件分类:

商业:收费,源码也不公开

共享:免费使用,但源码不公开

自由:源代码公开

开源项目的概念最早由GNU提出,不过“开源”这个正式名称是在1998年才被确定下来的。开源意味着源代码是公开的,可以自由流传、随意拷贝。但需要注意的是,开源并不等同于免费。开源和免费是两个不同的概念,不能混为一谈。开源并不意味着不收费,比如红帽的Linux版本,尤其是它的RHEL(Red Hat Enterprise Linux)版本,虽然是开源的,但如果你希望获得技术支持,那是需要付费的。所以,开源并不等于免费,这两者是有所区别的。

开源协议

世界上的开源许可证,大概有上百种。

t1-65

图1-65 开源协议

  • GPLv2, GPLv3, LGPL(lesser) :通用公共许可 copyleft
  • Apache: apache
  • BSD: bsd
  • Mozilla
  • MIT

为了保障开源软件的多样性,存在多种开源协议,如LGPL、Mozilla、BSD、MIT、Apache等。在图1-65所列的开源协议中,我们探讨哪个协议最为宽容。

首先,考虑他人修改源代码后是否可以闭源。若答案为“No”,则意味着修改后的代码不能闭源,协议相对严格;若答案为“Yes”,则表明修改后的代码可以闭源,协议显得较为宽容。因此,“Yes”一侧的协议相对宽容,“No”一侧则相对严格。

其次,看每一个修改过的文件是否都必须放置版权说明。若答案为“Yes”,则必须放置版权说明,协议有明确要求;若答案为“No”,则可以不放,协议显得宽容。

再者,考虑衍生软件的广告是否可以使用原作者的名字进行促销。若答案为“No”,则不可以使用;若答案为“Yes”,则可以使用,这同样体现了协议的宽容度。综观各项,MIT协议无疑是最为宽容的。

那么,最不宽容的协议又是谁呢?从图1-65的左侧来看,关键在于新增代码是否必须采用同样的许可证。若答案为“Yes”,则必须采用相同许可证,这显示了协议的严格性。在此方面,GPL协议无疑是最为严格的。

范例12:查看软件的许可协议

[root@rocky10 ~]# rpm -qi bash
Name        : bash
Version     : 5.2.26
Release     : 6.el10
Architecture: x86_64
Install Date: Wed 02 Jul 2025 11:46:14 AM CST
Group       : Unspecified
Size        : 8542584
License     : GPL-3.0-or-later
Signature   : RSA/SHA256, Wed 21 May 2025 09:19:52 PM CST, Key ID 5b106c736fedfc85
Source RPM  : bash-5.2.26-6.el10.src.rpm
Build Date  : Thu 31 Oct 2024 01:16:11 PM CST
Build Host  : pb-0d1a2830-bb51-4e9b-99ed-5362b27ea632-b-x86-64
Packager    : Rocky Linux Build System (Peridot) <releng@rockylinux.org>
Vendor      : Rocky Enterprise Software Foundation
URL         : https://www.gnu.org/software/bash
Summary     : The GNU Bourne Again shell
Description :
The GNU Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.

[root@rocky10 ~]# rpm -qi kernel
Name        : kernel
Version     : 6.12.0
Release     : 55.12.1.el10_0
Architecture: x86_64
Install Date: Wed 02 Jul 2025 11:46:50 AM CST
Group       : Unspecified
Size        : 0
License     : ((GPL-2.0-only WITH Linux-syscall-note) OR BSD-2-Clause) AND ((GPL-2.0-only WITH Linux-syscall-note) OR BSD-3-Clause) AND ((GPL-2.0-only WITH Linux-syscall-note) OR CDDL-1.0) AND ((GPL-2.0-only WITH Linux-syscall-note) OR Linux-OpenIB) AND ((GPL-2.0-only WITH Linux-syscall-note) OR MIT) AND ((GPL-2.0-or-later WITH Linux-syscall-note) OR BSD-3-Clause) AND ((GPL-2.0-or-later WITH Linux-syscall-note) OR MIT) AND 0BSD AND BSD-2-Clause AND (BSD-2-Clause OR Apache-2.0) AND BSD-3-Clause AND BSD-3-Clause-Clear AND CC0-1.0 AND GFDL-1.1-no-invariants-or-later AND GPL-1.0-or-later AND (GPL-1.0-or-later OR BSD-3-Clause) AND (GPL-1.0-or-later WITH Linux-syscall-note) AND GPL-2.0-only AND (GPL-2.0-only OR Apache-2.0) AND (GPL-2.0-only OR BSD-2-Clause) AND (GPL-2.0-only OR BSD-3-Clause) AND (GPL-2.0-only OR CDDL-1.0) AND (GPL-2.0-only OR GFDL-1.1-no-invariants-or-later) AND (GPL-2.0-only OR GFDL-1.2-no-invariants-only) AND (GPL-2.0-only WITH Linux-syscall-note) AND GPL-2.0-or-later AND (GPL-2.0-or-later OR BSD-2-Clause) AND (GPL-2.0-or-later OR BSD-3-Clause) AND (GPL-2.0-or-later OR CC-BY-4.0) AND (GPL-2.0-or-later WITH GCC-exception-2.0) AND (GPL-2.0-or-later WITH Linux-syscall-note) AND ISC AND LGPL-2.0-or-later AND (LGPL-2.0-or-later OR BSD-2-Clause) AND (LGPL-2.0-or-later WITH Linux-syscall-note) AND LGPL-2.1-only AND (LGPL-2.1-only OR BSD-2-Clause) AND (LGPL-2.1-only WITH Linux-syscall-note) AND LGPL-2.1-or-later AND (LGPL-2.1-or-later WITH Linux-syscall-note) AND (Linux-OpenIB OR GPL-2.0-only) AND (Linux-OpenIB OR GPL-2.0-only OR BSD-2-Clause) AND Linux-man-pages-copyleft AND MIT AND (MIT OR Apache-2.0) AND (MIT OR GPL-2.0-only) AND (MIT OR GPL-2.0-or-later) AND (MIT OR LGPL-2.1-only) AND (MPL-1.1 OR GPL-2.0-only) AND (X11 OR GPL-2.0-only) AND (X11 OR GPL-2.0-or-later) AND Zlib AND (copyleft-next-0.3.1 OR GPL-2.0-or-later)
Signature   : RSA/SHA256, Sun 25 May 2025 04:52:52 AM CST, Key ID 5b106c736fedfc85
Source RPM  : kernel-6.12.0-55.12.1.el10_0.src.rpm
Build Date  : Sat 24 May 2025 12:38:55 AM CST
Build Host  : iad1-prod-build001.bld.equ.rockylinux.org
Packager    : Release Engineering <releng@rockylinux.org>
Vendor      : Rocky Enterprise Software Foundation
URL         : https://www.kernel.org/
Summary     : The Linux kernel
Description :
The kernel meta package

[root@rocky10 ~]# rpm -qi openssh
Name        : openssh
Version     : 9.9p1
Release     : 7.el10_0
Architecture: x86_64
Install Date: Wed 02 Jul 2025 11:46:24 AM CST
Group       : Unspecified
Size        : 1452251
License     : BSD-3-Clause AND BSD-2-Clause AND ISC AND SSH-OpenSSH AND ssh-keyscan AND sprintf AND LicenseRef-Fedora-Public-Domain AND X11-distribute-modifications-variant
Signature   : RSA/SHA256, Wed 21 May 2025 06:20:06 AM CST, Key ID 5b106c736fedfc85
Source RPM  : openssh-9.9p1-7.el10_0.src.rpm
Build Date  : Tue 20 May 2025 11:21:36 AM CST
Build Host  : ord1-prod-x86build007.svc.aws.rockylinux.org
Packager    : Rocky Linux Build System <releng@rockylinux.org>
Vendor      : Rocky Enterprise Software Foundation
URL         : http://www.openssh.com/portable.html
Bug URL     : https://bugs.rockylinux.org
Summary     : An open source implementation of SSH protocol version 2
Description :
SSH (Secure SHell) is a program for logging into and executing
commands on a remote machine. SSH is intended to replace rlogin and
rsh, and to provide secure encrypted communications between two
untrusted hosts over an insecure network. X11 connections and
arbitrary TCP/IP ports can also be forwarded over the secure channel.

OpenSSH is OpenBSD's version of the last free version of SSH, bringing
it up to date in terms of security and features.

This package includes the core files necessary for both the OpenSSH
client and server. To make this package useful, you should also
install openssh-clients, openssh-server, or both.

[root@rocky10 ~]# dnf info httpd
Last metadata expiration check: 0:00:21 ago on Thu 03 Jul 2025 10:18:22 AM CST.
Available Packages
Name         : httpd
Version      : 2.4.63
Release      : 1.el10
Architecture : x86_64
Size         : 52 k
Source       : httpd-2.4.63-1.el10.src.rpm
Repository   : appstream
Summary      : Apache HTTP Server
URL          : https://httpd.apache.org/
License      : Apache-2.0 AND (BSD-3-Clause AND metamail AND HPND-sell-variant AND Spencer-94)
Description  : The Apache HTTP Server is a powerful, efficient, and extensible
             : web server.

1.2.7 Linux

1.2.7.1 Linux 历史

t1-66

图1-66 Linus Torvalds(林纳斯·托瓦兹)

1991年的10月5日Linus Torvalds(林纳斯·托瓦兹)在comp.os.minix 新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like kernel sources for 386-AT) — FREAX,含义是怪诞的、怪物、异想天开类Unix的内核,在GPL下发布。

官网:www.kernel.org

Linux操作系统:

  • 完整的类UNIX操作系统
  • Linux内核+ GNU工具=Linux/GNU
  • 如:Rocky、Ubuntu、Android

林纳斯·托瓦兹 - 维基百科:https://zh.wikipedia.org/wiki/林纳斯·托瓦兹,前面是维基百科对林纳斯·托瓦兹的详细介绍。

Linux - 维基百科:https://zh.wikipedia.org/wiki/Linux,前面是维基百科对Linux的详细介绍。

由于历史的机缘,Unix系统卷入了复杂的版权问题,这使得其发展之路充满了挑战。而在那个时期,市面上又缺乏免费的操作系统作为替代。那么,该如何破局呢?1991年,林纳斯·本纳第克特·托瓦兹站了出来,他开发出了免费的开源Linux内核,图1-47展示的正是Linus Torvalds本人。这个系统一经网络发布,便迅速吸引了众多关注者,他们纷纷加入到这个项目中,共同塑造了如今最为主流的操作系统——Linux。Linux恰好抓住了市场的机遇,而Hurd则因无人问津而错失良机。毕竟,Unix是商业软件需要付费,而Linux则是开源免费的。许多软件,特别是那些基于GNU项目的开源软件,都可以轻松迁移到Linux上运行。我们目前使用的Rocky和Ubuntu,可以简单理解为是由Linux内核加上各种免费的GNU项目组件构成的完整操作系统。

在这里插入图片描述

图1-67 Linux内核

目前Linux内核最新版本是6.15.6。

Linux的内核版本组成

  • 主版本号
  • 次版本号
  • 末版本号
  • 打包版本号
  • 厂商版本

t1-68

图1-68 Linux内核版本

以往的版本中,存在奇数和偶数之分,但现如今这一说法已不再沿用。过去,奇数版本代表着测试版,而偶数版本则是稳定版。图1-49便清晰展示了Linux内核中各个数字所蕴含的具体含义。

Linux团队

t1-69

图1-69 Linux团队

1.2.7.2 Linux 发行版
  • slackware:SUSE Linux Enterprise Server (SLES) , OpenSuse桌面
  • debian: ubuntu,deepin(深度),mint
  • redhat:
    • RHEL: RedHat Enterprise Linux, 每18个月发行一个新版本
    • CentOS: Community Enterprise Operating System 兼容RHEL的格式
    • 中标麒麟:中标软件
    • Fedora:每6个月发行一个新版本
  • Alpine: 一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,只有5M左右大小。
  • ArchLinux:轻量简洁,遵循K.I.S.S.原则( keep it simple and stupid ),Manjaro。
  • Gentoo:极致性能,不提供传统意义的安装程序,下载源代码在本机上编译安装软件。
  • LFS:Linux From scratch 自制Linux,只是一个说明书。
  • Android:kernel+busybox(工具集)+java虚拟机。

Linux 分支参考网站:

  • http://futurist.se/gldt/,这个网站现在不能访问了。
  • https://github.com/FabioLolix/LinuxTimeLine/releases,可以访问github上这个网站。

Linux发行版排名: https://distrowatch.com/dwres.php?resource=popularity

Linux 发行版体验: https://distrotest.net/

t1-70

图1-70 distrotest

1.2.7.3 RHEL和 CentOS
1.2.7.3.1 RHEL

RedHat 红帽公司

t1-71

图1-71 Marc Ewing(马克·尤因)

Marc Ewing早在卡内基梅隆大学读书的时候就戴着他祖父的红色曲球帽. Marc在Marc Ewing大学常把自己的软件命名为Red Hat — Red hat 1, Red Hat 2 用来区别他人的软件,所以当他开始自己的Linux项目, 自然就会命名为Red Hat Linux。Ewing非常乐于帮助同学解决计算机问题 “你的朋友可能会说, 去跟我的朋友Marc交流. 谁是Marc? 他是红帽男孩. ” 所以, 至少在他们最亲密的朋友当中, 红帽子成为了技术专家的同义词。

1993年,Bob Young 建立ACC公司,营销Linux和UNIX的支持软件和书籍杂志。

1995年,Bob Young 收购了Marc Ewing的业务,合并后的ACC公司成为新的Red Hat软件公司,发布了Red Hat Linux 2.0。

2018年10月29日,IBM宣布将以约340亿美元收购开源软件和技术主要供应商红帽公司。

红帽发行版本

Red Hat Linux 1.0 (Mother’s Day) 1994年11月03日

Red Hat Linux 2.0 1995年09月20日

Red Hat Linux 3.0 (Picasso) 1996年05月01日

Red Hat Linux 4.0 (Colgate) 1996年10月08日

Red Hat Linux 5.0 (Hurricane) 1997年12月01日

Red Hat Linux 6.0 (Hedwig) 1999年04月26日

Red Hat Linux 6.2 (Zoot) Red Hat Linux 6.2E 2000年04月03日

Red Hat Linux 7.0 (Guinness) 2000年03月27日

Red Hat Linux 7.2 (Enigma) Red Hat Enterprise Linux 2 2001年10月22日

Red Hat Linux 8.0 (Psyche) 2002年09月30日

Red Hat Linux 9.0 (Shrike) 2003年03月31日

Red Hat Enterprise Linux 3.0(Taroon) Fedora 1 (Yarrow) 2003年10月22日

Red Hat Enterprise Linux 4.0 2005年02月15日

Red Hat Enterprise Linux 5.0(Tikanga) 2007年03月14日

Red Hat Enterprise Linux 6.0(Santiago) 2010年11月10日

Red Hat Enterprise Linux 7.0(Maipo) 2014年06月10日

Red Hat Enterprise Linux 8.0 2019年05月07日

Red Hat Enterprise Linux 9.0 2022年5月18日

范例13:查看当前操作系统的内核版本

[root@rocky10 ~]# uname -r
6.12.0-55.12.1.el10_0.x86_64
1.2.7.3.2 关于红帽认证

红帽认证是目前世界范围内高度认可的Linux行业认证。

红帽认证体系有三个等级,分别是RHCSA(红帽认证系统管理员)、RHCE(红帽认证工程师)、 RHCA(红帽认证的系统架构师)。

官方链接

https://www.redhat.com/zh/services/certification/rhcsa
https://www.redhat.com/zh/services/certification/rhce
https://www.redhat.com/zh/services/certification/rhce-old
https://www.redhat.com/zh/services/certification/rhca

t1-72

图1-72 红帽认证体系

问题:

  • 找工作前是否需要考个RHCE或RHCA证书呢?
  • 学完本运维课程后,是否可以直接可否考RHCE或RHCA证书呢?
  • RHCE和RHCA证书的有效期?
1.2.7.3.3 CentOS 和 Rocky Linux

t1-73

图1-73 CentOS

2004年,Gregory Kurtzer和CentOS的其他创始成员基于开源的RHEL创建了CentOS,将EnterpriseLinux引入了社区。

2014年,红帽宣布正式赞助CentOS。CentOS的几个核心团队入职Red Hat专门负责其开发。并在Red Hat在理事会中占了三席,但是其社区属性得到保留,交易结果是一部分包括将CentOS商标和IP转移到Red Hat以安全保存。

CentOS 8于2019年9月交付,紧随RHEL 8之后,CentOS Stream的发布和发布是对下一个次要更新中即将发布内容预览版本。可以说是RHEL的beta频道。

2019,巨头IBM花重资收购了Red Hat。并承诺Red Hat忠于其开源根基不会改变,声称" Red Hat对开源的使命和坚定承诺将保持不变。"

2020年12月8日IBM宣布将惯例支持到2029年CentOS 8,提前在2年内就终结,唯一的升级途径是CentosStream—AKA,RHEL的Beta发布,并建议不再生产环境中使用。预示着CentOS可能会正式死亡。CentOS已死,但是CentOS精神将会永存。

随后以CentOS创始人之一Gregory Kurtzer为首,8小时内250人啸聚网络,计划以创建Rocky Linux(Rocky为已经逝世的另外一个CentOS创始人)取代CentOS。Rocky Linux与RHEL兼容目前已经创建了Github Rocky Linux项目组织(github.com/rocky-linux/rocky)和官网(rockylinux.org)。

t1-74

图1-74 Rocky Linux

1.2.7.4 Debian 和 Ubuntu
1.2.7.4.1 Debian

t1-75

图1-75 Debian

Debian 是从 1993 年由 Ian Murdock(伊恩·默多克) 发起的,受到当时 Linux 与 GNU 的鼓舞,目标是成为一个公开的发行版,经过二十几年的迭代更新Debian 从一个小型紧密的自由软件骇客(hacker)小组,逐渐成长成今日庞大且运作良好的开发者与用户社群,Debian 的名字是由 Debian 的创始人 Ian Murdock (伊恩·默多克) 和他的爱妻Debra(黛布拉) 两人的名字组合而成的。

Debian 是由大约一千个分布在世界各地的开发者无偿地利用他们的业余时间开发的,而这些开发者实际上大部分都没见过面,彼此之间的通讯大多是通过电子邮件(lists.debian.org 上的邮件列表)和 IRC(irc.debian.org 上的#debian 频道)来完成的,目前Debian 提供59000多个软件包的维护与更新。

Debian官网: https://www.debian.org/
官方镜像地址: https://www.debian.org/mirror/list
清华大学下载地址: https://mirrors.tuna.tsinghua.edu.cn/debian-cd/
1.2.7.4.2 Ubuntu

t1-76

图1-76 Ubuntu

Ubuntu(友帮拓、优般图、乌班图)早期是一个开源的GNU/Linux操作系统,Ubuntu 是基于Debian GNU/Linux,支持x86、amd64(即x64)和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,类似儒家“仁爱”的思想,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观。

与Debian的不同在于它每6个月会发布一个新版本,Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统,Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助,Ubuntu对GNU/Linux的普及特别是桌面普及作出了巨大贡献,由此使更多人共享开源的成果与精彩。

Canonical公司是一个私营公司,由南非的企业家马克·沙特尔沃思(Mark Shuttleworth)创建,主要为了促进开源软件项目,Canonical在马恩岛登记注册,其雇员分布在世界各地,其主要办事处在伦敦,在蒙特利尔也有办事处,Canonical公司支持并创建了几个项目,主要都是自由/开源软件(FOSS)或是一些旨在改善自由软件开发者和贡献者的工具。

Ubuntu是各种公有云上最受欢迎的操作系统,这是因为Ubuntu与各大云运营商密切合作,针对云服务商的基础架构优化内核和系统,加快安全更新速度,并最大限度降低用户默认需要的网络或存储成本。

Ubuntu 没有像其它软件一样有 1.0 版本,是因为其第一个版本是发布于 2004 年,Ubuntu的生日是2004年的10月20日。

ubuntu的版本号有个固定的特征,其使用一个形容词和一个动物名称组成,并且形容词和名词的首字母都是一致的,Ubuntu版本的命名规则是根据正式版发布的年月命名,Ubuntu 16.04 也就意味着 2016年4月发布的Ubuntu,研发人员与用户可从版本号码就知道正式发布的时间。

每两年的 4 月份,都会推出一个长期支持版本(LTS),其支持期长达五年,而非 LTS 版本的支持期通常只有半年。

# 中文官网
https://cn.ubuntu.com/
# 英文官网
https://ubuntu.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raymond运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值