Linux基础-13-CentOS7启动流程+Systemd管理
内核
内核设计流派
- 单内核设计:把所有的功能集成与同一个程序;比如Linux
- 微内核设计:每种功能使用一个单独的子系统实现;比如Windows,Solaris
Linux内核特点
- 支持模块化:.ko(ketnel object)
- 支持模块化运行时动态装载或卸载;
- 组成部分:
- 核心文件:/boot/vmlinuz-VERSION-release
- ramdisk:启动时划出内存中的某一空间当磁盘用,不是必须的
- CentOS 5:/boot/vmlinuz-VERSION-release.img
- CentOS 6,7,8:/boot/initramfs-VERSION-release.img
- 模块文件:/lib/modules/VERSION-release
CentOS7启动流程
1.POST加电自检
- 检测硬件设备是否能够正常运行(主板上ROM芯片上的BIOS程序实现)
- BIOS程序能够检测CPU/Memory/硬盘/IO设备是否能够正常运行
- 如果是个人PC机,还会检测显示器
- 只要通电,CPU就会自动去加载ROM芯片上的BIOS程序,实现硬件设备初始化
2.Boot Sequence(选择启动设备以加载MBR)
- 选择要启动的硬件设备,选择之后就开始读取这个设备位于MBR头里的BootLoader
- 根据BIOS中对启动顺序的设定,依次扫描引导设备
- 然后第一个被扫描到的具有引导程序(BootLoader)的设备会成为要启动的引导设备
3.加载BootLoader
功能:
- BIOS通过读取并执行启动设备中的BootLoader
- BootLoader会提供一个菜单给用户,让用户去选择要启动的系统或者不同的内核版本
- 用户将内核版本加载至MBR中的特定程序,接着将在RAM中解压展开,将系统控制权
交由给内核
GRUB阶段: 是BootLoader中的一种,主要功能是实现加载内核
- stage1: 用于加载stage1.5阶段,目的是为了识别驱动stage2 (/boot/)所在分区的文件系统
- stage1.5 :加载stage2阶段所在分区的文件系统驱动,让stage1中BootLoader能识别stage2所在分区的文件系统
- stage2: 存放在磁盘分区上,具体存放在/boot/grub目录中,主要用于加载内核文件以及ramdisk这个临时根文件系统
4.Kernel初始化
- 探测可识别的所有硬件设备;
- 加载硬件的驱动程序
- 以只读方式挂载根文件系统
- 运行用户空间中的第一个应用程序: /sbin/init(/sbin/systemd)(进程号为0)
5.管理用户空间服务进程
- init初始化程序会根据系统上的配置文件执行一系列操作
(Centos5/6/7上关于Init的配置文件不一样,但是总体的启动流程是不变的) - 根据Init配置文件设置默认运行级别
CentOS7: 初始化Init程序是systemd;配置文件为:a) /usr/lib/systemd/system/* b) /etc/systemd/system/*
- Note: Centos6 –> Centos7 Init管理程序的变化-> systemd (并行)
总结:
加电自检
检查服务器硬件是否正常MBR引导
读取磁盘的MBR存储记录信息,引导系统启动
grup菜单
选择启动的内核/进行单用户模式重置密码加载系统内核信息
可以更好的使用内核控制硬件系统的第一个进程运行起来 systemd (并行)
服务启动的时候,同时一起启动读取系统启动文件
/etc/systemd/system/default.target读取系统初始化文件
/usr/lib/systemd/system/sysinit.target使服务可以开机自启动
/etc/systemd/system 加载此目录中的信息,实现服务开机自动启动运行mingetty进程
显示开机登录信息界面
CentOS7之Systemd特性
新特性
- 系统引导实现服务运行并启动
- 按需激活进程
- 系统服务状态快照
- 基于依赖关系定义服务控制逻辑
核心概念:Unit
unit由其相关配置文件进行标识和配置,文件中主要包含系统服务、监听socket、保存的系统快照以及其他与init相关的配置信息都会保存至:
- /usr/lib/systemd/system/ 每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
- /run/systemd/system/ 系统执行过程中所产生的服务脚本,比上面目录优先运行
- /etc/systemd/system/ 管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行
Unit类型
systemctl -t help
查看unit类型
- service unit: 文件扩展名为.service;用于定义系统服务
[root@test ~]# cat /usr/lib/systemd/system/chronyd.service
- Target unit: 文件扩展名为.target;用于模拟实现”运行级别”
[root@test ~]# cat /usr/lib/systemd/system/sockets.target
- Device unit: 文件扩展名为.device;用于定义内核标识的设备
- Mount unit: 文件扩展名为.mount; 用于定义文件系统挂载点
- socket unit:文件扩展名为.socket;用于标识进程间通信的socket文件
- Snapshot unit: 文件扩展名为.snapshot;用于管理系统快照
- Swap unit: 文件扩展名为.swap;用于标识swap设备
- Automount unit: 文件扩展名为..automount;管理自动挂载的文件系统
- Path unit: 文件扩展名为.path; 用于定义文件系统中的一个文件或目录
关键特性
- 基于socket的激活机制: socket与服务程序分离
- 基于device的激活机制: ….
- 基于path的激活机制
- 基于bus的激活机制
- 系统快照,保存各init的当前状态信息于持久化存储设备中
- 向后兼容 sysv/init 脚本
不兼容
- systemctl的命令是固定不变的
- 非由systemd启动的服务,systemctl无法与之通信
运行级别:0-6
- 0: 关机
- 6:重启
- 1:单机用户
- 2:多用户,无网络连接
- 3:无图形化,多用户,网络连接
- 5:图形化,多用户,网络连接
target units:
- unit配置文件:.target
ls /usr/lib/systemd/system/*.targe
systemctl list-unit-files --type target --all
运行级别:
- 0 ==> runlevel0.target, poweroff.target 关机
- 1 ==> runlevel1.target, rescue.target 单用户模式
- 2 ==> runlevel2.target, multi-user.target 多用户,无网络连接
- 3 ==> runlevel3.target, multi-user.target 多用户,有网络连接
- 4 ==> runlevel4.target, multi-user.target 保留
- 5 ==> runlevel5.target, graphical.target 图形化,多用户,有网络连接
- 6 ==> runlevel6.target, reboot.target 重启
查看依赖性:
systemctl list-dependencies graphical.target
级别切换:init N ==> systemctl isolate name.target
systemctl isolate multi-user.target
注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl daemon-reload
才能生效)
查看target:
runlevel
who -r
systemctl list-units --type target
获取默认运行级别:
/etc/inittab ==> systemctl get-default
修改默认级别:
/etc/inittab
==>systemctl set-default name.target
systemctl set-default multi-user.target
ls –l /etc/systemd/system/default.target
systemctl命令
用于管理系统服务
[root@test ~]# systemctl --help
systemctl [OPTIONS…] {COMMAND} …
- 启动服务:
systemctl start name.service
- 重启服务:
systemctl restart name.service
- 停止服务:
systemctl stop name.service
- 开机自启:
systemctl enable name.service
- 开机不自启:
systemctl disable name.service
- 禁止某服务设定开机自启:
systemctl mask name.service
- 取消此禁止:
systemctl unmask name.service
- 重载或者重启服务:
systemctl reload-or-restart name.service
- 条件式重启:
systemctl try-restart name.service
- 重载或者条件式重启服务:
systemctl try-reload-or-restart name.service
- 查看服务状态:
systemctl status name.service
- loaded Unit配置文件已处理
- active(running) 一次或多次持续处理的运行
- active(exited) 成功完成一次性的配置
- active(waiting) 运行中,等待一个事件
- inactive 不运行
- enabled 开机启动
- disabled 开机不启动
- static 开机不启动,但可被另一个启用的服务激活
- 查看某个服务当前激活与否状态:
systemctl is-active chronyd.service
- 查看某个服务是否开机启动:
systemctl is-enabled chronyd.service
- 查看所有已经激活的服务:
systemctl list-units --type service
- 查看所有服务:
systemctl list-units --type service --all
- 列出失败的服务:
systemctl --failed --type=service
- 列出依赖的单元:
systemctl list-dependencies name.service
运行级别相关操作:
- 查看运行级别:
runlevel
==systemctl list-units --type target
- 切换运行级别:
init N
==sytemctl isolate name.target
- 获取默认运行级别:
systemctl get-default
- 设置默认运行级别:
systemctl set-default TARGET.target
- 切换紧急救援模式:
systemctl rescue
- 切换救援模式:
systemctl emergency
真正的最简洁的系统启动模式
其他常用命令:
关机:
systemctl halt
|systemctl poweroff
重启:
sytemctl reboot
挂起:
systemctl suspend
快照:
systemctl hibernate
快照并挂起:
systemctl hybride-sleep
service unit file:
文件通常由三部分组成:
- [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
- [Service]:与特定类型相关的专用选项;此处为Service类型
- [Install]:定义由”systemctl enable”以及”systemctl disable”命令在实现服务启用或禁用时用到的一些选项
Unit段的常用选项:
- Descrlption :描述信息;意义性描述;
- After :定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
- Requles :依赖到的其它units ;强依赖,被依赖的units无法激活时,当前unit即无法激活;
- Wants :依赖到的其它units ;弱依赖;
- Conflicts :定义units间的冲突关系;
其余的自行百度
示例
显示所有单元状态
systemctl 或 systemctl list-units
只显示服务单元的状态
systemctl --type=service
显示sshd服务单元
systemctl status sshd.service
验证sshd服务当前是否活动
systemctl is-active sshd
启动,停止和重启sshd服务
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
重新加载配置
systemctl reload sshd.service
列出活动状态的所有服务单元
systemctl list-units --type=service
列出所有服务单元
systemctl list-units --type=service --all
查看服务单元的启用和禁用状态
systemctl list-unit-files --type=service
列出失败的服务
systemctl --failed --type=service
列出依赖的单元
systemctl list-dependencies sshd
验证sshd服务是否开机启动
systemctl is-enabled sshd
禁用network,使之不能自动启动,但手动可以
systemctl disable network
启用network
systemctl enable network
禁用network,使之不能手动或自动启动
systemctl mask network
启用network
systemctl unmask network
启动排错
- 文件系统损坏
先尝试自动修复,失败则进入emergency shell,提示用户修复 - 在/etc/fstab不存在对应的设备和UUID
等一段时间,如不可用,进入emergency shell - 在/etc/fstab不存在对应挂载点
systemd 尝试创建挂载点,否则提示进入emergency shell. - 在/etc/fstab不正确的挂载选项
提示进入emergency shell
破解CentOS7的root口令
方法一
- 启动时任意键暂停启动
- 按e键进入编辑模式
- 将光标移动linux16开始的行,添加内核参数rd.break
- 按ctrl-x启动
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
方法二
- 启动时任意键暂停启动
- 按e键进入编辑模式
- 将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
- 按ctrl-x启动
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
修复GRUB2
- GRUB“the Grand Unified Bootloader”
引导提示时可以使用命令行界面
可从文件系统引导 - 主要配置文件 /boot/grub2/grub.cfg
- 修复配置文件
grub2-mkconfig > /boot/grub2/grub.cfg - 修复grub
grub2-install /dev/sda BIOS环境
grub2-install UEFI环境 - 调整默认启动内核
vim /etc/default/grub
GRUB_DEFAULT=0