RHCSARHCE 红帽Linux认证学习指南(第7版)EX200 & EX300
上QQ阅读APP看书,第一时间看更新

认证目标5.04 按目标控制

有了systemd, Red Hat企业版Linux的服务管理可按目标进行定制。因为systemd包含到运行级的链接,以实现与SysVinit向后兼容,所以仍然可以使用init和telinit等命令引用表5-2中列出的运行级。但是,应该让自己熟悉目标,因为这是在引导时激活服务的标准方法。

Linux是可以高度定制化的,因此可以定制在每个目标中启动的systemd单元。虽然可以使用GUI工具来定制systemd单元,但通常情况下在命令行接口配置它们速度会更快。

5.4.1 按目标定义功能

如前所述,每一个目标的基本功能都保存在/etc/systemd/systemd和/usr/lib/systemd/system目录下的配置文件中。例如,我们首先看默认目标,假设在RHEL 7系统中使用图形化登录:

        # systemctl get-default
        graphical.target

由于存在从/etc/systemd/system/default.target文件到/usr/lib/system/system中的graphical.target文件的符号链接,系统知道graphical.target是默认目标。观察这些文件。下面给出了一段节选:

        [Unit]
        Description=Graphical Interface
        Documentation=man:systemd.special(7)
        Requires=multi-user.target
        After=multi-user.target
        Conflicts=rescue.target
        Wants=display-manager.service
        AllowIsolate=yes

这意味着一个目标可以包含另一个目标。这里,graphical.target是multi-user.target的一个超集。当multi-user.target中的所有systemd单元都启动后,graphical.target会激活display-manager.service, graphical.target配置文件中的Wants指令说明了这一点。

graphical.target启动的其他服务包含在/etc/systemd/system或/usr/lib/systemd/system下的graphical.target.wants子目录中。在RHEL 7的默认安装中,可以看到下面的文件:

        # ls /etc/systemd/system/graphical.target.wants
        accounts-daemon.service rtkit-daemon.service

它们是到Accounts和RealtimeKit服务的单元配置文件的符号链接。

5.4.2 systemd单元的内部构造

每当系统移到一个不同的目标时,systemd单元就被激活。因此,在引导过程中将执行与默认目标关联的单元。修改目标时将启动合适的单元;例如,当从graphical.target运行systemctl isolate multi-user.target命令时,Linux将停止由图形目标启动的所有服务单元。

不过,我们可以直接控制systemd单元。例如,查看/usr/lib/systemd/system目录下的rsyslog.service文件的内容,如图5-12所示。

图5-12 rsyslog.service单元的配置文件

该配置文件以Unit节开头,其中包含了该服务的描述。然后是服务配置,包含了服务的类型,指向包含一些环境变量(它们配置服务行为)的文件的指针,激活服务时需要运行的主可执行文件,以及将所有标准输出从服务发送到/dev/null的一个指令。

最后,WantedBy指令指出,当系统在引导期间进入多用户目标时,该服务将被激活。

现在执行下面的命令:

        # systemctl status rsyslog.service

如果指定了单元名称,但不包含扩展名,那么默认情况下systemd假定这是一个服务单元。因此,上述命令的一个简短版本如下:

        # systemctl status rsyslog

该命令返回的输出如图5-13所示,其中包含服务单元的状态、其主进程ID以及最多10条最近日志记录行。如果一些日志记录行被截断,可使用-l开关选项完整显示它们。

图5-13 显示一个服务的状态

执行下面的命令可以停止一个服务:

        # systemctl stop rsyslog.service

另外,systemctl命令可以使用表5-4中显示的选项。例如,下面的命令重新加载SSH配置文件,但是不会停止或启动服务:

表5-4 systemctl服务控制命令

        # systemctl reload sshd.service

5.4.3 服务配置

systemctl命令提供了一种简单的方式为默认目标启动服务。首先,执行下面的命令:

        # systemctl list-unit-files --type=service

其输出如图5-11所示,但是仅限于服务单元。你将看到系统中已安装服务的完整列表,以及它们在引导时的激活状态。

systemctl命令的作用不止于此。使用该命令可以修改特定服务的引导状态。例如,下面的命令检查Postfix服务是否被配置为在引导时启动:

        # systemctl list-unit-files | grep postfix.service
        postfix.service                           enabled

下面是一个等效的命令:

        # systemctl is-enabled postfix.service
        enabled

这说明Postfix邮件服务器被配置为在默认目标中启动。如果想要确保Postfix服务不会在默认目标中启动,可执行下面的命令:

        # systemctl disable postfix.service

再次运行systemctl list-unit-files命令以确认修改成功。为给默认目标再次启用该服务,可以执行相同的命令,但是将disable替换为enable,如下所示:

        # systemctl enable postfix.service

启用一个服务时,systemctl enable命令会在/etc/systemd/system/multi-user.target.wants目录中创建一个指向/usr/lib/systemd/system中的对应单元配置文件的符号链接。如果愿意,可以在合适的systemd目录中创建符号链接,从而手动启用或禁用服务。但是,使用systemctl时出错的概率更小,所以是更好的方法。

禁用一个服务时,仍然可以使用systemctl start和stop命令手动启用和停止该服务。这意味着systemctl disable命令不会阻止用户不小心错误地启动一个服务。如果想要在引导时禁用一个服务单元,并确保该服务单元不能再被启动,应该使用mask命令,如下所示:

        # systemctl mask postfix.service
        ln -s '/dev/null' '/etc/systemd/system/postfix.service'

可以看到,此命令在/etc/systemd/system中创建了一个符号链接postfix.service,它指向/dev/null。/etc/systemd/system中的配置文件的优先级总是高于/usr/lib/systemd/system中的对应文件。因此,其结果是,/usr/lib/systemd/system中的默认postfix.service文件将被/etc/systemd/system中的符号链接屏蔽为/dev/null。