centos7启动过程及systemd详细说明

开机启过程

POST—>BOOT SEQUENCE—> BOOTLOADER—>KERNEL + INITRAMFS(INITRD)—>ROOTFS—>/sbin/init

POST:加电自检

当开机按下电源按钮后,计算机开始加电,主板上的BIOS或UEFI基本输入输出程序开始对硬件进行检查,检查内存,CPU等等吧,当检测到错误的时候机器会中断或者启动不了,这个做过电脑维护的人都知道,内存氧化可导至开不了机,还有的机器如果没插鼠标键盘自检也不会通过卡在那里了,不会继续往下走。

Boot sequence:选择引导顺序

当自检通过后,接着就要选择引导介质或方式,是通过光盘启动,硬盘启动,网络启动,还是U盘启动,这些也是在BIOS中设定的,所以设定的第一启动项是哪个就从那个开始引导,这个装过WINDOWS的都很熟悉了。

Bootloader:引导加载器

确定引导介质后便开始从介质中装载引导程序如grub2,这个是一个微小程序,我们知道MBR引导记录大小为512字节,其中前446个字节就是Bootloader,主要用来引导用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核。

grub2就是Linux中Bootloader程序,由于MBR记录限制,所以grub2分为两个部分:

  1. 在MBR引导记录中,大小为446字节,主要功能是引导启动介质的grub主体文件
  2. partition,/boot/grub[2],此为grub的主体。

KERNEL + INITRAMFS(INITRD)—>ROOTFS :加载内核

这时候kernel开始初始化,探测可识别的硬件设备,加载硬件启动程序。以只读方式加载根文件系统

kernel在内存中加载时,为了模拟系统环境,会生成一个ramdisk文件,来进行下一步操作,等到加载到真正的根文件系统时,就会退出ramdisk,切换到真正的根文件系统中去。

  • ramdisk:内存上临时虚拟的系统
  • ramdisk(虚拟磁盘,双缓冲,双缓存)—-> ramfs(虚拟文件系统)

  • centos5:initrd

  • 工具程序:mkinitrd

  • centos6,7:initramfs

  • 工具程序:dracut,mkinitrd

/sbin/init:运行用户空间的第一个应用程序

init:

    Centos 5: SysV init       配置文件:/etc/inittab

    Centos 6: Upstart         配置文件:/etc/inittab;/etc/init/*.conf(主要)

    Centos 7: systemd        配置文件:/etc/systemd/system;/usr/lib/systemd/system

至此,内核空间就已经启动完毕,内核启动完成接着开始启动用户态启动过程。systemd是个守护进程,pid号为1,后面所有启动的服务或进程都是systemd的子进程及子进程的子进程。

那么用户态的启动顺序又是什么样的呢?

设置默认允许级别—>初始化脚本,完成系统初始化—>关闭及启动对应级别下的服务—–>设置登录终端—–>[启动图形终端]

Systemd新特性

  • 系统引导时实现服务并行启动,没有顺序之分
  • 按需激活进程
  • 支持系统状态快照
  • 基于依赖关系定义服务控制逻辑

关键特性

  • 基于socket的激活机制:socket与服务程序分离;按需激活程序或服务,可并行启动
  • 基于bus的激活机制:

  • 基于device的激活机制:当某个硬件设备变得可用时就可激活某设备

  • 基于path的激活机制

  • 系统快照:保存各unit的当前状态信息于持久存储设备中

  • 向后兼容sysv init脚本

不兼容:

systemctl命令固定不变,非由systemd启动的服务,systemctl无法与之通信

核心概念:unit

配置文件进行标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其它与init相关的信息,保存至:

/usr/lib/systemd/system

/run/systemd/system

/etc/systemd/system

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,用于定义文件系统中的一个文件或目录

管理系统服务

  • 启动:systemctl start name.service
  • 停止:systemctl stop name .service

  • 重启:systemctl restart name.service

  • 重载:systemctl reload name.service

  • 条件式重启:systemctl try-restart name.service

  • 查看某服务当前是否运行:systemctl is-active name.service

  • 查看所有已经激活的服务:systemctl list-units –type service systemctl list-units –type service –-all

  • 开机自启动:systemctl enable name.service

  • 开机不启动:systemctl disable name.service

  • 查看所有服务开机自启动状态:systemctl list-unit-files –-type service

  • 查看服务是否开机自启:systemctl is-enabled name.service

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

  • 禁止设定为开机自启:systemctl mask name.service

  • 取消禁止设定为开机自启:systemctl unmask name.service

Target units:(模拟运行级别)

  • unit配置文件,以.target后辍名结尾
  • 关机:runlevel0.target,poweroff.target

  • 救援:runlevel1.target,rescue.target

  • 多用户:multi-user.target

  • 图形:graphical.target

  • 重启:reboot.target

  • 级别切换:systemctl isolate name.target

  • 查看级别:systemctl list-units –-type target systemctl get-default

  • 设置级别:systemctl set-default name.target

  • 切换至紧急救援模式:systemctl rescue

  • 切换至emergency模式:systemctl emergency(服务不加载不启动,驱动不加载,更彻底)

其它常用命令

  • 关机:systemctl halt,systemctl poweroff

  • 重启:systemctl reboot

  • 挂起:systemctl suspend

  • 快照:systemctl hibernate

  • 快照并挂起:systemctl hybrid-sleep

标签:SystemdCentos 发布于:2019-11-15 06:41:31