Linux 发展历史介绍


Linux 发展历史介绍


正文

操作系统始于二十世纪五十年代,当时的操作系统能运行批处理程序。批处理程序不需要用户的交互,它从文件或者穿孔卡片读取数据, 然后输出到另外一个文件或者打印机。

二十世纪六十年代初,交互式操作系统开始流行。它不仅仅可以交互,还能使多个用户从不同的终端同时操作主机。 这样的操作系统被称作分时操作系统,它的出现对批处理操作系统是个极大的挑战。许多人尝试开发分时操作系统, 其中包括一些大学的研究项目和商业项目。 当时有个项目叫做 Multics ,它的技术在当时很具有创新性。 Multics 项目的开发并不顺利,它花费了远超过预计的资金, 却没有在操作系统市场上占到多少份额。而参加该项目的一个开发团体——贝尔实验室退出了这个项目。他们在退出后开发了他们自己的一个操作系统—— UNIX 。

UNIX 最初免费发布并因此在大学里受到欢迎。后来,UNIX 实现了 TCP/IP 协议栈,成为了早期工作站的操作系统的一个流行选择。

1990 年,UNIX 在服务器市场上尤其是大学校园中成为主流操作系统,许多校园都有 UNIX 主机,当然还包括一些研究它的计算机系的学生。 这些学生都渴望能在自己的电脑上运行 UNIX 。不幸的是,从那时候开始,UNIX 开始变得商业化,它的价格也变得非常昂贵。 而唯一低廉的选择就是 MINIX,这是一个功能有限的类似 UNIX 的操作系统,作者 Andrew Tanenbaum 开发它的目的是用于教学。

1991 年 10 月,Linus Torvalds(Linux 之父)在赫尔辛基大学接触 UNIX,他希望能在自己的电脑上运行一个类似的操作系统。 可是 UNIX 的商业版本非常昂贵,于是他从 MINIX 开始入手,计划开发一个比 MINIX 性能更好的操作系统。很快他就开始了自己的开发工作。 他第一次发行的版本迅速吸引了一些黑客。尽管最初的 Linux 并没有多少用处,但由于一些黑客的加入使它很快就具有了许多吸引人的特性, 甚至一些对操作系统开发不感兴趣的人也开始关注它。

Linux 本身只是操作系统的内核。内核是使其它程序能够运行的基础。它实现了多任务和硬件管理, 用户或者系统管理员交互运行的所有程序实际上都运行在内核之上。其中有些程序是必需的,比如说,命令行解释器(shell), 它用于用户交互和编写 shell 脚本。 Linux 没有自己去开发这些应用程序,而是使用已有的自由软件。这减少了搭建开发环境所需花费的工作量。 实际上,他经常改写内核,使得那些程序能够更容易地在 Linux 上运行。许多重要的软件,包括 C 编译器, 都来自于自由软件基金 GNU 项目。GNU 项目开始于 1984 年,目的是为了开发一个完全类似于 UNIX 的免费操作系统。为了表扬 GNU 对 Linux 的贡献, 许多人把 Linux 称为 GNU/Linux(GNU 有自己的内核)。

1992-1993 年,Linux 内核具备了挑战 UNIX 的所有本质特性,包括 TCP/IP 网络,图形界面系统(X window ), Linux 同样也吸引了许多行业的关注。一些小的公司开始开发和发行 Linux,有几十个 Linux 用户社区成立。1994 年,Linux 杂志也开始发行。

Linux 内核 1.0 在 1994 年 3 月发布,内核的发布要经历许多开发周期,直至达到一个稳定的版本。

Linux大事记

下面列举一些 Linux 诞生大事件:

1965 年,Bell 实验室、MIT、GE(通用电气公司)准备开发 Multics 系统,为了同时支持 300 个终端访问主机,但是 1969 年失败了;

那时候并没有鼠标、键盘,输入设备,只有卡片机。因此,如果要测试某个程序,则需要将读卡纸插入卡片机,如果有错误,还需要重新来过; Multics:Multiplexed Information and Computing Service;

1969 年,Ken Thompson(C语言之父)利用汇编语言开发了 File Server System(Unics,即 UNIX 的原型);因为汇编语言对于硬件的依赖性, 因此只能针对特定硬件; 只是为了移植一款“太空旅游”的游戏;

1973 年,Dennis Ritchie 和 Ken Thompson 发明了 C 语言,而后写出了 UNIX 的内核;

将 B 语言改成 C 语言,由此产生了 C 语言之父;90% 的代码是 C 语言写的,10% 的代码用汇编语言写的,因此移植时只要修改那 10% 的代码即可;

1977 年,Berkeley 大学的 Bill Joy 针对他的机器修改了 UNIX 源码,称为BSD(Berkeley Software Distribution);Bill Joy 是 Sun 公司的创始人;

1979 年,UNIX 发布 System V,用于个人计算机;

1984 年,因为 UNIX 规定“不能对学生提供源码”,Tanenbaum 老师自己编写兼容于 UNIX 的 Minix,用于教学;

1984 年,Stallman 开始 GNU(GNU’s Not Unix)项目,创办 FSF(Free Software Foundation)基金会;

产品:GCC、Emacs、Bash Shell、GLIBC;倡导“自由软件”;GNU 的软件缺乏一个开放的平台运行,只能在 UNIX 上运行; 自由软件指用户可以对软件做任何修改,甚至再发行,但是始终要挂着 GPL 的版权;自由软件是可以卖的,但是不能只卖软件,而是卖服务、手册等;

1985 年,为了避免 GNU 开发的自由软件被其他人用作专利软件,因此创建 GPL(General Public License)版权声明;

1988 年,MIT 为了开发 GUI,成立了研发 XFree86 的组织;

1991 年,芬兰赫尔辛基大学的研究生 Linus Torvalds 基于 gcc、bash 开发了针对 386 机器的 Linux 内核;

1994 年,Torvalds 发布 Linux-v1.0;

1996 年,Torvalds 发布 Linux-v2.0,确定了 Linux 的吉祥物:企鹅。

UNIX进化史(UNIX大家族族谱1969-2013):

详细的Linux家族树:

GNU/Linux OS关系图:

init 进程历史

近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经淡出历史舞台, 新的 init 系统 UpStart 和 systemd 各有特点,而越来越多的 Linux 发行版采纳了 systemd。

Centos版本支持:

Centos 5:SysV init
Centos 6:Upstart
Centos 7:Systemd

SysV init 系统启动,特点:程序从前到后一个一个启动,不管以后需要不需要,都一次全部加载好,不支持热拔插。

UpStart 系统启动,特点:程序并行启动,采用事件驱动模式,支持热拔插。

Systemd 系统启动,特点:提供了和 Sysv init 以及 LSB initscripts 兼容的特性, 提供了比 UpStart 更激进的并行启动能力,采用了 socket / D-Bus activation 等技术启动服务, 提供按需启动能力,采用 Linux 的 Cgroup 特性跟踪和管理进程的生命周期,启动挂载点和自动挂载的管理, 实现事务性依赖关系管理,能够对系统进行快照和恢复,日志服务。

systemctl

systemd启动的服务,systemctl可以与之通信。

systemctl 命令: Control the systemd system and service manager(控制系统和服务)

对于Centos 7来说,其引入到了一个核心概念,称之为unit,用配置文件进行标识和识别。 在文件当中包含了几种类别,分别为系统服务、监听的套接字、保存的快照以及其它与init相关的信息。

unit涵盖了相关的配置文件进行标识、识别和配置。这些配置文件主要保存在:

/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system

systemd的unit配置文件包含很多种类型,我们以后缀名区分出大体的类型,unit常见的类型:

Service unit:文件扩展名.service;用于定义系统服务
Target unit:文件扩展名.target;用于模拟实现“运行级别”
Device unit:文件扩展名.device;用于定义内核识别的设备
Mount unit:文件扩展名.mount;用于定义文件系统的挂载点
Socket unit:文件扩展名.socket;用于标识进程间通信用到的socket文件
Snapshot unit:文件扩展名.snapshot;用于管理系统快照
Swap unit:文件扩展名.swap;用于标识swap设备
Automount unit:文件扩展名.automount;用于定义文件系统自动挂载设置
Path unit:文件扩展名.path;用于定义文件系统中的以文件或目录。

详细版:

.service:一个service单元文件描述了如何管理服务器上面的一个服务或者应用。单元文件里面将会包含如何开始或者停止该服务,在何种情况下该服务会自动运行,以及和相关软件的依赖关系及顺序信息。
.socket:一个socket单元文件描述了一个网络或IPC套接字,或者一个消息队列缓存,systemd用其所基于套接字的触发激活。当所定义的activity对于该socket可见的情况下,他们一般会有一个与之相关的.service单元文件会被启动。
.device:描述针对udev或者sysfs文件系统而言必要的systemd管理设备。并非所有的设备都会有.device文件。在下面一些场景下,.device单元是必要的:调整设备、挂载设备、访问设备。
.mount:定义了被systemd管理的挂载点。命名方法是将”/”换为”-“,并在结尾添加.mount。比如/dev/hugepage/挂载点,名称为dev-hugepage.mount
.automount:配置.mount定义的挂载点为自动挂载点,前提是必须要有与之对应的.mount单元文件。
.swap:定义交换空间。该文件的名字必须反应和交换空间相关的设备或者路径
.target:为启动或者改变状态提供一个同步点,也可以用作将系统带到一个新的状态。其余的单元通过设定和某个target的关系,和该target的操作绑定到一起。
.path:定义了可以被基于路径的触发激活所使用的路径。默认情况下,当路径到了指定的状态(切换到了指定的路径),一个同名的.service文件将会启用。这里是采用inotify去监控路径的改变。
.timer:定义了可以由systemd管理的计时器,和cron计划任务类似。当计时器到时,一个匹配的单元将会启动。
.snapshot:被systemctl snapshot命令所创建。可以让您在系统发生改变之后重新构建系统(回滚)。该快照只针对会话有效,用于回滚临时状态。
.slice:与Linux的CGroup相关。其名称反应了其在cgroup树的层次。默认情况下,单元依据其类型的不同被放置在一定的slice里面。
.scope:Scope单元由systemd接收到总线接口的信息而自动生成。这些Scope单元用于管理由外部创建的系统进程。

看一下关于管控service等类型的unit文件,与Centos 6的对比区别(sysvinit –> systemd):

启动:service NAME start --> systemctl start NAME.servcie
停止:service NAME stop --> systemctl stop NAME.servcie
重启:service NAME restart --> systemctl restart NAME.service
状态:service NAME status --> systemctl status NAME.service
条件式重启:service NAME condrestart --> systemctl try-restart NAME.service
重载或重启服务:systemctl reload-or-restart NAME.service
重载或条件式重启服务:systemctl reload-try-restart NAME.servie

查看某服务当前激活与否的状态:systemctl is-active NAME.service
查看所有已激活的服务:systemctl list-units --type service
查看所有服务(已激活及未激活):chkconfig --list --> systemctl list-units --type service --all
查看某服务是否能开机自启:chkconfig --list NAME --> systemctl is-enable NAME.service

禁止某服务设定为开机自启:systemctl mask NAME.service
取消此禁止:systemctl umask NAME.service
查询所有服务是否开机自启动:systemctl list-unit-files

查看服务的依赖关系:systemctl list-dependencies NAME.service

target类型就是用于实现其系统启动的运行级别:

0:关机
1:单用户模式,无网络连接,不运行守护进程,不允许非超级用户登录
2:多用户模式,无网络连接,不运行守护进程
3:多用户模式,正常启动系统
4:用户自定义
5:多用户模式,图形界面
6:重启

在systemd命令中所对应的运行级别以及在Centos 6上对应的运行切换等命令:

运行级别:
    0 --> runlevel0.target,poweroff.target
    1 --> runlevel1.target,rescue.target
    2 --> runlevel2.target,multi-user.target
    3 --> runlevel3.target,multi-user.target
    4 --> runlevel4.target,multi-user.target
    5 --> runlevel5.target,graphical.target
    5 --> runlevel6.target,reboot.target

级别切换:init N --> systemctl isolate NAME.target
查看级别:runlevel --> systemctl list-utits --type target
查看所有级别:systemctl list-units --type traget --all
获取默认运行级别:systemctl get-default
修改默认运行级别:systemctl get-default NAME.target
切换至紧急救援模式:systemctl rescue
切换至emergency模式:systemctl emergency

其它常用命令:

关机:systemctl <halt | poweroff>
重启:systemctl reboot
挂起:systemctl suspend
快照:systemctl hibernate
快照并挂起:systemctl hybrid-sleep

systemctl 也兼容了 service,即systemctl也会去 /etc/init.d 目录下,查看,执行相关程序。

在Centos7中 /etc/init.d 是个链接文件,指向 /etc/rc.d/init.d 目录,目录下 /etc/rc.d/init.d/README 文件内容比较有意思, 解说了 systemd 与 init 的区别与联系:

You are looking for the traditional init scripts in /etc/rc.d/init.d,
and they are gone?

Here's an explanation on what's going on:

You are running a systemd-based OS where traditional init scripts have
been replaced by native systemd services files. Service files provide
very similar functionality to init scripts. To make use of service
files simply invoke "systemctl", which will output a list of all
currently running services (and other units). Use "systemctl
list-unit-files" to get a listing of all known unit files, including
stopped, disabled and masked ones. Use "systemctl start
foobar.service" and "systemctl stop foobar.service" to start or stop a
service, respectively. For further details, please refer to
systemctl(1).

Note that traditional init scripts continue to function on a systemd
system. An init script /etc/rc.d/init.d/foobar is implicitly mapped
into a service unit foobar.service during system initialization.

Thank you!

Further reading:
        man:systemctl(1)
        man:systemd(1)
        http://0pointer.de/blog/projects/systemd-for-admins-3.html
        http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities






参考资料

Linux 历史简介 https://blog.csdn.net/weixin_42078760/article/details/80688270

Linux系统之UpStart https://www.cnblogs.com/plxx/p/5493073.html

浅析 Linux 初始化 init 系统,第 2 部分 UpStart https://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/index.html

浅析 Linux 初始化 init 系统,第 3 部分 Systemd https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html

浅析 Linux 初始化 init 系统: sysvinit https://linux.cn/article-4422-1.html

Linux 系统之Systemd https://www.cnblogs.com/plxx/p/5493105.html

Linux 启动过程分析 (SysV init启动模式) https://blog.csdn.net/yellowblue2/article/details/78745172

systemd基本概念及systemctl使用 https://blog.csdn.net/weixin_44023707/article/details/100153134

Systemd 入门教程:命令篇 阮一峰 http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

CentOS7 Nginx源码编译安装 & systemd注册服务 & 添加环境变量 https://blog.csdn.net/qq_43413788/article/details/106480952

理解Systemd Unit和Unit Files https://blog.51cto.com/jiangche00/1926777


返回