[root@c7-server ~]# systemctl mask httpd.service Created symlink from /etc/systemd/system/httpd.service to /dev/null. [root@c7-server ~]# systemctl start httpd.service Failed to start httpd.service: Unit is masked. [root@c7-server ~]# systemctl enable httpd.service Failed to execute operation: Cannot send after transport endpoint shutdown
可使用unmask来取消mask。
~]# systemctl unmask httpd.service Removed symlink /etc/systemd/system/httpd.service.
启动一个冲突的服务在systemd中存在积极的(positive)依赖和消极的(negative)依赖。启动某个特定的服务,可能会要求启动一个或多个其他服务(此为积极的依赖),或者要求停止一个或多个其他服务(此为消极的依赖)。
当你尝试启动某个服务的时候,systemd会自动解决这些依赖关系。注意,systemd不会显式通知用户。如果你已经启动了一个服务A(比如postfix),然后你尝试启动服务B(比如sendmail),服务B和服务A有消极的依赖关系,那么当你启动服务B的时候,服务A会自动被停止。
注:sendmail和postfix都是邮件服务,之间存在消极的依赖关系。
TARGETSystemd上使用target来模仿以前的运行级别的概念。不过要注意,这只是模仿,并不代表完全一样。target可以看作是一系列的unit的集合从而实现某个运行级别的功能。并且这些target之间会存在一个依赖链的关系。例如想启动图形界面(graphical.target)的话,就需要启动图形服务(gdm.service)或者账户服务(accounts-daemon.service)并且需要激活multi-user.target。同样地,multi-user.target需要启动网络服务(NetworkManager.service)或者D-Bus(dbus.service)并激活basic.target。basic.target也有自己的依赖。
运行级别和target的对应关系如下表。
运行级别 Target Units 描述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 重启
查看、切换运行级别/target的新旧命令如下表所示,应尽量避免使用旧的命令。
旧命令 新命令 描述runlevel systemctl list-units --type target 查看当前系统运行于哪个target下
telinit runlevel systemctl isolate name.target 修改当前的target
查看默认target
~]# systemctl get-default graphical.target
这个值的获取,其实是去检索字符链接。
~]# ls -l /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 36 Oct 17 15:06 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target
查看当前target~]# systemctl list-units --type target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System bluetooth.target loaded active active Bluetooth cryptsetup.target loaded active active Local Encrypted Volumes getty-pre.target loaded active active Login Prompts (Pre) getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded active active Network is Online network-pre.target loaded active active Network (Pre) network.target loaded active active Network nfs-client.target loaded active active NFS client services nss-user-lookup.target loaded active active User and Group Name Lookups paths.target loaded active active Paths remote-fs-pre.target loaded active active Remote File Systems (Pre) remote-fs.target loaded active active Remote File Systems rpc_pipefs.target loaded active active rpc_pipefs.target slices.target loaded active active Slices sockets.target loaded active active Sockets sound.target loaded active active Sound Card swap.target loaded active active Swap sysinit.target loaded active active System Initialization timers.target loaded active active Timers
这个命令查询出来的,是当前已加载并激活的target。那么我们如何从里面找到当前的target是什么呢?
在bootup(7)的man手册中有描述,并不是所有的unit都是并行启动的,局部并行,整体依然是有先后次序之分的。例如:
sysinit.target --> basic.target --> multi-user.target --> graphical.target
rescue.target和emergency.target应该都是单独出现,也就是说:
见到rescue.target或者emergency.target或者graphical.target,那么就是对应的target,这三者之间不会有并存的关系。
见到multi-user.target,就看看有没有graphical.target,没有的话那就是multi-user.target。
设置默认target