1 Linux 操作系统的启动流程和 init 进程
1.1 Linux 开机启动流程
Linux 操作系统中,不管软件还是命令还是服务脚本,都是一个个的脚本,用过就消失了。
Linux 中是 systemd 启动进程。
单击开机按钮,就是给计算机通电
一台计算机是由多个零件拼凑成的,通过 BIOS(输入输出系统) 发现 CPU,内存,硬盘,网卡,主板拼凑
主要两大功能:检查和发现所有硬件设备以及找到硬件的一个起点(也就是引导设备),也就是操作系统存在硬盘上,所以就是要先找到硬盘作为第一个启动,把硬盘作为起点
硬盘作为起点,但上面数据太多,MBR 是硬盘加载后第一个被读到的数据。里面记录着整个硬盘的分区,就是让计算机先大体了解一下硬盘的整体框架,知道了框架后,才能开始读其他的数据
通过 MBR,计算机大体了解了硬盘的框架,接下来是读数据,硬盘上的视频音乐对启动系统是无用的,只有和操作系统本身相关的数据才是计算机急需的。
所以需要一个引导程序,由它来负责找到操作系统的准确位置,这个引导程序就是 GRUB
GRUB 作为引导程序,最终目的是找到操作系统,GRUB 下一步会引导到 Linux 内核,平时说的操作系统 Linux,其实 Linux 这个词原本指的就是它的内核 kernal,或者说是 驱动程式,而驱动是为了调度所有计算机硬件而存在的,只有内核才能称作 Linux,后面启动的命令行、图形界面、各种服务、工具其实是 Linux 的附属品,所以 GRUB 的下一步是引导内核启动,也就是启动 Linux
Linux 内核启动,平常使用的各种工具服务都是进程,所有的进程都要有一个统一的起点,init 是作为Linux 操作系统启动的第一个程序,后续各种服务进程其实都是被 init 再启动起来。
1.2 第一个启动的进程 systemd
init 是一个统称,作为第一个启动的程序,这个 init 程序从 Linux 诞生开始就在不断地更新,目前新一代的 init 系统叫做 systemd。
init 程序在不断发展中有很多的版本。
systemd 是最新一代的 init 程序。
-
查看 systemd
进程 PID 是 1,说明是头一个进程,老版本的 CentOS 第一个进程叫做 init
ps -ef | grep systemd
pstree -- 把 Linux 下面所有进程按照一个树形结构显示出来,进程比喻成 树枝
2 CentOS 7.x 专属服务管理器 systemd
进程是操作系统的最小组成单位,太多进程混在一起的话不容易识别,于是有了服务的概念。服务:就是把某种特定的进程或者一些特定的进程包装一下,变成更容易读懂的形式。
systemd 既可以代表 CentOS 7.x 的第一个进程,同时也是 CentOS 7.x 的一个独特的服务体系框架。
2.1 systemctl 探索 systemd
systemd 是CnetOS 7.x 的第一个进程,是所有其他进程的父进程。其实 systemd 更多的功能是管理和维护,也就说 Linux 完全开启后,systemd 会维护着整个系统下的进程或者说是所有服务。
第一行 systemd Utilities 意思是 systemd 的自带工具,有了这些工具,可以轻松地访问 systemd。这些工具中,systemctl 是 systemd 最重要的命令。systemctl 可以轻松访问 systemd 发送指令,让 systemd 去做各种各样的工作
list-units:展示出单位,--type=service 指定类型是服务的
上图输出太多有删减,systemctl 展示了 systemd 下管理的所有服务单位 Unit
在 LInux 下的所有的进程,服务,配置等这些元素统称为 Unit,也就是一个单位。
这些单位被赋予了不同的类型。上图中显示的单位类型都是 service名称中用后缀表示
所有的服务都被抽象成一个个的Unit单位。
2.2 用systemctl 来探索服务的背后
用 systemctl 向一个服务发出指令,例如:启动,停止,重启一个服务
systemctl cat + 服务名称 -- 可以查看一个服务的详细信息
ExecStart=/usr/sbin/sshd -D $OPTIONS当执行 启动ssh服务的时候,发生的动作,可以看出,启动SSH服务其实就是运行了一个sshd的命令ps -ef | grep sshd
-- 查看 sshd,SSH服务的背后就是一个进程
root 5198 4708 0 08:35 pts/0 00:00:00 grep --color=auto sshd
systemctl status + 服务名称 -- 用来查看某一个服务当前的状态
systemd 提供的另一个重要工具:journalctl,用来统一记录 systemd 中所有的 Unit 的日志信息,方便进行排错。
journalctl -xe -- 显示信息
2.3 systemd 的启动项设置
在 Linux 中设置一个启动项非常重要。
systemctl enable sshd.service
-- 在开机时启用服务systemctl disable sshd.service
-- 在开机时禁用服务
systemd 下的服务如果想启动起来,必须有对应的文件,否则手动自动都启动不起来
systemd 下的服务配置文件都保存在 /usr/lib/systemd/system 下,然而 Linux 本身启动只关注另一个目录:/etc/systemd/system,所以,要想启动需要将配置文件放于两个文件夹中,两个文件不必要各放一个,创建一个软链接即可。
看看那些服务是开机启动的
systemctl list-unit-files|grep enabled
2.4 target 运行级别
其实 target 代表一组 Units,就是实实在在的东西,例如:一个 SSH 服务,一个 VSFTR 服务,target 就是特定的很多个 Units 拼成一组。
systemd 下的一个服务想让他启动就得在 /etc/systemd/system 下创建一个软链接,然后用 ls 命令查看是找不到 sshd.service 的软链接
用 find 命令可以看到:
sshd.service 是有的,只不过存在于一层子目录下面:multi-usr.target.wants,说明 sshd.service 包含在 multi-user 这个 target 组中。开机启动 multi-user 组顺带就会把 sshd.service 也给启动了。在定义一个 systemd Unit 时,它的配置文件中会指明这个 Unit 属于那个 target。
所谓的运行级别,不过指的就是一个 target 组设置成开机启动,下面用 systemctl 显示所有的 Units,并指定 Unit 的类型为 target