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