概述:systemd即为system daemon,是linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布,开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替常用的System V与BSD风格init程序。Debian8、CentOS7及以上版本默认使用SystemD。
扩展知识:查询系统版本
uname -a //系统版本所有信息
uname -r //Linux内核版本
hostnamectl status //包含系统名称、套件版本、内核版本、硬件平台版本
cat /etc/debianversion //查询Debian套件版本
cat /etc/centos-release //查询CentOS套件版本
一、sysVinit初始化方式(旧版默认启动管理程序)
1、基于运行级别(Runlevel)
运行级别是操作系统当前正在运行的功能级别,用来设置不同环境下所运行的程序和服务。
sysVinit使用运行级别和对应的链接文件启动和关闭系统服务。
/etc/inittab文件
init进程根据它的配置初始化系统,设置系统运行级别及进入各运行级别对应的要执行的命令。
管理员可以通过定制/etc/inittab配置文件来建立所需的系统运行环境。
2、优点
sysVinit初始化方式原理简单,易于理解。
可以依靠Shell脚本控制服务启动,服务脚本编写比较容易。
3、不足
sysVinit启动是线性、顺序的,启动过程比较慢。
二、systemd初始化方式
并行启动服务的机制
systemd系统初始化使用systemd取代init,作为系统第一个进程。
systemd不通过init脚本来启动服务,而是采用一种并行启动服务的机制。
特点
systemd使用单元文件替换之前的初始化脚本。
systemd使用启动目标(Target)替代运行级别。
并行启动最大的难点是要解决服务之间的依赖性,systemd使用类似缓冲池的办法加以解决。
提高了并行启动能力,极大地缩短了系统启动时间。
systemd与sysVinit兼容,支持并行化任务,按需启动守护进程。
三、systemd的概念和运行机制
1、systemd的主要概念和术语
核心概念:单元(unit)
2、依赖关系
在单元文件中使用关键字来描述单元之间的依赖关系。
systemd事务
systemd能保证事务完整性,旨在保证多个依赖的单元之间没有循环引用。
systemd将单元之间的依赖关系分为两种:required(强依赖)和wants(弱依赖)。
3、启动目标(Target)和运行级别(Runlevel)
4、systemd单元文件
(1)单元文件格式
#/usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshdconfig(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
(2)编辑单元文件
以emacs.service为例示范创建单元文件的步骤
第1步,在/etc/systemd/system/目录创建单元文件。
touch /etc/systemd/system/emacs.service
第2步,修改该文件权限,确保只能被root用户编辑。
chmod 664 /etc/systemd/system/emacs.service
第3步,在该文件中添加配置信息。
[Unit]
Description=Emacs:theextensible,self-documentingtexteditor
[Service]
Type=forking
ExecStart=/usr/bin/emacs--daemon
ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)"
Environment=SSHAUTHSOCK=%t/keyring/ssh
Restart=always
[Install]
WantedBy=default.target
第4步,通知systemd该服务已添加,并开启该服务。
systemctl daemon-reload //重新装载单元配置文件
systemctl start emacs.service //启动emacs单元
5、单元文件与启动目标
(1)systemd的方案:单元文件对应启动目标
systemd使用启动目标的概念来代替运行级别。
将基本的单元文件存放在/usr/lib/systemd/system/目录下,不同的启动目标要装载的服务等单元的配置文件则以软链接方式映射到/etc/systemd/system/目录下对应的启动目标子目录下,如multi-user.target装载的单元的配置文件链接到/etc/systemd/system/multi-user.target.wants/目录下。
在/etc/systemd/system目录下有多个.wants子目录,放在该子目录下的单元文件等同于在[Unit]节中的Wants字段,即该单元启动时还需启动这些单元。
(2)理解target单元文件
启动目标使用target单元文件描述,target单位文件扩展名是.target,target单元文件的唯一目的是将其他systemd单元文件通过一连串的依赖关系组织在一起。
以graphical.target单元文件为例进行分析。graphical.target单元用于启动一个图形会话,systemd会启动像GNOME显示管理(gdm.service)、账户服务(accounts-daemon)这样的服务,并且会激活multi-user.target单元。而multi-user.target单元又会启动必不可少的NetworkManager.service、dbus.service服务,并激活basic.target单元,从而最终完成带有图形界面的系统启动。
(3)systemd也存在一些不兼容的问题
- 有限支持运行级别
- 不支持脚本个性化参数
- 无法判断从命令行启动的特定服务的状态是启动还是运行的
- 不继承任何上下文环境,每个服务得到的是纯净的上下文环境
四、systemd基本管理操作
1、systemctl命令
注意:所有命令、子命令及可选参数支持tab键查询和补全(CentOS7及以上版本、Debian8及以上版本)。
systemd最重要的命令行工具是systemctl 。
systemctl主要负责控制systemd系统和服务管理器,基本语法:
systemctl [选项…] 命令 [单元文件名…]
不带任何选项和参数运行systemctl命令将列出系统已启动(装载)的所有单元。
执行不带参数的systemctl status命令将显示系统当前状态。
systemctl命令的部分选项提供有长格式和短格式,如--all和-a。
systemd还可以控制远程系统,管理远程系统主要是通过SSH协议。
单元管理
(1)单元的活动状态
高级表示形式
? active(活动的):表示正在运行
? inactive(不活动的):表示没有运行
? failed(失败的):表示运行不成功
低级表示形式
? running:表示一次或多次持续地运行,如vsftpd
? exited:表示成功完成一次性配置,仅运行一次就正常结束,目前已没有该进程运行
? waiting:表示正在运行中,不过还需再等待其他事件才能继续处理
? dead:表示没有运行
? failed:表示运行失败
? mounted:表示成功挂载(文件系统)
? plugged:表示已接入(设备)
(2)查看单元
systemctl list-units //列出所有已装载(Loaded)的单元
systemctl list-units --all //列出所有单元,包括没有找到配置文件的或者运行失败的。
systemctl list-units --failed //加上选项--failed列出所有运行失败的单元
systemctl list-units --all --state=not-found //加上选项--state列出特定状态的单元
systemctl list-units --type=device //加上选项--type列出特定类型的单元
systemctl show httpd.service //显示某单元的所有底层参数
(3)查看单元的状态
systemctl status 单元名称 //命令用于查看特定单元的状态。
(4)单元状态转换操作
start:启动单元使之运行。
stop:停止单元运行。
restart:重新启动单元使之运行。
reload:重载单元的配置文件而不重启单元。
try-restart:如果单元正在运行就重启单元。
reload-or-restart:如有可能重载单元的配置文件,不然,重启单元。
reload-or-try-restart:如有可能重载单元的配置文件,不然,若正在运行则重启单元。
kill:杀死单元,以结束单元的进程运行。
(5) 管理单元依赖关系
systemctl list-dependencies //列出指定单元的所有依赖。
(6)单元文件的状态
enabled:已建立启动连接,将随系统启动而启动,即开机时自动启动。
disabled:没建立启动连接,即开机时不会自动启动。
static:该单元文件没有[Install]部分(无法执行),只能作为其他单元文件的依赖。
masked:该单元文件被禁止建立启动连接,无论如何都不能启动。
(7)列出单元文件(可用单元)
systemctl list-unit-files //列出系统中所有已安装的单元文件
systemctl list-unit-files --state=disabled //列出开机时不会自动启动的可用单元
systemctl list-unit-files --type=service //加上选项--type或-t列出特定类型的可用单元
(8)查看单元文件状态
systemctl status //在显示特定单元的状态时会显示对应的单元文件的状态。
systemctl is-enabled //专门用于检查指定的单元文件是否允许开机自动启动。
(9)单元文件状态转换操作
enable 为单元文件建立启动连接,设置单元开机自动启动。
disable删除单元文件的启动连接,设置单元开机不自动启动。
mask将单元文件连接到/dev/null,禁止设置单元开机自动启动。
unmask允许设置单元开机自动启动。
(10)编辑单元文件
systemctl提供专门的命令edit来打开文本编辑器编辑指定的单元文件。
修改配置文件要让systemd重新装载配置文件。
systemctl daemon-reload //重新装载单元配置文件
systemctl restart 单元文件 //重新启动,使修改生效。
2、管理运行单元目标
(1)查看当前的启动目标
systemctl list-units --type=target
(2)切换到不同的目标
systemctl isolate 目标名.target
(3)管理默认启动单元目标
systemctl set-default //命令可以将某个目标设置成默认目标。
systemctl get-default //命令列出当前的默认目标。
(4)进入系统救援模式和紧急模式
systemctl rescue //进入系统救援模式(单用户模式)
systemctl emergency //进入系统紧急模式
3、系统电源管理(开关机)
五、使用systemd管理Linux服务
1、Linux服务状态管理
2、配置服务启动状态(服务开机自动启动)
3、创建自定义服务
服务单元文件的重点是[Service]节,常用的字段(指令)
Type:配置单元进程启动时的类型,影响执行和关联选项的功能。
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
ExecReload:指定单元重新装载是执行的命令或者脚本。
Restart:如果设置为always,服务重启时进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置为true,服务会被认为是在活动状态。
(附)扩展知识:
一、Linux系统启动过程分析
1、BIOS或UEFI初始化
- BIOS完成加电自检(POST)之后,按照CMOS设置搜索处于活动状态并且可以引导的设备。
- UEFI系统的启动遵循UEFI平台初始化标准。此阶段,UEFI从加电开始依次执行SEC(安全验证)、PEI(EFI前期初始化)、DXE(驱动执行环境)和BDS(引导设备选择)。
2、启动引导装载程序(Boot Loader) - 由引导装载程序引导操作系统。
-
CentOS 7使用GRUB2作为默认引导装载程序。
3、装载内核
(1)监测可识别的所有硬件设备。
(2)装载硬件驱动程序(可能借助于基于内存的虚拟文件系统rootfs)。
(3)以只读方式挂载根文件系统。
(4)运行用户空间的第一个应用程序。
4、系统初始化
(1)systemd执行initrd.target所有单元,包括挂载/etc/fstab。
(2)从initramfs根文件系统切换到磁盘根目录。也就是卸载initramfs的小型文件系统,实际挂载系统的根目录。
(3)systemd执行默认启动目标单元,单元文件为/etc/systemd/default.target。
(4)systemd执行sysinit.target初始化系统及basic.target以准备操作系统。
(5)systemd启动multi-user.target单元所定义的本机与服务器服务。
(6)systemd执行multi-user.target单元所定义的/etc/rc.d/rc.local。
(7)systemd执行multi-user.target单元指定的getty.target(提供tty界面)及登录服务。
(8)systemd执行graphical所需的服务。
二、检测和分析systemd启动过程
systemd-analyze用来检测和分析启动导过程
systemd-analyze time命令查看启动耗时,即内核空间和用户空间启动时所花的时间。
systemd-analyze blame命令查看正在运行的每个单元的启动耗时,并按照时长排序。
systemd-analyze verify命令检查所有系统单元是否有语法错误。
systemd-analyze critical-chain命令分析启动时的关键链,查看严重消耗时间的单元列表。注:本文部分理论文字内容参考百度百科、Debian官网应用文档。