基于socket激活(socket-based):在引导时,系统针对所有支持这类激活的系统服务创建监听socket,一旦服务启动就将这些socket传递给它们。这不仅允许systemd并行启动服务,还使得服务在重启的时候不会丢失任何在其服务不可用期间发送给它的消息(因为相关的socket仍然可以访问并且将所有的消息放入队列中)。该特性需要使用socket unit。
基于总线激活(bus-based):当第一次被客户端程序访问的时候,使用D-Bus用于IPC的系统服务可以按需启动。该特性需要使用D-Bus服务文件。
基于设备激活(device-based):当某种特定的硬件设备被插入或者可用时,支持基于设备激活的系统服务可以按需启动。该特性需要使用device unit。
基于路径激活(path-based):当一个文件或者目录改变其状态时,支持基于路径激活的系统服务可以按需启动。该特性需要使用path unit。
挂载和自动挂载点管理:Systemd监视和管理挂载和自动挂载点。该特性需要使用mount和automount unit。
进击的并行性(aggressive parallelization):由于具备基于socket激活的特性,只要所有监听的socket准备就绪,systemd就可以并行启动服务。结合系统服务的按需激活特性,并发激活有效地减少了系统启动的时间。
支持事务的(transactional)unit激活逻辑:在激活或者关闭(deactivate)一个unit之前,systemd会计算它的依赖关系,创建一个临时事务,验证事务的一致性。当一个事务出现不一致的情况时,systemd会在其报错之前尝试去校对它并从中移除一些不重要的工作。
向后兼容(backward compatibility)SysV init:支持遵循LSB标准的SysV init脚本。
兼容性变化Systemd在设计的时候尽可能做到与SysV和Upstart兼容,不过还是有一些点是不同的,需要留意:
Systemd对于运行级别的支持是有限的,并不是所有的运行级别都支持。其对于运行级别的支持是通过target unit来实现的,类似一种映射关系,例如graphical.target映射到runlevel5。systemd程序包在发行的时候包含了runlevel命令,不过用户因该尽量避免使用该命令。
systemctl程序不支持自定义子命令。在CentOS 6的SysV init脚本中,除了支持start、stop和restart这些基础子命令以外,脚本作者还可以撰写任何自己希望实现的功能实现额外的子命令。例如RHEL 6中的iptables脚本支持panic子命令,该子命令告诉系统进入panic模式,丢弃所有的流入和流出的数据包。而systemctl,仅支持文档中列出的子命令。
非由systemd所启动的服务,无法收到systemctl管理。当使用systemd启动服务的时候,systemd会记录并追踪服务的主进程PID,systemctl命令通过该PID来管理服务进程。若用户通过程序的CLI程序启动服务的话,那么systemd就无法获取并追踪该PID了。
Systemd只能停止运行中的服务。在以前,RHEL 6和以往的版本中,系统使用【/etc/rc0.d/】中的字符链接来关闭所有可用的服务而不关心它们的状态。在systemd中,只有运行中的服务会被关闭了。
系统服务无法从标准输入流中读取数据。当systemd启动一个服务的时候,会将/dev/null和服务的STDIN关联起来,使得用户无法与其交互。
系统服务不会从调用它们的用户和会话中继承任何上下文(context,例如HOME和PATH这类环境变量)。每个服务运行在一个干净的执行上下文中。
当加载一个SysV init脚本的时候,systemd从LSB头中读取依赖关系并在运行时解释。
Systemd的服务unit有一个代码写死的5分钟超时时长,用于处理那些运行出现故障的服务。这个时长可以在独立的服务类unit文件中修改。
管理服务在SysV init和Upstart中,使用【/etc/rc.d/init.d/】下的shell脚本(一般是bash)来管理服务,使用的命令是service和chkconfig。在Systemd中使用service类型的unit文件(.service文件)来管理,使用的命令统一为systemctl。
由于向后兼容的特性的存在,旧命令依然可用,但是官方并不建议。新旧命令的对应关系如下。
service命令和systemctl命令对照表,service命令用于管理一个服务的启动和停止。
service systemctl 描述service name start systemctl start name.service 启动一个服务
service name stop systemctl stop name.service 停止一个服务
service name restart systemctl restart name.service 重启一个服务
service name condrestart systemctl try-restart name.serivce 只有当服务处于运行状态时才重启服务
service name reload systemctl reload name.service 重载服务,一般用于配置文件的修改后执行
serivce name status
systemctl status name.service