写在前面:

    博客书写牢记5W1H法则:What,Why,When,Where,Who,How。


本篇主要内容:

● Systemd新特征

● Systemd核心概念:unit

   unit常见类型

   systemd关键特征

   管理target units

   unit文件格式

● systemd配置文件读取顺序

   开机流程

   开机自启脚本配置



Systemd新特征:

   系统引导时实现服务并行启动;

   按需激活进程;

   系统状态快照;

   基于依赖关系定义服务控制逻辑;


核心概念:unit

   unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听socket、保存的快照以及其他与init相关的信息;

   这些配置文件主要保存在:

      /usr/lib/systemd/system

      /run/systemd/system

      /etc/systemd/system


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, 用于定义文件系统中的一文件或目录;


关键特性:

   基于socket的激活机制:socket与程序分离;

   基于bus的激活机制

   基于device的激活机制

   基于Path的激活机制

   系统快照:保存各unit的当前状态信息于持久存储设备中;

   向后兼容sysv init脚本

      /etc/init.d/

   不兼容部分:

      systemctl的命令是固定不变的;不像service启动的服务脚本一样可以直接修改/etc/rc.d/rc.sysinit目录中脚本文件,自定义脚本命令。

      非由systemd启动的服务,systemctl无法与之通信;不支持自定义程序交给systemd管理。

管理系统服务:

   即借助.service类型的unit文件管理服务。

   systemctl

      Control the systemd system and service manager

      systemctl [OPTIONS...] COMMAND [NAME...]

      服务状态修改与状态查询:

         systemctl start|stop|restart|status|try-restart|reload-restart|reload-or-try-restart NAME.service

      服务当前激活状态:

         systemctl is-active NAME.service

      列出所有激活状态的服务:

         systemctl list-units --type service

      列出所有服务(已激活及未激活):

         systemctl list-units -t service all

      设置/取消/查看开机自启:

         systemctl enable|disable|is-enable NAME.service

         (无非就是在/etc/systemd/system/xx.target.wants/目录中建立或删除服务链接而已)

      禁止/不禁止设置为开机自启:

         systemctl mask|unmask NAME.service

      查看服务依赖关系:

         systemctl list-dependencies NAME.service


管理target units:

   运行级别对照:

      0 --> runlevel0.target, poweroff.target

      1 --> runlevel1.target, rescue.target

      2|3|4 --> runlevel2|3|4.target, multi-user.target

      5 --> runlevel5.target, graphical.target

      6 --> runlevel6.target, reboot.target

   切换运行级别

      systemctl isolate NAME.target

   查看运行级别:

      systemctl list-units --type target

   查看所有运行级别:

      systemctl list-units -t target -a

   获取/设置默认运行级别:

      systemctl get-default NAME.target

      systemctl set-default NAME.target

   切换至紧急救援模式:

      systemctl rescue

   切换至emergency模式:

      systemctl emergency

   其他常用命令 :

      systemctl halt|poweroff|reboot

      systemctl suspend 挂起

      systemctl hibernate 快照

      systemctl hubrid-sleep


unit文件格式:

   unit文件通常是由3部分组成的:

      [Unit]

         定义与Unit类型无关的通用选项,用于提供unit的描述信息、unit行为及依赖关系等;

      [Service]

         与特定类型相关的专用选项,此处为service类型。

      [Install]

         定义由"systemctl enable|disable"命令在实现服务启动或禁用时用到的一些选项。

   Unit段常用选项

      Description:描述信息; 意义性描述;

      After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;

      Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;

      Wants:依赖到的其它units;弱依赖;

      Conflicts:定义units间的冲突关系

   Service段的常用选项

      Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型;

         类型:

            simple:

            forking:

            oneshot:

            dbus:

            notify:

            idle:

      EnvironmentFile:环境配置文件;

      ExecStart:指明启动unit要运行命令或脚本; ExecStartPre, ExecStartPost

      ExecStop:指明停止unit要运行的命令或脚本;

      Restart:

   Install段的常用选项

      Alias:

      RequiredBy:被哪些units所依赖;

      WantedBy:被哪些units所依赖; 

   注意:对于新创建的unit文件或,修改了的unit文件,要通知systemd重载此配置文件:

      # systemctl  daemon-reload


systemd方式配置文件读取顺序:

   (1)systemd启动后首先读取/etc/systemd/system/default.target文件,取得默认启动级别

   (2)/etc/systemd/system/xx.target.wants/ 用户设定加载的unit

   /usr/lib/systemd/system/xx.target.wants/ 系统默认加载的unit

   (3)/usr/lib/systemd/system/xx.target根据文件内的定义,获取到启动xx.target需要依赖的其他服务。然后通过其他服务的对应文件,查找其他服务依赖的下一级服务,直到全部启动。(使用systemctl list-dependencies xx.target查看)


   systemd开机流程大概是这样:

      (通过观察systemctl list-dependencies xx.target总结得到)

      a. local-fs.target + swap.target:这两个target主要在挂载本机/etc/fstab里面所规范的文件系统与相关的内存置换空间。

      b. sysinit.target:这个target主要在侦测硬件,加载所需要的核心模块等动作。

      c. basic.target:加载主要的外围硬件驱动程序与防火墙相关任务。

      d. muli-user-target:底下的其它一般系统或网络服务加载。

      e. 图形界面相关服务。如gdm.service等 相关服务的加载。


   systemd下的自启动脚本配置:

      默认情况下使用systemd的centos7系统上的/etc/rc.d/rc.local文件是没有执行权限的,所以,如果需要使用兼容老版本的方式继续依靠rc.local文件开机启动某程序或脚本,需要先赋予rc.local文件x权限。

      systemd更建议用户在/etc/systemd/system/目录中创建启动脚本配置文件(unit文件),然后还用systemctl命令来管理开机启动。