systemd服务管理与系统启动流程
服务管理
init与systemd比较
-
RHEL7 之前 init管理 sysvinit作为系统的守护进程 pid为1 初始化系统 将开机需要启动的服务、运行的任务、运行级别、挂载的文件系统等等,写init脚本
-
串行启动
-
RHEL7 systemd 作为系统的守护进程 取代并兼容init
按照各个单元管理服务,目标(target)替代了init运行级别的概念
- 并行启动
- 按需激活
systemctl服务单元
- 服务单元、

systemctl list-units --type=/ --all
systemctl list-unit-files [--type/all]


systemctl管理服务
#启动和重启服务
systemctl start|stop|restart NAME.service
#设置服务开机是否启动
systemctl enable|disable NAME.service
#查看服务当前状态
systemctl status NAME.service
#查看服务启动状态
systemctl is-active NAME.service
systemctl is-enabled NAME.service
#服务依赖关系
systemctl list-dependencies NAME.service
- 重新加载服务
systemctl reload NAME.service 重新加载配置文件而不重启服务
- 屏蔽服务设置服务开机自启
systemctl mask|unmask NAME.service 屏蔽/取消屏蔽服务
服务的配置目录
/etc/systemd/system/ 自定义的服务, 系统启动时会读到的服务的配置
/usr/lib/systemd/system/*.service .target 安装软件包之后会生服务的配置文件
/etc/systemd/system/default.target 决定了系统的启动级别
/etc/systemd/system/graphical.target.wants 启动到graphical.target级别时所需要启动的服务
/etc/systemd/system/multiuser.target.wants启动到multiuser.target级别时所需要启动的服务
target目标(运行级别)
systemd目标(运行级别),决定了系统的状态
| target类型 | 功能 |
|---|---|
| graphical.target | 支持多用户、图形化和字符界面 |
| multi-user.target | 支持多用户、字符界面的登录 |
| rescue.target | 需要root账户登录 |
| emergency.target | 只读挂载根文件系统,需要root用户登录 |
| 运行级别 | 描述 |
|---|---|
| runlevel0 | 停机 |
| runlevel1 | 单用户,root账户,禁止远程登陆,修复模式 |
| runlevel2 | 多用户,没有NFS网络 |
| runlevel3 | 完全多用户状态,有NFS |
| runlevel4 | 系统未使用,保留 |
| runlevel5 | GUI |
| runlevel6 | 系统正常关机并重启,默认级别不能为6,否则不能正常重启 |
#查看系统当前运行级别
systemctl get-default
#切换运行级别
systemctl isolate NAME.target
#设置默认运行级别
systemctl set-default NAME.target

系统启动流程
- 第一阶段:BIOS启动引动阶段 控制权BIOS
- BIOS开机自检,初始化硬件,查找启动介质(引导记录)
- 找到引导记录,运行并启动引导程序
引导程序:时磁盘上一段固定的代码程序
MBR分区表:主引导记录在磁盘的第一个扇区 446字节(引导程序)+64字节分区表+2字节
GPT分区:引导程序在1024字节,第二个扇区里
- 第二阶段:GRUB2启动引导 控制权grub2
-
引导程序加载配置文件 /boot/grub2/grub.cfg 显示启动菜单
-
配置文件告知/boot所在的分区:hd0,msdos1 hd0msdos2
/boot单独分区则是/boot所在的分区,没有单独分区就是/根目录分区
-
装在所选的kernel和initrd文件到内存中
配置文件告知内核文件所在路径/boot/vmlinuz-*,将真正的根设备/dev/mapper/rhel-root以只读的方式加载根, 配置文件告知ramdisk文件所在路径/boot/initramfs-*
- 第三阶段:内核阶段
- 运行内核启动参数
- 解压initrd文件并挂载initd文件系统,装在必须的驱动 initramfs
- 挂载根文件系统 到/sysroot下
-
第四阶段:systemd /sys V init初始化
执行systemd将系统运行在队形的运行目标上
initramfs 第三方系统


grub2.cfg丢失的修复
根据系统启动流程,grub2.cfg删除、丢失、损坏。系统会无法知道/boot目录,内核以及initrd,因此,修复就是告知系统内核、boot目录、根目录在哪以及initrd启动
#指定boot目录所在分区
set root='hd0,msdos1'
#加载内核文件,并以只读方式加载根分区
linux /vmlinuz-4* ro root=/dev/sdb {/dev/mapper/rhel-root}
#z指定initramfs文件
initrd /initramfs-4*
#启动
boot
#重新生成grub.cfg文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#系统不同,设置方法会不同
内核启动信息
- 查看默认启动内核
grubby --default-kernel
- 查看内核启动信息
grubby --info=ALL 查看所有内核启动选项信息
启动信息配置在/boot/loader/entries/目录下
-
修改默认启动内核
- 根据索引号设置
查看
grub2-set-default 1
- 绑定版本内核
grubby --set-default /boot/vmlinuz-4-*
-
修改内核启动参数
- 修改配置文件更改参数 /etc/default/grub,修改配置文件需要重新生成grub.cfg 文件
- 命令行修改参数
grubby --args=
删除参数 --remove-args=
重置root密码
在RHEL8中,可以使initramfs运行的脚本在某点暂停,并提供shell。即在initrd的伪根中进行一些操作。在启动内核时中断暂停,以达到重置密码
- 重启系统,在选择内核启动界面按e
- 将光标移至linux行尾,添加rd.break
- 按ctrl+x继续启动,进入shell
- 重新以读写挂载sysroot: mount -o remount,rw /sysroot
- 切换到真正操作系统的根:chroot /sysroot
- 重置密码:echo *** |passwd --stdin root
- 重新打标签: touch /.aurorelabel
- 重启或者exit两次
防止重置密码——加密grub
grub2-setpassword
文件系统错误
文件系统错误会进入紧急模式:修复文件系统错误解决
- 文件系统不存在
- 挂载点不存在
- 文件系统类型错误
/ 挂载出错 需要重新挂载根目录,然后修改/etc/fstab文件
分区/文件系统 挂载点 文件系统类型 挂载选项 系统自动挂载条目
/dev/sda / xfs defaults 0 0

引导程序丢失
- 模拟引导程序丢失,损坏
dd if=/dev/zero of=boot所在磁盘分区 bs=446 count=1
-
进入救援模式
- 服务器:使用远程管理卡,BMC ilo idrc 或者U盘刻录系统iso启动
- 虚拟机:
![image-20220420110853405]()
选择进入救援模式,选择修复模式,输入1
-
切换到根目录 chroot
-
重新生成引导程序
grub2-install boot所在磁盘分区 -
退出重启
硬盘的MBR分区表信息丢失
没有备份无法修复
- 备份boot分区所在磁盘的第一个扇区
dd if=boot所在分区 of=mbr.bak count=1 bs=512
将备份文件拷贝到其他主机上
- 模拟丢失
dd if=/dev/zero of=boot所在分区 bs=512 count=1
-
进入救援模式,将备份文件拷贝回来
-
恢复MBR分区表
dd if=mbr.bak of=boot所在磁盘 bs=512 count=1
- 退出重启
boot分区误删
重新安装系统对应的内核
- 进入BIOS,设置光驱启动为第一个
- 进入救援模式
- 配置光盘yum仓库
- 重新安装内核
yum reinstall kernel-* -y - 重新生成grub配置文件
grub2-install boot所在分区
grub2-mkconfig -o /boot/grub2/grub.cfg
- 进入BIOS设置硬盘启动


浙公网安备 33010602011771号