55、systemd

时间:2023-01-05 15:03:21
systemd特性

从 CentOS 7 版本之后开始用 systemd 实现init进程,系统启动和服务器守护进程管理器, 负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。

1、系统引导服务是并行启动
2、按需启动守护进程
3、自动化处理依赖关系
4、同时采用socket式与D-Bus总线式激活服务
5、socket与服务程序分离
6、向后兼容sysv init脚本
7、使用systemctl进行管理socket、服务等,systemctl命令固定不变,不可扩展,非由systemd启动的服务,systemctl无法与之通信和控制
8、系统状态快照

systemd核心概念:unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息

unit类型

service unit: 文件扩展名为.service, 用于定义系统服务
Socket unit: .socket, 定义进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
Target unit: 文件扩展名为.target,用于模拟实现运行级别
Device unit: .device, 用于定义内核识别的设备
Mount unit: .mount, 定义文件系统挂载点
Snapshot unit: .snapshot, 管理系统快照
Swap unit: .swap, 用于标识swap设备
Automount unit: .automount,文件系统的自动挂载点
Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录

配置文件
/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/lib/systemd/system: ubutun的对应目录
/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rcN.d/Sxx的功能,比上面目录优先运行

55、systemd

systemctl 管理系统服务命令

#启动:相当于service name start   systemctl start name.service
#停止:相当于service name stop systemctl stop name.service
#重启:相当于service name restart systemctl restart name.service
#查看状态:相当于service name status systemctl status name.service
#禁止自动和手动启动: systemctl mask name.service
#取消禁止 systemctl unmask name.service
#查看某服务当前激活与否的状态: systemctl is-active name.service
#查看所有已经激活的服务: systemctl list-units --type|-t service
#查看所有服务: systemctl list-units --type service --all|-a
#设定某服务开机自启,相当于chkconfig name on systemctl enable name.service服务状态
#设定某服务开机禁止启动:相当于chkconfig name off systemctl disable name.service
#查看所有服务的开机自启状态,相当于chkconfig --list systemctl list-unit-files --type service
#用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name ls /etc/systemd/system/*.wants/name.service
#查看服务是否开机自启: systemctl is-enabled name.service
#列出失败的服务 systemctl --failed --type=service
#开机并立即启动或停止 systemctl enable --now postfix systemctl disable --now postfix
#查看服务的依赖关系:systemctl list-dependencies name.service
#杀掉进程: systemctl kill unitname

55、systemd

55、systemd

55、systemd

55、systemd

55、systemd

服务状态

systemctl list-unit-files --type service --all

loaded Unit配置文件已处理
active(running) 一次或多次持续处理的运行
active(exited) 成功完成一次性的配置
active(waiting) 运行中,等待一个事件
inactive 不运行
enabled 开机启动
disabled 开机不启动
static 开机不启动,但可被另一个启用的服务激活
indirect 重定向到别处

55、systemd

#显示所有单元状态
systemctl 或 systemctl list-units
#只显示服务单元的状态
systemctl --type=service
#显示sshd服务单元
systemctl –l 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 list-dependencies sshd
验证sshd服务是否开机启动
systemctl is-enabled sshd
禁用network,使之不能自动启动,但手动可以
systemctl disable network
#启用network
systemctl enable network
#禁用network,使之不能手动或自动启动
systemctl mask network
#启用network
systemctl unmask network

55、systemd

unit的文件格式

/etc/systemd/system:系统管理员和用户使用

/usr/lib/systemd/system:发行版打包者使用

unit 格式说明:
以 “#” 开头的行后面的内容会被认为是注释
相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

service unit file文件通常由三部分组成:
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
[Service]:与特定类型相关的专用选项;此处为Service类型
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项

Unit段的常用选项:
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其它units,弱依赖
Conflicts:定义units间的冲突关系

55、systemd

Service段的常用选项:
Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行命令或脚本的绝对路径
ExecStartPre: ExecStart前运行
ExecStartPost: ExecStart后运行
ExecStop:指明停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
Install段的常用选项:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务

注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
systemctl daemon-reload

示例

[Unit]
Description=The Nginx HTTP Server daemon # 描述信息
After=network.target remote-fs.target nss-lookup.target # 指定启动nginx之前需要其他的其他服务,如network.target等
[Service]
# Type为服务类型,仅启动一个主进程的服务为simple,需要启动若干子进程的服务为forking
Type=forking
# 设置执行systemctl start nginx后需要启动的具体命令
ExecStart=/usr/local/nginx/sbin/nginx
# 设置执行systemctl reload nginx后需要执行的具体命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
# 设置执行systemctl stop nginx后需要执行的具体命令
ExecStop=/bin/kill -s QUIT ${MAINPID}
[Install]
# 设置在什么模式下被安装,设置开机启动的时候需要
WantedBy=multi-user.target
运行级别

target units:相当于centos 6的runlevel

ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target --all

55、systemd

级别切换

systemctl isloate name.target

55、systemd

进入默认target

systemctl

55、systemd

修改默认级别

systemctl set-default name.target  相当于更改/etc/inittab
切换至紧急救援模式:
切换至emergency模式:
说明:rescue.target 比emergency 支持更多的功能,例如日志等
传统命令init,poweroff,halt,reboot都成为 systemctl的软链接

禁用ctrl+alt+del重启

systemctl mask ctrl-alt-del.target

55、systemd

55、systemd

Centos7版本引导
1、uefi或bios初始化,运行post开机自检
2、选择启动设备
3、引导装载程序,grub2 /etc/grub.d/ /etc/default/grub /boot/grub2/grub/cfg
4、加载initrafams驱动模块
5、加载内核选项
6、内核初始化,centos7使用systemd代替init
7、执行initrd.target所有单元,包括挂载/etc/fstab
8、从initramfs根文件系统切换到磁盘根目录
9、systemd执行target配置,配置文件/etc/systemd/system/default.target
10、systemd执行sysinit.target初始化系统及basic.target准备操作系统
11、systemd启动multi-user.target下的本机与服务器服务
12、systemd执行multi-user.target下的/etc/rc.d/rc.local
13、Systemd执行multi-user.target下的getty.target及登录服务
14、systemd执行graphical需要的服务

55、systemd

设置内核参数

设置内核参数,只影响当次启动

启动时,到启动菜单,按e键,找到在linux 开头的行后添加systemd.unit=desired.target

比如:systemd.unit=emergency.target 或 systemd.unit=rescue.target

55、systemd

55、systemd

破解root密码

方法一
启动时任意键暂停启动
按e键进入编辑模式将光标移动linux 开始的行,添加内核参数rd.break
按ctrl-x启动
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel
exit
reboot

方法二
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux 开始的行,将ro改为rw init=/bin/sh
按ctrl-x启动
passwd root
#如果SELinux是启用的,才需要执行下面操作,如查没有启动,不需要执行
touch /.autorelabel 或者编辑/etc/selinux/config 改为
重启 exec /sbin/init

55、systemd

55、systemd

grub2修复

grub 主配置文件:/boot/grub2/grub.cfg  修复配置文件 :grub2-mkconfig > /boot/grub2/grub.cfg

修复grub    grub2-install /dev/sda bios环境    grub2-install  uefi环境

修改默认启动内核

查看默认启动内核
cat /boot/grub2/grubenv 或者grub2-editenv list
修改默认启动内核
grub2-set-default 'CentOS Linux (6.1.0) 7 (Core)'
#或者
vim /etc/default/grub
GRUB_DEFAULT=1

55、systemd

55、systemd

55、systemd

55、systemd

grub故障排错

破坏MBR后进行恢复

dd if=/dev/zero of=/dev/sda bs=1 count=446
光盘进入救援模式
chroot /mnt/sysimage
grub2-install /dev/sda
或者
grub2-install --root-directory=/mnt/sysimage /dev/sda 前提需要安装grub2,不然会进行报错

55、systemd

删除/boot/grub2/*下所有内容进行恢复

光盘进入救援模式
chroot /mnt/sysimage
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg

CentOS 7 ,8 删除/boot/下所有文件后进行恢复

55、systemd

1 光盘救援模式下安装grub2
特别说明:Centos8 必须先grub,再安装kernel,否则安装kernel-core时会提示grub出错
chroot /mnt/sysimage
mount /dev/sr0 /mnt
grub2-install /dev/sda
2安装Kernel
#CentOS 7rpm –ivh /mnt/Packages/kernel-3.10.0-1062.el7.x86_64.rpm --force
#CentOS 8
rpm -ivh /mnt/BaseOS/Packages/kernel-core-4.18.0-147.el8.x86_64.rpm --force
3修复grub配置文件 (最后修复cfg文件,否则grub报错)
生成grub2.cfg文件
grub2-mkconfig –o /boot/grub2/grub.cfg
退出重启
exit
reboot