Linux系统启动流程及服务控制

系统启动流程和服务管理

在这里插入图片描述

系统启动

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

3369_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值