系统启动流程和服务管理
系统启动
1)BIOS加电自检、检测硬件、决定启动介质、找到引导扇区
2)读取并且执行第一个开机设备中的MBR的bootloader
3)依据bootloader设置去加载内核,内核开始侦测硬件并加载驱动程序
- 如果是sysvinit启动程序(linux6版本)
4)内核启动init进程
5)系统初始化
6)init找到/etc/inittab文件,决定系统的运行级别
7)触发相应的运行级别的事件,运行/etc/rcX.d下的脚本
8)执行/etc/rc.local文件,来到登录界面
9)输入用户名密码,进入到系统中 - 如果是systemd启动程序(Linux7版本)
4)在硬件驱动加载成功后,内核会主动呼叫systemd程序,并以default.target流程开机
5)systemd执行sysinit.target初始化系统及basic.target准备操作系统
6)systemd启动multi-user.target下的本机与服务器服务
7)systemd执行multi-user.target下的/etc/rc.d/rc.local文件
8)systemd执行multi-user.target下的getty.target及登录服务
9)systemd执行graphical需要的服务
Init和Systemd的区别
- init
1.启动时间长,init是串行启动,只有前一个进程启动完,才会启动下一个进程
2.启动脚本复杂,Init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长
3.由Linux内核加载运行,位于 /sbin/init ,是系统中第一个进程,PID永远为1 - systemd
1.按需启动服务,减少系统资源消耗
2.尽可能并行启动进程,减少系统启动等待时间
3.由Linx内核加载运行,位于 /usr/lib/systemd/systemd ,是系统中第一个进程,PID永远为1
配置文件的区别
- Init 进程的配置文件
- 运行级别和说明
- 查看运行级别
runlevel : 显示切换前的运行级别 和当前运行级别 (6/7)
systemctl get-default : 显示当前运行级别 (7) - 永久设置开机模式
systemctl set-default multi-user.target 开机默认为文本模式
systemctl set-default graphical.target 开机默认为图形模式
修改 /etc/inittab 默认运行级别配置文件
Systemd服务管理
- Systemd 的简介和特点
Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度,systemd和ubuntu的upstart是竞争对手,从15.04版本开始,Ubuntu也已经采systemd作为其标准的系统初始化系统 - Systemd 的基本概念
单元(unit)的概念:
系统初始化需要做的事情非常多。需要启动后台服务,比如启动 SSHD 服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被systemd 抽象为一个配置单元,即 unit。可以认为一个服务是一个配置单元;一个挂载点是一个配置单元;一个交换分区的配置是一个配置单元;
Service unit:系统服务,最常见的类型
Target unit:多个 Unit 构成的一个组,执行环境类型
Device Unit:硬件设备
Mount Unit:文件系统的挂载点
Automount Unit:自动挂载点
Path Unit:侦测特定文件或目录类型的
Scope Unit:不是由 Systemd 启动的外部进程
Slice Unit:进程组
Snapshot Unit:Systemd 快照,可以切回某个快照
Socket Unit:进程间通信的 socket服务
Swap Unit:swap 文件
Timer Unit:循环执行的服务 - Target和运行级别
systemd 用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其它服务,来创建自己的目标。下表列举了 systemd 下的目标和常见 runlevel 的对应关系
Systemctl管理服务
RHEL7监视和控制systemd的主要命令是systemctl,该命令可以用于查看系统状态和管理系统及服务
- systemctl最常用的命令如下
- [Unit]
[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系,它的主要字段如下
Description:简短描述
Documentation:文档地址
Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit会启动失败
Wants:与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit不会启动失败
BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前Unit 停止运行
Before:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After:如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行
Condition…:当前 Unit 运行必须满足的条件,否则不会运行
Assert…:当前 Unit 运行必须满足的条件,否则会报启动失败 - [Service]
[Service]部分是服务的关键,是服务的一些具体运行参数的设置,只有Service 类型的 Unit 才有这个区块,它的主要字段如下
Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当前服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、onabort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
Environment:指定环境变量 - [install]
[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动,它的主要字段如下
WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target名 + .wants后缀构成的子目录中
RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:当前 Unit 可用于启动的别名
Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit - Target
简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态;传统的init启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个RunLevel同时启动,但是多个Target可以同时启动
//查看当前系统的所有 Target
$ systemctl list-unit-files --type=target
// 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target
//查看启动时的默认 Target
$ systemctl get-default
//设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target
//切换 Target 时,默认不关闭前一个 Target 启动的进程,
$ systemctl isolate 命令改变这种行为,
//关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target