这篇文章上次修改于 2179 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 随着debian默认启用systemd,主流发行版已经全面正式采用systemd来替换原来的sysv init了。Systemd的主要目的就是减少系统引导时间和计算开销。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。 Systemd引入了并行启动的概念(依赖于dbus),它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。处于不同控制组的进程之间可以通过内核来互相通信。systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。让我们看下Systemd的一些核心功能。 Systend的新特性: - 系统引导时实现服务的并行启动; - 按需激活进程; - 系统实现快照; - 基于依赖关系定义服务的控制逻辑; #核心概念:unit unit涵盖了相关的配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其它与init相关的信息;这些配置文件主要保存在: ``` /usr/lib/systemd/system /run/systemd/system /etc/systemd/system ``` systemd的unit配置文件包含很多种类型,我们以后缀名来区分出大体的类型。 unit的常见类型: ``` Service unit: 文件扩展名.service, 用于定义系统服务; Target unit: 文件扩展名.target, 用于模拟实现"运行级别"; Device unit: 文件扩展名.device, 用于定义内核识别的设备; Mount unit: 文件扩展名.mount, 用于定义文件系统的挂载点; Socket unit: 文件扩展名.socket, 用于标识进程间通信用到的socket文件; Snapshot unit: 文件扩展名.snapshot, 用于管理系统快照; Swap unit: 文件扩展名.swap, 用于标识swap设备; Automount unit: 文件扩展名.automount, 用于定义文件系统自动点设备; Path unit: 文件扩展名.path, 用于定义文件系统中的一文件或目录; ``` 对于Linux-3.10以后的内核来讲,即使用户没有挂载任何设备,也会看到以cgroup的设备挂载,这个叫做控制组,来实现内核中的资源分配的一种机制,以Docker,主要依赖的就是cgroup机制以及namespace机制用来实现。 以上就是unit特别常见的类型,那么为了了解systemd的工作方式,接下来我们就简单的描述一下其关键特性: 关键特性: - 基于socket激活机制: 意味着socket与程序是可以进行分离的; - 基于bus的激活机制; - 基于device的激活机制; - 基于path的激活机制; - 系统快照:保存各unit的当前状态信息于持久存储设备中; - 向后兼容SysV init脚本 /etc/init.d/ 当服务启动时,可事先将socket分予给该服务程序,但该服务程序可先暂时并未启动,接下来我们还可以基于总线(bus)进行激活等特性。 不过需要注意的是,systemd也有不兼容的此前较老版本的功能特性。 不兼容特性: - systemctl的命令是固定不变的; - 由非systemd启动的服务,systemctl无法与之通信,意味着systemd无法控制此服务; #systemctl命令 我们使用很多次systemctl命令来管理服务,对于RHEL 7/Ubuntu16.04 以上来说,只要是service以及其它类型的unit的文件,都是由systemd进行管控的,而且还能兼容/etc/init.d/目录下的各个服务脚本,而且对于命令的使用也很好掌握。 service等类型的unit文件; systemctl命令: ``` systemctl - Control the systemd system and service manager systemctl [OPTIONS...] COMMAND [NAME...] ``` 对于该命令来说,拥有着许多的子命令,与原来upstart和sysv init的对比 ``` 启动: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 条件式重启:service NAME condrestart ==> systemctl try-restart NAME.service 重载或重启服务:systemctl reload-or-restart NAME.service 重载或条件式重启服务:systemctl reload-try-restart NAME.service 查看某服务当前激活与否的状态:systemctl is-active NAME.service 查看所有已激活的服务:systemctl list-units --type service 查看所有服务(已激活及未激活): chkconfig --list ==> systemctl list-units -t service --all 查看某服务是否能开机自启:chkconfig --list NAME ==> systemctl is-enable NAME.service 禁止某服务设定为开机自启:systemctl mask NAME.service 取消此禁止:systemctl umask NAME.service 查看服务的依赖关系:systemctl list-dependencies NAME.service ``` 前面写到unit的常见类型,其中target类型就是用于实现其系统启动的运行级别,一共有七个运行级别,从0开始,到6结束,我们介绍一下这七个运行级别。 ``` 0:关机; 1:单用户模式,无网络连接,不运行守护进程,不允许非超级用户登录; 2:多用户模式,无网络连接,不运行守护进程; 3:多用户模式,正常启动系统; 4:用户自定义; 5:多用户模式,图形界面; 6:重启; ``` 对应target如下 ``` 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 ``` 对应原来的init 切换方式如下: ``` 切换切换:init N ==> systemctl isolate NAME.target 查看级别:runlevel ==> systemctl list-units --type target 查看所有级别:systemctl list-units -t target -a 获取默认运行级别:systemctl get-default 修改默认运行级别:systemctl get-default NAME.target 切换至紧急救援模式:systemctl rescre 切换至emergency模式:systemctl emergency ``` 以上就是管理常见的target类型的命令,我们还有一些其它常用命令来进行总结。 其它常用命令: ``` 关机:systemctl halt, systemctl poweroff 重启:systemctl reboot 挂起:systemctl suspend 快照:systemctl hibernate 快照并挂起:systemctl hybrid-sleep ``` #systemd unit file 在介绍完systemd以及讲解了systemctl命令之后,我们来了解unit file,以及如何写出unit file。 而unit文件是由描述各其行为及配置指令组成的,其配置文件属于.ini风格,通过各种指令来管理以上的功能。 unit file共有三部分组成, 比如service unit file 一般组成如下 ``` [Unit]: 定义与Unit类型无关的通用选项;用于提供unit的描述信息,unit行为及依赖关系等; [Service]:与特定类型相关的专用选项;此处为Service类型; [Install]:定义由"systemctl enable"及"systemctl disable"命令在实现服务启用或禁用时用到的一些选项; ``` 以上就是unit配置文件的结构,接下来我们说一下这三部分的常用选项。 Unit段的常用选项: ``` Description:描述信息,意义性描述; After:定义unit的启动次序;表示当前unit应晚于哪些unit启动;其功能与Before相反; Requies:依赖到其它的units;强依赖,被依赖的units无法激活时,当前的unit即无法激活; Wants:依赖到其它的units;弱依赖; Confilcts:定义units 的冲突关系; ``` Service段的常用选项: ``` Type:用于定义影响ExecStart及相关参数的功能的unit进程类型; 类型: simple: forking: oneshot: dbus: notify: idle: EnvironmentFile:环境配置文件; ExecStart:指明启动unit要运行的命令或脚本;ExecStart, ExecStartPost ExecStop:指明停止unit要运行的命令或脚本; Restart: ``` Install段的常用配置: Alias: RequiredBy:被哪些unit所依赖; WantBy:被哪些unit所依赖; ** 另外,对于新创建的unit文件以及修改过的unit文件,我们需要使用systemctl来重载其配置文件才能生效!。** ``` # systemctl daemon-reload ``` 相关链接 - [arch 的 systemd 说明页面](https://wiki.archlinux.org/index.php/Systemd "arch 的 systemd 说明页面") - [systemd 的手册页](https://www.freedesktop.org/software/systemd/man/ "systemd 的手册页") - [systemd.unit 中文手册 - 金步国](http://www.jinbuguo.com/systemd/systemd.unit.html "systemd.unit 中文手册 - 金步国") - [systemd Optimizations优化](https://freedesktop.org/wiki/Software/systemd/Optimizations/ "systemd Optimizations优化") - [DBus入门介绍](https://www.jianshu.com/p/c073daaf427f "DBus简介") - [systemd/Timers](https://wiki.archlinux.org/index.php/Systemd/Timers "systemd/Timers") - [systemd攻略](https://www.jianshu.com/p/8b3fba13fcad "systemd攻略") - https://www.linuxidc.com/Linux/2018-11/155443.htm
没有评论