# systemd的配置及管理 ## systemd配置文件夹路径 systemd配置文件存在于以下三个文件中: - `/etc/system/system` : 存放系统启动的默认级别及启动的unit的软连接,优先级最高 - `/run/systemd/system` : 系统执行过程中产生的服务脚本,优先级次之。 - `/usr/lib/systemd/system` : 存放系统上所有的启动文件。优先级最低 ### unit分类及配置 > unit的定义文件可以根据其后缀名称识别其定义的类型,可以使用systemctl -t help 查看 ``` #l .servicre定义了系统服务的启动 #l .target 定义了系统启动的级别标签,systemd 没有运行级别的概念,创建标签只是为了兼容老版本。 #l .socket 定义了进程通信用到的套接字,套接字与进程是分离的 #l .device 定义了系统启动时内核识别的文件,systemd提供了设备的管理功能,/dev 下的设备由/etc/udev/下的配置文件与.device共同定制 #l .mount 定义了系统的文件系统的挂载点 #l .snapshop 系统快照 #l .swap 用于标识swap设备 #l .automount 文件系统的自动挂载点 #l .path用于定义文件系统中的一个文件或目录使用。常用于文件系统发生变化时,延迟激活服务。 ``` > 文件通常由3段组成 ``` [Unit] [unit的类型:service target socket] [install] ``` > [unit] : 不属于第二个标签的定义都放在这里,或存放不属于unit类型的定义,描述信息,依赖的unit ``` # Description:描述信息,此文本显示在systemctl status命令的输出中 # After:表明需要依赖的服务,作用决定启动顺序(定义单元启动的顺序。只有在after中指定的单元激活后,该单元才会启动。与require不同,After不会显式激活指定单位。Before选项具有与After相反的功能。) # Before:表明被依赖的服务(其他服务需要这个服务启动) # Requires:依赖到的其他unit ,强依赖,即依赖的unit启动失败。该unit不启动。 # Wants:依赖到的其他unit,弱依赖,即依赖的unit 启动失败。该unit继续启动 # Conflicts:定义冲突关系,配置负依赖关系,与require相反。 ``` > [unit 类型] ``` [Service]: # Type:启动时关系的定义, simple:exec启动的进程就是主进程。 => 官方解析:默认值。由ExecStart启动的进程是该服务的主进程 forking :exec 启动的进程生成的其中一个子进程成为主进程,启动完成后,旧的主进程会退出。 => 官方解析:由ExecStart启动的进程生成一个子进程,该子进程成为服务的主进程。父进程在启动完成后退出。 ontshot:启动下一个进程前主进程退出。 => 官方解析:这种类型类似于simple,但是进程会在启动后续单元之前退出 dbus: => 官方解析:这种类型类似于simple,但是后续单元只有在主进程获得D-Bus名称后才会启动 notify: => 官方解析:这种类型类似于simple,但是后续单元只有在通过sd_notify()函数发送通知消息后才会启动 ldle: => 官方解析:与simple类似,服务二进制文件的实际执行被延迟到所有作业完成,这避免了状态输出与服务的shell输出混合。 # PIDFile=/var/run/sshd.pid # EnvironmentFile 需要使用到的变量的定义文件 # ExecStart= 启动 unit需要执行的命令 # ExecStartpre:启动前操作 # ExecStartpost:启动后操作 # ExecStop=停止unit需要执行的命令 # Restart: # ExecReload=/bin/kill -HUP $MAINPID # KillMode=process # Restart=on-failure # RestartSec=42s ``` > [install] : 服务启动或禁用时的一些选项 ``` Alias: RequlredBy: 被那些unit所依赖, WanteBy:被那些unit所依赖 注:修改了的unit文件 需要重载。systemctl daemon-reload ``` ## centos 7程序管理工具 centos 7 的程序管理基本上都是由工具systemctl完成,systemctl的控制命令是固定不变的。非systemctl启动的服务systemctl无法进行管理。systemd 兼容init文件夹下的启动脚本。 **systemctl命令的服务管理的使用:** 管理服务通过的service的unit文件实现的。管理unit是通过配置文件实现的(针对服务的unit文件,只有service的配置文件才提供功能) ``` # systemctl 参数 name.service 服务管理参数说明: start: 启动服务 stop: 停止服务 restart: 重启服务 status: 查看状态 条件重启参数说明: try-restart:即服务之前是启动的则进行重启,如果服务没有启动则不进行操作 reload-or-restart:首先进行重载,如果重载不成功则进行重启 reload-or-try-restart:重载或条件式重启,上两个的结合 设置服务是否可以被用户设置开机启动状态参数说明: unmask:取消禁止。 mask:禁止。设置服务是否可以被用户设置开机启动状态 查看服务的当前激活状态参数说明: is-active: 服务已经启动命令的状态返回值为0 命令未启动命令的状态返回值为非0值 ``` **查看所有已经激活的服务:** ``` -t 指定显示的unit类型。 --all 显示更加详细的信息列表。 -a 等价 --all # systemctl list-units # systemctl list-units -t service # systemctl list-units -t service -a ``` **查看所有服务:** ``` systemctl list-units -a ``` **查看所有服务状态:** ``` # systemctl list-unit-files -a 、--all : 查看所有服务的状态 -t 、--type :指定需要查看的unit类型 loaded :配置文件已经加载,载入内存 active(running):一次或多次持续处理的运行 active(exited):成功完成一次性的配置 active(waiting):运行中,等待一个事件 inactive:不运行 enabled:开机启动 disabled:开机不启动 static:开机不启动,但可被另一个启用的服务激活 ``` **用来列出该服务在哪些运行级别下启用和禁用:** ``` ls /etc/systemd/system/*.wants/sshd.service systemctl list-unit-files --type target --all ``` **设置服务开机不启动:** ``` # systemctl disable 服务名称unit ``` **查看服务是否开机自启:** ``` # systemctl is-enabled name.service ``` **查看服务的依赖关系:** ``` # systemctl list-dependencies name.service # systemctl list-depebdencies ``` **重载服务:** ``` # systemctl daemon-reload ``` **杀掉进程:** ``` # systemctl kill 进程名 ``` ## systemctl命令的系统运行级别的使用 老版本的sysv以及upstart已经被替换为systemd,但centos7中同样可以能使用init命令切换级别,而且centos7中并无运行级别的概念,centos老版本中的运行级别也不过就是一个被定义死的对象。 centos7 为了兼容老版本定义了与老版本 runlevel{0…6}相对应的target后缀的unit。与启动级别对应的target类型的unit为真正的unit的软连接。 系统需要运行的unit由软连接文件存放在/etc/systemd/system文件夹下。代表运行状态的target可以相互包含,如5模式的target,包含3模式的target与一些其他unit,或者说5模式依赖3模式,启动5模式需要先启动3模式。 systemd的思想是层层包含的关系,5依赖3 ,如果3模式下的服务没有启动,在5模式下同样不会启动。 **SysV 运行级别与 systemd 目标的比较:** | 运行级别 | 目标单位 | 描述 | | -------- | ---------------------------------- | ---------------------------- | | 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 | 关闭并重新启动系统 | ``` [root@CentOS7.0~]#ll `locate runlevel0.target` lrwxrwxrwx. 1 root root 15 3月 22 21:57 /usr/lib/systemd/system/runlevel0.target -> poweroff.target ``` **使用systemctl命令切换级别:** ``` systemctl isolate name.target 注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换 ``` **使用systemctl 命令查看级别:** ``` # systemctl list-units –t target --all 查看所有的 target ``` **使用systemctl 对默认的运行级别进行设定** ``` # systemctl get-default => 获取当前的运行级别 # systemctl set-default name.target => 设置当前的运行级别 ``` **切换至紧急救援模式** ``` # systemctl rescue => 加载驱动 # systemctl emergency => 不会加载驱动 ``` **其他命令:** ``` 关机: systemctl halt, systemctl poweroff 重启: systemctl reboot 挂起: systemctl suspend 快照\休眠: systemctl hibernate 休眠并挂起:systemctl hybrid-sleep ```