systemd服务管理与系统启动流程

服务管理

init与systemd比较

  • RHEL7 之前 init管理 sysvinit作为系统的守护进程 pid为1 初始化系统 将开机需要启动的服务、运行的任务、运行级别、挂载的文件系统等等,写init脚本

  • 串行启动

  • RHEL7 systemd 作为系统的守护进程 取代并兼容init

    按照各个单元管理服务,目标(target)替代了init运行级别的概念

    • 并行启动
    • 按需激活

systemctl服务单元

  • 服务单元、

image-20220418221047470

systemctl list-units --type=/ --all

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

image-20220418221653381image-20220418222018565

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

image-20220419151006098

系统启动流程

  • 第一阶段:BIOS启动引动阶段 控制权BIOS
  1. BIOS开机自检,初始化硬件,查找启动介质(引导记录)
  2. 找到引导记录,运行并启动引导程序

引导程序:时磁盘上一段固定的代码程序

MBR分区表:主引导记录在磁盘的第一个扇区 446字节(引导程序)+64字节分区表+2字节

GPT分区:引导程序在1024字节,第二个扇区里

  • 第二阶段:GRUB2启动引导 控制权grub2
  1. 引导程序加载配置文件 /boot/grub2/grub.cfg 显示启动菜单

  2. 配置文件告知/boot所在的分区:hd0,msdos1 hd0msdos2

    /boot单独分区则是/boot所在的分区,没有单独分区就是/根目录分区

  3. 装在所选的kernel和initrd文件到内存中

    配置文件告知内核文件所在路径/boot/vmlinuz-*,将真正的根设备/dev/mapper/rhel-root以只读的方式加载根, 配置文件告知ramdisk文件所在路径/boot/initramfs-*

  • 第三阶段:内核阶段
  1. 运行内核启动参数
  2. 解压initrd文件并挂载initd文件系统,装在必须的驱动 initramfs
  3. 挂载根文件系统 到/sysroot下
  • 第四阶段:systemd /sys V init初始化

    执行systemd将系统运行在队形的运行目标上

initramfs 第三方系统

image-20220419161222877

img

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

image-20220420110026683

引导程序丢失

  • 模拟引导程序丢失,损坏

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设置硬盘启动
posted @ 2023-05-09 16:36  loser_xu  阅读(676)  评论(0)    收藏  举报