Red Hat Training

A Red Hat training course is available for RHEL 8

配置基本系统设置

Red Hat Enterprise Linux 8

配置 Red Hat Enterprise Linux 8 中基本系统设置的指南

Red Hat Customer Content Services

摘要

本文档论述了 Red Hat Enterprise Linux 8 中系统管理的基础知识。这个标题着重论述: 在操作系统成功安装后系统管理员需要完成的基本任务、使用 yum 安装软件、使用 systemd 进行服务管理、管理用户、组群和文件权限,使用 chrony 配置 NTP 并使用 Python 3 和其它用户合作。

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要提交更复杂的反馈,请创建一个 Bugzilla ticket:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 RHEL 系统角色入门

本节介绍 RHEL 系统角色是什么。另外,它介绍了如何通过 Ansible playbook 应用特定角色来执行各种系统管理任务。

1.1. RHEL 系统角色简介

RHEL 系统角色是 Ansible 角色和模块的集合。RHEL 系统角色提供了一个配置界面,用于远程管理多个 RHEL 系统。这个界面允许在多个 RHEL 版本间管理系统配置,以及处理新的主发行版本。

在 Red Hat Enterprise Linux 8 中,该接口目前由以下角色组成:

  • kdump
  • network
  • selinux
  • storage
  • certificate
  • kernel_settings
  • logging
  • metrics
  • nbde_client 和 nbde_server
  • timesync
  • tlog

所有这些角色都由 AppStream 存储库中可用的 rhel-system-roles 软件包提供。

1.2. RHEL 系统角色术语

您可以在本文档中找到以下术语:

系统角色术语

Ansible playbook
Playbook 是 Ansible 的配置、部署和编配语言。它们可以描述您希望远程系统强制使用的策略,或者在一般的 IT 进程中选择一组步骤。
控制节点
安装了 Ansible 的任何机器。您可以从任何控制节点运行命令和 playbook,调用 /usr/bin/ansible 或 /usr/bin/ansible-playbook。您可以使用任意安装了 Python 的计算机作为控制节点 - 笔记本电脑、共享桌面和服务器都可以运行 Ansible。但是,您不能使用 Windows 机器作为控制节点。您可以拥有多个控制节点。
清单(Inventory)
受管节点列表。清单文件有时也称为"hostfile"。您的清单可以为每个受管节点指定像 IP 地址等信息。清单也可以管理受管节点,创建并嵌套组以更轻松地进行扩展。如需了解更多有关清单的信息,请参阅使用清单一 节。
受管节点
使用 Ansible 管理的网络设备、服务器或两者。受管节点有时也称为 "hosts(主机)"。Ansible 未安装到受管节点上。

1.3. 应用一个角色

以下流程描述了如何应用特定角色。

先决条件

  • 确定在您要用作控制节点的系统中安装了 rhel-system-roles 软件包:

    # yum install rhel-system-roles
  • 您需要 ansible 软件包来运行使用 RHEL 系统角色的 playbook。确保启用了 Ansible Engine 软件仓库,且 ansible 软件包安装在您要用作控制节点的系统中。

    • 如果您没有 Red Hat Ansible Engine 订阅,可以使用 Red Hat Enterprise Linux 订阅提供的有限版本的 Red Hat Ansible Engine。在这种情况下,请按照以下步骤操作:

      1. 启用 RHEL Ansible Engine 存储库:

        # subscription-manager refresh
        # subscription-manager repos --enable ansible-2-for-rhel-8-x86_64-rpms
      2. 安装 Ansible Engine:

        # yum install ansible
    • 如果您有 Red Hat Ansible Engine 订阅,请按照以下所述步骤操作 如何下载和安装 Red Hat Ansible Engine?
  • 确保您可以创建 Ansible 清单。

    清单代表 Ansible playbook 使用的主机、主机组以及一些配置参数。

    playbook 通常是人类可读的,并使用 iniyamljson 和其他文件格式定义。

  • 确保您可以创建一个 Ansible playbook。

    Playbook 代表 Ansible 的配置、部署和编配语言。通过使用 playbook,您可以声明和管理远程机器的配置,部署多个远程机器,编配任何手动排序进程的步骤。

    playbook 是一个或多个 plays 的列表。每个 play 都可以包括 Ansible 变量、任务或角色。

    playbook 是人类可读的,以 yaml 格式定义。

流程

  1. 创建包含您要管理的主机和组所需的 Ansible 清单。下面是一个示例,它使用了名为 webservers 的一组主机的名为 inventory.ini 的文件:

    [webservers]
    host1
    host2
    host3
  2. 创建一个 Ansible playbook,包括所需角色。以下示例演示了如何通过 playbook 的 roles: 选项使用角色:

    以下示例演示了如何通过给定 roles: 选项使用角色 play:

    ---
    - hosts: webservers
      roles:
         - rhel-system-roles.network
         - rhel-system-roles.timesync
    注意

    每个角色都包括 README 文件,该文件记录如何使用角色和支持的参数值。您还可以在角色的文档目录中找到特定角色的示例 playbook。这些文档目录默认由 rhel-system-roles 软件包提供,并可在以下位置找到:

    /usr/share/doc/rhel-system-roles/SUBSYSTEM/

    SUBSYSTEM 替换为所需角色的名称,如 selinuxkdumpnetworktimesyncstorage

  3. 要在特定主机上执行 playbook,您必须执行以下任一操作:

    • 编辑 playbook 以使用 hosts: host1[,host2,…]hosts: all 并执行命令:

      # ansible-playbook name.of.the.playbook
    • 编辑清单,以确保要在组中定义要使用的主机,并执行以下命令:

      # ansible-playbook -i name.of.the.inventory name.of.the.playbook
    • 指定执行 ansible-playbook 命令时的所有主机:

      # ansible-playbook -i host1,host2,... name.of.the.playbook
      重要

      请注意, -i 标志指定所有可用主机的清单。如果您有多个目标主机,但要选择要针对其运行 playbook 的主机,您可以在 playbook 中添加变量以能够选择主机。例如:

      Ansible Playbook | example-playbook.yml:
      
      - hosts: "{{ target_host }}"
        roles:
           - rhel-system-roles.network
           - rhel-system-roles.timesync

      playbook 执行命令:

      # ansible-playbook -i host1,..hostn -e target_host=host5 example-playbook.yml

1.4. 其它资源



[1] 本文档会随 rhel-system-roles 软件包自动安装。

第 2 章 更改基本环境设置

配置基本环境设置是安装过程的一部分。以下部分介绍了在稍后修改时的信息。环境的基本配置包括:

  • 日期和时间
  • 系统区域设置
  • 键盘布局
  • 语言

2.1. 配置日期和时间

因为许多原因,系统准确计时非常重要。在 Red Hat Enterprise Linux 中, NTP 协议保证计时的平衡,该协议由用户空间运行的守护进程实施。user-space 守护进程更新内核中运行的系统时钟。系统时钟可以通过使用不同的时钟源来维护系统的时间。

Red Hat Enterprise Linux 8 使用 chronyd 守护进程来实现 NTPchronyd 包括在 chrony 软件包中。如需更多信息,请参阅使用 chrony 来配置 NTP

2.1.1. 显示当前日期和时间

要显示当前日期和时间,请使用这些步骤之 一。

流程

  1. 输入 date 命令:

    $ date
    Mon Mar 30 16:02:59 CEST 2020
  2. 要查看更多详细信息,请使用 timedatectl 命令:

    $ timedatectl
    Local time: Mon 2020-03-30 16:04:42 CEST
    Universal time: Mon 2020-03-30 14:04:42 UTC
      RTC time: Mon 2020-03-30 14:04:41
     Time zone: Europe/Prague (CEST, +0200)
    System clock synchronized: yes
    NTP service: active
    RTC in local TZ: no

其它资源

2.2. 配置系统区域设置

系统范围的区域设置保存在 /etc/locale.conf 文件中,该文件在早期引导时由 systemd 守护进程读取。每个服务或用户都会继承在 /etc/locale.conf 中配置的 locale 设置,单独程序或个人用户可以单独覆盖它们。

这部分论述了如何管理系统区域设置。

流程

  • 要列出系统可用区域设置,请执行以下操作:

    $ localectl list-locales
    C.utf8
    aa_DJ
    aa_DJ.iso88591
    aa_DJ.utf8
    ...
  • 显示系统区域设置的当前状态:

    $ localectl status
  • 要设置或更改默认系统区域设置,以 root 用户身份使用 localectl set-locale 子命令。例如:

    # localectl set-locale LANG=en-US

其它资源

  • man localectl(1)man locale(7)man locale.conf(5)

2.3. 配置键盘布局

键盘布局设置控制文本控制台和图形用户界面中的布局。

流程

  • 要列出可用的键映射:

    $ localectl list-keymaps
    ANSI-dvorak
    al
    al-plisi
    amiga-de
    amiga-us
    ...
  • 显示 keymaps 设置的当前状态:

    $ localectl status
    ...
    VC Keymap: us
    ...
  • 设置或更改默认系统键映射。例如:

    # localectl set-keymap us

其它资源

  • man localectl(1)man locale(7)man locale.conf(5)

2.4. 使用桌面 GUI 更改语言

这一段讲述了如何使用桌面 GUI 改变系统语言。

先决条件

  • 在您的系统中会安装所需的语言软件包

流程

  1. GNOME Control Center 中的图标打开 System menu

    cs system menu

  2. GNOME Control Center 中,从左边栏中选择 Region & Language
  3. Language 菜单。

    cs language menu

  4. 在菜单里选择所需地区和语言。

    cs select region language

    如果您的区域及语言没有被列出,向下滚动页面,然后点 More 选择可用的地区和语言。

    cs available region language

  5. Done
  6. Restart 以使更改生效。

    cs restart region language

注意

有些应用程序不支持某些语言。没有被翻译的应用程序会使用美国英语。

2.5. 其它资源

第 3 章 配置和管理网络

这部分论述了如何在 Red Hat Enterprise Linux 中添加以太网连接的不同选项。

3.1. 在图形安装模式中配置网络和主机名

按照以下步骤来配置您的网络和主机名。

流程

  1. 安装概述 窗口中点击 网络和主机名称
  2. 在左侧窗格的列表中选择一个接口。详情显示在右侧方框中。
  3. 使用 ON/OFF 开关来启用或禁用所选接口。

    注意

    安装程序自动检测到本地可访问的界面,您无法手动添加或删除它们。

  4. + 添加虚拟网络接口,可以是 Team、Bond、Bridge 或 VLAN。
  5. - 删除虚拟接口。
  6. Configure 更改设置,如 IP 地址、DNS 服务器或者现有接口的路由配置(虚拟和物理)。
  7. Host Name 字段中输入您系统的主机名。

    注意
    • 用于使用持久名称识别网络设备的网络设备命名标准有几种,例如 em1wl3sp0。有关这些标准的详情,请查看 配置和管理联网文档
    • 主机名可以是完全限定域名(FQDN),其格式为 hostname.domainname,也可以是没有域名的短主机名。很多网络有一个动态主机配置协议(DHCP)服务,它可自动提供带域名的连接的系统。要允许 DHCP 服务为这台机器分配域名,请只指定简短主机名。localhost.localdomain 表示没有为目标系统配置特定静态主机名,同时在执行网络配置的过程中会配置安装的系统的实际主机名,比如使用 DHCP 或 DNS 的 NetworkManager
  8. Apply 在环境中应用主机名。

其它资源

3.2. 使用 nmcli 配置静态以太网连接

这个步骤描述了使用 nmcli 实用程序在以下设置中添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1,子网掩码为 /24
  • 静态 IPv6 地址 - 2001:db8:1::1,子网掩码为 /64
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

流程

  1. 为以太网连接添加新的 NetworkManager 连接配置集:

    # nmcli connection add con-name Example-Connection ifname enp7s0 type ethernet

    额外步骤修改您创建的 Example-Connection 连接配置集。

  2. 设置 IPv4 地址:

    # nmcli connection modify Example-Connection ipv4.addresses 192.0.2.1/24
  3. 设置 IPv6 地址:

    # nmcli connection modify Example-Connection ipv6.addresses 2001:db8:1::1/64
  4. 将 IPv4 和 IPv6 连接方法设置为 manual:

    # nmcli connection modify Example-Connection ipv4.method manual
    # nmcli connection modify Example-Connection ipv6.method manual
  5. 设置 IPv4 和 IPv6 默认网关:

    # nmcli connection modify Example-Connection ipv4.gateway 192.0.2.254
    # nmcli connection modify Example-Connection ipv6.gateway 2001:db8:1::fffe
  6. 设置 IPv4 和 IPv6 DNS 服务器地址:

    # nmcli connection modify Example-Connection ipv4.dns "192.0.2.200"
    # nmcli connection modify Example-Connection ipv6.dns "2001:db8:1::ffbb"

    要设置多个 DNS 服务器,以空格分隔并用引号括起来。

  7. 为 IPv4 和 IPv6 连接设置 DNS 搜索域:

    # nmcli connection modify Example-Connection ipv4.dns-search example.com
    # nmcli connection modify Example-Connection ipv6.dns-search example.com
  8. 激活连接配置集:

    # nmcli connection up Example-Connection
    Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 使用 ping 实用程序验证这个主机是否可以向其他主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:2::1

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fffe
  4. 使用 host 实用程序验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

故障排除步骤

  1. 如果连接失败,或者网络接口在上线和关闭状态间切换:

    • 确保网络电缆插入到主机和交换机。
    • 检查连接失败是否只存在于这个主机上,或者其他连接到该服务器连接的同一交换机的主机中。
    • 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。
    • 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接

其它资源

3.3. 使用 nmtui 添加连接配置集

nmtui 应用程序为 NetworkManager 提供了一个文本用户界面。以下介绍了如何添加新连接配置集的步骤。

先决条件

  • 已安装 NetworkManager-tui 软件包。

流程

  1. 启动 NetworkManager 文本用户界面工具:

    # nmtui
  2. 选择 Edit a connection 菜单条目,点 Enter
  3. 选择 Add 按钮,点 Enter
  4. 选择 Ethernet,点 Enter
  5. 输入连接详情信息。

    在 nmtui 中添加连接
  6. 选择 OK 保存更改。
  7. 选择 Back 返回主菜单。
  8. 选择 Activate a connection,点 Enter
  9. 选择新的连接条目,点 Enter 键激活连接。
  10. 选择 Back 返回主菜单。
  11. 选择 Quit

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp1s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp1s0
    ...

    如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接

    其它资源

3.4. 在 rhel 8 web 控制台中管理网络

在 Web 控制台中,使用 Networking 菜单可以:

  • 显示当前接收并发送的数据包
  • 显示可用网络接口最重要的信息
  • 显示网络日志的内容。
  • 添加各种网络接口类型(bond、team、bridge、VLAN)

图 3.1. 在 RHEL 8 web 控制台中管理网络

CS 入门网络

3.5. 使用 RHEL 系统角色管理网络

您可以使用 network 角色在多个目标机器上配置网络连接。

network 角色允许配置以下类型的接口:

  • Ethernet
  • Bridge
  • Bonded
  • VLAN
  • MacVLAN
  • Infiniband

每个主机所需的网络连接作为 network_connections 变量中的列表提供。

警告

network 角色更新或创建目标系统中的所有连接配置集,与 network_connections 变量中指定的一样。因此,如果选项只在系统中出现而没有出现在 network_connections 变量中, network 角色会从指定的配置集中删除选项。

以下示例演示了如何应用 network 角色来确保存在与所需参数的以太网连接:

应用网络角色的 playbook 示例,以设置使用所需参数的以太网连接

# SPDX-License-Identifier: BSD-3-Clause
---
- hosts: network-test
  vars:
    network_connections:

      # Create one ethernet profile and activate it.
      # The profile uses automatic IP addressing
      # and is tied to the interface by MAC address.
      - name: prod1
        state: up
        type: ethernet
        autoconnect: yes
        mac: "00:00:5e:00:53:00"
        mtu: 1450

  roles:
    - rhel-system-roles.network

3.6. 其它资源

第 4 章 注册系统并管理订阅

订阅覆盖了在 Red Hat Enterprise Linux 中安装的产品,包括操作系统本身。

您可以使用 Red Hat Content Delivery Network 订阅来跟踪:

  • 注册的系统
  • 在您的系统中安装的产品
  • 附加到安装产品的订阅

4.1. 安装后注册系统

如果您在安装过程中还没有注册系统,请使用以下步骤注册您的系统。

先决条件

  • 红帽客户门户网站中的一个有效的用户帐户。
  • 请参阅 创建红帽登录 页面。
  • RHEL 系统的有效订阅。
  • 如需有关安装过程的更多信息,请参阅 执行标准 RHEL 安装

流程

  1. 注册并自动订阅您的系统。

    # subscription-manager register --username <username> --password <password> --auto-attach
    Registering to: subscription.rhsm.redhat.com:443/subscription
    The system has been registered with ID: 37to907c-ece6-49ea-9174-20b87ajk9ee7
    The registered system name is: client1.idm.example.com
    Installed Product Current Status:
    Product Name: Red Hat Enterprise Linux for x86_64
    Status:       Subscribed

    该命令提示您输入您的红帽客户门户网站用户名和密码。

    如果注册过程失败,您可以使用一个特定的池来注册您的系统。有关如何操作的指南,请执行以下步骤:

    1. 确定您需要的订阅池 ID:

      # subscription-manager list --available

      这个命令会显示您的红帽账户中的所有可用订阅。对于每个订阅,会显示各种相关信息,包括池 ID。

    2. 通过使用上一步中决定的池 ID 替换 pool_id 来为您的系统附加适当的订阅:

      # subscription-manager attach --pool=pool_id

4.2. 在 web 控制台中使用凭证注册订阅

按照以下步骤,使用 RHEL 8 web 控制台注册新安装的 Red Hat Enterprise Linux。

先决条件

  • 红帽客户门户网站中的有效用户帐户。

    请参阅 创建红帽登录 页面。

  • RHEL 系统的有效订阅。

流程

  1. 在搜索字段中输入 subscription 并按 Enter 键。

    cockpit subscription icon

    或者,您可以登录到 RHEL 8 web 控制台。详情请参阅 Web 控制台的日志记录

  2. 在特权任务的 polkit 验证对话框中,添加属于对话框中显示的用户名的密码。

    cockpit subscription password

  3. Authenticate
  4. Subscriptions 对话框中,点 Register

    cockpit subscription notregistered

  5. 输入您的客户门户网站凭证。

    cockpit subscription register cred

  6. 输入您的机构名称。

    如果您在红帽客户门户网站中有一个以上帐户,必须添加机构名称或机构 ID。要获得机构 ID,请联系您的红帽相关人员。

  7. 点击注册按钮。

此时您的 Red Hat Enterprise Linux 8 系统已被成功注册。

cockpit subscription registered

4.3. 在 GNOME 中使用红帽帐户注册系统

按照以下步骤将您的系统注册到您的红帽帐户中。

先决条件

  • 红帽客户门户网站中的有效帐户。

    对于新用户注册的详情,请参阅创建红帽登陆页。

流程

  1. 进入系统菜单,该菜单可从右上角访问,点 Settings 图标。
  2. DetailsAbout 部分,点 Register
  3. 选择 Registration Server
  4. 如果没有使用红帽服务器,在 URL 项中输入服务器地址。
  5. Registration Type 菜单中选 Red Hat Account
  6. Registration Details 中:

    • Login 项中输入您的红帽帐户的用户名。
    • Password 项中输入您的红帽帐户的密码。
    • Organization 项中输入您的机构名称。
  7. Register

4.4. 在 GNOME 中使用激活码注册系统

按照以下步骤,使用激活码注册您的系统。您可从您的机构管理员获得激活码。

先决条件

  • 激活码或密钥。

    有关生成新激活码的详情,查看 Activation Keys 页。

流程

  1. 进入系统菜单,该菜单可从右上角访问,点 Settings 图标。
  2. DetailsAbout 部分,点 Register
  3. 选择 Registration Server
  4. 如果没有使用红帽服务器,输入自定义的服务器的 URL
  5. Registration Type 菜单中选 Activation Keys
  6. Registration Details 中:

    • 输入 激活码

      使用以逗号(,)分隔多个密钥。

    • Organization 字段中输入您的机构名称或者 ID。
  7. Register

第 5 章 在引导时启动 systemd 服务

Systemd 是 Linux 操作系统的系统和服务管理器,它引进了 systemd 单元的概念。

本节介绍了如何在引导时启用或禁用服务。它还介绍了如何通过 Web 控制台管理服务。

5.1. 启用或禁用服务

在安装过程中,可以设置在系统引导时启用或禁用哪些服务。您还可以在已安装的操作系统中启用或禁用服务。

这部分论述了在已安装的操作系统中启用或者禁用这些服务的步骤:

先决条件

  • 您必须有对该系统的根权限。

流程

  1. 要启用服务,使用 enable 选项:

    # systemctl enable service_name

    用您要启用的服务替换 service_name

    您还可以使用一个命令启用并启动服务:

    # systemctl enable --now service_name
  2. 要禁用服务,使用 disable 选项:

    # systemctl disable service_name

    使用您要禁用的服务替换 service_name

警告

您不能启用之前已屏蔽的服务。您需要首先卸装它:

# systemctl unmask service_name

5.2. 在 rhel 8 web 控制台中管理服务

本节介绍了如何使用 Web 控制台启用或禁用服务。您可以管理 systemd 目标、服务、套接字、计时器和路径。您还可以检查服务的状态、启动或停止服务、启用或者禁用这些服务。

先决条件

  • 您必须有对该系统的根权限。

流程

  1. 在您首选的网页浏览器中打开 https://localhost:9090/
  2. 使用您系统中的 root 凭证登录到 web 控制台。
  3. 要显示 Web 控制台面板,请点击位于窗口右上角的 Host 图标。

    管理服务 Web 控制台
  4. 在菜单中点击 Services

    您可以管理 systemd 目标、服务、套接字、计时器和路径。

  5. 例如,要管理服务 NFS 客户端服务

    1. Targets
    2. 选择服务 NFS 客户端服务
    3. 要启用或禁用该服务,点 Toogle 按钮。
    4. 要停止该服务,点 按钮并选择 Stop 选项。

      停止服务 Web 控制台

第 6 章 配置系统安全性

计算机安全性涉及到对硬件、软件、信息和服务的保护。计算机安全性是一项非常关键的任务,特别是对于那些处理敏感数据并处理商业事务的企业。

这部分只论述安装操作系统后您可以配置的基本安全功能。

6.1. 启用 firewalld 服务

防火墙是一个网络安全系统,它可根据配置的安全规则监控并控制进入和离开的网络流量。防火墙通常在可信内部网络和其它网络间建立一个屏障。

firewalld 服务在 Red Hat Enterprise Linux 中提供防火墙,可在安装过程中自动启用。

要启用 firewalld 服务,请按照以下步骤执行。

流程

  • 显示 firewalld 的当前状态:

    $ systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
       Active: inactive (dead)
    ...
  • 如果没有启用并运行 firewalld,切换到 root 用户,启动 firewalld 服务并在系统重启后自动启动它:

    # systemctl enable --now firewalld

验证步骤

  • 检查 firewalld 是否正在运行并启用:

    $ systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running)
    ...

其它资源

6.2. 在 rhel 8 web 控制台中管理防火墙

要在 web 控制台中配置 firewalld 服务,请导航至 NetworkingFirewall

默认情况下启用 firewalld 服务。

流程

  1. 要在 web 控制台中启用或禁用 firewalld,使用 Firewall 切换按钮进行切换。

    CS getting started firewall new
注意

另外,您可以使用 Add services… 按钮通过防火墙定义更加精细的访问。

6.3. 管理基本 selinux 设置

Security-Enhanced Linux(SELinux)是系统安全性的额外层,可决定哪些进程可访问哪些文件、目录和端口。这些权限在 SELinux 策略中定义。策略是一组指导 SELinux 安全引擎的规则。

SELinux 有两个可能的状态:

  • Disabled
  • Enabled

启用 SELinux 时,它以以下模式之一运行:

  • Enabled

    • Enforcing
    • Permissive

enforcing 模式 中,SELinux 强制执行载入的策略。SELinux 会基于 SELinux 策略规则来拒绝访问,只有明确指定允许的操作才可以被接受。Enforcing 模式是最安全的 SELinux 模式,它是安装后的默认模式。

permissive 模式 中,SELinux 不强制执行载入的策略。SELinux 不会拒绝访问,但报告违反了 /var/log/audit/audit.log 日志规则的操作。Permissive 模式是安装过程中的默认模式。在一些特殊情况下,permissive 模式也很有用,如进行故障排除时。

其它资源

6.4. 确定 selinux 所需的状态

默认情况下,SELinux 在 enforcing 模式下运行。然而,在特定情况下,您可以将 SELinux 设置为 permissive 模式,甚至可以禁用 SELinux。

重要

红帽建议使您的系统保持在 enforcing 模式下。为了进行调试,您可以将 SELinux 设置为 permissive 模式。

按照以下步骤更改系统中 SELinux 的状态和模式。

流程

  1. 显示当前的 SELinux 模式:

    $ getenforce
  2. 临时设置 SELinux:

    1. Enforcing 模式:

      # setenforce Enforcing
    2. Permissive 模式:

      # setenforce Permissive
      注意

      重启后,SELinux 模式被设置为 /etc/selinux/config 配置文件中指定的值。

  3. 要将 SELinux 模式设置为在重启后保留,修改 SELINUX 配置文件中的 /etc/selinux/config 变量。

    例如: 将 SELinux 切换到 enforcing 模式:

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    ...
    警告

    禁用 SELinux 会降低您的系统安全性。避免使用 SELINUX=disabled 文件中的 /etc/selinux/config 选项禁用 SELinux,因为这可能导致内存泄漏和竞争条件导致内核 panic。反之,通过在内核命令行中添加 selinux=0 参数来在 引导时更改 SELinux 模式来禁用 SELinux

6.5. 在 RHEL 8 web 控制台中切换 SELinux 模式

您可以在 SELinux 菜单项中通过 RHEL 8 web 控制台设置 SELinux 模式。

默认情况下,web 控制台中的 SELinux enforcing 策略是 on,SELinux 在 enforcing 模式下运行。关闭 SELinux 后,您需要将 SELinux 切换到 permissive 模式。请注意,这个选择会在下次引导时自动恢复到 /etc/sysconfig/selinux 文件中定义的配置。

流程

  1. 在 web 控制台中,使用 SELinux 菜单项中的 Enforce policy 切换按钮打开或关闭 SELinux 强制策略。

    cs getting started selinux on

6.6. 其它资源

第 7 章 管理用户帐户入门

Red Hat Enterprise Linux 是一个多用户操作系统,可让不同计算机中的多个用户访问在同一台机器上安装的单一系统。每个用户都在其自身帐户下运行,因此管理用户帐户代表 Red Hat Enterprise Linux 系统管理的一个核心元素。

以下是不同类型的用户帐户:

  • 普通用户帐户:

    为特定系统用户创建普通帐户。这些帐户可以在正常的系统管理过程中添加、删除和修改。

  • 系统用户帐户:

    系统用户帐户代表系统中的特定应用程序标识符。通常仅在软件安装时添加或操作这些帐户,且之后不会修改它们。

    警告

    系统帐户假定在一个系统中本地可用。如果这些帐户被远程配置和提供,比如在 LDAP 配置实例中,则可能会发生系统中断和服务启动失败。

    对于系统帐户,1000 以下的用户 ID 被保留。对于普通帐户,使用从 1000 开始的 ID。但推荐做法是使用从 5000 开始的 ID。有关分配 ID,请查看 /etc/login.defs 文件。

  • 组:

    组是一个实体,它将多个用户帐户连接在一起以实现共同目的,如授予对特定文件的访问权限。

7.1. 使用命令行工具管理帐户和组群

这部分论述了管理用户帐户和组群的基本命令行工具。

  • 显示用户和组群 ID:

    $ id
    uid=1000(example.user) gid=1000(example.user) groups=1000(example.user),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  • 要创建新用户帐户,请执行以下操作:

    # useradd example.user
  • example.user 所属用户帐户分配新密码:

    # passwd example.user
  • 将用户添加到组中:

    # usermod -a -G example.group example.user

其它资源

  • man useradd(8)man passwd(1)man usermod(8)

7.2. Web 控制台中管理的系统用户帐户

您可在 RHEL web 控制台中显示用户帐户:

  • 在访问系统时验证用户。
  • 设置系统的访问权限。

RHEL web 控制台显示系统中的所有用户帐户。因此,在首次登录 web 控制台后,至少可以看到一个可用的用户帐户。

登录到 RHEL web 控制台后,您可以执行以下操作:

  • 创建新用户帐户。
  • 更改其参数。
  • 锁定帐户。
  • 终止用户会话。

7.3. 使用 Web 控制台添加新帐户

使用以下步骤将用户帐户添加到系统,并通过 RHEL web 控制台为帐户设置管理权限。

先决条件

流程

  1. 登录到 RHEL web 控制台。
  2. Account
  3. Create New Account
  1. Full Name 字段中输入用户全名。

    RHEL web 控制台会自动在全名中推荐用户名并在 User Name 字段中填充该用户名。如果您不想使用原始命名规则(由名的第一个字母和完整的姓组成),对它进行更新。

  2. Password/Confirm 字段中输入密码并重新输入该密码以便验证您的密码是否正确。

    下面的颜色栏显示您输入密码的安全等级,这不允许您创建带弱密码的用户。

  1. Create 保存设置并关闭对话框。
  2. 选择新创建的帐户。
  3. Roles 项中选择 Server Administrator

    cockpit terminate session pf4

    现在您可以在 Accounts 设置中看到新帐户,您可以使用凭证连接到该系统。

第 8 章 转储崩溃的内核以便稍后进行分析

要分析系统崩溃的原因,可以使用 kdump 服务保存系统内存内容,以便稍后进行分析。本节概述了 kdump 以及使用 RHEL web 控制台或使用对应的 RHEL 系统角色配置 kdump 的信息。

8.1. kdump

kdump 提供崩溃转储机制的服务。该服务可让您保存系统内存内容,以便稍后进行分析。kdump 使用 kexec 系统调用在没有重启的情况下引导至第二个内核(capture kernel),然后捕获崩溃内核的内存( crash dumpvmcore)并保存它。这个第二个内核位于系统内存保留的一部分。

重要

内核崩溃转储可能会是系统失败时唯一可用的信息(关键错误)。因此,在关键任务环境中确保 kdump 操作正常运行非常重要。红帽建议系统管理员在正常内核更新周期内定期更新和测试 kexec-tools。这在部署了新内核功能时尤为重要。

8.2. 在 web 控制台中配置 kdump 内存用量和目标位置

下面的步骤显示如何使用 Red Hat Enterprise Linux Web 控制台界面中的 Kernel Dump 标签页配置为 kdump 内核保留的内存量。此流程还描述了如何指定 vmcore 转储文件的目标位置以及如何测试您的配置。

流程

  1. 打开 Kernel Dump 标签并启动 kdump 服务。
  2. 使用命令行配置 kdump 内存用量。
  3. Crash dump location 选项旁的链接。

    Web 控制台初始界面
  4. 从下拉菜单中选择 Local Filesystem 选项,并指定您要保存转储的目录。

    Web 控制台 crashdump 目标
    • 或者,从下拉菜单中选择 Remote over SSH 选项,使用 SSH 协议将该 vmcore 发送到远程机器。

      使用远程机器地址、ssh 密钥位置和目标目录填充 Serverssh keyDirectory 字段。

    • 另一个选择是从下拉菜单中选择 Remote over NFS 选项并填写 Mount 字段来使用 NFS 协议将 vmcore 发送到远程机器。

      注意

      选择 Compression 复选框来缩小 vmcore 文件的大小。

  5. 崩溃内核以测试您的配置。

    Web 控制台测试 kdump 配置
    警告

    这一步会破坏内核的执行,并导致系统崩溃和数据丢失。

8.3. kdump 使用 RHEL 系统角色

RHEL 系统角色是 Ansible 角色和模块的集合,可为远程管理多个 RHEL 系统提供一致的配置界面。kdump 角色可让您在多个系统中设置基本内核转储参数。

警告

通过替换 /etc/kdump.conf 文件,kdump 角色完全替换了受管主机的 kdump 配置。另外,如果应用了 kdump 角色,则之前的所有 kdump 设置也会被替换,即使它们没有被角色变量指定,也会替换 /etc/sysconfig/kdump 文件。

以下示例 playbook 演示了如何应用 kdump 系统角色来设置崩溃转储文件的位置:

---
- hosts: kdump-test
  vars:
    kdump_path: /var/crash
  roles:
    - rhel-system-roles.kdump

有关 kdump 角色变量的详细参考,安装 rhel-system-roles 软件包,并查看 /usr/share/doc/rhel-system-roles/kdump 目录中的 README.mdREADME.html 文件。

8.4. 其它资源

第 9 章 恢复系统

要使用现有备份恢复系统,Red Hat Enterprise Linux 提供了 Relax-and-Recover(ReaR)程序。

您可以使用这个工具作为灾难恢复解决方案,也用于系统迁移。

该工具可让您执行以下任务:

  • 生成可引导镜像,并使用镜像从现有备份中恢复系统。
  • 复制原始存储布局。
  • 恢复用户和系统文件。
  • 将系统还原到不同的硬件中。

另外,对于灾难恢复,您还可以将某些备份软件与 ReaR 集成。

设置 ReaR 涉及以下高级别的操作:

  1. 安装 ReaR。
  2. 创建救援系统。
  3. 修改 ReaR 配置文件以添加备份方法详情。
  4. 生成备份文件。

9.1. 设置 ReaR

使用以下步骤安装软件包以使用 Relax-and-Recover(ReaR)工具,创建一个救援系统,配置并生成备份。

先决条件

  • 根据备份恢复计划完成必要的配置。

    请注意,您可以使用 NETFS 备份方法,这是 ReaR 完全整合的内置方法。

流程

  1. 安装 ReaR、genisomage 预管程序以及提供一组引导装载程序的 syslinux 软件包:

    # yum install rear genisoimage syslinux
  2. 创建一个救援系统:

    # rear mkrescue
  3. 在您选择的编辑器中修改 ReaR 配置文件,例如:

    # vi /etc/rear/local.conf
  4. /etc/rear/local.conf 添加备份设置详情。例如,在使用 NETFS 备份方法时,添加以下行:

    BACKUP=NETFS
    BACKUP_URL=backup.location

    使用备份位置的 URL 替换 backup.location

  5. 要将 ReaR 配置为在创建新归档时保留之前的备份归档,并在配置文件中添加以下行:

    NETFS_KEEP_OLD_BACKUP_COPY=y
  6. 要让递增形式进行备份,在每个运行中只备份修改了的文件,添加以下行:

    BACKUP_TYPE=incremental
  7. 根据恢复计划进行备份。

第 10 章 使用日志文件进行故障排除

日志文件包含有关系统的信息,包括内核、服务和在该系统中运行的应用程序。这些信息可帮助故障排除问题或监控系统功能。Red Hat Enterprise Linux 中的日志记录系统基于内置 syslog 协议。特定的程序使用这个系统记录事件并将其整理到日志文件中,这些文件在审核操作系统和故障排除各种问题时非常有用。

10.1. 处理 syslog 信息的服务

以下两个服务处理 syslog 信息:

  • systemd-journald 守护进程
  • Rsyslog 服务

systemd-journald 守护进程从不同源收集信息并将其转发到 Rsyslog 以便进一步处理。systemd-journald 守护进程从以下源收集信息:

  • 内核
  • 引导过程的早期阶段
  • 启动并运行守护进程的标准和错误输出
  • Syslog

Rsyslog 服务根据类型和优先级对 syslog 信息排序,并将其写入 /var/log 目录中的文件。/var/log 目录会永久存储日志信息。

10.2. 存储 syslog 信息的子目录

/var/log 目录下的以下子目录存储了 syslog 信息。

  • /var/log/messages - 除以下外的所有 syslog 信息
  • /var/log/secure - 与安全性和验证相关的信息和错误
  • /var/log/maillog - 与邮件服务器相关的信息和错误
  • /var/log/cron - 与定期执行的任务相关的日志文件
  • /var/log/boot.log - 与系统启动相关的日志文件

10.3. 使用 Web 控制台检查日志文件

按照以下步骤使用 Web 控制台检查日志文件。

流程

  1. 登录到 Red Hat Enterprise Linux 8 web 控制台。
  2. Logs

图 10.1. 在 RHEL 8 web 控制台中检查日志文件

CS 查看日志 Web 控制台

10.4. 使用命令行查看日志

Journal 是 systemd 的一个组件,可帮助查看和管理日志文件。它解决了与传统日志记录相关的问题,并与系统的其余部分紧密集成,并支持各种日志记录技术和日志文件访问管理。

您可以使用 journalctl 命令使用命令行查看系统日志中的信息,例如:

$ journalctl -b | grep kvm
May 15 11:31:41 localhost.localdomain kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00
May 15 11:31:41 localhost.localdomain kernel: kvm-clock: cpu 0, msr 76401001, primary cpu clock
...

表 10.1. 查看系统信息

命令描述

journalctl

显示所有收集的日志条目。

journalctl FILEPATH

显示与特定文件相关的日志。例如: journalctl /dev/sda 命令显示与 /dev/sda 文件系统相关的日志。

journalctl -b

显示当前引导的日志。

journalctl -k -b -1

显示当前引导的内核日志。

表 10.2. 查看特定服务的信息

命令描述

journalctl -b _SYSTEMD_UNIT=foo

过滤日志以查看与 "foo" systemd 服务匹配的日志。

journalctl -b _SYSTEMD_UNIT=foo _PID=number

合并匹配。例如:这个命令显示 systemd-units 的日志,它们与 foo 和 PID number 匹配。

journalctl -b _SYSTEMD_UNIT=foo _PID=number + _SYSTEMD_UNIT=foo1

分隔符 "+" 组合了逻辑 OR 中的两个表达式。例如,这个命令显示来自 foo 服务进程的所有信息 PID 以及来自 foo1 服务(来自其任意进程)的所有信息。

journalctl -b _SYSTEMD_UNIT=foo _SYSTEMD_UNIT=foo1

此命令显示与其中任何一个表达式匹配的所有条目,引用同一字段。此命令显示与 systemd-unit foo 或 systemd-unit foo1 匹配的日志。

表 10.3. 查看与特定引导相关的日志

命令描述

journalctl --list-boots

显示引导号码、ID 以及与引导相关的第一个和最后一个消息的时间戳列表。您可以使用下一命令中的 ID 查看详细信息。

journalctl --boot=ID _SYSTEMD_UNIT=foo

显示指定引导 ID 的信息。

10.5. 其它资源

第 11 章 获得红帽支持

本节介绍了如何使用红帽支持有效解决问题 sosreport

要获得红帽支持,请使用 红帽客户门户网站,它提供对您订阅所有可用资源的访问。

11.1. 通过红帽客户门户网站获得红帽支持

下面的部分论述了如何使用红帽客户门户网站获得帮助。

先决条件

  • 红帽客户门户网站中的有效用户帐户。请参阅 创建红帽登录帐号
  • RHEL 系统的有效订阅。

流程

  1. 访问 红帽支持:

    1. 创建新的支持问题单。
    2. 与红帽支持专家启动实时聊天。
    3. 通过致电或发送电子邮件与红帽专家联系。

11.2. 使用 sosreport 进行故障排除

sosreport 命令从 Red Hat Enterprise Linux 系统收集配置详情、系统信息和诊断信息。

下面的部分论述了如何使用 sosreport 命令为您的支持问题单生成报告。

先决条件

  • 红帽客户门户网站中的有效用户帐户。请参阅 创建红帽登录帐号
  • RHEL 系统的有效订阅。
  • 支持问题单号。

流程

  1. 安装 sos 软件包:

    # yum install sos
    注意

    Red Hat Enterprise Linux 的默认最小安装不包括 sos 软件包,该软件包提供 sosreport 命令。

  2. 生成一个报告:

    # sosreport
  3. 将报告附加到您的支持问题单中。

    请参阅 如何将文件附加到红帽支持问题单?更多信息请参阅红帽知识库文章。

    请注意,在附加报告时会提示您输入相关问题单的号码。

第 12 章 管理软件包

12.1. Red Hat Enterprise Linux 8 中的软件管理工具

在 RHEL 8 中,软件安装由基于 DNF 技术的 YUM 工具(YUM v4)的新版本启用。

注意

上游文档将此技术称为 DNF,这个工具在上游社区被称为 DNF。因此,RHEL 8 中新 YUM 工具返回的一些输出会引用 DNF

尽管 RHEL 8 中使用的 YUM v4 是基于 DNF的,但它与 RHEL 7 中使用的 YUM v3 兼容。对于软件安装, yum 命令及其大多数选项在 RHEL 8 中的工作方式与在 RHEL 7 中相同。

精选的 yum 插件和工具已移植到新的 DNF 后端,并可按照与 RHEL 7 的名称相同的安装。软件包也提供兼容性符号链接,因此可在通常的位置找到 二进制文件、配置文件和目录。

请注意,YUM v3 提供的旧版本的 Python API 不再可用。您可以将插件和脚本迁移到 YUM v4 (DNF Python API)提供的新 API 中,该 API 是稳定并被完全支持的。如需更多信息,请参阅 DNF API 参考

12.2. 应用程序流

Red Hat Enterprise Linux 8 引进了应用程序流(Application Streams)的概念。和操作系统软件包相比,现在为用户空间组件提供了多个版本且会更频繁地进行更新。这为自定义 Red Hat Enterprise Linux 提供了更大的灵活性,不会影响平台或特定部署的基本稳定性。

作为 Application Streams 提供的组件可打包为模块(module)或 RPM 软件包,并通过 RHEL 8 中的 AppStream 软件仓库提供。每个 Application Stream 都有一个生命周期,它与 RHEL 8 的生命周期相同或更短。Red Hat Enterprise Linux 8 Application Streams 生命周期页中列出了生命周期较短的 Application Streams

模块是代表逻辑单元的软件包集合: 应用程序、语言堆栈、数据库或一组工具。这些软件包被一同构建、测试并发布。

模块流代表 Application Stream 组件的版本。例如,PostgreSQL 数据库服务器的两个流(版本)位于 postgresql 模块中: PostgreSQL 10(默认流)和 PostgreSQL 9.6。在系统中只能安装 一 个模块流。不同的容器可以使用不同的版本。

详细的模块命令,请参考 安装、管理和删除用户空间组件文档。有关 AppStream 中可用模块列表,请查看 软件包清单

12.3. 搜索软件包

yum 允许您使用软件包执行一组完整的操作。

下面的部分描述了如何使用 yum:

  • 搜索软件包。
  • 列出软件包。
  • 列出软件仓库。
  • 显示软件包信息。
  • 列出软件包组。
  • 在 yum 输入中指定全局表达式。

12.3.1. 使用 yum 搜索软件包

  • 要搜索软件包,使用:

    # yum search term

    使用与该软件包相关的术语替换 term

    请注意, yum search 命令返回与软件包名称和概述中的术语匹配。这样可加快搜索速度,您可以搜索您不知道名称但您了解相关术语的软件包。

  • 要在软件包描述中包含匹配名,请使用:

    # yum search --all term

    用您要在软件包名称、概述或描述中搜索的术语替换 term

    请注意, yum search --all 启用了更详细但更慢的搜索。

12.3.2. 使用 yum 列出软件包

  • 要列出所有安装以及可用软件包的信息,请使用:

    # yum list --all
  • 要列出安装在您的系统中的所有软件包,请使用:

    # yum list --installed
  • 要列出所有启用的库中所有可用来安装的软件包,请使用:

    # yum list --available

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.3.6 节 “在 yum 输入中指定全局表达式”

12.3.3. 使用 yum 列出库

  • 要列出您系统中所有启用的库,请使用:

    # yum repolist
  • 要列出系统中所有禁用的软件仓库,请使用:

    # yum repolist --disabled
  • 要列出启用和禁用的存储库,请使用:

    # yum repolist --all
  • 要列出有关存储库的附加信息,请使用:

    # yum repoinfo

请注意,您可以通过传递 ID 或库名称作为参数或者附加全局表达式来过滤结果。详情请查看 第 12.3.6 节 “在 yum 输入中指定全局表达式”

12.3.4. 使用 yum 显示软件包信息

  • 要显示一个或多个软件包的信息,请使用:

    # yum info package-name

    使用软件包名称替换 package-name

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.3.6 节 “在 yum 输入中指定全局表达式”

12.3.5. 使用 yum 列出软件包组

  • 要查看已安装的和可用组的数量,请使用:

    # yum group summary
  • 要列出所有安装的和可用的组,请使用:

    # yum group list

    请注意,您可以通过为 yum group list 命令添加命令行选项(--hidden--available)过滤结果。更多可用选项请查看 man page。

  • 要列出特定组群中包含的强制和可选软件包,请使用:

    # yum group info group-name

    用组群的名称替换 group-name

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.7.4 节 “在 yum 输入中指定全局表达式”

12.3.6. 在 yum 输入中指定全局表达式

yum 命令允许您将一个或多个 glob 表达式附加为参数来过滤结果。当作为参数传递给 yum 命令时,全局表达式必须被转义。要确定将全局表达式传递给 yum,请使用以下方法之一:

  • 使用双引号或单引号包括整个全局表达式。

    # yum provides "*/file-name"

    用文件名替换 file-name

  • 在它们前面使用反斜杠(\)字符转义通配符字符。

    # yum provides \*/file-name

    用文件名替换 file-name

12.4. 安装软件包

下面的部分描述了如何使用 yum:

  • 安装软件包。
  • 安装软件包组。
  • 在 yum 输入中指定软件包名称。

12.4.1. 使用 yum 安装软件包

  • 要安装软件包以及所有软件包的依赖软件包,请使用:

    # yum install package-name

    使用软件包名称替换 package-name

  • 要同时安装多个软件包及其依赖软件包,请使用:

    # yum install package-name-1 package-name-2

    使用软件包名称替换 package-name-1package-name-2

  • 当在一个 multilib 系统(AMD64、Intel 64 机器)中安装软件包时,您可以指定软件包的构架,方法是将其附加到软件包名称中:

    # yum install package-name.arch

    使用软件包的名称和构架替换 package-name.arch

  • 如果您知道要安装的二进制代码的名称,但不知道软件包名,则可以使用到这个二进制代码的路径作为一个参数:

    # yum install /usr/sbin/binary-file

    使用二进制文件的路径替换 /usr/sbin/binary-file

    yum 搜索软件包列表,找到提供 /usr/sbin/binary-file 的软件包,并提示您是否要安装它。

  • 要从本地目录中安装之前下载的软件包,请使用:

    # yum install /path/

    使用到该软件包的路径替换 /path/

请注意,您可以通过显式定义如何解析参数来优化软件包搜索。详情请查看 第 12.4.3 节 “在 yum 输入中指定软件包名称”

12.4.2. 使用 yum 安装软件包组

  • 要根据组名称安装软件包组,请使用:

    # yum group install group-name

    或者

    # yum install @group-name

    使用组群或者环境组群的完整名称替换 group-name

  • 要根据 groupID 安装软件包组,请使用:

    # yum group install groupID

    使用组 ID 替换 groupID

12.4.3. 在 yum 输入中指定软件包名称

要优化安装和删除过程,您可以在 yum installyum remove 命令中附加 -n-na-nerva 后缀,以明确定义如何解析参数:

  • 要使用准确的名称安装软件包,请使用:

    # yum install-n name

    使用具体软件包名称替换 name

  • 要使用准确的名称和构架安装软件包,请使用:

    # yum install-na name.architecture

    使用软件包的实际名称和构架替换 namearchitecture

  • 要使用准确的名称、epoch、version、release 和 architecture 安装软件包,请使用:

    # yum install-nevra name-epoch:version-release.architecture

    用软件包的名称、epoch、版本、发行和架构替换 nameepochversionreleasearchitecture

12.5. 更新软件包

yum 允许您检查您的系统是否有待处理的更新。您可以列出需要更新的软件包,并选择更新单个软件包、多个软件包或者所有软件包。如果您选择更新的软件包有依赖项,它们也会被更新。

下面的部分描述了如何使用 yum:

  • 检查更新。
  • 更新单个软件包。
  • 更新软件包组。
  • 更新所有软件包及其依赖项。
  • 应用安全更新。
  • 自动软件更新。

12.5.1. 检查 yum 更新

  • 要查看您系统中安装的软件包是否有可用的更新,请使用:

    # yum check-update

    输出返回有可用更新的软件包及其依赖项列表。

12.5.2. 使用 yum 更新单个软件包

  • 要更新软件包,请使用:

    # yum update package-name

    使用软件包名称替换 package-name

重要

当对内核应用更新时, yum 总会 安装 一个新内核,无论您是使用 yum update 还是 yum install 命令。

12.5.3. 使用 yum 更新软件包组

  • 要更新软件包组,请使用:

    # yum group update group-name

    使用软件包组的名称替换 group-name

12.5.4. 使用 yum 更新所有软件包及其依赖项

  • 要更新所有软件包及其依赖项,请使用:

    # yum update

12.5.6. 自动化软件更新

要自动检查并下载软件包更新,您可以使用 dnf-automatic 软件包提供的 DNF Automatic 工具。

DNF Automaticyum 的替代命令行界面,它适用于使用 systemd 计时器、cron 任务和其它此类工具自动和常规执行。

DNF Automatic 根据需要同步软件包元数据,然后检查可用更新。之后,该工具可以根据您的配置方式执行以下操作之一:

  • Exit
  • 下载更新的软件包
  • 下载并应用更新

然后,操作的结果由所选机制报告,如标准输出或电子邮件。

12.5.6.1. 安装 DNF Automatic

以下流程描述了如何安装 DNF Automatic 工具。

流程

  • 要安装 dnf-automatic 软件包,请使用:

    # yum install dnf-automatic

验证步骤

  • 要验证成功安装,请运行以下命令确认是否存在 dnf-automatic 软件包:

    # rpm -qi dnf-automatic

12.5.6.2. DNF Automatic 配置文件

默认情况下,DNF Automatic 使用 /etc/dnf/automatic.conf 作为其配置文件定义其行为。

配置文件被分隔为以下主题部分:

  • [commands] 部分

    设置 DNF Automatic 的操作模式。

  • [emitters] 部分

    定义如何报告 DNF Automatic 的结果。

  • [command_email] 部分

    为用来发送电子邮件的外部命令提供电子邮件发布程序配置。

  • [email] 部分

    提供电子邮件发布程序配置。

  • [base] 部分

    覆盖 yum 主配置文件中的设置。

使用 /etc/dnf/automatic.conf 文件的默认设置, DNF Automatic 检查可用更新,下载它们,并将结果报告为标准输出。

警告

[commands] 部分中的操作模式设置会被 systemd 计时器单元用于除 dnf-automatic.timer 以外的所有计时器单元的设置覆盖。

其它资源

12.5.6.3. 启用 DNF Automatic

要运行 DNF Automatic,您始终需要启用并启动特定的 systemd 计时器单元。您可以使用 dnf-automatic 软件包中提供的计时器单元之一,或者根据需要编写您自己的计时器单元。

下面的部分论述了如何启用 DNF Automatic

先决条件

  • 您可以通过修改 /etc/dnf/automatic.conf 配置文件来指定 DNF Automatic 的行为。

有关 DNF Automatic 配置文件的更多信息,请参阅 section 2.5.6.2 "DNF Automatic 配置文件"。

流程

  • 选择、启用并启动一个符合您需要的 systemd 计时器单元:

    # systemctl enable --now <unit>

    其中 <unit> 是以下计时器之一:

    • dnf-automatic-download.timer
    • dnf-automatic-install.timer
    • dnf-automatic-notifyonly.timer
    • dnf-automatic.timer

下载 可用更新,请使用:

# systemctl enable dnf-automatic-download.timer
# systemctl start dnf-automatic-download.timer

下载并安装 可用更新,请使用:

# systemctl enable dnf-automatic-install.timer
# systemctl start dnf-automatic-install.timer

报告 可用更新,请使用:

# systemctl enable dnf-automatic-notifyonly.timer
# systemctl start dnf-automatic-notifyonly.timer

另外,您可以使用:

# systemctl enable dnf-automatic.timer
# systemctl start dnf-automatic.timer

就下载和应用更新而言,这个计时器单元的行为根据 /etc/dnf/automatic.conf 配置文件中的设置实现。默认行为类似于 dnf-automatic-download.timer:它下载更新的软件包,但不安装它们。

注意

另外,您还可以从命令行或自定义脚本直接执行 /usr/bin/dnf-automatic 文件来运行 DNF Automatic

验证步骤

  • 要验证是否启用了计时器,请运行以下命令:

    # systemctl status <systemd timer unit>

其它资源

12.5.6.4. dnf-automatic 软件包中包含的 systemd 计时器单元概述

systemd 计时器单元优先使用 /etc/dnf/automatic.conf 配置文件中有关下载和应用更新的设置。

例如,如果您设置了:

download_updates = yes

/etc/dnf/automatic.conf 配置文件中,但已激活了 dnf-automatic-notifyonly.timer 单元,软件包不会下载。

dnf-automatic 软件包包括以下 systemd 计时器单元:

计时器单元功能覆盖 /etc/dnf/automatic.conf 文件中的设置?

dnf-automatic-download.timer

下载软件包以便进行更新。

注: 这个计时器单元没有安装更新的软件包。要执行安装,您必须执行 dnf update 命令。

dnf-automatic-install.timer

下载并安装更新的软件包。

dnf-automatic-notifyonly.timer

只下载存储库数据以保持存储库缓存最新状态,并通知您可用更新。

注: 这个计时器单元不下载或安装更新的软件包

dnf-automatic.timer

此计时器有关下载和应用更新的行为是由 /etc/dnf/automatic.conf 配置文件中的设置指定。

默认行为与 dnf-automatic-download.timer 单元相同:它只下载软件包,但不安装它们。

其它资源

12.6. 卸载软件包

下面的部分描述了如何使用 yum:

  • 删除软件包。
  • 删除软件包组。
  • 在 yum 输入中指定软件包名称。

12.6.1. 使用 yum 删除软件包

  • 要删除某个软件包以及所有相依性软件包,请使用:

    # yum remove package-name

    使用软件包名称替换 package-name

  • 要同时删除多个软件包及其依赖项,请使用:

    # yum remove package-name-1 package-name-2

    使用软件包名称替换 package-name-1package-name-2

注意

在删除其依赖软件包前。yum 无法删除软件包。

请注意,您可以通过显式定义如何解析参数来优化软件包搜索。详情请查看 第 12.6.3 节 “在 yum 输入中指定软件包名称”

12.6.2. 使用 yum 删除软件包组

  • 要根据组群名称删除软件包组,请使用:

    # yum group remove group-name

    或者

    # yum remove @group-name

    使用组群的全名替换 group-name

  • 要通过 groupID 删除软件包组,请使用:

    # yum group remove groupID

    使用组 ID 替换 groupID

12.6.3. 在 yum 输入中指定软件包名称

要优化安装和删除过程,您可以在 yum installyum remove 命令中附加 -n-na-nerva 后缀,以明确定义如何解析参数:

  • 要使用准确的名称安装软件包,请使用:

    # yum install-n name

    使用具体软件包名称替换 name

  • 要使用准确的名称和构架安装软件包,请使用:

    # yum install-na name.architecture

    使用软件包的实际名称和构架替换 namearchitecture

  • 要使用准确的名称、epoch、version、release 和 architecture 安装软件包,请使用:

    # yum install-nevra name-epoch:version-release.architecture

    用软件包的名称、epoch、版本、发行和架构替换 nameepochversionreleasearchitecture

12.7. 管理软件包组

软件包组是用于共同目的的软件包集合(System ToolsSound and Video)。安装软件包组会拉取一组依赖软件包,这可节省大量时间。

下面的部分描述了如何使用 yum:

  • 列出软件包组。
  • 安装软件包组。
  • 删除软件包组。
  • 在 yum 输入中指定全局表达式。

12.7.1. 使用 yum 列出软件包组

  • 要查看已安装的和可用组的数量,请使用:

    # yum group summary
  • 要列出所有安装的和可用的组,请使用:

    # yum group list

    请注意,您可以通过为 yum group list 命令添加命令行选项(--hidden--available)过滤结果。更多可用选项请查看 man page。

  • 要列出特定组群中包含的强制和可选软件包,请使用:

    # yum group info group-name

    用组群的名称替换 group-name

请注意,您可以通过将全局表达式附加为参数来过滤结果。详情请查看 第 12.7.4 节 “在 yum 输入中指定全局表达式”

12.7.2. 使用 yum 安装软件包组

  • 要根据组名称安装软件包组,请使用:

    # yum group install group-name

    或者

    # yum install @group-name

    使用组群或者环境组群的完整名称替换 group-name

  • 要根据 groupID 安装软件包组,请使用:

    # yum group install groupID

    使用组 ID 替换 groupID

12.7.3. 使用 yum 删除软件包组

  • 要根据组群名称删除软件包组,请使用:

    # yum group remove group-name

    或者

    # yum remove @group-name

    使用组群的全名替换 group-name

  • 要通过 groupID 删除软件包组,请使用:

    # yum group remove groupID

    使用组 ID 替换 groupID

12.7.4. 在 yum 输入中指定全局表达式

yum 命令允许您将一个或多个 glob 表达式附加为参数来过滤结果。当作为参数传递给 yum 命令时,全局表达式必须被转义。要确定将全局表达式传递给 yum,请使用以下方法之一:

  • 使用双引号或单引号包括整个全局表达式。

    # yum provides "*/file-name"

    用文件名替换 file-name

  • 在它们前面使用反斜杠(\)字符转义通配符字符。

    # yum provides \*/file-name

    用文件名替换 file-name

12.8. 处理软件包管理历史记录

yum history 命令允许您查看有关 yum 事务的范围、发生日期和时间、受影响的软件包数量、这些事务是成功还是被终止的信息,以及 RPM 数据库在事务间是否有变化。yum history 也可以用命令来撤销或重做事务。

下面的部分描述了如何使用 yum:

  • 列出事务。
  • 恢复事务。
  • 重复事务。
  • 在 yum 输入中指定全局表达式。

12.8.1. 使用 yum 列出事务

  • 要显示所有最新的 yum 事务列表,请使用:

    # yum history
  • 要显示所选软件包的最新操作列表,请使用:

    # yum history list package-name

    使用软件包名称替换 package-name。您可以通过附加全局表达式来过滤命令输出。详情请查看 第 12.8.4 节 “在 yum 输入中指定全局表达式”

  • 要检查特定的事务,请使用:

    # yum history info transactionID

    用事务的 ID 替换 transactionID

12.8.2. 使用 yum 恢复事务

  • 要恢复特定的事务,请使用:

    # yum history undo transactionID

    用事务的 ID 替换 transactionID

  • 要恢复到最后的事务,请使用:

    # yum history undo last

请注意, yum history undo 命令只恢复事务期间执行的操作步骤。如果事务安装了一个新的软件包, yum history undo 命令会卸载它。如果事务卸载了软件包,yum history undo 命令会重新安装它。yum history undo 另外,如果旧的软件包仍然可用,则尝试将所有更新的软件包降级到之前的版本。

12.8.3. 使用 yum 重复事务

  • 要重复特定的事务,请使用:

    # yum history redo transactionID

    用事务的 ID 替换 transactionID

  • 要重复最后的事务,请使用:

    # yum history redo last

请注意, yum history redo 命令只重复事务期间执行的操作步骤。

12.8.4. 在 yum 输入中指定全局表达式

yum 命令允许您将一个或多个 glob 表达式附加为参数来过滤结果。当作为参数传递给 yum 命令时,全局表达式必须被转义。要确定将全局表达式传递给 yum,请使用以下方法之一:

  • 使用双引号或单引号包括整个全局表达式。

    # yum provides "*/file-name"

    用文件名替换 file-name

  • 在它们前面使用反斜杠(\)字符转义通配符字符。

    # yum provides \*/file-name

    用文件名替换 file-name

12.9. 管理软件存储库

yum 及相关工具的配置信息保存在 /etc/yum.conf 文件中。此文件包含一个或多个 [repository] 部分,用于设置特定软件仓库选项。

建议您在 .repo 目录中的新或现有 /etc/yum.repos.d/ 文件中定义单独的软件仓库。

请注意,您在 [repository] 文件的独立 /etc/yum.conf 部分中定义的值会覆盖 [main] 部分中设置的值。

下面的部分描述了如何:

  • 设置 [repository] 选项。
  • 添加 yum 软件仓库。
  • 启用 yum 软件仓库。
  • 禁用 yum 软件仓库。

12.9.1. 设置 yum 软件仓库选项

/etc/yum.conf 配置文件包含 [repository] 部分,其中 repository 是唯一 的存储库 ID。[repository] 部分允许您定义独立的 yum 软件仓库。

注意

不要给出红帽软件仓库使用的自定义软件仓库名称以避免冲突。

有关可用 [repository] 选项的完整列表,请查看 yum.conf(5)手册页中的 [repository] OPTIONS 部分。

12.9.2. 添加 yum 软件仓库

要定义新软件仓库,您可以:

  • /etc/yum.conf 文件中添加 [repository] 部分。
  • /etc/yum.repos.d/ 目录中的 .repo 文件中添加 [repository] 部分。

    yum 软件仓库通常提供它们自己的 .repo 文件。

注意

建议您在 .repo 文件中而不是 /etc/yum.conf 中定义您的程序库,因为在这个目录中的所有 .repo 文件扩展名都被 yum 读取。

  • 要在您的系统中添加库并启用该程序,请使用:

    # yum-config-manager --add-repo repository_URL

    使用指向库的 URL 替换 repository_url

警告

从基于红帽证书的 Content Delivery Network (CDN)以外的未经验证或不受信任的源获取并安装软件包会存在潜在的安全隐患,并可能导致安全、稳定性、兼容性和维护问题。

12.9.3. 启用 yum 软件仓库

12.9.4. 禁用 yum 软件仓库

12.10. 配置 yum

yum 及相关工具的配置信息保存在 /etc/yum.conf 文件中。这个文件包含一个必须的 [main] 部分,它可让您设置具有全局效果的 yum 选项。

下面的部分描述了如何:

  • 查看当前的 yum 配置。
  • 设置 yum [main] options。
  • 使用 yum 插件。

12.10.1. 查看当前的 yum 配置

  • 要显示在 /etc/yum.conf 文件的 [main] 部分指定的全局 yum 选项的当前值,请使用:

    # yum config-manager --dump

12.10.2. 设置 yum 主选项

/etc/yum.conf 配置文件包含一个 [main] 部分。本节中的键值对会影响 yum 如何运行和对待软件仓库。

您可以在 /etc/yum.conf[main] 部分标题下添加附加选项。

有关可用 [main] 选项的完整列表,请查看 yum.conf(5)手册页中的 [main] OPTIONS 部分。

12.10.3. 使用 yum 插件

yum 提供扩展和增强操作的插件。默认安装某些插件。

下面的部分论述了如何启用、配置和禁用 yum 插件。

12.10.3.1. 管理 yum 插件

插件配置文件始终包含 [main] 部分,其中 enabled= 选项控制在运行 yum 命令时插件是否启用。如果缺少这个选项,您可以手动将其添加到该文件中。

每个安装的插件在 /etc/dnf/plugins/ 目录中都有自己的配置文件。您可以在这些文件中启用或禁用特定插件选项。

12.10.3.2. 启用 yum 插件

  • 启用所有 yum 插件:

    1. 确定 /etc/yum.conf 文件的 [main] 部分有以 plugins= 开头的行。
    2. plugins= 的值设置为 1

      plugins=1

12.10.3.3. 禁用 yum 插件

  • 禁用所有 yum 插件:

    1. 确定 /etc/yum.conf 文件的 [main] 部分有以 plugins= 开头的行。
    2. plugins= 的值设置为 0

      plugins=0
      重要

      不建议禁用所有插件。某些插件提供重要的 yum 服务。特别是 product-idsubscription-manager 插件,它们支持基于证书的 Content Delivery Network (CDN)。在全局范围内禁用插件作为一个方便的选项,只有在诊断 yum 的潜在问题时才建议使用。

  • 要禁用特定命令的所有 yum 插件,请在该命令中附加 --noplugins 选项。

    # yum --noplugins update
  • 要在单个命令中禁用特定的 yum 插件,请在该命令中附加 --disableplugin=plugin-name 选项。

    # yum update --disableplugin=plugin-name

    使用插件的名称替换 plugin-name

第 13 章 systemd 简介

Systemd 是 Linux 操作系统的系统和服务管理器。它旨在与 SysV 初始化脚本向后兼容,它提供很多功能,比如在引导时并行启动系统服务、按需激活守护进程或基于依赖项的服务控制逻辑。从 Red Hat Enterprise Linux 7 开始, systemd 替换了 Upstart 作为默认 init 系统。

systemd 引进了 systemd 单元 的概念。这些单元由位于下表中列出的目录之一的单元配置文件来表示。

表 13.1. systemd 单元文件位置

目录描述

/usr/lib/systemd/system/

安装的 RPM 软件包中的 systemd 单元文件。

/run/systemd/system/

在运行时创建的 systemd 单元文件。该目录优先于安装了的服务单元文件的目录。

/etc/systemd/system/

Systemd 单元文件由 systemctl enable 创建,并添加用于扩展服务的单元文件。这个目录优先于带有运行时单元文件的目录。

单元封装了以下相关信息:

  • 系统服务
  • 侦听套接字
  • 与 init 系统相关的其他对象

有关可用 systemd 单元类型的完整列表,请查看下表。

表 13.2. 可用的 systemd 单元类型

单位类型文件扩展描述

服务单元

.service

系统服务。

目标单元

.target

一组 systemd 单元。

Automount 单元

.automount

文件系统自动挂载点。

设备单元

.device

内核可识别的设备文件。

挂载单位

.mount

文件系统挂载点。

路径单元

.path

文件系统中的一个文件或者目录。

Scope 单元

.scope

外部创建的进程。

Slice 单元

.slice

一组管理系统进程的分层组织单元。

套接字单元

.socket

进程间的通信套接字。

Swap 单元

.swap

一个交换设备或者一个交换文件。

计时器单元

.timer

systemd 计时器。

使用 system.conf 覆盖默认的 systemd 配置

默认 systemd 配置是在编译过程中定义的,它可在 /etc/systemd/system.conf 的 systemd 配置文件中找到。如果您想与那些默认值分离,并全局覆盖所选的 systemd 单元默认值,请使用这个文件。

例如:要覆盖超时限制的默认值(设置为 90 秒),请使用 DefaultTimeoutStartSec 参数输入所需的值,以秒为单位。

DefaultTimeoutStartSec=required value

有关详情请参考 例 17.2 “更改超时限制”

13.1. 主要特性

systemd 系统和服务管理器提供以下主要功能:

  • 基于套接字的激活 - 在引导时, systemd 会为所有支持这类激活的系统服务创建侦听套接字,并在启动后将套接字传递给这些服务。这不仅允许 systemd 并行启动服务,还可以在不可用时丢失任何信息来重启服务:对应的套接字可一直访问,并将所有信息放入队列。

    Systemd 使用 套接字单元进行基于套接字的激活。

  • 基于总线的激活 - 使用 D-Bus 进行进程间通信的系统服务可以按需启动,同时客户端应用程序第一次尝试与它们通信。Systemd 使用 D-Bus 服务文件 进行基于总线的激活。
  • 基于设备的激活 - 支持基于设备的激活的系统服务可以按需启动,当特定类型的硬件插入或变得可用时。systemd 使用设备单元作为基于设备的激活。
  • 基于路径的激活 - 当某个特定文件或目录改变其状态时,支持基于路径的激活的系统服务可以按需启动。systemd 使用 路径单位作为基于路径的激活。
  • 挂载和自动挂载点管理 - Systemd 监控并管理挂载和自动挂载点。Systemd 使用 mount 单元用于挂载点, automount 单元 用于自动挂载点。
  • 活跃的 并行化 - 因为使用基于套接字的激活,所以 systemd 可以在所有监听套接字都存在后马上并行启动系统服务。和支持按需激活的系统服务相结合,并行激活可大大减少引导系统所需的时间。
  • 事务单元激活逻辑 - 在激活或取消激活一个单元前, systemd 计算其依赖项,创建一个临时事务,并验证这个事务是否一致。如果事务不一致, systemd 会自动尝试更正它,并在报告错误前从中移除非必要作业。
  • 与 SysV init 的后向兼容性 - Systemd 支持 SysV init 脚本,如 Linux Standard Base Core Specification 所述,这可简化对 systemd 服务单元的升级路径。

13.2. 兼容性更改

systemd 系统和服务管理器的主要设计思想是与 SysV init 和 Upstart 兼容。以下是与使用 SysV init 的 Red Hat Enterprise Linux 6 系统相关的最显著兼容性更改:

  • Systemd 只对运行级别(runlevel)提供有限支持。它提供了很多目标单元,它们可以直接映射到这些运行级别,并且出于兼容性的原因,它也会使用之前的 runlevel 命令发布。不是所有 systemd 目标都可以直接映射到运行级别,因此这个命令可能会返回 N 以指示未知运行级别。建议您尽可能避免使用 runlevel 命令。
    有关 systemd 目标及其与运行级别比较的详情请参考 第 15 章 使用 systemd 目标
  • systemctl 工具不支持自定义命令。除了标准命令,如 startstopstatus 外,SysV 初始化脚本的作者也可以实现对任意任意命令的支持,以便提供额外的功能。例如: iptables 的初始化脚本可以使用 panic 命令执行,该命令会立即启用 panic 模式并重新配置系统以开始丢弃所有传入和传出的数据包。systemd 不支持这个设置, systemctl 只接受记录的命令。
  • systemctl 实用程序不会与 systemd 启动的服务进行通信。当 systemd 启动系统服务时,它会保存其主进程的 ID 以跟踪它。然后, systemctl 工具会使用这个 PID 来查询和管理该服务。因此,如果用户直接在命令行启动特定的守护进程, systemctl 将无法决定其当前状态或停止它。
  • Systemd 只停止运行的服务。在以前的版本中,当启动关闭序列时,Red Hat Enterprise Linux 6 以及之前的发行本都使用位于 /etc/rc0.d/ 目录中的符号链接停止所有可用的系统服务,而不考虑它们的状态。使用 systemd 时,只有运行的服务才会在关闭时停止。
  • 系统服务无法从标准输入流读取。当 systemd 启动服务时,它会将其标准输入连接到 /dev/null,以防止与用户交互。
  • 系统服务不会从调用用户及其会话继承任何上下文(如 HOMEPATH 环境变量)。每个服务在干净执行环境中运行。
  • 当载入 SysV init 脚本时, systemd 会读取 Linux Standard Base(LSB)标头中编码的依赖项信息,并在运行时解释它。
  • 服务单元中的所有操作都会被默认超时 5 分钟,以防止出现故障的服务中断。这个值在从 initscripts 生成的且无法更改的服务中是被硬编码的。但是,各个配置文件可以用来指定一个较长的超时值,请参阅 例 17.2 “更改超时限制”

有关使用 systemd 引进的兼容性更改的详细列表,请查看 Red Hat Enterprise Linux 7 的 迁移规划指南

第 14 章 使用 systemctl 管理系统服务

systemctl 工具有助于管理系统服务。您可以使用 systemctl 实用程序执行与不同服务相关的不同任务,如启动、停止、重启、启用和禁用服务、列出服务以及显示系统服务状态。

这部分论述了如何使用 systemctl 工具管理系统服务。

14.1. 使用 systemctl 的服务单元管理

服务单元 可帮助控制系统中的服务和守护进程状态。

服务单元以 .service 文件扩展名结尾,例如 nfs-server.service。但是,在命令中使用服务文件名时,您可以省略文件扩展名。systemctl 工具假设参数是一个服务单元。例如,要停止 nfs-server.service,请输入以下命令:

# systemctl stop nfs-server

另外,有些服务单元都有 别名。别名可能小于单位,您可以使用它们而不是实际的单元名称。

要查找可用于特定单元的所有别名,请使用:

# systemctl show nfs-server.service -p Names

14.2. service 工具程序和 systemctl 的比较

本节显示了服务工具与 systemctl 命令使用的比较。

表 14.1. service 工具程序和 systemctl 的比较

servicesystemctl描述

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>.service

仅在运行时重启服务。

service <name> reload

systemctl reload <name>.service

重新加载配置。

service <name> status

systemctl status <name>.service

systemctl is-active <name>.service

检查服务是否在运行。

service --status-all

systemctl list-units --type service --all

显示所有服务的状态。

14.3. 列出系统服务

您可以列出所有当前载入的服务单元以及所有可用服务单元的状态。

流程

  • 要列出所有当前载入的服务单元,请输入:

    $ systemctl list-units --type service
    UNIT                     LOAD   ACTIVE SUB     DESCRIPTION
    abrt-ccpp.service        loaded active exited  Install ABRT coredump hook
    abrt-oops.service        loaded active running ABRT kernel log watcher
    abrtd.service            loaded active running ABRT Automated Bug Reporting Tool
    ...
    systemd-vconsole-setup.service loaded active exited  Setup Virtual Console
    tog-pegasus.service            loaded active running OpenPegasus CIM Server
    
    LOAD   = Reflects whether the unit definition was properly loaded.
    ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
    SUB    = The low-level unit activation state, values depend on unit type.
    
    46 loaded units listed. Pass --all to see loaded but inactive units, too.
    To show all installed unit files use 'systemctl list-unit-files'

    默认情况下, systemctl list-units 命令只显示活跃的单元。对于每个服务单元文件,命令会显示:

    • UNIT: 其全名
    • LOAD: 是否载入该单元文件的信息
    • ACTIVE\ SUB:其高级别和低级单元文件激活状态
    • DESCRIPTION: 简短描述
  • 要列出 所有载入的单元,无论它们的状态 如何,请使用 --all-a 命令行选项输入以下命令:

    $ systemctl list-units --type service --all
  • 要列出所有可用服务单元的状态(启用/禁用),请输入:

    $ systemctl list-unit-files --type service
    UNIT FILE                               STATE
    abrt-ccpp.service                       enabled
    abrt-oops.service                       enabled
    abrtd.service                           enabled
    ...
    wpa_supplicant.service                  disabled
    ypbind.service                          disabled
    
    208 unit files listed.

    对于每个服务单元,这个命令会显示:

    • UNIT FILE: 其全名
    • STATE: 服务单元是否启用或禁用

14.4. 显示系统服务状态

您可以检查任何服务单元来获取其详细信息,并验证服务的状态,无论它是否已启用还是正在运行。您还可以查看在特定服务单元之后或之前排序启动的服务。

流程

  • 要显示与系统服务对应的服务单元的详细信息,请输入:

    $ systemctl status <name>.service

    <name> 替换为您要检查的服务单元的名称(例如 gdm)。

    这个命令显示所选服务单元的名称,后接其简短描述、Available 服务单元信息 中描述的一个或多个字段(如果由 root 用户执行),以及最新的日志条目。

    表 14.2. 可用的服务单元信息

    描述

    Loaded

    是否载入了服务单元、到这个单元文件的绝对路径,以及是否启用该单位的信息。

    Active

    服务单元是否在运行的信息,后面有一个时间戳。

    Main PID

    对应系统服务的 PID 及其名称。

    Status

    相关系统服务的额外信息。

    Process

    有关相关进程的附加信息。

    CGroup

    有关相关控制组群(cgroups)的附加信息。

    例 14.1. 显示服务状态

    GNOME 显示管理器的服务单元名为 gdm.service。要确定这个服务单元的当前状态,在 shell 提示下键入以下内容:

    # systemctl status gdm.service
    gdm.service - GNOME Display Manager
       Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)
       Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
     Main PID: 1029 (gdm)
       CGroup: /system.slice/gdm.service
               ├─1029 /usr/sbin/gdm
               ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
               └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...
    
    Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.
  • 要只验证某个服务单元是否正在运行,请输入:

    $ systemctl is-active <name>.service
  • 要确定某个服务单元是否启用,请输入:

    $ systemctl is-enabled <name>.service
    注意

    如果指定的服务单元正在运行或启用, systemctl is-activesystemctl is-enabled 都会返回一个 0 退出状态。

  • 要确定在指定服务单元前调度什么服务启动,请输入:

    # systemctl list-dependencies --after <name>.service

    <name> 替换为命令中的服务名称。例如:要查看在 gdm 之前排序启动的服务列表,请输入:

    # systemctl list-dependencies --after gdm.service
    gdm.service
    ├─dbus.socket
    ├─getty@tty1.service
    ├─livesys.service
    ├─plymouth-quit.service
    ├─system.slice
    ├─systemd-journald.socket
    ├─systemd-user-sessions.service
    └─basic.target
    [output truncated]
  • 要确定在指定服务单元后调度的服务启动,请输入:

    # systemctl list-dependencies --before <name>.service

    <name> 替换为命令中的服务名称。例如:要查看在 gdm 后排序启动的服务列表,请输入:

    # systemctl list-dependencies --before gdm.service
    gdm.service
    ├─dracut-shutdown.service
    ├─graphical.target
    │ ├─systemd-readahead-done.service
    │ ├─systemd-readahead-done.timer
    │ └─systemd-update-utmp-runlevel.service
    └─shutdown.target
      ├─systemd-reboot.service
      └─final.target
        └─systemd-reboot.service

其它资源

14.5. 服务依赖项和负性

systemd 中,服务间存在正或负的依赖关系。启动特定服务可能需要启动一个或多个其他服务(正依赖项)或者停止一个或多个服务(负依赖项)。

当您试图启动新服务时, systemd 会自动解析所有依赖项,而无需向用户发出显式通知。这意味着,如果您已在运行服务,且您试图使用负依赖项启动另一个服务,则第一个服务会自动停止。

例如:如果您正在运行 postfix 服务,且您试图启动 sendmail 服务, systemd 首先会自动停止 postfix,因为这两个服务是冲突的,且不能在同一端口中运行。

其它资源

14.6. 启动系统服务

您可以使用 start 命令在当前会话中启动系统服务。您必须具有 root 访问权限,因为启动服务可能会影响操作系统的状态。

流程

  • 要启动与系统服务对应的所选服务单元,以 root 身份输入以下命令:

    # systemctl start <name>.service

    <name> 替换为您要启动的服务单元的名称(例如 httpd.service)。

    例 14.2. 启动 httpd.service

    Apache HTTP 服务器的服务单元名为 httpd.service。要激活这个服务单元并在当前会话中启动 httpd 守护进程,以 root 身份输入以下命令:

    # systemctl start httpd.service

14.7. 停止系统服务

您可以使用 stop 命令停止当前会话中的系统服务。您必须具有 root 访问权限,因为停止服务可能会影响操作系统的状态。

流程

  • 要停止与系统服务对应的服务单元,以 root 身份输入以下命令:

    # systemctl stop <name>.service

    <name> 替换为您要停止的服务单元的名称(例如 bluetooth)。

    例 14.3. 停止 bluetoothd.service

    bluetoothd 守护进程的服务单元命名为 bluetooth.service。要取消激活这个服务单元并在当前会话中停止 bluetoothd 守护进程,以 root 身份输入以下命令:

    # systemctl stop bluetooth.service

14.8. 重启系统服务

您可以使用 restart 命令重启当前会话中的系统服务。您必须具有 root 访问权限,因为重启服务可能会影响操作系统的状态。

这个步骤描述了如何:

  • 停止当前会话中所选服务单元并立即再次启动
  • 仅在相应服务已在运行时重启服务单元
  • 在不中断其执行的情况下重新载入系统服务的配置

流程

  • 要重启与系统服务对应的服务单元,以 root 身份输入以下命令:

    # systemctl restart <name>.service

    <name> 替换为您要重启的服务单元的名称(例如 httpd)。

    注意

    如果所选服务单元没有运行,这个命令也会启动它。

    • 另外,若要在相应服务已在运行时重启服务单元,以 root 身份输入以下命令:

      # systemctl try-restart <name>.service
    • 要在不中断服务的情况下重新载入配置,以 root 身份输入以下命令:

      # systemctl reload <name>.service
      注意

      不支持这个功能的系统服务会忽略这个命令。要重启这些服务,使用 reload-or-restartreload-or-try-restart 命令。

    例 14.4. 重新载入 httpd.service

    为了防止用户遇到不必要的错误信息或部分呈现网页,Apache HTTP 服务器允许您编辑并重新载入其配置,而无需重启它并中断主动处理的请求。要做到这一点,以 root 身份输入以下内容:

    # systemctl reload httpd.service

14.9. 启用系统服务

您可以将服务配置为在系统引导时自动启动。enable 命令读取所选服务单元的 [Install] 部分,并创建到 /etc/systemd/system/ 目录中的 /usr/lib/systemd/system/name.service 文件及其子目录中的正确符号链接。然而,它不会重写已经存在的链接。

流程

  • 要配置与系统服务对应的服务单元,在引导时自动启动,以 root 身份输入以下命令:

    # systemctl enable <name>.service

    <name> 替换为您要启用的服务单元的名称(例如 httpd)。

    • 如果要确保重新创建符号链接,以 root 身份输入以下命令:

      # systemctl reenable <name>.service

      该命令禁用所选服务单元,并立即再次启用。

      例 14.5. 启用 httpd.service

      要将 Apache HTTP 服务器配置为在引导时自动启动,以 root 身份输入以下命令:

      # systemctl enable httpd.service
      Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

14.10. 禁用系统服务

您可以防止服务单元在引导时自动启动。disable 命令读取所选服务单元的 [Install] 部分,并从 /etc/systemd/system/ 目录中删除到 /usr/lib/systemd/system/name.service 文件的适当符号链接。

流程

  • 要配置与系统服务对应的服务单元,在引导时不自动启动,以 root 身份输入以下命令:

    # systemctl disable <name>.service

    <name> 替换为您要禁用的服务单元的名称(例如 bluetooth)。

    例 14.6. 禁用 bluetoothd.service

    bluetoothd 守护进程的服务单元命名为 bluetooth.service。要防止这个服务单元在引导时启动,以 root 身份输入以下命令:

    # systemctl disable bluetooth.service
    Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
    Removed symlink /etc/systemd/system/dbus-org.bluez.service.
    • 要屏蔽任何服务单元并防止手动启动或者由其他服务启动,以 root 身份输入以下命令:

      # systemctl mask <name>.service

      这个命令将 /etc/systemd/system/name.service 文件替换为到 /dev/null 的符号链接,从而使 systemd 无法访问实际单元文件。

    • 要恢复这个动作并取消掩码一个服务单元,请输入:

      # systemctl unmask <name>.service

第 15 章 使用 systemd 目标

systemd 目标由目标单元表示。目标单元文件以 .target 文件扩展结尾,它们的唯一的目的是通过依赖关系链将其他 systemd 单元分组到一起。例如,用来启动图形会话的 graphical.target unit 启动系统服务,如 GNOME 显示管理器 (gdm.service) 或 Accounts Service (accounts-daemon.service),并激活 multi-user.target unit。同样, multi-user.target 单元会启动其他基本系统服务,如 NetworkManager (NetworkManager.service) 或 D-Bus (dbus.service),并激活名为 basic.target 的另一个目标单元。

本节包含使用 systemd 目标时要执行的步骤。

15.1. SysV 运行级别和 systemd 目标之间的区别

之前的 Red Hat Enterprise Linux 版本使用 SysV init 或 Upstart 发布,并实施一组代表特定操作模式的预定义的运行级别(runlevel)。这些运行级别从 0 到 6,由系统管理员启用特定运行级别时要运行的系统服务选择定义。从 Red Hat Enterprise Linux 7 开始,运行级别的概念已被 systemd 目标替代。

Red Hat Enterprise Linux 7 是由很多预定义目标发布的,它们与之前版本中的运行级别标准集合类似。出于兼容性的原因,它还为这些直接映射到 SysV 运行级别的别名提供了别名。

下表提供了 SysV 运行级别及其对应的 systemd 目标的完整列表:

表 15.1. SysV 运行级别与 systemd 目标的比较

运行级别目标单元描述

0

runlevel0.target, poweroff.target

关闭系统。

1

runlevel1.target, rescue.target

设置救援 shell。

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

关闭并重启系统。

下表将 SysV init 命令与 systemctl 进行比较。使用 systemctl 实用程序查看、更改或配置 systemd 目标:

重要

在系统中仍可使用 runleveltelinit 命令,并按预期工作,但只出于兼容性的原因包括,应该避免。

表 15.2. SysV init 命令与 systemctl 的比较

旧命令新命令描述

runlevel

systemctl list-units --type target

列出当前载入的目标单元。

telinit runlevel

systemctl isolate name.target

更改当前目标。

其它资源

  • man sysv init
  • man upstart init
  • man systemctl

15.2. 查看默认对象

默认目标单元由 /etc/systemd/system/default.target 文件表示。

流程

  • 要确定默认使用哪个目标单元:

    $ systemctl get-default
    graphical.target
  • 使用符号链接决定默认对象:

    $  ls -l /lib/systemd/system/default.target

15.3. 查看目标单元

默认情况下,systemctl list-units 命令只显示活跃的单元。

流程

  • 列出所有载入的单元,而不考虑它们的状态:

    $ systemctl list-units --type target --all
  • 要列出所有当前载入的目标单元:

    $ systemctl list-units --type target
    
    UNIT                  LOAD   ACTIVE SUB    DESCRIPTION
    basic.target          loaded active active Basic System
    cryptsetup.target     loaded active active Encrypted Volumes
    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.target        loaded active active Network
    paths.target          loaded active active Paths
    remote-fs.target      loaded active active Remote File Systems
    sockets.target        loaded active active Sockets
    sound.target          loaded active active Sound Card
    spice-vdagentd.target loaded active active Agent daemon for Spice guests
    swap.target           loaded active active Swap
    sysinit.target        loaded active active System Initialization
    time-sync.target      loaded active active System Time Synchronized
    timers.target         loaded active active Timers
    
    LOAD   = Reflects whether the unit definition was properly loaded.
    ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
    SUB    = The low-level unit activation state, values depend on unit type.
    
    17 loaded units listed.

15.4. 更改默认对象

默认目标单元由 /etc/systemd/system/default.target 文件表示。以下流程描述了如何使用 systemctl 命令更改默认目标:

流程

  1. 要确定默认目标单元:

    # systemctl get-default
  2. 将系统配置为默认使用不同的目标单元:

    # systemctl set-default multi-user.target
    rm /etc/systemd/system/default.target
    ln -s /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target

    这个命令将 /etc/systemd/system/default.target 文件替换为到 /usr/lib/systemd/system/name.target 的符号链接,其中 name 是您要使用的目标单元的名称。使用您要默认使用的目标单元的名称替换 multi-user

  3. 重启

    # reboot

15.6. 更改当前目标

此流程解释了如何使用 systemctl 命令更改当前会话中的目标单元。

流程

  • 在当前会话中切换到不同的目标单元:

    # systemctl isolate multi-user.target

    这个命令启动名为 multi-user 以及所有依赖的单元的目标单元,并立即停止所有其他单元。

使用您要默认使用的目标单元的名称替换 multi-user

验证步骤

  • 验证新创建的 default.target:

    $ systemctl get-default
    multi-user.target

15.7. 引导至救援模式

救援模式提供了一个方便的单用户环境,它可让您在无法完成常规引导过程时修复您的系统。在救援模式中,系统会尝试挂载所有本地文件系统并启动一些重要的系统服务,但不激活网络接口或者同时允许更多的用户登录到该系统。

流程

  • 要改变当前目标并在当前会话中进入救援模式:

    # systemctl rescue
    
    Broadcast message from root@localhost on pts/0 (Fri 2013-10-25 18:23:15 CEST):
    
    The system is going down to rescue mode NOW!
    注意

    这个命令和 systemctl isolate rescue.target 类似,但它也会向目前登录到该系统的所有用户发送一个信息信息。

    要防止 systemd 发送信息,使用 --no-wall 命令行选项运行以下命令: # systemctl --no-wall rescue

15.8. 引导至紧急模式

紧急模式 提供最小的环境,并可在系统无法进入救援模式的情况下修复您的系统。在紧急模式中,系统只挂载 root 文件系统进行读取,不会尝试挂载任何其他本地文件系统,不激活网络接口,且只启动几个必要的服务。

流程

  • 要更改当前目标并进入紧急模式:

    # systemctl emergency
    注意

    这个命令和 systemctl isolate emergency.target 类似,但它也会向目前登录到该系统的所有用户发送一个信息信息。

    要防止 systemd 发送这个信息,使用 --no-wall 命令行选项运行以下命令: # systemctl --no-wall emergency

第 16 章 关闭、挂起和休眠系统

本节包含关闭、挂起或休眠您的操作系统的说明。

16.1. 系统关闭

要关闭系统,您可以直接使用 systemctl 工具,或通过 shutdown 命令调用这个工具。

使用 shutdown 命令的优点是:

  • 支持时间参数

    这对调度的维护特别有用。另外,用户有足够的时间响应系统已经调度关闭的警告。

  • 取消关闭的选项

16.2. 使用 shutdown 命令关闭系统

按照以下步骤,您可以使用 shutdown 命令执行各种操作。您可以关闭系统并在一定时间关闭机器,或者在不关闭机器的情况下关闭和停止系统,或者取消待处理的关闭。

先决条件

  • 切换到 root 用户

流程

  • 要关闭系统并在一定时间关闭机器,以以下格式使用以下命令:

    shutdown --poweroff hh:mm

    这里的 hh:mm 是 24 小时时钟格式的时间。/run/nologin 文件会在系统关闭前 5 分钟创建,以防止新的登录。

    当使用时间参数时,可将可选的 挂起信息 附加到命令中。

    或者,要在一段延迟后关闭和停止系统,在不关闭机器的情况下,使用:

    shutdown --halt +m

    其中 +m 是延迟时间(以分钟为单位)。now 关键字是 +0 的别名。

    要取消待处理的关闭,请使用:

    shutdown -c

其它资源

16.3. 使用 systemctl 命令关闭系统

按照以下步骤,您可以使用 systemctl 命令执行各种操作。您可以关闭系统并关闭机器,也可以在不关闭机器的情况下关闭和停止系统。

先决条件

  • 切换到 root 用户

流程

  • 要关闭系统并关闭机器,以以下格式使用以下命令:

    systemctl poweroff

    另外,若要在不关闭机器的情况下关闭和停止系统,请使用:

    systemctl halt
注意

默认情况下,运行其中任何一个命令可让 systemd 向所有当前登录该系统的用户发送信息。要防止 systemd 发送这个信息,使用 --no-wall 命令行选项运行所选命令。

16.4. 重启系统

您可以按照此流程重启该系统。

先决条件

  • 切换到 root 用户

流程

  • 要重启该系统,请运行以下命令:

    systemctl reboot
注意

默认情况下,这个命令可使 systemd 向所有当前登录该系统的用户发送信息。要防止 systemd 发送这个信息,使用 --no-wall 命令行选项运行这个命令。

16.5. 挂起系统

您可以按照以下步骤挂起系统。

先决条件

  • 切换到 root 用户。

流程

  • 要挂起该系统,请运行以下命令:

    systemctl suspend

    该命令在 RAM 中保存系统状态,除了 RAM 模块外,关闭机器中的大多数设备。当您重新打开机器时,系统会从内存中恢复其状态,而无需再次引导。

    因为系统状态保存在 RAM 中而不是硬盘上,所以恢复系统从挂起模式比休眠要快得多。但请注意,挂起的系统状态也可能会出现电源问题。

其它资源

16.6. 休眠系统

按照这个步骤,您可以休眠系统或者休眠系统并暂停系统。

先决条件

  • 切换到 root 用户。

流程

  • 要休眠系统,请运行以下命令:

    systemctl hibernate

    该命令在硬盘驱动器中保存系统状态,并断开机器电源。当您重新打开机器时,系统会从保存的数据中恢复其状态,而无需再次引导。

    由于系统状态保存在硬盘上而不是 RAM 中,所以机器不必为 RAM 模块维护电源。因此,从休眠中恢复系统比恢复系统不再挂起模式要慢得多。

    或者,若要休眠并挂起系统,请运行以下命令:

    systemctl hybrid-sleep

其它资源

16.7. 使用 systemctl 概述电源管理命令

您可以使用以下 systemctl 命令列表来控制系统电源管理。

表 16.1. systemctl 电源管理命令概述

systemctl 命令描述

systemctl halt

关闭系统。

systemctl poweroff

关闭系统。

systemctl reboot

重启该系统。

systemctl suspend

挂起系统。

systemctl hibernate

休眠系统。

systemctl hybrid-sleep

休眠并挂起系统。

第 17 章 使用 systemd 单元文件

本章包含 systemd 单元文件的描述。以下部分介绍了如何进行:

  • 创建自定义单元文件
  • 将 SysV init 脚本转换为单元文件
  • 修改现有单元文件
  • 使用实例化单元

17.1. 单元文件简介

单元文件包含描述这个单元并定义其行为的配置指令。几个 systemctl 命令可用于后台的单元文件。要进行更细的调整,系统管理员必须手动编辑或创建单元文件。表 13.1 “systemd 单元文件位置” 列出将单元文件存储在系统中的三个主要目录, /etc/systemd/system/ 目录为系统管理员创建或自定义的单元文件保留。

单元文件名的格式如下:

unit_name.type_extension

在这里 , unit_name 代表单元名称, type_extension 代表单元类型,请参阅 表 13.2 “可用的 systemd 单元类型” 了解单元类型的完整列表。例如:系统中通常会有 sshd.servicesshd.socket 单元。

可通过一个目录来补充单元文件,以了解额外的配置文件。例如:要在 sshd.service 中添加自定义配置选项,请创建 sshd.service.d/custom.conf 文件并插入附加指令。有关配置目录的更多信息,请参阅 修改现有单元文件

另外,可以创建 sshd.service.wants/sshd.service.requires/ 目录。这些目录包含到 sshd 服务依赖的单元文件的符号链接。符号链接可在安装过程中根据 [Install] 单元文件选项或在运行时根据 [Unit] 选项自动创建。也可以手动创建这些目录和符号链接。有关 [Install] 和 [Unit] 选项的详情请参考下表。

可使用称为单元 指定符 - 通配符字符串来设置很多单元 文件选项,当载入单元文件时,它们会被动态替换为单元参数。这允许创建作为模板的通用单元文件,以生成实例化单元。详情请查看 使用实例化单元 进行操作。

17.2. 单元文件结构

单元文件通常由三个部分组成:

  • [Unit] 部分 - 包含不依赖于单元类型的通用选项。这些选项提供单元描述,指定单元的行为,并将依赖项设置为其他单元。有关最常用 [Unit] 选项的列表请参考 表 17.1 “重要 [Unit] 部分选项”
  • [Unit type] 部分 - 如果某个单元有特定类型指令,则在以单元类型命名的部分中分组。例如,服务单元文件包含 [Service] 部分。
  • [Install] 部分 - 包含 systemctl enabledisable 命令使用的单元安装的信息。有关 [Install] 部分的选项列表,请参阅 表 17.3 “重要 [Install] 部分选项”

17.2.1. 重要 [Unit] 部分选项

下表列出了 [Unit] 部分的重要选项。

表 17.1. 重要 [Unit] 部分选项

选项 [a]描述

Description

对这个单元有有意义的描述。这个文本显示在 systemctl status 命令的输出中。

Documentation

提供单元参考文档的 URI 列表。

After[b]

定义启动单位的顺序。这个单元仅在 After 中指定的单元处于活跃状态后启动。与 Requires 不同,After 不会显式激活指定的单元。Before 选项的功能与 After 相反。

Requires

配置其它单元上的依赖关系。Requires 中列出的单元与单元一同被激活。如果任何需要的单元无法启动,则该单位就不会被激活。

Wants

配置比 Requires 更弱的依赖项。如果列出的单元没有成功启动,它对单元激活不会有影响。这是建立自定义单元依赖项的建议方法。

Conflicts

配置负的依赖关系,与 Requires 相反。

[a] 有关 [Unit] 部分中可配置选项的完整列表,请查看 systemd.unit(5) 手册页。
[b] 在大多数情况下,只使用 AfterBefore 单元文件选项设置排序依赖关系就足够了。如果您还使用 Wants (推荐)或 Requires 设置了需要的依赖关系,仍需要指定依赖关系顺序。这是因为排序和要求依赖关系可以独立地工作。

17.2.2. 重要 [Service] 部分选项

下表列出了 [Service] 部分的重要选项。

表 17.2. 重要 [Service] 部分选项

选项 [a]描述

Type

配置影响 ExecStart 及相关选项功能的单元进程启动类型。其中之一:

* simple - 默认值。使用 ExecStart 启动的进程是该服务的主要进程。

* forking - 进程以 ExecStart 启动,生成一个作为服务主要进程的子进程。父进程在启动完成后会退出。

* oneshot - 这个类型与 simple 类似,但在启动单元前会退出。

* dbus - 这个类型与 simple 类似,但仅在主进程获得 D-Bus 名称后启动。

* notify - 这个类型与 simple 类似,但只有在通过 sd_notify() 函数发送通知消息后才启动该单元。

* idle - 与 simple 类似,服务二进制的实际执行会延迟到所有作业完成为止,这可以避免将状态输出与服务的 shell 输出混合。

ExecStart

指定在启动该单元时要执行的命令或脚本。ExecStartPreExecStartPost 指定在 ExecStart 之前和之后要执行的自定义命令。Type=oneshot 启用指定可按顺序执行的多个自定义命令。

ExecStop

指定在该单元停止时要执行的命令或脚本。

ExecReload

指定重新载入该单元时要执行的命令或脚本。

Restart

启用这个选项后,服务会在进程退出后重启,但 systemctl 命令有一个干净的 stop 除外。

RemainAfterExit

如果设为 True,即使其所有进程已退出,该服务也被视为活跃。默认值为 False。这个选项在配置了 Type=oneshot 时特别有用。

[a] 有关 [Service] 部分中可配置选项的完整列表,请查看 systemd.service(5) 手册页。

17.2.3. 重要 [Install] 部分选项

下表列出了 [Install] 部分的重要选项。

表 17.3. 重要 [Install] 部分选项

选项 [a]描述

Alias

为这个单元提供空格分开的额外名称列表。除 systemctl enable 外,大多数 systemctl 命令可使用别名而不是实际单元名称。

RequiredBy

依赖于这个单元的单元列表。当启用这个单元时, RequiredBy 中列出的单元会得到对这个单元的 Require 依赖项。

WantedBy

依赖于这个单元的单位列表。当启用这个单元时, WantedBy 中列出的单元会得到对这个单元的 Want 依赖项。

Also

指定要随这个单元一起安装或卸载的单元列表。

DefaultInstance

仅限于实例化单元,这个选项指定启用单位的默认实例。请参阅 使用实例化单元进行操作

[a] 有关 [Install] 部分中可配置选项的完整列表,请查看 systemd.unit(5) 手册页。

17.3. 创建自定义单元文件

从头开始创建单元文件有几个用例:您可以运行自定义守护进程,创建第二个现有服务实例(如 创建第二个 sshd 服务实例),或导入 SysV init 脚本(更多在 将 SysV init 脚本转换到单元文件中)。另一方面,如果您只想修改或扩展现有单元的行为,请使用 修改现有单元文件的说明。以下流程描述了创建自定义服务的一般过程。

流程

  1. 使用自定义服务准备可执行文件。这可以是自定义创建的脚本,也可以是软件供应商提供的可执行文件。如果需要,准备 PID 文件来保存自定义服务主要进程的恒定 PID。也可以包含环境文件来存储该服务的 shell 变量。确保源脚本是可执行文件(通过执行 chmod a+x),且不具有互动性。
  2. /etc/systemd/system/ 目录中创建单元文件并确保它有正确的文件权限。以 root 身份执行:

    touch /etc/systemd/system/name.service
    
    chmod 664 /etc/systemd/system/name.service

    使用要创建的服务的名称替换 name。请注意,该文件不需要可执行。

  3. 打开上一步中创建的 name.service 文件并添加服务配置选项。根据您想要创建的服务类型,可以使用各种选项,请参阅 单元文件结构。以下是网络相关服务的单元配置示例:

    [Unit]
    Description=service_description
    After=network.target
    
    [Service]
    ExecStart=path_to_executable
    Type=forking
    PIDFile=path_to_pidfile
    
    [Install]
    WantedBy=default.target

    其中:

    • Service_description 是一个说明性描述,在日志日志文件和 systemctl status 命令的输出中显示。
    • After 设置可确保仅在网络运行时启动该服务。添加以空格分隔的其他相关服务或目标的列表。
    • path_to_executable 代表到实际可执行服务的路径。
    • Type=forking 用于生成 fork 系统调用的守护进程。该服务的主要进程使用 path_to_pidfile 中指定的 PID 创建。更多与启动类型包括在 表 17.2 “重要 [Service] 部分选项”
    • WantedBy 说明服务应该启动的目标。将这些指标看成是旧的运行级别概念的替代。
  4. root 身份执行以下命令来通知 systemd 存在新的 name.service 文件:

    systemctl daemon-reload
    
    systemctl start name.service
    警告

    在创建新单元文件或修改现有单元文件后,始终运行 systemctl daemon-reload 命令。否则, systemctl startsystemctl enable 命令可能会因为 systemd 状态和磁盘中实际服务单元文件不匹配而失败。请注意,对于有大量单元的系统来说,这需要很长时间,因为每个单元的状态必须在重新载入的过程中被序列化,然后再进行反序列化。

17.3.1. 使用 sshd 服务的第二个实例创建自定义单元文件

系统管理员通常需要配置并运行多个服务实例。这可以通过创建原始服务配置文件的副本并修改某些参数来避免与服务的主实例冲突。以下流程演示了如何创建 sshd 服务第二个实例。

流程

  1. 创建第二个守护进程将使用的 sshd_config 文件副本:

    # cp /etc/ssh/sshd{,-second}_config
  2. 编辑上一步中创建的 sshd-second_config 文件,为第二个守护进程分配不同的端口号和 PID 文件:

    Port 22220
    PidFile /var/run/sshd-second.pid

    有关 PortPidFile 选项的更多信息,请参阅 sshd_config(5) manual page。请确定您选择的端口没有被其他服务使用。在运行该服务前,PID 文件不一定存在,它会在服务启动时自动生成。

  3. sshd 服务创建 systemd 单元文件副本:

    # cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshd-second.service
  4. 按如下方式更改上一步中创建的 sshd-second.service:

    1. 修改 Description 选项:

      Description=OpenSSH server second instance daemon
    2. 将 sshd.service 添加到 After 选项中指定的服务,因此第二实例仅在第一个实例启动后启动:

      After=syslog.target network.target auditd.service sshd.service
    3. sshd 的第一个实例包括密钥生成,因此删除 ExecStartPre=/usr/sbin/sshd-keygen 行。
    4. sshd 命令中添加 -f /etc/ssh/sshd-second_config 参数,以便使用其他配置文件:

      ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
    5. 在进行以上修改后,sshd-second.service 应该如下所示:

      [Unit]
      Description=OpenSSH server second instance daemon
      After=syslog.target network.target auditd.service sshd.service
      
      [Service]
      EnvironmentFile=/etc/sysconfig/sshd
      ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
      ExecReload=/bin/kill -HUP $MAINPID
      KillMode=process
      Restart=on-failure
      RestartSec=42s
      
      [Install]
      WantedBy=multi-user.target
  5. 如果使用 SELinux,将第二个 sshd 实例的端口添加到 SSH 端口,否则第二个 sshd 实例将被拒绝绑定到端口:

    # semanage port -a -t ssh_port_t -p tcp 22220
  6. 启用 sshd-second.service,以便在引导时自动启动:

    # systemctl enable sshd-second.service
  7. 使用 systemctl status 命令验证 sshd-second.service 是否在运行。
  8. 通过连接到该服务来验证是否正确启用了端口:

    ssh -p 22220 user@server

    如果使用防火墙,请确定正确配置了防火墙以便允许到第二个 sshd 实例的连接。

17.3.2. 选择自定义单元文件排序和依赖项的目标

要了解如何正确地选择自定义单元文件排序和依赖项的目标,请查看以下文章:

红帽知识库文章中提供了在单元文件中通过顺序和依赖项触发的、一些实际的 World 问题单示例的附加信息吗?

如果要为由 systemd 启动的服务设置限制,请参阅红帽知识库文章 How to set limits on RHEL 7 和 systemd。这些限制需要在服务的单元文件中设置。请注意, systemd 忽略 /etc/security/limits.conf/etc/security/limits.d/*.conf 配置文件中设置的限制。这些文件中定义的限制由 PAM 在启动登录会话时设置,但由 systemd 启动的守护进程不使用 PAM 登录会话。

17.4. 将 SysV init 脚本转换为单元文件

在将 SysV 初始化脚本转换为单元文件前,请确定在其它位置还没有进行转换。Red Hat Enterprise Linux 中安装的所有核心服务都带有默认的单元文件,很多第三方软件包也是如此。

将初始化脚本转换成单元文件需要分析脚本并从中提取所需信息。基于这个数据,您可以创建一个单元文件。因为初始化脚本可能会根据服务的类型有很大不同,您可能需要使用比本章概述的更多配置选项。请注意,systemd 单元不再支持 init 脚本提供某种级别的定制。

转换所需的大多数信息在脚本的标头中提供。以下示例显示了初始化脚本的打开部分,用于在 Red Hat Enterprise Linux 6 中启动 postfix 服务:

!/bin/bash # postfix Postfix Mail Transfer Agent # chkconfig: 2345 80 30 # description: Postfix is a Mail Transport Agent, which is the program that moves mail from one machine to another. # processname: master # pidfile: /var/spool/postfix/pid/master.pid # config: /etc/postfix/main.cf # config: /etc/postfix/master.cf  BEGIN INIT INFO # Provides: postfix MTA # Required-Start: $local_fs $network $remote_fs # Required-Stop: $local_fs $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop postfix # Description: Postfix is a Mail Transport Agent, which is the program that moves mail from one machine to another.
# END INIT INFO

在上面的例子中,只有以 # chkconfig# description 开头的行是强制的,因此您可能不会在不同的 init 文件中找到其他行。BEGIN INIT INFO END INIT INFO 行之间连接的文本名为 Linux Standard Base (LSB) header。如果指定,LSB 标头包含定义服务描述、依赖项和默认运行级别的指令。下面是一个分析任务概述,旨在收集新单元文件所需的数据。postfix 初始化脚本被用作示例。

17.4.1. 查找 systemd 服务描述

您可以在以 #description 开头的行中找到有关脚本的描述性信息。这个描述与单元文件的 [Unit] 部分的 Description 选项中的服务名称一同使用。LSB 标头可能在 #Short-Description#Description 行中包含类似的数据。

17.4.2. 查找 systemd 服务依赖项

LSB 标头可能包含一些在服务间组成相依性指令。大多数可以转换到 systemd 单元选项,请参考 表 17.4 “LSB 标头中的依赖项选项”

表 17.4. LSB 标头中的依赖项选项

LSB 选项描述单元文件的对等

Provides

指定该服务的引导工具名称,可在其他初始化脚本中引用(使用"$"前缀)。因为单元文件根据文件名指向其他单元,所以不再需要这个操作。

Required-Start

包含所需服务的引导工具名称。这可转换为排序依赖项,引导工具名称被替换为相应服务的单元文件名或目标。例如,在 postfix 中,对 $network 的 Required-Start 依赖项会被转换为对 network.target 的依赖关系。

After, Before

Should-Start

比 Required-Start 更弱的依赖项。Should-Start 依赖项失败不会影响服务的启动。

After, Before

Required-Stop, Should-Stop

组成负依赖关系。

Conflicts

17.4.3. 查找服务的默认目标

#chkconfig 开始的行包含三个数字值。最重要的是第一个代表启动该服务的默认运行级别的数字。将这些运行级别映射到等同的 systemd 目标。然后在单元文件的 [Install] 部分的 WantedBy 选项中列出这些指标。例如: postfix 之前在运行级别 2、3、4 和 5 中启动,它们转换为 multi-user.target 和 graphical.target。请注意,graphical.target 依赖于 multiuser.target,因此不需要同时指定。您可能会在 LSB 标头的 #Default-Start#Default-Stop 行中找到默认和禁用运行级别的信息。

#chkconfig 行里指定的其他两个值代表初始化脚本的启动和关闭优先级。如果 systemd 加载初始化脚本,则对这些值进行解释,但没有等价的单元文件。

17.4.4. 查找该服务使用的文件

初始化脚本需要从专用目录中载入功能库,并允许导入配置、环境和 PID 文件。环境变量是在初始化脚本标头中以 #config 开始的行指定的,它转换为 EnvironmentFile 单元文件选项。在 #pidfile init 脚本行中指定的 PID 文件使用 PIDFile 选项导入到单元文件中。

未包含在初始化脚本标头中的关键信息是该服务可执行文件的路径,以及该服务可能需要的一些其他文件。在以前的 Red Hat Enterprise Linux 版本中,初始化脚本使用 Bash 问题单声明来定义服务在默认操作中的行为,如 启动停止重启, 以及自定义定义的操作。postfix init 脚本的以下摘录显示了在服务启动时要执行的代码块。

conf_check() {
    [ -x /usr/sbin/postfix ] || exit 5
    [ -d /etc/postfix ] || exit 6
    [ -d /var/spool/postfix ] || exit 5
}

make_aliasesdb() {
	if [ "$(/usr/sbin/postconf -h alias_database)" == "hash:/etc/aliases" ]
	then
		# /etc/aliases.db might be used by other MTA, make sure nothing
		# has touched it since our last newaliases call
		[ /etc/aliases -nt /etc/aliases.db ] ||
			[ "$ALIASESDB_STAMP" -nt /etc/aliases.db ] ||
			[ "$ALIASESDB_STAMP" -ot /etc/aliases.db ] || return
		/usr/bin/newaliases
		touch -r /etc/aliases.db "$ALIASESDB_STAMP"
	else
		/usr/bin/newaliases
	fi
}

start() {
	[ "$EUID" != "0" ] && exit 4
	# Check that networking is up.
	[ ${NETWORKING} = "no" ] && exit 1
	conf_check
	# Start daemons.
	echo -n $"Starting postfix: "
	make_aliasesdb >/dev/null 2>&1
	[ -x $CHROOT_UPDATE ] && $CHROOT_UPDATE
	/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
	RETVAL=$?
	[ $RETVAL -eq 0 ] && touch $lockfile
        echo
	return $RETVAL
}

init 脚本的可扩展性允许指定从 start() 功能块中调用的两个自定义功能 conf_check()make_aliasesdb()。然后,上面的代码中会提到的几个外部文件和目录:主服务可执行文件 /usr/sbin/postfix/etc/postfix//var/spool/postfix/ 配置目录以及 /usr/sbin/postconf/ 目录。

Systemd 只支持预定义的操作,但使用 ExecStartExecStartPreExecStartPostExecStopExecReload 选项启用自定义可执行文件。在服务启动时执行 /usr/sbin/postfix 以及支持脚本。转换复杂初始化脚本需要了解脚本中每个声明的目的。某些语句特定于操作系统版本,因此您不需要转换它们。另一方面,在新环境中可能需要对单元文件以及可执行和支持的服务文件进行一些调整。

17.5. 修改现有单元文件

在系统中安装的服务会附带保存在 /usr/lib/systemd/system/ 目录中的默认单元文件。系统管理员不应该直接修改这些文件,因此任何自定义都必须仅限于 /etc/systemd/system/ 目录中的配置文件。

流程

  1. 根据所需更改的程度,选择以下方法之一:

    • /etc/systemd/system/unit.d/ 创建一个附加配置文件的目录。我们推荐在大多数用例中使用这个方法。它启用了额外的功能来扩展默认配置,同时仍然引用原始的单元文件。因此,在软件包升级时对默认单元的更改会自动应用。如需更多信息, 请参阅扩展默认单元配置
    • /etc/systemd/system/ 中创建原始单元文件 /usr/lib/systemd/system/ 的副本并在此进行修改。这个副本会覆盖原始文件,因此不会应用软件包更新带来的更改。这个方法对无论软件包更新都应保留的重要单元更改都很有用。有关详细信息,请参阅覆盖默认单元配置
  2. 要返回这个单元的默认配置,请删除 /etc/systemd/system/ 中的自定义配置文件。
  3. 要在不重启系统的情况下对单元文件应用更改,请执行:

    systemctl daemon-reload

    daemon-reload 选项会重新载入所有单元文件并重新创建依赖项树,这是立即将任何更改应用到单元文件所必需的。另外,您可以使用以下命令得到同样的结果,该命令必须以 root 用户执行:

    init q
  4. 如果修改后的单元文件属于正在运行的服务,则必须重启该服务以接受新设置:

    systemctl restart name.service
重要

要修改由 SysV initscript 处理的服务的属性,如依赖项或超时,请不要修改 initscript 本身。反之,为服务创建一个 systemd drop-in 配置文件,如 扩展默认单元配置和 覆盖默认单元配置 中所述。然后,以与普通 systemd 服务相同的方式管理这个服务。

例如,要扩展 network 服务的配置,不要修改 /etc/rc.d/init.d/network initscript 文件。反之,创建新目录 /etc/systemd/system/network.service.d/ 和一个 systemd drop-in 文件 /etc/systemd/system/network.service.d/my_config.conf。然后将修改的值放到 drop-in 文件中。备注: systemd 知道 network 服务为 network.service,因此必须调用创建的目录 network.service.d

17.5.1. 扩展默认单元配置

这部分论述了如何使用额外配置选项扩展默认单元文件。

流程

  1. 要使用附加配置选项扩展默认单元文件,请首先在 /etc/systemd/system/ 中创建配置目录。如果扩展服务单元,以 root 身份执行以下命令:

    mkdir /etc/systemd/system/name.service.d/

    使用您要扩展的服务的名称替换 name。以上语法适用于所有单元类型。

  2. 在上一步中创建的目录中创建配置文件。请注意,文件名必须以 .conf 后缀结尾。类型:

    touch /etc/systemd/system/name.service.d/config_name.conf

    使用配置文件的名称替换 config_name。这个文件遵循通常的单元文件结构,因此所有指令都必须在适当的部分中指定,请参阅 单元文件结构

    例如,要添加自定义依赖项,请使用以下内容创建配置文件:

    [Unit]
    Requires=new_dependency
    After=new_dependency

    这里的 new_dependency 代表这个单元被标记为依赖项。另一个例子是主进程退出后重新启动服务的配置文件,延迟 30 秒:

    [Service]
    Restart=always
    RestartSec=30

    建议您只创建一个专注于一个任务的小配置文件。这些文件可轻松地移动或者链接到其他服务的配置目录。

  3. 要应用对单元所做的更改,以 root 身份执行:

    systemctl daemon-reload
    systemctl restart name.service

例 17.1. 扩展 httpd.service 配置

要修改 httpd.service 单元,以便在启动 Apache 服务时自动执行自定义 shell 脚本,请执行以下步骤。

  1. 创建目录和自定义配置文件:

    # mkdir /etc/systemd/system/httpd.service.d/
    # touch /etc/systemd/system/httpd.service.d/custom_script.conf
  2. 如果您要使用 Apache 自动启动的脚本位于 /usr/local/bin/custom.sh,请将以下文本插入到 custom_script.conf 文件中:

    [Service]
    ExecStartPost=/usr/local/bin/custom.sh
  3. 要应用单元更改,请执行:

    # systemctl daemon-reload
    # systemctl restart httpd.service
注意

/etc/systemd/system/ 中配置文件的配置文件优先于 /usr/lib/systemd/system/ 中的单元文件。因此,如果配置文件包含一个只能指定一次的选项,如 DescriptionExecStart,这个选项的默认值将被覆盖。请注意,在 监控覆盖单元 中描述的 systemd-delta 命令输出中,这些单元始终标记为 [EXTENDED],但在 sum 中,某些选项实际上会被覆盖。

17.5.2. 覆盖默认单元配置

这部分论述了如何覆盖默认单元配置。

流程

  1. 要在更新提供该单元文件的软件包后保留更改,首先将该文件复制到 /etc/systemd/system/ 目录中。要做到这一点,以 root 身份执行以下命令:

    cp /usr/lib/systemd/system/name.service /etc/systemd/system/name.service

    其中 name 代表您希望修改的服务单元的名称。以上语法适用于所有单元类型。

  2. 使用文本编辑器打开复制的文件,并进行必要的修改。要应用单元更改,以 root 身份执行:

    systemctl daemon-reload
    systemctl restart name.service

例 17.2. 更改超时限制

您可以为每个服务指定一个超时值,以防止出现故障的服务中断。否则,一般服务的超时时间会被默认设置为 90 秒,SysV 兼容的服务会被设置为 300 秒。

例如,要为 httpd 服务扩展超时限制:

  1. httpd 单元文件复制到 /etc/systemd/system/ 目录中:

    cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/httpd.service
  2. 打开文件 /etc/systemd/system/httpd.service 并在 [Service] 部分指定 TimeoutStartUSec 值:

    
    [Service]
    
    PrivateTmp=true
    TimeoutStartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
  3. 重新载入 systemd 守护进程:

    systemctl daemon-reload
  4. 可选。验证新的超时值:

    systemctl show httpd -p TimeoutStartUSec
注意

要全局更改超时限制,请在 /etc/systemd/system.conf 文件中输入 DefaultTimeoutStartSec

17.5.3. 监控覆盖单元

这部分论述了如何显示覆盖或修改的单元文件概述。

流程

  1. 要显示覆盖或修改的单元文件概述,请使用以下命令:

    systemd-delta

    例如,以上命令的输出结果如下:

    [EQUIVALENT] /etc/systemd/system/default.target → /usr/lib/systemd/system/default.target
    [OVERRIDDEN] /etc/systemd/system/autofs.service → /usr/lib/systemd/system/autofs.service
    
    --- /usr/lib/systemd/system/autofs.service      2014-10-16 21:30:39.000000000 -0400
    + /etc/systemd/system/autofs.service  2014-11-21 10:00:58.513568275 -0500
    @@ -8,7 +8,8 @@
     EnvironmentFile=-/etc/sysconfig/autofs
     ExecStart=/usr/sbin/automount $OPTIONS --pid-file /run/autofs.pid
     ExecReload=/usr/bin/kill -HUP $MAINPID
    -TimeoutSec=180
    +TimeoutSec=240
    +Restart=Always
    
     [Install]
     WantedBy=multi-user.target
    
    [MASKED]     /etc/systemd/system/cups.service → /usr/lib/systemd/system/cups.service
    [EXTENDED]   /usr/lib/systemd/system/sssd.service → /etc/systemd/system/sssd.service.d/journal.conf
    
    4 overridden configuration files found.

17.6. 使用实例化单元

可以在运行时使用单一模板配置文件实例化多个单元。"@"字符用于标记模板并与其关联。实例化的单元可以从另一个单元文件(使用 RequiresWants 选项)或者使用 systemctl start 命令启动。以下列方式命名实例化服务单元:

template_name@instance_name.service

其中 template_name 代表模板配置文件的名称。将 instance_name 替换为单元实例的名称。多个实例可以指向带有通用于单元所有实例的配置选项的同一个模板文件。模板单元名称具有以下格式:

unit_name@.service

例如,单位文件中的以下 Wants 设置:

Wants=getty@ttyA.service getty@ttyB.service

首先为给定服务单元进行 systemd 搜索。如果没有找到这样的单元,"@" 和类型后缀间的部分会被忽略, systemd 会搜索 getty@.service 文件,从中读取配置并启动服务。

例如: getty@.service 模板包含以下指令:

[Unit]
Description=Getty on %I
…
[Service]
ExecStart=-/sbin/agetty --noclear %I $TERM
…

当 getty@ttyA.service 和 getty@ttyB.service 由以上模板实例化时,Description= is 被解析为 Getty on ttyA 以及 Getty on ttyB

17.6.1. 重要单元指定符

可在任何单元配置文件中使用通配符字符(称为 单元指定符)。单元指定符替换了某些单元参数,并在运行时解释。表 17.5 “重要单元指定符” 列出对模板单元特别有用的单元指定符。

表 17.5. 重要单元指定符

单元指定符含义描述

%n

完整单元名称

代表完整单元名称,包括类型后缀。%N 具有相同的含义,但也将禁止字符替换为 ASCII 代码。

%p

前缀名称

代表删除类型后缀的单元名称。例如,实例化单元 %p 代表了"@"字符前的单元名称的一部分。

%i

实例名称

是"@"字符和类型后缀间的实例化单元名称的一部分。%I 具有相同的含义,但也替换了 ASCII 代码的禁止字符。

%H

主机名

代表在载入单元配置时的运行系统的主机名。

%t

运行时目录

代表运行时目录,对于 root 用户是 /run,对于非特权用户是 XDG_RUNTIME_DIR 变量的值。

有关单元指定符的完整列表,请查看 systemd.unit(5) 手册页。

第 18 章 优化 systemd 以缩短引导时间

有一组默认启用的 systemd 单元文件列表。由这些单元文件定义的系统服务会在引导时自动运行,这会影响引导时间。

本节描述:

  • 检查系统引导性能的工具。
  • 默认启用 systemd 单元以及您可以安全禁用 systemd 单元以便缩短引导时间的情况。

18.1. 检查系统引导性能

要检查系统引导性能,可以使用 systemd-analyze 命令。这个命令有很多可用选项。然而,本节只涵盖所选对 systemd 调整很重要以便缩短引导时间的选择。

有关所有选项的完整列表和详细描述,请查看 systemd-analyze man page。

先决条件

在开始检查 systemd 以调整引导时间之前,您可能需要列出所有启用的服务:

$ systemctl list-unit-files --state=enabled

分析整个引导时间

流程

  • 有关最后一次成功引导时间的总体信息,请使用:
$ systemd-analyze

分析单元初始化时间

流程

  • 有关每个 systemd 单元初始化时间的信息,请使用:
$ systemd-analyze blame

输出会根据在上一次成功引导过程中初始化的时间以降序列出。

识别关键单元

流程

  • 要识别在最后一次引导成功时需要花费最多时间的单元,请使用:
$ systemd-analyze critical-chain

输出突出显示使用红色的引导速度非常慢的单元。

图 18.1. systemd-analyze critical-chain 命令的输出

systemd analyze critical

18.2. 为选择可安全禁用的服务提供指导信息

如果系统的引导时间较长,您可以通过禁用引导时启用的一些服务来缩短这个时间。

要列出这些服务,请运行:

$ systemctl list-unit-files --state=enabled

要禁用某个服务,请运行:

# systemctl disable service_name

然而,某些服务必须启用才能确保操作系统安全,并使其可以正常工作。

您可以使用下面的表格来选择可安全禁用的服务。这个表格列出了在 Red Hat Enterprise Linux 8 最小安装中默认启用的所有服务。对于每个服务,它还说明是否可安全禁用这个服务。

该表还提供了关于禁用该服务的情况或不应禁用该服务的原因的更多信息。

表 18.1. 在 RHEL 8 最小安装中默认启用的服务

服务名称它可用被禁用吗?更多信息

auditd.service

仅在不需要内核提供审计信息时禁用 auditd.service。请注意,如果您禁用 auditd.service,则不会生成 /var/log/audit/audit.log 文件。因此,您无法追溯检查一些常见的动作或事件,如用户登录、服务启动或密码更改。还请注意 auditd 有两个部分:内核部分和服务本身。使用 systemctl disable auditd 命令时,您只禁用该服务,而不是禁用内核部分。要禁用系统审核,请在内核命令行中设置 audit=0

autovt@.service

这个服务只在真正需要时才运行,因此不需要禁用它。

crond.service

请注意,如果您禁用 crond.service,则不会运行 crontab 中的项目。

dbus-org.fedoraproject.FirewallD1.service

到的符号链接 firewalld.service

dbus-org.freedesktop.NetworkManager.service

到的符号链接 NetworkManager.service

dbus-org.freedesktop.nm-dispatcher.service

到的符号链接 NetworkManager-dispatcher.service

firewalld.service

仅在不需要防火墙时禁用 firewalld.service

getty@.service

这个服务只在真正需要时才运行,因此不需要禁用它。

import-state.service

仅在不需要从网络存储引导时禁用 import-state.service

irqbalance.service

仅在只有一个 CPU 时禁用 irqbalance.service。不要在有多个 CPU 的系统中禁用 irqbalance.service

kdump.service

仅在不需要内核崩溃报告时禁用 kdump.service

loadmodules.service

除非 /etc/rc.modules/etc/sysconfig/modules 目录存在,否则不会启动该服务。这意味着它不会在最小 RHEL 8 安装中启动。

lvm2-monitor.service

仅在不使用逻辑卷管理器(LVM)时禁用 lvm2-monitor.service

microcode.service

不要禁用该服务,因为它在 CPU 中提供了 microcode 软件的更新。

NetworkManager-dispatcher.service

仅在不需要在网络配置更改时通知时才禁用 NetworkManager-dispatcher.service (例如在静态网络中)。

NetworkManager-wait-online.service

仅在引导后不需要工作网络连接时禁用 NetworkManager-wait-online.service。如果启用该服务,则该系统不会在网络连接正常工作前完成引导。这可能会大大延长引导时间。

NetworkManager.service

仅在不需要连接到网络时禁用 NetworkManager.service

nis-domainname.service

仅在不使用网络信息服务(NIS)时禁用 nis-domainname.service

rhsmcertd.service

 

rngd.service

仅在您的系统不需要很多熵或者您没有任何硬件生成器时禁用 rngd.service。请注意,在需要大量好熵的环境中,比如用于生成 X.509 证书的系统(如 FreeIPA 服务器)中,该服务是必需的。

rsyslog.service

仅在不需要持久性日志或将 systemd-journald 设置为持久模式时禁用 rsyslog.service

selinux-autorelabel-mark.service

仅在不使用 SELinux 时禁用 selinux-autorelabel-mark.service

sshd.service

仅在不需要 OpenSSH 服务器远程登录时禁用 sshd.service

sssd.service

仅在没有通过网络登录系统的用户时禁用 sssd.service (例如,使用 LDAP 或 Kerberos)。如果您禁用了 sssd-*,红帽建议禁用所有 sssd.service 单元。

syslog.service

用于 rsyslog.service

tuned.service

仅在需要使用性能调整时才禁用 tuned.service

lvm2-lvmpolld.socket

仅在不使用逻辑卷管理器(LVM)时禁用 lvm2-lvmpolld.socket

dnf-makecache.timer

仅在不需要自动更新软件包元数据时禁用 dnf-makecache.timer

unbound-anchor.timer

仅在不需要每日更新 DNS 安全扩展(DNSSEC)的根信任基础时禁用 unbound-anchor.timer。Unbound resolver 和 resolver 库使用这个根信任锚器进行 DNSSEC 验证。

要查找有关服务的更多信息,您可以运行以下命令之一:

$ systemctl cat <service_name>
$ systemctl help <service_name>

systemctl cat 命令提供位于 /usr/lib/systemd/system/<service> 下的服务文件的内容,以及所有适用的覆盖。可用的覆盖包括来自 /etc/systemd/system/<service> 文件或对应 unit.type.d 目录中的单元文件覆盖的单元文件。

有关 drop-in 文件的详情请参考 systemd.unit man page。

systemctl help 命令显示特定服务的 man page。

第 19 章 其它资源

有关 systemd 及其在 Red Hat Enterprise Linux 中的用法的详情,请查看以下列出的资源。

19.1. 安装的文档

  • systemctl(1)- systemctl 命令行实用程序手册页提供支持选项和命令的完整列表。
  • systemd(1)- systemd 系统和服务管理器的手册页提供有关其概念和文档可用命令行选项和环境变量、支持的配置文件和目录、识别的信号以及可用内核选项的更多信息。
  • systemd-delta(1)- systemd-delta 工具手册页,允许查找扩展和覆盖的配置文件。
  • systemd.directives(7) - 名为 systemd.directives 的手册页提供有关 systemd 指令的详细信息。
  • systemd.unit( systemd.unit )- 名为 的手册页提供有关 systemd 单元文件和文档所有可用配置选项的详细信息。
  • systemd.service建议 - 名为 systemd.service 的手册页记录了服务单元文件的格式。
  • systemd.target建议 - 名为 systemd.target 的手册页记录了目标单元文件的格式。
  • systemd.kill建议 - 名为 systemd.kill 的手册页记录了进程终止过程的配置。

19.2. 在线文档

  • systemd 主页 - 项目主页提供了更多关于 systemd 的信息。

第 20 章 管理用户和组群帐户介绍

用户和组群的控制是 Red Hat Enterprise Linux(RHEL)系统管理的核心元素。每个 RHEL 用户都有不同的登录凭证,并可分配给不同的组以自定义其系统权限。

创建文件的用户是该文件的拥有者以及该文件的组所有者。这个文件会单独为拥有者、组和组以外的成员分配读、写和执行权限。文件所有者只能由 root 用户更改。root 用户和文件拥有者都可以更改对该文件的访问权限。常规用户可以将他们拥有的文件的组群所有权改为他们所属的组。

每个用户都与一个唯一数字身份号关联,称为 user ID (UID)。每个组都与一个 group ID (GID)关联。组群中的用户共享相同的读取、写入和执行该组所拥有的文件的权限。

20.1. 用户和组介绍

创建文件的用户是该文件的拥有者以及该文件的组所有者。这个文件会单独为拥有者、组和组以外的成员分配读、写和执行权限。文件所有者只能由 root 用户更改。root 用户和文件拥有者都可以更改对该文件的访问权限。常规用户可以将他们拥有的文件的组群所有权改为他们所属的组。

每个用户都与一个唯一数字身份号关联,称为 user ID (UID)。每个组都与一个 group ID (GID)关联。组群中的用户共享相同的读取、写入和执行该组所拥有的文件的权限。

20.2. 配置保留的用户和组群 ID

RHEL 为系统用户和组保留在 1000 以下的用户和组群 ID。您可以在 setup 软件包中找到保留的用户和组群 ID。要查看保留的用户和组群 ID,请使用:

cat /usr/share/doc/setup*/uidgid

建议从 5000 开始将 ID 分配给新用户和组,因为保留范围将来可能会增加。

要使分配给新用户的 ID 默认从 5000 开始,修改 /etc/login.defs 文件中的 UID_MINGID_MIN 参数。

流程

要使分配给新用户的 ID 默认从 5000 开始,请使用:

  1. 在您选择的编辑器中打开 /etc/login.defs 文件。
  2. 找到为自动 UID 选择定义最小值的行。

    # Min/max values for automatic uid selection in useradd
    #
    UID_MIN                  1000
  3. 修改 UID_MIN 值从 5000 开始。

    # Min/max values for automatic uid selection in useradd
    #
    UID_MIN                  5000
  4. 找到自动选择 GID 最小值的行。

    # Min/max values for automatic gid selection in groupadd
    #
    GID_MIN                  1000

请注意,对于在更改 UID_MINGID_MIN 值前创建的用户和组,UID 和 GID 仍从默认值 1000 开始。

警告

不要通过更改 SYS_UID_MAX 来提高系统 1000 以上保留的 ID,以避免与保留 1000 限制的系统冲突。

20.3. 用户私人组群

RHEL 使用 用户私人组群UPG)系统配置,这可让 UNIX 组更容易管理。无论何时在系统中添加新用户,都会创建一个用户私人组群。用户私人组群的名称与为其创建的用户的名称相同,该用户是该用户私人组群中的唯一成员。

UPG 简化了多个用户之间在项目上的协作。另外, UPG 系统配置可以安全地为新创建的文件或目录设置默认权限,因为它允许用户以及此用户所属组群对文件或目录进行修改。

所有组的列表都保存在 /etc/group 配置文件中。

第 21 章 在 Web 控制台中管理用户帐户

RHEL web 控制台提供了一个图形界面,供您在不直接访问终端的情况下执行各种管理任务。例如,您可以添加、编辑或删除系统用户帐户。

在阅读这个部分后,您将了解:

  • 现有帐户来自哪里。
  • 如何添加新帐户。
  • 如何设置密码过期。
  • 如何和何时终止用户会话。

先决条件

21.1. Web 控制台中管理的系统用户帐户

您可在 RHEL web 控制台中显示用户帐户:

  • 在访问系统时验证用户。
  • 设置系统的访问权限。

RHEL web 控制台显示系统中的所有用户帐户。因此,在首次登录 web 控制台后,至少可以看到一个可用的用户帐户。

登录到 RHEL web 控制台后,您可以执行以下操作:

  • 创建新用户帐户。
  • 更改其参数。
  • 锁定帐户。
  • 终止用户会话。

21.2. 使用 Web 控制台添加新帐户

使用以下步骤将用户帐户添加到系统,并通过 RHEL web 控制台为帐户设置管理权限。

先决条件

流程

  1. 登录到 RHEL web 控制台。
  2. Account
  3. Create New Account
  1. Full Name 字段中输入用户全名。

    RHEL web 控制台会自动在全名中推荐用户名并在 User Name 字段中填充该用户名。如果您不想使用原始命名规则(由名的第一个字母和完整的姓组成),对它进行更新。

  2. Password/Confirm 字段中输入密码并重新输入该密码以便验证您的密码是否正确。

    下面的颜色栏显示您输入密码的安全等级,这不允许您创建带弱密码的用户。

  1. Create 保存设置并关闭对话框。
  2. 选择新创建的帐户。
  3. Roles 项中选择 Server Administrator

    cockpit terminate session pf4

    现在您可以在 Accounts 设置中看到新帐户,您可以使用凭证连接到该系统。

21.3. 在 web 控制台中强制密码过期

默认情况下,用户帐户将密码设定为永远不会过期。您可以设置系统密码在指定的天数后过期。当密码过期时,下次登录尝试会提示密码更改。

流程

  1. 登录到 RHEL 8 web 控制台。
  2. Account
  3. 选择要强制密码过期的用户帐户。
  4. 在用户帐户设置中,点 Never expire password
  5. Password Expiration 对话框中,选 Require password change every …​ days,然后输入一个正整数,代表密码过期的天数。
  1. Change

验证步骤

  • 要验证是否设定了密码过期时间,打开帐户设置。

    RHEL 8 web 控制台显示与过期日期的链接。

    cockpit password expiration date

21.4. 在 web 控制台中终止用户会话

用户在登录系统时创建用户会话。终止用户会话意味着从系统中注销用户。如果您需要执行对配置更改敏感的管理任务,比如升级系统,这非常有用。

在 RHEL 8 web 控制台中的每个用户帐户中,您可以终止该帐户的所有会话,但您当前使用的 web 控制台会话除外。这样可防止您丢失对您的系统的访问。

流程

  1. 登录到 RHEL 8 web 控制台。
  2. Account
  3. 点击要终止会话的用户帐户。
  4. Terminate Session

    如果 Terminate Session 按钮不可用,这个用户就不能登录到系统。

    RHEL web 控制台会终止会话。

第 22 章 从命令行管理用户

您可以使用命令行界面(CLI)来管理用户和组。这可让您在 Red Hat Enterprise Linux 环境中添加、删除和修改用户和用户组。

22.1. 使用命令行添加新用户

本节论述了如何使用 useradd 工具添加新用户。

先决条件

  • Root 访问

流程

  • 要添加新用户,请使用:

    # useradd options username

    使用 useradd 命令 命令行选项替换 options,并使用 用户名替换 username

    例 22.1. 添加新用户

    要添加用户 ID 为 5000 的用户 sarah,请使用:

    +

    # useradd -u 5000 sarah

验证步骤

  • 要验证新用户是否已添加,使用 id 工具。

    # id sarah

    输出会返回:

    uid=5000(sarah) gid=5000(sarah) groups=5000(sarah)

其它资源

  • useradd man page

22.2. 使用命令行添加新组

本节论述了如何使用 groupadd 工具添加新组。

先决条件

  • Root 访问

流程

  • 要添加新组,请使用:

    # groupadd options group-name

    使用 groupadd 命令的命令行选项 替换 options,并使用组群 名称替换 group- name。

    例 22.2. 添加新组

    要使用组 ID 5000 添加组 sysadmins,请使用:

    +

    # groupadd -g 5000 sysadmins

验证步骤

  • 要验证新组是否已添加,使用 tail 实用程序。

    # tail /etc/group

    输出会返回:

    sysadmins:x:5000:

其它资源

  • groupadd man page

22.3. 使用命令行在组群中添加用户

本节论述了如何使用 usermod 工具在用户的附加组群中添加组。

先决条件

  • Root 访问

流程

  • 要在用户的附加组中添加一个组,请使用:

    # usermod --append -G group-name username

    使用组群名称替换 group- name,并将 group-name 替换为组的名称。

    例 22.3. 在组中添加用户

    要将用户 sysadmin 添加到组 system-administrators 中,请使用:

    +

    # usermod --append -G system-administrators sysadmin

验证步骤

  • 要验证新组被添加到用户 sysadmin 的附加组中,请使用:

    # groups sysadmin

    输出会返回:

    sysadmin: sysadmin system-administrators

22.4. 创建组目录

在 UPG 系统配置中,您可以将 set-group 身份权限setgid 位)应用到一个目录中。setgid 位可以管理共享目录的组项目。当您将 setgid 位应用到某个目录中时,在该目录中创建的文件会自动分配给拥有该目录的组群。任何具有在此组中写入和执行权限的用户,现在都可以在目录中创建、修改和删除文件。

下面的部分论述了如何创建组目录。

先决条件

  • Root 访问

流程

  1. 创建目录:

    # mkdir directory-name

    使用目录名替换 directory-name

  2. 创建组:

    # groupadd group-name

    用组群的名称替换 group-name

  3. 向组中添加用户:

    # usermod --append -G group-name username

    使用组群 名称替换 group- name,并使用用户名替换 replac[role=" abstract"]e _username

  4. 将目录的用户和组群所有权与 group-name 组关联:

    # chown :group-name directory-name

    用组群名称替换 group-name,并用 目录名替换 directory-name

  5. 设置写入权限,允许用户创建和修改文件和目录,并设置 setgid 位使其在 directory-name 目录中应用这个权限:

    # chmod g+rwxs directory-name

    使用目录名替换 directory-name

    现在, group-name 组的所有成员都可以在 directory-name 目录中创建并编辑文件。新创建的文件保留 group-name 组的组群所有权。

验证步骤

  • 要验证设置权限的正确性,请使用:

    # ls -ld directory-name

    使用目录名替换 directory-name

    输出返回:

    drwxrwsR-x。 2 root group-name 6 Nov 25 08:45 directory-name

第 23 章 使用命令行从组群中删除用户

您可以通过覆盖用户所属的组来从主组群或附加组群中删除用户,这些组中不包含您想要从中删除该用户的组。

23.1. 覆盖用户的主组群

本节论述了如何使用 usermod 工具覆盖用户的主组群。

先决条件

  • Root 访问

流程

  • 要覆盖用户的主要组群,请使用:

    # usermod -g group-name username

    使用组群名称替换 group- name,并将 group-name 替换为组的名称。

    例 23.1. 更改用户的主组群

    如果用户 sarah 属于主组 sarah1,并且您要将用户的主组群改为 sarah2,请使用:

    # usermod -g sarah2 sarah

验证步骤

  • 要验证用户的主要组群是否已覆盖,请使用:

    # groups sarah

    输出会返回:

    sarah : sarah2

23.2. 覆盖用户的附加组群

本节论述了如何使用 usermod 工具覆盖用户的附加组群。

先决条件

  • Root 访问

流程

  • 要覆盖用户的附加组群,请使用:

    # usermod -G group-name username

    使用组群名称替换 group- name,并将 group-name 替换为组的名称。

    例 23.2. 更改用户的附加组群

    如果用户 sarah 属于 system-administrator 组和 developer 组,而您想要从 system-administrator 组中删除用户 sarah,则可以通过使用一个新组替换旧的组列表来达到此目的。要做到这一点,请使用:

    # usermod -G developer sarah

验证步骤

  • 要验证用户的附加组群是否已覆盖,请使用:

    # groups sarah

    输出会返回:

    sarah : sarah developer

第 24 章 管理 sudo 访问

系统管理员可以授予 sudo 访问权限来允许非 root 用户执行通常为 root 用户保留的管理命令。因此,非 root 用户可以在不登录 root 用户帐户的情况下执行这些命令。

24.1. sudoers 中的用户授权

/etc/sudoers 文件指定哪些用户可以使用 sudo 命令运行哪些命令。这些规则可应用于单个用户和用户组。您还可以使用别名来简化为一组主机、命令甚至用户定义规则。默认别名在 /etc/sudoers 文件的第一部分中定义。

当用户试图使用 sudo 权限运行 /etc/sudoers 文件中不允许的命令时,系统会记录一个信息,其中包含 username : user NOT in sudoers 到日志中的。

默认 /etc/sudoers 文件提供授权信息和示例。您可以通过从行开始删除 # 注释字符来激活特定示例规则。与用户相关的授权部分标记如下:

## Next comes the main part: which users can run what software on
## which machines  (the sudoers file can be shared between multiple
## systems).

您可以使用以下格式创建新的 sudoers 授权并修改现有授权:

username hostname=path/to/command

其中:

  • 用户名 是用户或组群的名称,例如 user1%group1
  • hostname 是规则适用的主机的名称。
  • path/to/command 是命令 的完整绝对路径。您还可以将用户限制为只执行带有特定选项和参数的命令,方法是在命令路径后添加这些选项。如果您没有指定任何选项,用户就可以使用包含所有选项的命令。

您可以将任何这些变量替换为 ALL,将规则应用到所有用户、主机或命令。

警告

使用过量的 permissive 规则,如 ALL ALL=(ALL) ALL,所有用户都可以作为所有主机的所有用户运行所有命令。这可能导致安全隐患。

您可以使用 ! Operator 来拒绝指定参数。例如,使用 !root 指定除 root 用户以外的所有用户。请注意,使用允许列表允许特定用户、组群和命令比使用块列表来禁止特定的用户、组群和命令更为安全。您还可以使用允许列表阻止新的未授权用户或组。

警告

避免对命令使用负规则,因为用户可以使用 alias 命令重新命名命令来绕过这些规则。

系统从开始到结尾读取 /etc/sudoers 文件。因此,如果文件包含用户的多个条目,条目会按顺序应用。如果值冲突,系统也会使用最后的匹配项,即使它不是最具体的匹配项。

sudoers 中添加新规则的首选方法是在 /etc/sudoers.d/ 目录中创建新文件,而不是直接在 /etc/sudoers 文件中输入规则。这是因为这个目录的内容会在系统更新过程中被保留。另外,与 /etc/sudoers 文件中相比,可以更容易修复独立文件中的任何错误。当在 /etc/sudoers 文件中到达以下行时,系统读取 /etc/sudoers.d 目录中的文件:

#includedir /etc/sudoers.d

请注意,在这个行的开头符号 # 是语法的一部分,并不意味着行是一个注释。该目录中的文件名称不能包含句点 .,且不能以 tilde ~ 结尾。

24.2. 为用户授予 sudo 访问权限

系统管理员可以授予 sudo 访问权限来允许非 root 用户执行管理命令。sudo 命令在不使用 root 用户密码的情况下为用户提供管理访问。

当用户需要执行管理命令时,您可以在使用 sudo 命令前执行该命令。然后会像 root 用户一样执行该命令。

请注意以下限制:

  • 只有 /etc/sudoers 配置文件中列出的用户才能使用 sudo 命令。
  • 该命令在用户的 shell 中执行,而不是在 root shell 中执行。

先决条件

  • root 访问

流程

  1. 以 root 用户身份打开 /etc/sudoers 文件。

    # visudo

    /etc/sudoers 文件定义 sudo 命令应用的策略。

  2. /etc/sudoers 文件中,找到为管理 wheel 组中的用户授予 sudo 访问权限的行。

    ## Allows people in group wheel to run all commands
    %wheel        ALL=(ALL)       ALL
  3. 确保以 %wheel 开头的行前面没有 # 注释字符。
  4. 保存所有更改并退出编辑器。
  5. 添加您要向管理 wheel 组授予 sudo 访问权限的用户。

     # usermod --append -G wheel username

    使用用户名替换 username

    验证步骤

    • 验证用户是否已添加到管理 wheel 组中:

      # id username
      uid=5000(username) gid=5000(_username) groups=5000(username),10(wheel)

24.3. 启用非特权用户运行某些命令

您可以配置一个策略,允许非特权用户在特定工作站运行特定命令。要配置这个策略,您需要编辑 sudoers.d 文件。

先决条件

  • root 访问

流程

  1. 以 root 用户身份,在 /etc/ 下创建新 sudoers.d 目录:

    # mkdir -p /etc/sudoers.d/
  2. /etc/sudoers.d 目录中创建新文件:

    # visudo -f /etc/sudoers.d/file-name

    使用您要创建 的文件的名称替换 file- name。该文件将自动打开。

  3. 在新创建的文件中添加以下行:

    username hostname = /path/to/the/command

    使用用户名替换 username。使用主机的名称替换 hostname。使用 命令的绝对路径替换 /path/to /the/command(例如 /usr/bin/yum)。

  4. 保存所有更改并退出编辑器。

    例 24.1. 启用非特权用户使用 yum 和 dnf 安装程序

    要让用户 sarah 使用具有 sudo 权限的 yumdnf 工具在 localhost.localdomain 工作站中安装程序,请使用:

    1. 以 root 用户身份,在 /etc/ 下创建新 sudoers.d 目录:

      # mkdir -p /etc/sudoers.d/
    2. /etc/sudoers.d 目录中创建新文件:

      # visudo -f /etc/sudoers.d/sarah

      该文件将自动打开。

    3. /etc/sudoers.d/sarah 文件中添加以下行:

      sarah localhost.localdomain = /usr/bin/yum, /usr/bin/dnf

      确定两个命令路径用 , 逗号分开,后跟一个空格。

    4. :每次用户 sarah 尝试使用 sudo 权限时,若要接收电子邮件通知,请在该文件中添加以下行:

      Defaults    mail_always
      Defaults    mailto="email@domain.com"
    5. 要验证用户 sarah 是否可以使用 sudo 权限运行 yum 命令,请切换帐户:

      # su sarah -
    6. 输入 sudo yum 命令:

      $ sudo yum
      [sudo] password for sarah:

      为用户 sarah 输入 sudo 密码。

    7. 系统显示 yum 命令和选项列表:

      ...
      usage: yum [options] COMMAND
      ...

      如果您收到 sarah is not in the sudoers file. This incident will be reported. 信息,则配置无法正确完成。请确定您以 root 身份执行这个步骤,并且您明确遵循了这些步骤。

24.4. 其它资源

  • sudo(8) man page
  • visudo(8) man page

第 25 章 更改和重置根密码

如果现有的根密码不再满意或被忘记,您可以以 root 用户或一个非 root 用户重置它。

25.1. 作为 root 用户更改 root 密码

这部分论述了如何使用 passwd 命令以 root 用户的身份更改 root 密码。

先决条件

  • Root 访问

流程

  • 要更改 root 密码,请使用:

    # passwd

    在修改前,会提示您输入您当前的密码。

25.2. 以非 root 用户的身份更改或重置根密码

这部分论述了如何以非 root 用户使用 passwd 命令更改或重置 root 密码。

先决条件

  • 您可以以非 root 用户身份登录。
  • 您是管理 wheel 组的成员。

流程

  • 以属于 wheel 组的非 root 用户身份更改或重置 root 密码,请使用:

    $ sudo passwd root

    此时会提示您输入当前的非 root 密码,然后才能更改 root 密码。

25.3. 在引导时重置根密码

如果您无法以非 root 用户身份登录或者不属于管理 wheel 组,则可以通过切换到一个特殊的 chroot jail 环境在引导时重置 root 密码。

流程

  1. 重启系统,在 GRUB 2 引导屏幕上按 e 键中断引导过程。

    此时会出现内核引导参数。

    load_video
    set gfx_payload=keep
    insmod gzio
    linux ($root)/vmlinuz-4.18.0-80.e18.x86_64 root=/dev/mapper/rhel-root ro crash\
    kernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv/swap rhgb quiet
    initrd ($root)/initramfs-4.18.0-80.e18.x86_64.img $tuned_initrd
  2. 进入以 linux 开头的行的末尾。

    linux ($root)/vmlinuz-4.18.0-80.e18.x86_64 root=/dev/mapper/rhel-root ro crash\
    kernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv/swap rhgb quiet

    Ctrl+e 键跳到这一行的末尾。

  3. 在以 linux 开头的行末尾添加 rd.break

    linux ($root)/vmlinuz-4.18.0-80.e18.x86_64 root=/dev/mapper/rhel-root ro crash\
    kernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv/swap rhgb quiet rd.break
  4. Ctrl+x 使用更改的参数启动系统。

    此时会出现 switch_root 提示符。

  5. 将文件系统重新挂载为可写:

    mount -o remount,rw /sysroot

    文件系统以只读形式挂载到 /sysroot 目录中。将文件系统重新挂载为可写才可以更改密码。

  6. 输入 chroot 环境:

    chroot /sysroot

    此时会出现 sh-4.4# 提示符。

  7. 重置 root 密码:

    passwd

    按照命令行中的说明完成 root 密码的更改。

  8. 在下次系统引导时启用 SELinux 重新标记进程:

    touch /.autorelabel
  9. 退出 chroot 环境:

    exit
  10. 退出 switch_root 提示符:

    exit
  11. 等待 SELinux 重新标记过程完成。请注意,重新标记一个大磁盘可能需要很长时间。系统会在这个过程完成后自动重启。

验证步骤

  1. 要验证 root 密码是否已成功更改,以普通用户身份登录并打开 Terminal。
  2. 以 root 用户身份运行交互式 shell:

    $ su
  3. 输入您的新 root 密码。
  4. 输出与当前有效用户 ID 关联的用户名:

    whoami

    输出会返回:

    root

第 26 章 管理文件权限

文件权限控制用户和组群帐户查看、修改、访问和执行文件和目录内容的能力。

每个文件或目录都有三个级别的所有权:

  • 用户所有者(u)。
  • 组所有者(g)。
  • 其他(o)。

可为每个级别的所有权分配以下权限:

  • 读(r)。
  • 写(w)。
  • 执行(x)。

请注意,文件的执行权限允许执行该文件。目录的执行权限允许访问目录中的内容,但不执行它。

当创建新文件或目录时,会自动为其分配默认权限集。文件或目录的默认权限基于以下两个因素:

  • 基本权限。
  • user file-creation mode maskumask)。

26.1. 基本文件权限

每当创建新文件或目录时,会自动为其分配基本权限。文件或目录的基本权限可以使用符号或者数值表示。

权限

符号

数值

无权限

---

0

执行

--x

1

-w-

2

写和执行

-wx

3

r--

4

读和执行

r-x

5

读写

rw-

6

读、写、执行

rwx

7

目录的基本权限是 777 (drwxrwxrwx),它为任何人都授予读、写和执行的权限。这意味着目录所有者、组和其它可以列出目录的内容,并可以在该目录下(以及其子目录)中创建、删除和编辑项。

请注意,一个目录中的单个文件可以有它们自己的权限,例如可以阻止用户您编辑它们,即使用户对该目录有非受限的访问权限。

文件的基本权限是 666 (-rw-rw-rw-),它为任何人都授予读写权限。这意味着文件所有者、组和其它用户都可以读和编辑该文件。

例 26.1. 文件的权限

如果文件有以下权限:

$ ls -l
-rwxrw----. 1 sysadmins sysadmins 2 Mar 2 08:43 file
  • - 表示它是一个文件。
  • rwx 表示文件所有者有读、写和执行文件的权限。
  • rw- 表示组有读写权限,但不能执行文件。
  • --- 表示其他用户没有读、写或执行文件的权限。
  • . 表示为该文件设定了 SELinux 安全上下文。

例 26.2. 目录的权限

如果一个目录有以下权限:

$ ls -dl directory
drwxr-----. 1 sysadmins sysadmins 2 Mar 2 08:43 directory
  • d 表示它是一个目录。
  • rwx 表示目录所有者有读取、写入和访问目录内容的权限。

    作为目录所有者,您可以列出目录中的项目(文件、子目录),访问这些项目的内容并进行修改。

  • r-- 表示组有读取权限,但没有写入或访问目录的内容。

    作为拥有该目录的组的成员,您可以列出目录中的项目。您无法访问目录中项目的信息或修改它们。

  • --- 表示其他用户没有权限读取、写入或者访问目录的内容。

    作为不是用户拥有者或该目录的组所有者,您无法列出目录中的项目、访问这些项目的信息或修改它们。

  • . 表示为该目录设定了 SELinux 安全上下文。
注意

自动分配给某个文件或者目录的基本权限不是文件或目录最终的默认权限。当您创建文件或目录时,基本权限会被 umask 更改。基本权限和 umask 的组合会为文件和目录创建默认权限。

26.2. 用户文件创建模式掩码

用户 file-creation 模式掩码(umask)是控制如何为新创建的文件和目录设置文件权限的变量。umask 会自动从基本权限值中删除权限,以提高 linux 系统的整体安全性。umask 可以用 符号数值 表示。

权限

符号

数值

读、写和执行

rwx

0

读写

rw-

1

读和执行

r-x

2

r--

3

写和执行

-wx

4

-w-

5

执行

--x

6

无权限

---

7

标准用户的默认 umask0002root 用户的默认 umask0022

umask 的第一个数字代表特殊权限(sticky 位)。umask 的最后三位数字分别代表从用户拥有者(u)、组群所有者(g)和其它(o)中删除的权限。

例 26.3. 在创建文件时应用 umask

以下示例演示了,带有 0137 值的 umask 应用到具有 777 基本权限的文件,以便创建具有 640 默认权限的文件。

用户组 Umask 示例

26.3. 默认文件权限

所有新创建的文件和目录会自动设置默认权限。默认权限的值通过将 umask 应用到基本权限来确定。

例 26.4. 由标准用户创建的目录的默认权限

标准用户 创建一个新 目录 时, umask 被设置为 002 (rwxrwxr-x),目录的基本权限被设置为 777 (rwxrwxrwx)。这会使默认权限为 775 (drwxrwxr-x)。

 

符号

数值

基本权限

rwxrwxrwx

777

Umask

rwxrwxr-x

002

默认权限

rwxrwxr-x

775

这意味着目录所有者、组和其它可以列出目录的内容,并可以在该目录下(以及其子目录)中创建、删除和编辑项。其他用户只能列出该目录的内容并将其下移到其中。

例 26.5. 由标准用户创建的文件的默认权限

标准用户 创建一个新 文件 时, umask 被设置为 002 (rwxrwxr-x),文件的基本权限被设置为 666 (rw-rw-rw-)。这会使默认权限为 664 (-rw-rw-r--)。

 

符号

数值

基本权限

rw-rw-rw-

666

Umask

rwxrwxr-x

002

默认权限

rw-rw-r--

664

这意味着,文件拥有者和组群可以读取和编辑该文件,而其他用户只能读取该文件。

例 26.6. root 用户创建的目录的默认权限

root 用户 创建一个新 目录 时, umask 被设置为 022 (rwxr-xr-x),目录的基本权限被设置为 777 (rwxrwxrwx)。这会使默认权限为 755 (rwxr-xr-x)。

 

符号

数值

基本权限

rwxrwxrwx

777

Umask

rwxr-xr-x

022

默认权限

rwxr-xr-x

755

这意味着目录所有者可以列出目录的内容,并可以在该目录下(以及其子目录)中创建、删除和编辑项。这个组群和其它只能列出该目录的内容并将其下移。

例 26.7. root 用户创建的文件的默认权限

root 用户 创建一个新 文件 时, umask 被设置为 022 (rwxr-xr-x),文件的基本权限被设置为 666 (rw-rw-rw-)。这会使默认权限为 644 (-rw-r—r--)。

 

符号

数值

基本权限

rw-rw-rw-

666

Umask

rwxr-xr-x

022

默认权限

rw-r—r--

644

这意味着,文件所有者可以读取和编辑文件,而组和其它用户只能读取该文件。

注意

出于安全考虑,常规文件默认无法具有执行权限,即使 umask 被设置为 000 (rwxrwxrwx)。但是,创建的目录可以具有执行权限。

26.4. 使用符号值更改文件权限

您可以使用带有符号值(组合字母和符号)的 chmod 工具来更改文件或目录的文件权限。

您可以分配以下 权限:

  • 读(r)
  • 写(w)
  • 执行(x)

可将权限分配给以下 级别的所有权:

  • 用户所有者(u)
  • 组所有者(g)
  • 其他(o)
  • 所有(a)

要添加或删除权限,您可以使用以下 符号:

  • + 在现有权限之上添加权限
  • - 从现有权限中删除权限
  • = 删除现有权限并明确定义新权限

流程

  • 要更改文件或目录的权限,请使用:

    $ chmod <level><operation><permission> file-name

    使用您要设置权限 的所有权级别 替换 <level>。使用其中一个 符号 替换 <operation>。使用您要分配的 权限 替换 <permission>。用文件或目录的名称替换 file-name。例如:要为任何人都授予读取、写入和执行(rwx) my-script.sh 的权限,使用 chmod a=rwx my-script.sh 命令。

    详情请查看基本 权限

验证步骤

  • 要查看特定文件的权限,请使用:

    $ ls -l file-name

    用文件名替换 file-name

  • 要查看特定目录的权限,请使用:

    $ ls -dl directory-name

    使用目录名替换 directory-name

  • 要查看特定目录中所有文件的权限,请使用:

    $ ls -l directory-name

    使用目录名替换 directory-name

例 26.8. 更改文件和目录的权限

  • 要将 my-file.txt 的文件权限从 -rw-rw-r-- 改为 -rw------,请使用:

    1. 显示 my-file.txt 的当前权限:

      $ ls -l my-file.txt
      -rw-rw-r--. 1 username username 0 Feb 24 17:56 my-file.txt
    2. 从组所有者(g)删除读取、写入和执行(rwx)文件的权限:o

      $ chmod go= my-file.txt

      请注意,任何在等号(=)后没有被指定的权限都会被自动禁止。

    3. 验证 my-file.txt 的权限是否已正确设置:

      $ ls -l my-file.txt
      -rw-------. 1 username username 0 Feb 24 17:56 my-file.txt
  • 要将 my-directory 的文件权限从 drwxrwx--- 改为 drwxrwxr-x,请使用:

    1. 显示 my-directory 的当前权限:

      $ ls -dl my-directory
      drwxrwx---. 2 username username 4096 Feb 24 18:12 my-directory
    2. 添加所有用户的读取、写入、执行(rwx)访问(a):

      $ chmod o+rx my-directory
    3. 验证 my-directory 及其内容的权限是否已正确设置:

      $ ls -dl my-directory
      drwxrwxr-x. 2 username username 4096 Feb 24 18:12 my-directory

26.5. 使用数值更改文件权限

您可以使用带有数值的 chmod 实用程序(数字)来更改文件或目录的文件权限。

流程

  • 要为现有文件或者目录更改文件权限,请使用:

    $ chmod octal_value file-name

    用文件或目录的名称替换 file-name。使用数值替换 octal_value。详情请查看基本 权限

第 27 章 管理 umask

您可以使用 umask 实用程序显示、设置或更改 umask 的当前或默认值

27.1. 显示 umask 的当前值

您可以使用 umask 实用程序以符号或数值模式显示 umask 的当前值。

流程

  • 要以符号模式显示 umask 的当前值,请使用:

    $ umask -S
  • 要在数值模式中显示 umask 的当前值,请使用:

    $ umask
    注意

    当以数值模式显示 umask 时,您可以看到它有四个数字(0002 或者 0022)。umask 的第一个数字代表一个特殊的位(spicky 位、SGID 位或 SUID 位)。如果第一个数字被设置为 0,则不会设置特殊位。

27.2. 显示默认 bash umask

您可以使用多个 shell,如 bashkshzshtcsh。这些 shell 可以是登录或非登录 shell。登录 shell 通常通过打开一个原生或 GUI 终端来调用。

要确定您是在登录 shell 还是非登录 shell 中执行某个命令,请使用 echo $0 命令。

例 27.1. 确定您是否在登录或非登录 bash shell 中工作

  • 如果 echo $0 命令的输出返回 bash,您会在非登录 shell 中执行命令。

    $ echo $0
    bash

    非登录 shell 的默认 umask/etc/bashrc 配置文件中设定。

  • 如果 echo $0 命令的输出返回 -bash,您会在登录 shell 中执行命令。

    # echo $0
    -bash

    登录 shell 的默认 umask/etc/profile 配置文件中设定。

流程

  • 要显示非登录 shell 的默认 bash umask,请使用:

    $ grep umask /etc/bashrc

    输出会返回:

    # By default, we want umask to get set. This sets it for non-login shell.
           umask 002
           umask 022
  • 要显示登录 shell 的默认 bash umask,请使用:

    $ grep umask /etc/profile

    输出会返回:

    # By default, we want umask to get set. This sets it for login shell
           umask 002
           umask 022

27.3. 使用符号值设置 umask

您可以使用带有符号值(组合字母和符号)的 umask 实用程序为当前 shell 会话 设置 umask

您可以分配以下 权限:

  • 读(r)
  • 写(w)
  • 执行(x)

可将权限分配给以下 级别的所有权:

  • 用户所有者(u)
  • 组所有者(g)
  • 其他(o)
  • 所有(a)

要添加或删除权限,您可以使用以下 符号:

  • + 在现有权限之上添加权限
  • - 从现有权限中删除权限
  • = 删除现有权限并明确定义新权限

    注意

    所有在等号(=)后没有被指定的权限都会被自动禁止。

流程

  • 要为当前 shell 会话 设置 umask,请使用:

    $ umask -S <level><operation><permission>

    使用您要 为 umask 设置所有权级别 替换 <level>。使用其中一个 符号 替换 <operation>。使用您要分配的 权限 替换 <permission>。例如,要将 umask 设置u=rwx,g=rwx,o=rwx,请使用 umask -S a=rwx

    如需了解更多详细信息,请参阅 用户文件创建模式

    注意

    umask 只对当前 shell 会话有效。

27.4. 使用数值设置 umask

您可以将 umask 实用程序与数值(数字)搭配使用来为当前 shell 会话 设置 umask

流程

  • 要为当前 shell 会话 设置 umask,请使用:

    $ umask octal_value

    使用数值替换 octal_value。如需了解更多详细信息,请参阅 用户文件创建模式掩码

    注意

    umask 只对当前 shell 会话有效。

27.5. 更改非登录 shell 的默认 umask

您可以通过修改 /etc/bashrc 文件来更改标准用户的默认 bash umask

先决条件

  • root 访问

流程

  1. 作为 root,在您选择的编辑器中打开 /etc/bashrc 文件。
  2. 修改以下部分以设置新的默认 bash umask:

        if [ $UID -gt 199 ] && [ “id -gn” = “id -un” ]; then
           umask 002
        else
           umask 022
        fi

    将 umask 的默认值 ( 002)替换为另一个数值。如需了解更多详细信息,请参阅 用户文件创建模式掩码

  3. 保存更改并退出编辑器。

27.6. 更改登录 shell 的默认 umask

您可以通过修改 /etc/profile 文件来更改 root 用户的默认 bash umask

先决条件

  • root 访问

流程

  1. 作为 root,在您选择的编辑器中打开 /etc/profile 文件。
  2. 修改以下部分以设置新的默认 bash umask:

    if [ $UID -gt 199 ] && [ “/usr/bin/id -gn” = “/usr/bin/id -un” ]; then
        umask 002
    else
        umask 022
    fi

    将 umask 的默认值 ( 022)替换为另一个数值。如需了解更多详细信息,请参阅 用户文件创建模式掩码

  3. 保存更改并退出编辑器。

27.7. 更改特定用户的默认 umask

您可以通过修改特定用户的 .bashrc 来更改特定用户的默认 umask

流程

  • 将指定 umask 的数值的行附加到特定用户的 .bashrc 文件中。

    $ echo 'umask octal_value' >> /home/username/.bashrc

    使用数值替换 octal_value,并使用用户名替换 username。如需了解更多详细信息,请参阅 用户文件创建模式掩码

27.8. 为新创建的主目录设置默认 UMASK

您可以通过修改 /etc/login.defs 文件来更改为新创建的用户主目录指定 UMASK 的权限。

流程

  1. 作为 root,在您选择的编辑器中打开 /etc/login.defs 文件。
  2. 修改以下部分以设置新的默认 UMASK

    # The permission mask is initialized to this value. If not specified,
    # the permission mask will be initialized to 022.
    UMASK 077

    将默认数值(077)替换为另一个数值。如需了解更多详细信息,请参阅 用户文件创建模式掩码

  3. 保存更改并退出编辑器。

第 28 章 在 RHEL 8 中使用 dnstap

dnstap 工具提供了监控和记录传入名称查询详情的高级方法。它记录从 named 服务发送的信息。本节介绍如何使用 dnstap 记录 DNS 查询。

28.1. 在 RHEL 8 中使用 dnstap 记录 DNS 查询

网络管理员可以记录 DNS 查询,以收集网站或 IP 地址信息以及域健康状况。

先决条件

  • BIND 软件包升级到版本 bind-9.11.26-2 或更新版本。
警告

如果您已经安装并运行了 BIND 版本,添加新版本 BIND 将覆盖现有的版本。

流程

以下是记录 DNS 查询的步骤:

  1. 编辑 options 块中的 /etc/named.conf 文件启用 dnstap 和目标文件:

    options
    {
    # …
    
    dnstap { all; }; # Configure filter
    dnstap-output file “/var/named/data/dnstap.bin”;
    
    # …
    };
    # end of options

    ( all | auth | client | forwarder | resolver | update ) [ ( query | response ) ];

    dnstap 过滤器包含 dnstap {} 块中由 ; 分隔的多个定义。

    下面是每个规则的语法:

    • auth - 权威区响应或回答。
    • client - 内部客户端查询或回答。
    • forwarder - 转发查询或响应。
    • resolver - 迭代解析查询或响应。
    • update - 动态区更新请求。
    • all - 以上选项中的任何选项。
    • query | response - 如果没有指定查询或响应关键字,则会记录这两个词。

      以下示例只请求 auth 响应, client queries 以及动态 updates 的查询和响应:

    Example:
    
    dnstap {auth response; client query; update;};
  2. 为活跃的日志配置定期推出部署。

    在以下示例中,用户编辑的脚本的内容由 cron 每天运行一次。第 3 号表示备份日志文件仅限于这个数字。因为该文件被删除,所以它永远不会达到 .2 后缀。

    Example:
    
    sudoedit /etc/cron.daily/dnstap
    
    #!/bin/sh
    rndc dnstap -roll 3
    mv /var/named/data/dnstap.bin.1 \ /var/log/named/dnstap/dnstap-$(date -I).bin
    
    # use dnstap-read to analyze saved logs
    sudo chmod a+x /etc/cron.daily/dnstap
  3. 使用 dnstap-read 实用程序以人类可读格式处理和分析日志。

    在以下示例中,详细 dnstap 输出以 YAML 文件格式打印。

    Example:
    
    dnstap-read -y [file-name]

第 29 章 管理访问控制列表

每个文件和目录每次只能有一个用户所有者和一个组所有者。如果您要授予用户权限来访问属于不同用户或组群的特定文件或目录,同时将其他文件和目录保留为私密,您可以使用 Linux 访问控制列表(ACL)。

29.1. 显示当前访问控制列表

您可以使用 getfacl 实用程序显示当前 ACL。

流程

  • 要显示特定文件或目录的当前 ACL,请使用:

    $ getfacl file-name

    用文件或目录的名称替换 file-name

29.2. 设置访问控制列表

您可以使用 setfacl 实用程序为文件或目录设置 ACL。

先决条件

  • root 访问。

流程

  • 要为文件或目录设置 ACL,请使用:
# setfacl -m u:username:symbolic_value file-name

使用用户名替换 username,使用符号值替换 symbolic_value,使用文件或目录的名称替换 file-name。详情请查看 setfacl man page。

例 29.1. 修改组项目的权限

以下示例描述了如何修改属于 root 组的 root 用户拥有的 group-project 文件的权限,以便该文件:

  • 不能被任何人执行。
  • 用户 andrew 具有 rw- 权限。
  • 用户 susan 具有 --- 权限。
  • 其他用户有 r-- 权限。

流程

# setfacl -m u:andrew:rw- group-project
# setfacl -m u:susan:--- group-project

验证步骤

  • 要验证用户 andrew 是否有 rw- 权限,用户 susan--- 权限,其他用户有 r-- 权限,请使用:

    $ getfacl group-project

    输出会返回:

    # file: group-project
    # owner: root
    # group: root
    user:andrew:rw-
    user:susan:---
    group::r--
    mask::rw-
    other::r--

第 30 章 使用 Chrony 套件配置 NTP

因为许多原因,系统准确计时非常重要。例如在网络中,需要准确的数据包和日志的时间戳。在 Linux 系统中, NTP 协议由在用户空间运行的守护进程实现。

用户空间守护进程更新内核中运行的系统时钟。系统时钟可以通过使用不同的时钟源来维护系统的时间。通常, 使用 时间戳计数器TSC)。TSC 是一个 CPU 寄存器,它计算从上次重置的循环数。它非常快,分辨率很高,且不会被中断。

在 Red Hat Enterprise Linux 8 中, NTP 协议由 chronyd 守护进程实现,它可从 chrony 软件包中的软件仓库中获得。

以下小节介绍了如何使用 chrony 套件配置 NTP。

30.1. chrony 套件介绍

chronyNetwork Time Protocol (NTP) 的一个实现。您可以使用 chrony:

  • 将系统时钟与 NTP 服务器同步
  • 将系统时钟与参考时钟同步,如 GPS 接收器
  • 将系统时钟与手动时间输入同步
  • 作为 NTPv4(RFC 5905) 服务器或 peer 为网络中的其他计算机提供时间服务

在多数条件下,chrony 都会表现良好,包括时断时续的网络连接、有大量网络数据的网络、温度不稳定(普通计算机时钟对温度敏感)以及不持续运行或在虚拟机上运行的系统。

通过互联网镜像同步的两天机器之间的准确性通常在几毫秒之内,而对于 LAN 中的机器则为几十微秒。硬件时间戳或硬件参考时钟可能会提高与子微秒级别同步的两台机器之间的准确性。

chrony 包括 chronyd,一个在用户空间中运行的守护进程,和 chronyc (可用来监控 chronyd 性能并在运行时更改各种操作参数的命令行程序)。

chrony 守护进程 chronyd 可由命令行工具 chronyc 监控和控制。这个工具提供了一个命令提示,允许输入大量命令来查询 chronyd 的当前状态并更改其配置。默认情况下, chronyd 只接受来自本地 chronyc 实例的命令,但它也可以配置为接受来自远程主机的监控命令。应该限制远程访问。

30.2. 使用 chronyc 来控制 chronyd

这部分论述了如何使用 chronyc 命令行实用程序控制 chronyd

流程

  1. 要使用互动模式的命令行实用程序 chronyc 来更改 chronyd 的本地实例,以 root 身份输入以下命令:

    # chronyc

    如果要使用某些受限命令,chronyc 必须以 root 身份运行。

    chronyc 命令提示符如下所示:

    chronyc>
  2. 要列出所有命令,请输入 help
  3. 或者,如果与以下命令一同调用,工具也可以在非互动命令模式下调用:

    chronyc command
注意

使用 chronyc 所做的更改不具有持久性,它们会在 chronyd 重启后丢失。要进行永久更改,请修改 /etc/chrony.conf

30.3. 迁移到 chrony

在 Red Hat Enterprise Linux 7 中,用户可以选择 ntpchrony 来保证准确计时。有关 ntpchrony ntpdchronyd 之间的区别,请参阅 ntpd 和 chronyd 之间的差别

在 Red Hat Enterprise Linux 8 中不再支持 ntp。默认启用chrony。因此,您可能需要从 ntp 迁移到 chrony

在大多数情况下,从 ntp 迁移到 chrony 是非常直接的。程序、配置文件和服务的相应名称为:

表 30.1. 从 ntp 迁移到 chrony 时的程序、配置文件和服务对应的名称

ntp 名称chrony 名称

/etc/ntp.conf

/etc/chrony.conf

/etc/ntp/keys

/etc/chrony.keys

ntpd

chronyd

ntpq

chronyc

ntpd.service

chronyd.service

ntp-wait.service

chrony-wait.service

ntpdatesntp 工具程序(包含在 ntp 发行本中)可使用 -q 选项或 -t 选项替换为 chronyd。可在命令行中指定配置以避免读取 /etc/chrony.conf。例如, chronyd 可以以以下方式启动,而不是运行 ntpdate ntp.example.com:

# chronyd -q 'server ntp.example.com iburst'
2018-05-18T12:37:43Z chronyd version 3.3 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
2018-05-18T12:37:43Z Initial frequency -2.630 ppm
2018-05-18T12:37:48Z System clock wrong by 0.003159 seconds (step)
2018-05-18T12:37:48Z chronyd exiting

ntpstat 工具程序之前包含在 ntp 软件包中,且只支持 ntpd,它现在支持 ntpdchronyd。它可在 ntpstat 软件包中找到。

30.3.1. 迁移脚本

名为 ntp2chrony.py 的 Python 脚本包括在 chrony 软件包(/usr/share/doc/chrony)文档中。这个脚本会自动将现有的 ntp 配置转换为 chrony。它支持 ntp.conf 文件中最常用的指令和选项。所有在转换中忽略的行都会作为注释包含在生成的 chrony.conf 文件中以供审核。在 ntp 密钥文件中指定但没有在 ntp.conf 中标记为可信密钥的密钥会作为注释出现在生成的 chrony.keys 文件中。

默认情况下,该脚本不会覆盖任何文件。如果 /etc/chrony.conf/etc/chrony.keys 已存在,可以使用 -b 选项重命名该文件作为备份。这个脚本支持其他选项。--help 选项输出所有支持选项。

例如,在 ntp 软件包中提供了默认 ntp.conf 的脚本调用示例:

# python3 /usr/share/doc/chrony/ntp2chrony.py -b -v
Reading /etc/ntp.conf
Reading /etc/ntp/crypto/pw
Reading /etc/ntp/keys
Writing /etc/chrony.conf
Writing /etc/chrony.keys

本例中唯一忽略的指令是 disable monitor,它在 noclientlog 指令中有一个等同的 chrony,但它包含在默认 ntp.conf 中,只用于缓解一个安全工具。

生成的 chrony.conf 文件通常包含大量与 ntp.conf 中限制行对应的 allow 指令。如果您不想将 chronyd 作为 NTP 服务器运行,请从 chrony.conf 中删除所有 allow 指令。

第 31 章 安全配置 chrony

chronyd 的默认配置文件是 /etc/chrony.conf-f 选项可以用来指定备选配置文件路径。更多选项请查看 chrony.conf(5) man page。有关可以使用的指令的完整列表请参考 chronyd 配置文件

chronyc 可以通过两种方式访问 chronyd:

  • 互联网协议、IPv4 或者 IPv6。
  • Unix 域套接字,由 rootchrony 用户在本地访问。

默认情况下,chronyc 连接到 Unix 域套接字。默认路径为 /var/run/chrony/chronyd.sock。如果这个连接失败,比如 chronyc 在非 root 用户中运行时, chronyc 会尝试连接到 127.0.0.1,然后是 ::1。

网络中只允许以下监控命令,它们不会影响 chronyd 的行为:

  • activity
  • manual list
  • rtcdata
  • smoothing
  • sources
  • sourcestats
  • tracking
  • waitsync

chronyd 接受这些命令的主机集合可以使用 chronyd 配置文件中的 cmdallow 指令或者 chronyc 中的 cmdallow 命令配置。默认情况下,这些命令只接受 localhost(127.0.0.1 或 ::1)。

所有其他命令只能通过 Unix 域套接字进行。当通过网络发送时, chronyd 会返回 Not authorised 错误,即使它来自 localhost。

以下流程描述了如何使用 chronyc 远程访问 chronyd。

流程

  1. /etc/chrony.conf 文件中添加以下内容来允许来自 IPv4 和 IPv6 地址的访问:

    bindcmdaddress 0.0.0.0

    或者

    bindcmdaddress ::
  2. 使用 cmdallow 指令允许来自远程 IP 地址、网络或子网的命令。

    /etc/chrony.conf 文件中添加以下内容:

    cmdallow 192.168.1.0/24
  3. 在防火墙中打开端口 323 从远程系统连接。

    #  firewall-cmd --zone=public --add-port=323/udp

    如果您想永久打开端口 323,使用 --permanent

    #  firewall-cmd --permanent --zone=public --add-port=323/udp

其它资源

  • chrony.conf(5) man page

第 32 章 使用 Chrony

以下小节描述了如何安装、启动和停止 chronyd,以及如何检查是否同步了 chrony。部分还描述了如何手动调整系统时钟。

32.1. 管理 chrony

以下流程描述了如何安装、启动、停止和检查 chronyd 的状态。

流程

  1. chrony 在 Red Hat Enterprise Linux 被默认安装。要确保它,以 root 身份运行以下命令:

    # yum install chrony

    chrony 守护进程的默认位置为 /usr/sbin/chronyd。命令行工具将安装到 /usr/bin/chronyc

  2. 运行以下命令检查 chronyd 的状态:

    systemctl status chronyd
    chronyd.service - NTP client/server
       Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
       Active: active (running) since Wed 2013-06-12 22:23:16 CEST; 11h ago
  3. 要启动 chronyd,请输入以下命令 root:

    # systemctl start chronyd

    要确保 chronyd 在系统启动时自动启动,以 root 身份运行以下命令:

    # systemctl enable chronyd
  4. 要停止 chronyd,请以 root 身份运行以下命令:

    # systemctl stop chronyd

    要防止 chronyd 在系统启动时自动启动,以 root 身份运行以下命令:

    # systemctl disable chronyd

32.2. 检查是否同步 chrony

以下流程描述了如何检查 chrony 是否与 trackingsourcessourcestats 命令的使用同步。

流程

  1. 运行以下命令检查 chrony 跟踪:

    chronyc tracking
    Reference ID    : CB00710F (foo.example.net)
    Stratum         : 3
    Ref time (UTC)  : Fri Jan 27 09:49:17 2017
    System time     :  0.000006523 seconds slow of NTP time
    Last offset     : -0.000006747 seconds
    RMS offset      : 0.000035822 seconds
    Frequency       : 3.225 ppm slow
    Residual freq   : 0.000 ppm
    Skew            : 0.129 ppm
    Root delay      : 0.013639022 seconds
    Root dispersion : 0.001100737 seconds
    Update interval : 64.2 seconds
    Leap status     : Normal
  2. source 命令显示 chronyd 访问的当前时间源的信息。运行以下命令检查 chrony 源:

    $ chronyc sources
    	210 Number of sources = 3
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    #* GPS0                          0   4   377    11   -479ns[ -621ns] /-  134ns
    ^? a.b.c                         2   6   377    23   -923us[ -924us] +/-   43ms
    ^ d.e.f                         1   6   377    21  -2629us[-2619us] +/-   86ms

    可以使用可选参数 -v 来包括详细信息。在这种情况下,会输出额外的标头行显示字段含义的信息。

  3. sourcestats 命令显示目前被 chronyd 检查的每个源的偏移率和误差估算过程的信息。运行以下命令检查 chrony 源统计:

    chronyc sourcestats
    210 Number of sources = 1
    Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
    ===============================================================================
    abc.def.ghi                11   5   46m     -0.001      0.045      1us    25us

    可以使用可选参数 -v 来包括详细信息。在这种情况下,会输出额外的标头行显示字段含义的信息。

其它资源

  • chronyc(1) man page

32.3. 手动调整系统时钟

以下流程描述了如何手动调整系统时钟。

流程

  1. 要立即调整系统时钟,绕过单机进行的任何调整,以 root 身份运行以下命令:

    # chronyc makestep

如果使用 rtcfile 指令,则不应该手动调整实时时钟。随机调整会影响 chrony的值,需要测量实时时钟偏移的速度。

32.4. 在隔离的网络中为系统设定 chrony

对于从来不连接到互联网的网络来说,一台计算机被选为主计时服务器。其他计算机要么是主计算机的直接客户端,要么是客户端的客户端。在 master 上,必须使用系统时钟的平均偏移率手动设置 drift 文件。如果 master 被重启,它将从周围的系统获得时间并计算设定系统时钟的平均值。之后它会恢复基于 drift 文件的调整。当使用 settime 命令时会自动更新 drift 文件。

以下流程描述了如何在隔离的网络中为系统设置 chrony

流程

  1. 在选为 master 的系统上,使用作为 root 运行的文本编辑器来编辑 /etc/chrony.conf,如下所示:

    driftfile /var/lib/chrony/drift
    commandkey 1
    keyfile /etc/chrony.keys
    initstepslew 10 client1 client3 client6
    local stratum 8
    manual
    allow 192.0.2.0

    其中 192.0.2.0 是允许客户端连接的网络或子网地址。

  2. 在选择为 master 客户端的系统上,以 root 身份运行一个文本编辑器来编辑 /etc/chrony.conf,如下所示:

    server master
    driftfile /var/lib/chrony/drift
    logdir /var/log/chrony
    log measurements statistics tracking
    keyfile /etc/chrony.keys
    commandkey 24
    local stratum 10
    initstepslew 20 master
    allow 192.0.2.123

    其中 192.0.2.123 是 master 的地址, master 是 master 的主机名。带有此配置的客户端如果重启 master 将重新同步。

在不是 master 客户端的客户端系统中, /etc/chrony.conf 文件应该是相同的,除了应该省略 localallow 指令。

在隔离的网络中,您还可以使用 local 指令来启用本地参考模式,它允许作为 NTP 服务器运行的 chronyd 实时显示同步,即使它从未同步或者最后一次更新时钟早前发生。

要允许网络中的多个服务器使用相同的本地配置并相互同步,而不让客户端轮询多个服务器,请使用 local 指令的 orphan 选项启用孤立模式。每个服务器都需要配置为使用 local 轮询所有其他服务器。这样可确保只有具有最小参考 ID 的服务器具有本地参考活跃状态,并同步其他服务器。当服务器失败时,另一个服务器会接管。

32.5. 其它资源

第 33 章 带有 HW 时间戳的 Chrony

硬件时间戳是某些网络接口控制器(NIC)支持的功能,它提供传入和传出数据包的时间戳。NTP 时间戳通常由内核和使用系统时钟的 chronyd 创建。但是,当启用 HW 时间戳时,NIC 会使用自己的时钟来生成数据包进入或离开链路层或物理层时的时间戳。当与 NTP 一起使用时,硬件时间戳可以显著提高同步的准确性。为了获得最佳准确性, NTP 服务器和 NTP 客户端都需要使用硬件时间戳。在理想情况下,子微秒的准确性是可能的。

另一个用于使用硬件时间戳进行时间同步的协议是 PTP

NTP 不同, PTP 依赖于网络交换机和路由器。如果您想要达到同步的最佳准确性,在具有支持 PTP 的交换机和路由器的网络中使用 PTP,在没有这样的交换机和路由器的网络中首选使用 NTP

以下小节描述了如何进行:

  • 验证硬件时间戳支持
  • 启用硬件时间戳
  • 配置客户端轮询间隔
  • 启用交集模式
  • 为大量客户端配置服务器
  • 验证硬件时间戳
  • 配置 PTP-NTP 桥接

33.1. 验证硬件时间戳支持

要验证接口是否支持使用 NTP 的硬件时间戳,请使用 ethtool -T 命令。如果 ethtool 列出了 SOF_TIMESTAMPING_TX_HARDWARESOF_TIMESTAMPING_TX_SOFTWARE 功能,以及 HWTSTAMP_FILTER_ALL 过滤器模式,则可以使用 NTP 的硬件时间戳。

例 33.1. 在特定接口中验证硬件时间戳支持

# ethtool -T eth0

输出:

Timestamping parameters for eth0:
Capabilities:
        hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
        software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
        hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
        software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
        software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
        hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 0
Hardware Transmit Timestamp Modes:
        off                   (HWTSTAMP_TX_OFF)
        on                    (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
        none                  (HWTSTAMP_FILTER_NONE)
        all                   (HWTSTAMP_FILTER_ALL)
        ptpv1-l4-sync         (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
        ptpv1-l4-delay-req    (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
        ptpv2-l4-sync         (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
        ptpv2-l4-delay-req    (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
        ptpv2-l2-sync         (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
        ptpv2-l2-delay-req    (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
        ptpv2-event           (HWTSTAMP_FILTER_PTP_V2_EVENT)
        ptpv2-sync            (HWTSTAMP_FILTER_PTP_V2_SYNC)
        ptpv2-delay-req       (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)

33.2. 启用硬件时间戳

要启用硬件时间戳,请使用 /etc/chrony.conf 文件中的 hwtimestamp 指令。该指令可指定单一接口,也可以指定通配符字符来启用所有支持接口的硬件时间戳。如果没有其他应用程序(如 linuxptp 软件包中的 ptp4l) 在接口中使用硬件时间戳,请使用通配符规格。chrony 配置文件中允许使用多个 hwtimestamp 指令。

例 33.2. 使用 hwtimestamp 指令启用硬件时间戳

hwtimestamp eth0
hwtimestamp eth1
hwtimestamp *

33.3. 配置客户端轮询间隔

建议为互联网中的服务器使用默认的轮询间隔范围(64-1024秒)。对于本地服务器和硬件时间戳,需要配置一个较短的轮询间隔,以便最小化系统时钟偏差。

/etc/chrony.conf 中的以下指令使用一个轮询间隔指定本地 NTP 服务器:

server ntp.local minpoll 0 maxpoll 0

33.4. 启用交集模式

NTP 不是硬件 NTP 应用程序的服务器,而是运行软件 NTP 实现的通用目的计算机,如 chrony,只有在发送数据包后才会获得硬件传输时间戳。这个行为可防止服务器在对应的数据包中保存时间戳。要启用 NTP 客户端接收传输时间戳后生成的传输时间戳,请将客户端配置为使用 NTP 交集模式,方法是在 /etc/chrony.conf 的 server 指令中添加 xleave 选项:

server ntp.local minpoll 0 maxpoll 0 xleave

33.5. 为大量客户端配置服务器

默认服务器配置最多允许几千个客户端同时使用交集模式。要为大量客户端配置服务器,增大 /etc/chrony.conf 中的 clientloglimit 指令。这个指令指定了在服务器中记录客户端访问的最大内存大小:

clientloglimit 100000000

33.6. 验证硬件时间戳

要校验该接口是否已成功启用了硬件时间戳,请检查系统日志。这个日志应该包含来自 chronyd 的每个接口的消息,并成功启用硬件时间戳。

例 33.3. 为启用硬件时间戳的接口记录日志信息

chronyd[4081]: Enabled HW timestamping on eth0
chronyd[4081]: Enabled HW timestamping on eth1

chronyd 配置为 NTP 客户端或对等时,您可以通过 chronyc ntpdata 命令为每个 NTP 源报告传输和接收时间戳模式,以及交集模式:

例 33.4. 报告每个 NTP 源的传输、接收时间戳以及交集模式

# chronyc ntpdata

输出:

Remote address  : 203.0.113.15 (CB00710F)
Remote port     : 123
Local address   : 203.0.113.74 (CB00714A)
Leap status     : Normal
Version         : 4
Mode            : Server
Stratum         : 1
Poll interval   : 0 (1 seconds)
Precision       : -24 (0.000000060 seconds)
Root delay      : 0.000015 seconds
Root dispersion : 0.000015 seconds
Reference ID    : 47505300 (GPS)
Reference time  : Wed May 03 13:47:45 2017
Offset          : -0.000000134 seconds
Peer delay      : 0.000005396 seconds
Peer dispersion : 0.000002329 seconds
Response time   : 0.000152073 seconds
Jitter asymmetry: +0.00
NTP tests       : 111 111 1111
Interleaved     : Yes
Authenticated   : No
TX timestamping : Hardware
RX timestamping : Hardware
Total TX        : 27
Total RX        : 27
Total valid RX  : 27

例 33.5. 报告 NTP 测量的稳定性

# chronyc sourcestats

启用硬件时间戳后, NTP 测量的稳定性应该是几十秒或几百纳秒,处于正常负载下。这个稳定性在 chronyc sourcestats 命令输出的 Std Dev 列中报告:

输出:

210 Number of sources = 1
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
ntp.local                  12   7    11     +0.000      0.019     +0ns    49ns

33.7. 配置 PTP-NTP 桥接

如果网络中存在一个高度准确的 Precision Time Protocol(PTP)grandmaster,且没有支持 PTP 的交换机或路由器,则一个计算机可能会被指定专门用于作为 PTP slave 和一个 stratum-1 NTP 服务器操作。这样的计算机需要两个或者多个网络接口,并接近 grandmaster 或与其直接连接。这样可保证高度准确的网络同步。

linuxptp 软件包中配置 ptp4 l 和 phc2sys 程序,使用一个接口使用 PTP 同步系统时钟。

配置 chronyd 以使用其他接口提供系统时间:

例 33.6. 将 chronyd 配置为使用其他接口提供系统时间

bindaddress 203.0.113.74
hwtimestamp eth1
local stratum 1

第 34 章 在 chrony 中实现一些之前被 NTP 支持的设置

chrony 不支持一些在之前的 Red Hat Enterprise Linux 主要版本中被 ntp 支持的设置。以下小节列出了这些设置,并描述了在使用 chrony 的系统中达到它们的方法

34.1. 使用 ntpq 和 ntpdc 进行监控

chronyd 无法被来自 ntp 发行版本的 ntpq 和 ntpdc 监控,因为 chrony 不支持 NTP 模式 6 和 7。它支持不同的协议,chronyc 是一个客户端的实现。详情请查看 chronyc(1) man page。

要监控使用 chronyd 的系统时钟的状态,您可以:

  • 使用 tracking 命令
  • 使用支持 chronyntpstat 工具,它提供类似于用于它的输出 ntpd

例 34.1. 使用跟踪命令

$ chronyc -n tracking
Reference ID    : 0A051B0A (10.5.27.10)
Stratum         : 2
Ref time (UTC)  : Thu Mar 08 15:46:20 2018
System time     : 0.000000338 seconds slow of NTP time
Last offset     : +0.000339408 seconds
RMS offset      : 0.000339408 seconds
Frequency       : 2.968 ppm slow
Residual freq   : +0.001 ppm
Skew            : 3.336 ppm
Root delay      : 0.157559142 seconds
Root dispersion : 0.001339232 seconds
Update interval : 64.5 seconds
Leap status     : Normal

例 34.2. 使用 ntpstat 程序

$ ntpstat
synchronised to NTP server (10.5.27.10) at stratum 2
   time correct to within 80 ms
   polling server every 64 s

34.2. 使用基于公钥加密的认证机制

在 Red Hat Enterprise Linux 7 中, ntp 支持 Autokey,它是一个基于公钥加密的认证机制。 chronyd 不支持 Autokey。

在 Red Hat Enterprise Linux 8 系统中,建议您使用对称密钥。使用 chronyc keygen 命令生成密钥。客户端和服务器需要共享在 /etc/chrony.keys 中指定的密钥。客户端可以使用 serverpoolpeer 指令中的 key 选项启用身份验证。

34.3. 使用临时对称关联

在 Red Hat Enterprise Linux 7 中, ntpd 支持临时对称关联,该关联可由来自对等的数据包加载,这些数据包没有在 ntp.conf 配置文件中指定。在 Red Hat Enterprise Linux 8 中, chronyd 都需要在 chrony.conf 中指定所有对等者。不支持临时对称关联。

请注意,使用 serverpool 指令启用的客户端/服务器模式与 peer 指令启用的对称模式相比更为安全。

34.4. 多播/广播客户端

Red Hat Enterprise Linux 7 支持广播/多播 NTP 模式,该模式简化了客户端配置。使用这个模式,可将客户端配置为侦听发送到多播/广播地址的数据包,而不是侦听单个服务器的具体名称或地址(这些内容可能会随时间改变)。

在 Red Hat Enterprise Linux 8 中, chronyd 不支持广播/多播模式。主要的原因是它比一般的客户端/服务器以及对称模式的准确性较低且安全性较低。

NTP 广播/多播设置中迁移有几个选项:

  • 将 DNS 配置为将单个名称(如 ntp.example.com)转换为不同服务器的多个地址。

    客户端只能使用单一池指令来与多个服务器同步进行静态配置。如果池中的服务器变得不可访问,或者不适合同步,客户端会自动将其替换为池中的另一台服务器。

  • 通过 DHCP 分配 NTP 服务器列表

    当 NetworkManager 从 DHCP 服务器获得 NTP 服务器列表时, chronyd 会自动配置为使用它们。这个功能可以通过在 /etc/sysconfig/network 文件中添加 PEERNTP=no 来禁用。

  • 使用 Precision Time Protocol (PTP)

    这个选项主要适用于服务器经常更改的环境,或者大量的客户端需要在没有指定服务器的情况下相互同步。

    PTP 它被设计为多播消息,它的工作方式与 NTP 广播模式相似。PTP 软件包中包括了一个 linuxptp 实现。

    PTP 通常需要硬件时间戳并支持网络开关执行正常。但是,即使使用软件时间戳且不支持网络交换机, PTP 也比广播模式中的 NTP 更好地工作。

    在同一个通信路径中有大量 PTP slave 的网络中,建议使用 hybrid_e2e 选项配置 PTP 从设备,以便减少从设备生成的网络流量数量。您可以将运行 chronyd 的计算机配置为 NTP 客户端,可能还会作为 PTP grandmaster 操作,使用多播消息向大量计算机分发同步时间。NTP

第 35 章 使用 RHEL 系统角色管理时间同步

您可以使用 timesync 角色在多个目标机器上管理时间同步。timesync 角色安装并配置 NTP 或 PTP 实现来作为 NTP 客户端或 PTP slave 操作,以便将系统时钟与 PTP 域中的 NTP 服务器或 grandmasters 同步。

请注意,使用 timesync 角色也有助于 迁移到 chrony,因为您可以在从 RHEL 6 开始的所有 Red Hat Enterprise Linux 版本中使用相同的 playbook,无论系统是否使用 ntpchrony 来实现 NTP 协议。

警告

timesync 角色替换了受管主机上给定或检测到的供应商服务的配置。之前的设置即使没有在角色变量中指定,也会丢失。如果没有定义 timesync_ntp_provider 变量,唯一保留的设置就是供应商选择。

以下示例演示了如何在只有一个服务器池的情况下应用 timesync 角色。

例 35.1. 为单一服务器池应用 timesync 角色的 playbook 示例

---
- hosts: timesync-test
  vars:
    timesync_ntp_servers:
      - hostname: 2.rhel.pool.ntp.org
        pool: yes
        iburst: yes
  roles:
    - rhel-system-roles.timesync

有关 timesync 角色变量的详细参考,安装 rhel-system-roles 软件包,并查看 /usr/share/doc/rhel-system-roles/timesync 目录中的 README.mdREADME.html 文件。

其它资源

第 36 章 使用 OpenSSH 的两个系统间使用安全通讯

SSH(Secure Shell)是一个协议,它使用客户端-server 架构在两个系统间提供安全通讯,并允许用户远程登录到服务器主机系统。和其它远程沟通协议,如 FTP 或 Telnet 不同,SSH 会加密登录会话,它会阻止入侵者从连接中收集未加密的密码。

Red Hat Enterprise Linux 8 包含基本 OpenSSH 软件包:常规 openssh 软件包、openssh-server 软件包和 openssh-clients 软件包。请注意, OpenSSH 软件包需要 OpenSSL 软件包 openssl-libs,它会安装几个重要的加密库来启用 OpenSSH 提供加密的通讯。

36.1. SSH 和 OpenSSH

SSH(安全 Shell)是一个登录远程机器并在该机器上执行命令的程序。SSH 协议通过不安全的网络在两个不可信主机间提供安全加密的通讯。您还可以通过安全频道转发 X11 连接和任意 TCP/IP 端口。

当使用这个主机进行远程 shell 登录或文件复制时,SSH 协议可缓解安全隐患,如拦截两个系统间的通信和模拟特定主机。这是因为 SSH 客户端和服务器使用数字签名来验证其身份。另外,所有客户端和服务器系统之间的沟通都是加密的。

主机密钥验证使用 SSH 协议的主机。主机密钥是首次安装 OpenSSH,或主机第一次引导时自动生成的加密密钥。

OpenSSH 是很多 Linux、UNIX 和类似操作系统支持的 SSH 协议的实现。它包括 OpenSSH 客户端和服务器需要的核心文件。OpenSSH 组件由以下用户空间工具组成:

  • ssh 是一个远程登录程序(SSH 客户端)
  • sshd 是一个 OpenSSH SSH 守护进程
  • scp 是一个安全的远程文件复制程序
  • sftp 是一个安全的文件传输程序
  • ssh-agent 是用于缓存私钥的身份验证代理
  • ssh-addssh-agent 添加私钥身份
  • ssh-keygenssh 生成、管理和转换验证密钥
  • ssh-copy-id 是一个将本地公钥添加到远程 SSH 服务器的 authorized_keys 文件中的脚本
  • ssh-keyscan - 收集 SSH 公共主机密钥

现有两个 SSH 版本: 版本 1 和较新的版本 2。Red Hat Enterprise Linux 8 中的 OpenSSH 套件只支持 SSH 版本 2,它增强的密钥交换算法不会受到版本 1 中已知漏洞的影响。

OpenSSH作为 RHEL 核心加密子系统之一,使用系统范围的加密策略。这样可确保在默认配置中禁用弱密码套件和加密算法。要调整策略,管理员必须使用 update-crypto-policies 命令更严格或浮动设置,或者手动不使用系统范围的加密策略。

OpenSSH 套件使用两组不同的配置文件:用于客户端程序(即 sshscpsftp)的配置文件,和用于服务器( sshd 守护进程)的配置文件。系统范围的 SSH 配置信息保存在 /etc/ssh/ 目录中。用户特定的 SSH 配置信息保存在用户主目录中的 ~/.ssh/ 中。有关 OpenSSH 配置文件的详细列表,请查看 sshd(8) man page 中的 FILES 部分。

其它资源

36.2. 配置并启动 OpenSSH 服务器

使用以下步骤进行您的环境以及启动 OpenSSH 服务器所需的基本配置。请注意,在默认 RHEL 安装后, sshd 守护进程已经启动,服务器主机密钥会自动创建。

先决条件

  • 已安装 openssh-server 软件包。

流程

  1. 在当前会话中启动 sshd 守护进程,并将其设置为在引导时自动启动:

    # systemctl start sshd
    # systemctl enable sshd
  2. 要指定一个与 /etc/ssh/sshd_config 配置文件中的 ListenAddress 指令指定的默认地址 0.0.0.0 (IPv4)或 ::(IPv6)不同的地址,并使用较慢的动态网络配置时,将 network-online.target 目标单元的依赖关系添加到 sshd.service 单元文件中。要做到这一点,使用以下内容创建 /etc/systemd/system/sshd.service.d/local.conf 文件:

    [Unit]
    Wants=network-online.target
    After=network-online.target
  3. 查看 OpenSSH 配置文件中的 /etc/ssh/sshd_config 服务器设置是否满足您的要求。
  4. 另外,还可以通过编辑 /etc/issue 文件来更改您的 OpenSSH 服务器在客户端验证前显示的欢迎信息,例如:

    Welcome to ssh-server.example.com
    Warning: By accessing this server, you agree to the referenced terms and conditions.

    确保 Banner 选项没有注释掉 /etc/ssh/sshd_config 选项,这个选项的值包含 /etc/issue

    # less /etc/ssh/sshd_config | grep Banner
    Banner /etc/issue

    请注意,要在成功登录后更改显示的信息,您必须编辑服务器上的 /etc/motd 文件。详情请查看 pam_motd man page。

  5. 重新载入 systemd 配置并重启 sshd 以应用更改:

    # systemctl daemon-reload
    # systemctl restart sshd

验证

  1. 检查 sshd 守护进程是否正在运行:

    # systemctl status sshd
    ● sshd.service - OpenSSH server daemon
       Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
       Active: active (running) since Mon 2019-11-18 14:59:58 CET; 6min ago
         Docs: man:sshd(8)
               man:sshd_config(5)
     Main PID: 1149 (sshd)
        Tasks: 1 (limit: 11491)
       Memory: 1.9M
       CGroup: /system.slice/sshd.service
               └─1149 /usr/sbin/sshd -D -oCiphers=aes128-ctr,aes256-ctr,aes128-cbc,aes256-cbc -oMACs=hmac-sha2-256,>
    
    Nov 18 14:59:58 ssh-server-example.com systemd[1]: Starting OpenSSH server daemon...
    Nov 18 14:59:58 ssh-server-example.com sshd[1149]: Server listening on 0.0.0.0 port 22.
    Nov 18 14:59:58 ssh-server-example.com sshd[1149]: Server listening on :: port 22.
    Nov 18 14:59:58 ssh-server-example.com systemd[1]: Started OpenSSH server daemon.
  2. 使用 SSH 客户端连接到 SSH 服务器。

    # ssh user@ssh-server-example.com
    ECDSA key fingerprint is SHA256:dXbaS0RG/UzlTTku8GtXSz0S1++lPegSy31v3L/FAEc.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added 'ssh-server-example.com' (ECDSA) to the list of known hosts.
    
    user@ssh-server-example.com's password:

其它资源

  • sshd(8)sshd_config(5) man page。

36.3. 为基于密钥的身份验证设置 OpenSSH 服务器

要提高系统安全性,请通过在 OpenSSH 服务器上禁用密码验证来强制进行基于密钥的验证。

先决条件

  • 已安装 openssh-server 软件包。
  • sshd 守护进程正在服务器中运行。

流程

  1. 在文本编辑器中打开 /etc/ssh/sshd_config 配置,例如:

    # vi /etc/ssh/sshd_config
  2. PasswordAuthentication 选项改为 no:

    PasswordAuthentication no

    在新默认安装以外的系统中,检查 PubkeyAuthentication no 没有被设置,并将 ChallengeResponseAuthentication 指令设置为 no。如果您要进行远程连接,而不使用控制台或带外访问,在禁用密码验证前测试基于密钥的登录过程。

  3. 要在 NFS 挂载的主目录中使用基于密钥的验证,启用 use_nfs_home_dirs SELinux 布尔值:

    # setsebool -P use_nfs_home_dirs 1
  4. 重新载入 sshd 守护进程以应用更改:

    # systemctl reload sshd

其它资源

  • sshd(8)sshd_config(5)setsebool(8) man page。

36.4. 生成 SSH 密钥对

使用这个流程在本地系统中生成 SSH 密钥对,并将生成的公钥复制到 OpenSSH 服务器中。如果正确配置了服务器,您可以在不提供任何密码的情况下登录到 OpenSSH 服务器。

重要

如果以 root 身份完成一下步骤,则只有 root 可以使用密钥。

流程

  1. 为 SSH 协议的版本 2 生成 ECDSA 密钥对:

    $ ssh-keygen -t ecdsa
    Generating public/private ecdsa key pair.
    Enter file in which to save the key (/home/joesec/.ssh/id_ecdsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/joesec/.ssh/id_ecdsa.
    Your public key has been saved in /home/joesec/.ssh/id_ecdsa.pub.
    The key fingerprint is:
    SHA256:Q/x+qms4j7PCQ0qFd09iZEFHA+SqwBKRNaU72oZfaCI joesec@localhost.example.com
    The key's randomart image is:
    +---[ECDSA 256]---+
    |.oo..o=++        |
    |.. o .oo .       |
    |. .. o. o        |
    |....o.+...       |
    |o.oo.o +S .      |
    |.=.+.   .o       |
    |E.*+.  .  . .    |
    |.=..+ +..  o     |
    |  .  oo*+o.      |
    +----[SHA256]-----+

    您还可以通过在 ssh-keygen -t ed25519 命令中使用 -t rsa 选项生成一个 RSA 密钥对,或使用 ssh-keygen 选项生成 Ed25519 密钥对。

  2. 要将公钥复制到远程机器中:

    $ ssh-copy-id joesec@ssh-server-example.com
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    joesec@ssh-server-example.com's password:
    ...
    Number of key(s) added: 1
    
    Now try logging into the machine, with: "ssh 'joesec@ssh-server-example.com'" and check to make sure that only the key(s) you wanted were added.

    如果您没有在会话中使用 ssh-agent 程序,上一个命令会复制最新修改的 ~/.ssh/id*.pub 公钥。要指定另一个公钥文件,或者通过 ssh-agent 内存中缓存的密钥优先选择文件中的密钥,请使用带 -i 选项的 ssh-copy-id 命令。

注意

如果您重新安装您的系统并希望保留之前生成的密钥对,请备份 ~/.ssh/ 目录。重新安装后,将其复制到主目录中。您可以为系统中的所有用户进行此操作,包括 root

验证

  1. 在不提供任何密码的情况下登录到 OpenSSH 服务器:

    $ ssh joesec@ssh-server-example.com
    Welcome message.
    ...
    Last login: Mon Nov 18 18:28:42 2019 from ::1

其它资源

  • ssh-keygen(1)ssh-copy-id(1) man page。

36.5. 使用保存在智能卡中的 SSH 密钥

Red Hat Enterprise Linux 可让您使用保存在 OpenSSH 客户端智能卡中的 RSA 和 ECDSA 密钥。使用这个步骤使用智能卡而不是使用密码启用验证。

先决条件

  • 在客户端中安装了 opensc 软件包, pcscd 服务正在运行。

流程

  1. 列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到 key.pub 文件:

    $ ssh-keygen -D pkcs11: > keys.pub
    $ ssh-keygen -D pkcs11:
    ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
    ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
  2. 要使用远程服务器上的智能卡(example.com)启用验证,将公钥传送到远程服务器。使用带有上一步 中创建的 key.pubssh-copy-id 命令:

    $ ssh-copy-id -f -i keys.pub username@example.com
  3. 要使用在第 1 步 ssh-keygen -D 命令输出中的 ECDSA 密钥连接到 example.com,您只能使用 URI 中的一个子集,它是您的密钥的唯一参考,例如:

    $ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com
    Enter PIN for 'SSH key':
    [example.com] $
  4. 您可以使用 ~/.ssh/config 文件中的同一 URI 字符串使配置持久:

    $ cat ~/.ssh/config
    IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so"
    $ ssh example.com
    Enter PIN for 'SSH key':
    [example.com] $

    因为 OpenSSH 使用 p11-kit-proxy wrapper,并且 OpenSC PKCS #11 模块注册到 PKCS#11 Kit,您可以简化前面的命令:

    $ ssh -i "pkcs11:id=%01" example.com
    Enter PIN for 'SSH key':
    [example.com] $

如果您跳过 PKCS #11 URI 的 id= 部分,则 OpenSSH 会加载代理模块中可用的所有密钥。这可减少输入所需的数量:

$ ssh -i pkcs11: example.com
Enter PIN for 'SSH key':
[example.com] $

其它资源

36.6. 使 OpenSSH 更安全

以下提示可帮助您在使用 OpenSSH 时提高安全性。请注意 /etc/ssh/sshd_config OpenSSH 配置文件中的更改需要重新载入 sshd 守护进程才能生效:

# systemctl reload sshd
重要

大多数安全强化配置更改减少了与不支持最新算法或密码套件的客户端的兼容性。

禁用不安全的连接协议

  • 要使 SSH 生效,防止使用由 OpenSSH 套件替代的不安全连接协议。否则,用户的密码可能只会在一个会话中被 SSH 保护,可能会在以后使用 Telnet 登录时被捕获。因此,请考虑禁用不安全的协议,如 telnet、rsh、rlogin 和 ftp。

启用基于密钥的身份验证并禁用基于密码的身份验证

  • 禁用密码验证并只允许密钥对可减少安全攻击面,还可节省用户的时间。在客户端中,使用 ssh-keygen 工具生成密钥对,并使用 ssh-copy-id 工具从 OpenSSH 服务器的客户端复制公钥。要在 OpenSSH 服务器中禁用基于密码的身份验证,请编辑 /etc/ssh/sshd_config 并将 PasswordAuthentication 选项改为 no

    PasswordAuthentication no

密钥类型

  • 虽然 ssh-keygen 命令默认生成一组 RSA 密钥,但您可以使用 -t 选项指定它生成 ECDSA 或 Ed25519 密钥。ECDSA(Elliptic Curve Digital Signature Algorithm)提供了比对称密钥强度的 RSA 更好的性能。它还会生成较短的密钥。Ed25519 公钥算法是 twisted Edwards curves 的一个实现,它比 RSA、DSA 和 ECDSA 更安全且更快。

    如果没有这些密钥,OpenSSH 会自动创建 RSA、ECDSA 和 Ed25519 服务器主机密钥。要在 RHEL 8 中配置主机密钥创建,请使用 sshd-keygen@.service 实例化服务。例如,禁用自动创建 RSA 密钥类型:

    # systemctl mask sshd-keygen@rsa.service
  • 要排除 SSH 连接的特定密钥类型,注释掉 /etc/ssh/sshd_config 中的相关行,并重新载入 sshd 服务。例如,只允许 Ed25519 主机密钥:

    # HostKey /etc/ssh/ssh_host_rsa_key
    # HostKey /etc/ssh/ssh_host_ecdsa_key
    HostKey /etc/ssh/ssh_host_ed25519_key

非默认端口

  • 默认情况下, sshd 守护进程侦听 TCP 端口 22。更改此端口可降低系统因自动网络扫描而受到攻击的风险,并可以提高安全性。您可以使用 /etc/ssh/sshd_config 配置文件中的 Port 指令指定端口。

    您还必须更新默认 SELinux 策略以允许使用非默认端口。要做到这一点,使用 policycoreutils-python-utils 软件包中的 semanage 工具:

    # semanage port -a -t ssh_port_t -p tcp port_number

    另外,更新 firewalld 配置:

    # firewall-cmd --add-port port_number/tcp
    # firewall-cmd --runtime-to-permanent

    在前面的命令中,将 port_number 替换为使用 Port 指令指定的新端口号。

没有 root 登录

  • 如果您的特定用例不需要以 root 用户登录,您应该考虑将 PermitRootLogin 文件中的 /etc/ssh/sshd_config 配置指令设置为 no。通过禁用以 root 用户身份登录的可能性,管理员可以审核哪些用户在以常规用户身份登录后运行哪些特权命令,然后获得 root 权限。

    另外,将 PermitRootLogin 设置为 prohibit-password:

    PermitRootLogin prohibit-password

    这会强制使用基于密钥的身份验证,而不是使用密码登录 root,并通过防止"强制攻击"来降低风险。

使用 ⁠X 安全扩展

  • Red Hat Enterprise Linux 客户端中的 X 服务器不提供 X 安全性扩展。因此,当连接到带有 X11 转发的不可信 SSH 服务器时,客户端无法请求另一个安全层。大多数应用程序都无法在启用此扩展时运行。

    默认情况下,/etc/ssh/ssh_config.d/05-redhat.conf 文件中的 ForwardX11Trusted 选项被设置为 yesssh -X remote_machine (不可信主机)和 ssh -Y remote_machine (可信主机)命令之间没有区别。

    如果您的场景根本不需要 X11 转发功能,请将 /etc/ssh/sshd_config 配置文件中的 X11Forwarding 指令设置为 no

限制对特定用户、组群或者域的访问

  • 使用 /etc/ssh/sshd_config 配置文件服务器中的 AllowUsersAllowGroups 指令可以只允许某些用户、域或组连接到您的 OpenSSH 服务器。您可以组合 AllowUsersAllowGroups 来更精确地限制访问,例如:

    AllowUsers *@192.168.1.*,*@10.0.0.*,!*@192.168.1.2
    AllowGroups example-group

    前面的配置行接受来自系统的所有用户的连接。192.168.1.* 和 10.0.0.* 子网除外,但来自系统 192.168.1.2 地址的子网除外。所有用户都必须位于 example-group 组中。OpenSSH 服务器拒绝所有其他连接。

    请注意,使用允许列表(以允许列表开头)比使用块列表(从 Deny 开始)更安全,因为允许列表块也是新的未授权用户或组。

更改系统范围的加密策略

  • OpenSSH 使用 RHEL 系统范围的加密策略,默认的系统范围的加密策略级别为当前的威胁模型提供了安全设置。要使您的加密设置更严格,请更改当前的策略级别:

    # update-crypto-policies --set FUTURE
    Setting system policy to FUTURE
  • 要为您的 OpenSSH 服务器选择不使用系统范围的加密策略,请使用 /etc/sysconfig/sshd 文件中的 CRYPTO_POLICY= 变量取消对行的注释。更改后,您在 /etc/ssh/sshd_config 文件中的 CiphersMACsKexAlgoritmsGSSAPIKexAlgorithms 部分中指定的值不会覆盖。请注意,这个任务需要深入了解配置加密选项。
  • 如需更多信息,请参阅 RHEL 8 安全强化文档中的使用系统范围的加密策略

其它资源

  • sshd_config(5)ssh-keygen(1)crypto-policies(7)update-crypto-policies(8) man page。

36.7. 使用 SSH 跳过主机连接到远程服务器

使用这个步骤通过中间服务器(也称为跳过主机)将本地系统连接到远程服务器。

先决条件

  • 跳过主机接受来自本地系统的 SSH 连接。
  • 远程服务器只接受来自跳过主机的 SSH 连接。

流程

  1. 通过编辑本地系统中的 ~/.ssh/config 文件来定义跳过主机,例如:

    Host jump-server1
      HostName jump1.example.com
    • Host 参数定义您可以在 ssh 命令中使用的主机的名称或别名。该值可以与真实主机名匹配,但也可以是任意字符串。
    • HostName 参数设置跳过主机的实际主机名或 IP 地址。
  2. 使用 ProxyJump 指令将远程服务器跳过配置添加到本地系统的 ~/.ssh/config 文件中,例如:

    Host remote-server
      HostName remote1.example.com
      ProxyJump jump-server1
  3. 使用您的本地系统通过跳过服务器连接到远程服务器:

    $ ssh remote-server

    如果您省略了配置步骤 1 和 2,则前面的命令等同于 ssh -J jump-server1 remote-server 命令。

注意

您可以指定更多跳过的服务器,您还可以在提供完整主机名时跳过将主机定义添加到配置文件中,例如:

$ ssh -J jump1.example.com,jump2.example.com,jump3.example.com remote1.example.com

如果跳过服务器中的用户名或 SSH 端口与远程服务器的名称和端口不同,则在上一命令中更改主机名标记,例如:

$ ssh -J johndoe@jump1.example.com:75,johndoe@jump2.example.com:75,johndoe@jump3.example.com:75 joesec@remote1.example.com:220

其它资源

  • ssh_config(5)ssh(1) man page。

36.8. 使用 ssh-agent 使用 SSH 密钥连接到远程机器

为了避免每次启动 SSH 连接时都输入密码,您可以使用 ssh-agent 工具缓存私有 SSH 密钥。私钥和密码短语可以保持安全性。

先决条件

  • 您有一个带有 SSH 守护进程运行的远程主机,可通过网络访问。
  • 您知道登录到远程主机的 IP 地址或者主机名以及凭证。
  • 您已用密码生成了 SSH 密钥对,并将公钥传送到远程机器。如需更多信息,请参阅 生成 SSH 密钥对

流程

  1. 可选:使用密钥验证远程主机:

    1. 使用 SSH 连接到远程主机:

      $ ssh example.user1@198.51.100.1 hostname
    2. 输入您在创建密钥时设定的密码短语以授予对私钥的访问权限。

      $ ssh example.user1@198.51.100.1 hostname
       host.example.com
  2. 启动 ssh-agent

    $ eval $(ssh-agent)
    Agent pid 20062
  3. 将密钥添加到 ssh-agent

    $ ssh-add ~/.ssh/id_rsa
    Enter passphrase for ~/.ssh/id_rsa:
    Identity added: ~/.ssh/id_rsa (example.user0@198.51.100.12)

验证

  • 可选:使用 SSH 登录到主机机器。

    $ ssh example.user1@198.51.100.1
    
    Last login: Mon Sep 14 12:56:37 2020

    请注意您不必输入密码短语。

36.9. 其它资源

第 37 章 配置远程日志解决方案

要确保环境中不同机器的日志被集中记录在日志记录服务器中,您可以将 Rsyslog 应用程序配置为记录来自客户端系统到服务器的特定条件的日志。

37.1. Rsyslog 日志记录服务

Rsyslog 应用程序与 systemd-journald 服务相结合,在 Red Hat Enterprise Linux 中提供本地和远程日志支持。rsyslogd 守护进程持续读取由 systemd-journald 服务接收的,来自日志的 syslog 信息。rsyslogd 然后过滤和处理这些 syslog 事件,并将其记录到 rsyslog 日志文件,或者根据配置将它们转发到其他服务。

rsyslogd 守护进程还提供扩展过滤、加密对消息进行传输、输入和输出模块以及使用 TCP 和 UDP 协议的支持。

/etc/rsyslog.conf 中( rsyslog 的主要配置文件),您可以指定 rsyslogd 处理消息的规则。通常,您可以根据其源和主题(优先级)和主题来分类信息,然后分配当消息适合这些条件时应执行的操作。

/etc/rsyslog.conf 中,您还可以看到由 rsyslogd 维护的日志文件列表。大多数日志文件都位于 /var/log/ 目录中。有些应用程序,如 httpdsamba,将日志文件存储在 /var/log/ 中的子目录中。

其它资源

37.2. 安装 Rsyslog 文档

Rsyslog 应用程序有广泛的文档,如 https://www.rsyslog.com/doc/ 可用 , 但您也可以按照以下流程在本地安装 rsyslog-doc 文档软件包。

先决条件

  • 您已在系统中激活了 AppStream 软件仓库。
  • 您可以使用 sudo 安装新软件包。

流程

  • 安装 rsyslog-doc 软件包:

    $ sudo yum install rsyslog-doc

验证

  • 在您选择的浏览器中 打开 file:///usr/share/doc/rsyslog/html/index.html 文件,例如:

    $ firefox file:///usr/share/doc/rsyslog/html/index.html

37.3. 配置服务器以使用 TCP 进行远程日志

Rsyslog 应用程序允许您运行日志记录服务器,并配置独立的系统将其日志文件发送到日志记录服务器。要通过 TCP 使用远程日志,请配置服务器和客户端。服务器收集并分析一个或多个客户端系统发送的日志。

使用 Rsyslog 应用程序,您可以维护一个集中式日志系统,它通过网络将日志信息转发到服务器。为了避免服务器不可用时消息丢失,您可以为 forwarding 操作配置操作队列。这样,发送失败的信息会在本地存储,直到服务器可以被再次访问为止。请注意,无法为使用 UDP 协议的连接配置这样的队列。

omfwd 插件通过 UDP 或 TCP 提供转发。默认协议是 UDP。由于插件是内置的,所以不必载入它。

默认情况下, rsyslog 在端口 514 上使用 TCP。

先决条件

  • rsyslog 在服务器系统中安装
  • 以 root 用户身份登录到服务器

流程

  1. 可选: 要将不同的端口用于 rsyslog 流量,请将 syslogd_port_t SELinux 类型添加到端口。例如,启用端口 30514:

    # semanage port -a -t syslogd_port_t -p tcp 30514
  2. 可选: 要将不同的端口用于 rsyslog 流量,请将 firewalld 配置为允许那个端口上的 rsyslog 流量。例如,允许区 30514 中的端口 zone 的 TCP 流量:

    # firewall-cmd --zone=zone --permanent --add-port=30514/tcp
    success
  3. 在名为 remotelog.conf/etc/rsyslog.d/ 目录中创建一个新文件,并插入以下内容:

    # Define templates before the rules that use them
    ### Per-Host Templates for Remote Systems ###
    template(name="TmplAuthpriv" type="list") {
        constant(value="/var/log/remote/auth/")
        property(name="hostname")
        constant(value="/")
        property(name="programname" SecurePath="replace")
        constant(value=".log")
        }
    
    template(name="TmplMsg" type="list") {
        constant(value="/var/log/remote/msg/")
        property(name="hostname")
        constant(value="/")
        property(name="programname" SecurePath="replace")
        constant(value=".log")
        }
    
    # Provides TCP syslog reception
    module(load="imtcp")
    # Adding this ruleset to process remote messages
    ruleset(name="remote1"){
         authpriv.*   action(type="omfile" DynaFile="TmplAuthpriv")
          *.info;mail.none;authpriv.none;cron.none
    action(type="omfile" DynaFile="TmplMsg")
    }
    
    input(type="imtcp" port="30514" ruleset="remote1")
  4. 保存对 /etc/rsyslog.d/remotelog.conf 文件的更改。
  5. 确保 rsyslog 服务已在日志服务器中运行并启用:

    # systemctl status rsyslog
  6. 重启 rsyslog 服务。

    # systemctl restart rsyslog
  7. 可选:如果 rsyslog 没有启用,请确保在重启后自动启动 rsyslog 服务:

    # systemctl enable rsyslog

现在,您的日志服务器被配置为接收和存储环境中其他系统的日志文件。

验证

  • 测试 /etc/rsyslog.conf 文件的语法:

    # rsyslogd -N 1
    rsyslogd: version 8.1911.0-2.el8, config validation run (level 1), master config /etc/rsyslog.conf
    rsyslogd: End of config validation run. Bye.

其它资源

  • rsyslogd(8) man page。
  • rsyslog.conf(5) man page。
  • semanage(8) man page。
  • firewall-cmd(1) man page。
  • 安装 rsyslog-doc 软件包(位于 file:///usr/share/doc/rsyslog/html/ index.html)的 文档

37.4. 通过 TCP 配置远程日志记录到服务器

按照以下步骤通过 TCP 协议配置系统将日志信息转发到服务器。omfwd 插件通过 UDP 或 TCP 提供转发。默认协议是 UDP。由于插件是内置的,所以不必载入它。

先决条件

  • rsyslog 软件包安装在应该向服务器报告的客户端系统中。
  • 您已为服务器配置了远程日志。
  • SELinux 允许使用指定的端口并在防火墙中打开。

流程

  1. 在名为 remotelog.conf/etc/rsyslog.d/ 目录中创建一个新文件,并插入以下内容:

    *.* action(type="omfwd"
          queue.type="linkedlist"
          queue.filename="example_fwd"
          action.resumeRetryCount="-1"
          queue.saveOnShutdown="on"
          target="example.com" port="30514" protocol="tcp"
         )

    其中:

    • queue.type="linkedlist" 在内存队列中启用 LinkedList,
    • queue.filename 定义磁盘存储。备份文件使用前面的全局 workDirectory 指令中指定的工作目录中的 example_fwd 前缀创建,
    • action.resumeRetryCount -1 设置可防止 rsyslog 在服务器没有响应时在重试连接时丢弃信息,
    • 如果 rsyslog 关闭,启用 queue.saveOnShutdown="on" 将保存内存数据,
    • 最后一行将所有接收的信息转发到日志记录服务器,端口规格是可选的。

    使用这个配置, rsyslog 会向服务器发送信息,但如果远程服务器无法访问,则在内存中保存信息。只有在 rsyslog 用尽配置的内存队列空间或需要关闭时,才会在磁盘上创建文件,这会提高系统性能。

  2. 重启 rsyslog 服务。

    # systemctl restart rsyslog

验证

要验证客户端系统向服务器发送信息,请按照以下步骤执行:

  1. 在客户端系统中发送测试信息:

    # logger test
  2. 在服务器系统中查看 /var/log/messages 日志,例如:

    # cat /var/log/remote/msg/hostname/root.log
    Feb 25 03:53:17 hostname root[6064]: test

    其中 hostname 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,在本例中是 root

其它资源

  • rsyslogd(8) man page。
  • rsyslog.conf(5) man page。
  • 安装 rsyslog-doc 软件包(位于 file:///usr/share/doc/rsyslog/html/ index.html)的 文档

37.5. 配置服务器以通过 UDP 接收远程日志信息

Rsyslog 应用程序允许您配置系统来接收来自远程系统的日志信息。要通过 UDP 使用远程日志,请配置服务器和客户端。接收服务器收集并分析一个或多个客户端系统发送的日志。默认情况下, rsyslog 使用端口 514 的 UDP 来接收来自远程系统的日志信息。

按照以下步骤配置服务器以收集和分析一个或多个客户端系统通过 UDP 协议发送的日志。

先决条件

  • 已安装 rsyslog 工具。

流程

  1. 可选:要为 rsyslog 流量使用与默认端口 514 不同的端口:

    1. 在 SELinux 策略配置中添加 syslogd_port_t SELinux 类型,使用您要 rsyslog 的端口号替换 portno:

      # semanage port -a -t syslogd_port_t -p udp portno
    2. firewalld 配置为允许进入 rsyslog 流量,使用您要 rsyslog 使用的区替换 portno 和端口号和 zone:

      # firewall-cmd --zone=zone --permanent --add-port=portno/udp
      success
    3. 重新载入防火墙规则:

      # firewall-cmd --reload
  2. /etc/rsyslog.d/ 目录中创建新 .conf 文件,如 remotelogserv.conf 并插入以下内容:

    # Define templates before the rules that use them
    ### Per-Host Templates for Remote Systems ###
    template(name="TmplAuthpriv" type="list") {
        constant(value="/var/log/remote/auth/")
        property(name="hostname")
        constant(value="/")
        property(name="programname" SecurePath="replace")
        constant(value=".log")
        }
    
    template(name="TmplMsg" type="list") {
        constant(value="/var/log/remote/msg/")
        property(name="hostname")
        constant(value="/")
        property(name="programname" SecurePath="replace")
        constant(value=".log")
        }
    
    # Provides UDP syslog reception
    module(load="imudp")
    
    # This ruleset processes remote messages
    ruleset(name="remote1"){
         authpriv.*   action(type="omfile" DynaFile="TmplAuthpriv")
          *.info;mail.none;authpriv.none;cron.none
    action(type="omfile" DynaFile="TmplMsg")
    }
    
    input(type="imudp" port="514" ruleset="remote1")

    其中 514 是默认使用的端口号 rsyslog。您可以指定不同的端口。

  3. 重启 rsyslog 服务。

    # systemctl restart rsyslog
  4. 可选:如果 rsyslog 没有启用,请确保在重启后自动启动 rsyslog 服务:

    # systemctl enable rsyslog

验证

  1. 验证 /etc/rsyslog.conf 文件以及 /etc/rsyslog.d/ 目录中的所有 .conf 文件的语法:

    # rsyslogd -N 1
    rsyslogd: version 8.1911.0-2.el8, config validation run (level 1), master config /etc/rsyslog.conf
    rsyslogd: End of config validation run. Bye.

其它资源

  • rsyslogd(8) man page。
  • rsyslog.conf(5) man page。
  • semanage(8) man page。
  • firewall-cmd(1) man page。
  • 安装 rsyslog-doc 软件包(位于 file:///usr/share/doc/rsyslog/html/ index.html)的 文档

37.6. 通过 UDP 配置远程日志记录到服务器

按照以下步骤通过 UDP 协议配置系统将日志信息转发到服务器。omfwd 插件通过 UDP 或 TCP 提供转发。默认协议是 UDP。由于插件是内置的,所以不必载入它。

先决条件

流程

  1. /etc/rsyslog.d/ 目录中创建新 .conf 文件,如 remotelogcli.conf 并插入以下内容:

    *.* action(type="omfwd"
          queue.type="linkedlist"
          queue.filename="example_fwd"
          action.resumeRetryCount="-1"
          queue.saveOnShutdown="on"
          target="example.com" port="portno" protocol="udp"
         )

    其中:

    • queue.type="linkedlist" 在内存队列中启用 LinkedList。
    • queue.filename 定义磁盘存储。备份文件使用前面的全局 workDirectory 指令中指定的工作目录中的 example_fwd 前缀创建。
    • 如果服务器没有响应, action.resumeRetryCount -1 设置可防止 rsyslog 在重试连接时丢弃信息。
    • enabled queue.saveOnShutdown="on" 如果 rsyslog 关闭,则会保存内存数据。
    • portno 您要 rsyslog 的端口号。默认值为 514
    • 最后一行将所有接收的信息转发到日志记录服务器,端口规格是可选的。

      使用这个配置, rsyslog 会向服务器发送信息,但如果远程服务器无法访问,则在内存中保存信息。只有在 rsyslog 用尽配置的内存队列空间或需要关闭时,才会在磁盘上创建文件,这会提高系统性能。

  2. 重启 rsyslog 服务。

    # systemctl restart rsyslog
  3. 可选:如果 rsyslog 没有启用,请确保在重启后自动启动 rsyslog 服务:

    # systemctl enable rsyslog

验证

要验证客户端系统向服务器发送信息,请按照以下步骤执行:

  1. 在客户端系统中发送测试信息:

    # logger test
  2. 在服务器系统中查看 /var/log/remote/msg/hostname/root.log 日志,例如:

    # cat /var/log/remote/msg/hostname/root.log
    Feb 25 03:53:17 hostname root[6064]: test

    其中 hostname 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,在本例中是 root

其它资源

  • rsyslogd(8) man page。
  • rsyslog.conf(5) man page。
  • 安装 rsyslog-doc 软件包(位于 file:///usr/share/doc/rsyslog/html/ index.html)的 文档

37.7. 配置可靠的远程日志

使用可靠的事件日志记录协议(RELP),您可以使用 TCP 发送和接收 syslog 信息,并降低消息丢失的风险。RELP 提供可靠的事件消息交付,这在无法接受消息丢失的环境中很有用。要使用 RELP,请配置 imrelp 输入模块,该模块在服务器上运行并接收日志 ; 在客户端中运行的 omrelp 输出模块将日志发送到日志记录服务器。

先决条件

  • 您已在服务器和客户端系统中安装了 rsysloglibrelprsyslog-relp 软件包。
  • SELinux 允许使用指定的端口并在防火墙中打开。

流程

  1. 配置客户端系统以进行可靠的远程日志:

    1. 在客户端系统中,在 /etc/rsyslog.d/ 目录中创建一个新的 .conf 文件,例如 relpcli.conf,并插入以下内容:

      module(load="omrelp")
      *.* action(type="omrelp" target="target_IP" port="target_port")

      其中:

      • target_IP 是日志记录服务器的 IP 地址。
      • target_port 是日志记录服务器的端口。
    2. 保存对 /etc/rsyslog.d/relpserv.conf 文件的更改。
    3. 重启 rsyslog 服务。

      # systemctl restart rsyslog
    4. 可选:如果 rsyslog 没有启用,请确保在重启后自动启动 rsyslog 服务:

      # systemctl enable rsyslog
  2. 为可靠远程日志记录配置服务器系统:

    1. 在服务器系统中,在 /etc/rsyslog.d/ 目录中创建一个新的 .conf 文件,例如 relpserv.conf,并插入以下内容:

      ruleset(name="relp"){
      *.* action(type="omfile" file="log_path")
      }
      
      
      module(load="imrelp")
      input(type="imrelp" port="target_port" ruleset="relp")

      其中:

      • log_path 指定存储消息的路径。
      • target_port 是日志记录服务器的端口。使用与客户端配置文件相同的值。
    2. 保存对 /etc/rsyslog.d/relpserv.conf 文件的更改。
    3. 重启 rsyslog 服务。

      # systemctl restart rsyslog
    4. 可选:如果 rsyslog 没有启用,请确保在重启后自动启动 rsyslog 服务:

      # systemctl enable rsyslog

验证

要验证客户端系统向服务器发送信息,请按照以下步骤执行:

  1. 在客户端系统中发送测试信息:

    # logger test
  2. 在服务器系统中,使用指定的 log_path 查看日志,例如:

    # cat /var/log/remote/msg/hostname/root.log
    Feb 25 03:53:17 hostname root[6064]: test

    其中 hostname 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,在本例中是 root

其它资源

  • rsyslogd(8) man page。
  • rsyslog.conf(5) man page。
  • 安装 rsyslog-doc 软件包(位于 file:///usr/share/doc/rsyslog/html/ index.html)的 文档

37.8. 支持的 Rsyslog 模块

要扩展 Rsyslog 工具程序的功能,您可以使用特定的附加模块。模块提供额外的输入(输入模块)、输出(输出模块)和其他特定功能。模块也可以提供额外的配置指令,这些指令会在您载入该模块后可用。

您可以使用以下命令列出系统中安装的输入和输出模块:

# ls /usr/lib64/rsyslog/{i,o}m*

您可以在从 rsyslog-doc 软件包安装的文档中的以下页面查看所有可用 rsyslog 模块列表: file:///usr/share/doc/rsyslog/html/configuration/modules/idx_output.html

37.9. 其它资源

第 38 章 使用日志记录系统角色

作为系统管理员,您可以使用日志记录系统角色将 RHEL 主机配置为日志服务器,从很多客户端系统收集日志。

38.1. 日志系统角色

使用日志记录系统角色,您可以在本地和远程主机上部署日志配置。

要在一个或多个系统中应用日志记录系统角色,您可以在 playbook 中定义日志配置。playbook 是一个或多个 play 的列表。playbook 是人类可读的,它们采用 YAML 格式编写。如需有关 playbook 的更多信息,请参阅 Ansible 文档中的 使用 playbook

您希望 Ansible 根据 playbook 配置的系统集合已在 清单文件中定义。如需有关创建和使用清单的更多信息,请参阅 Ansible 文档中的如何构建您的清单

日志记录解决方案提供多种读取日志和多个日志记录输出的方法。

例如,日志记录系统可接受以下输入:

  • 本地文件、
  • systemd/journal,
  • 网络中的另一个日志记录系统。

另外,日志记录系统还可有以下输出:

  • 日志存储在 /var/log 目录中的本地文件中,
  • 日志发送到 Elasticsearch,
  • 日志转发到另一个日志系统。

使用日志记录系统角色,您可以组合输入和输出来满足您的需要。例如:您可以配置一个日志解决方案,它会将来自 journal 的输入保存在本地文件中,而从文件中读取的输入会转发到另一个日志记录系统,并存储在本地日志文件中。

38.2. 日志记录系统角色参数

在日志记录系统角色 playbook 中,您要定义 logging_inputs 参数中的输入、logging_outputs 参数中的输出以及 logging_flows 参数中的输入和输出之间的关系。Logging 系统角色使用附加选项处理这些变量来配置日志记录系统。您还可以启用加密。

注意

目前,日志记录系统角色中唯一可用的日志记录系统是 Rsyslog

  • logging_inputs - 日志记录解决方案的输入列表。

    • name - 输入的唯一名称。在 logging_flows 输入列表和生成 config 文件名称的一部分中使用。
    • type - 输入元素的类型。这个类型指定与目录名称对应的任务类型 roles/rsyslog/{tasks,vars}/inputs/

      • basics - 输入配置从 systemd 日志或 unix 套接字输入。

        • kernel_message - 如果设置为 true,则会加载imklog 。默认为 false
        • use_imuxsock - 使用 imuxsock 替代 imjournal。默认为 false
        • ratelimit_burst - 可在其中发送的最大信息数 ratelimit_interval。默认 20000 use_imuxsock 为 false。默认 200 use_imuxsock 为 true。
        • ratelimit_interval - 评估 ratelimit_burst 的时间间隔。如果 use_imuxsock 为 false,则默认为 600 秒。如果 use_imuxsock 为 true, 则默认为 0。0 表示关闭速率限制。
        • persist_state_interval - Journal 状态会保留每个 value 信息。默认为 10。仅在 use_imuxsock 为 false 时有效。
      • files - 输入配置本地文件输入。
      • remote - 输入通过网络配置其他日志记录系统的输入。
    • state - 配置文件的状态。present 或者 absent。默认为 present
  • logging_outputs - 日志解决方案的输出列表。

    • files - 输出配置输出到本地文件。
    • forwards - 输出配置输出到另一个日志记录系统。
    • remote_files - 输出将输出配置为另一个日志记录系统到本地文件。
  • logging_flows - 定义 logging_inputslogging_outputs 间关系的流程列表。logging_flows 变量有以下键:

    • name - 流的唯一名称
    • inputs - logging_inputs 名称值列表
    • outputs - logging_outputs 名称值列表。

其它资源

  • 安装 rhel-system-roles 软件包,文档位于 /usr/share/ansible/roles/rhel-system-roles.logging/README.html

38.3. 应用本地日志记录系统角色

按照以下步骤准备和应用 Red Hat Ansible Engine playbook,在一组单独机器上配置日志记录解决方案。每台机器都会在本地记录日志。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要部署日志记录解决方案的系统中安装 Red Hat Ansible Engine。

  • 您在要从中运行 playbook 的系统中具有 rhel-system-roles 软件包。

    注意

    您不必安装 rsyslog,因为在部署后系统角色会安装 rsyslog

  • 您有一个清单文件,它列出要配置日志记录解决方案的系统。

流程

  1. 创建定义所需角色的 playbook:

    1. 创建新 YAML 文件,并在文本编辑器中打开,例如:

      # vi logging-playbook.yml
    2. 插入以下内容:

      ---
      - name: Deploying basics input and implicit files output
        hosts: all
        roles:
          - linux-system-roles.logging
        vars:
          logging_inputs:
            - name: system_input
              type: basics
          logging_outputs:
            - name: files_output
              type: files
          logging_flows:
            - name: flow1
              inputs: [system_input]
              outputs: [files_output]
  2. 在特定清单上执行 playbook:

    # ansible-playbook -i inventory-file /path/to/file/logging-playbook.yml

    其中:

    • inventory-file 是清单文件。
    • logging-playbook.yml 是您使用的 playbook。

验证

  1. 测试 /etc/rsyslog.conf 文件的语法:

    # rsyslogd -N 1
    rsyslogd: version 8.1911.0-6.el8, config validation run (level 1), master config /etc/rsyslog.conf
    rsyslogd: End of config validation run. Bye.
  2. 验证系统是否向日志发送信息:

    1. 发送测试信息:

      # logger test
    2. 查看 /var/log/messages 日志,例如:

      # cat /var/log/messages
      Aug  5 13:48:31 hostname root[6778]: test

      其中 'hostname' 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,在本例中是 root

38.4. 过滤本地日志记录系统角色中的日志

您可以部署一个日志记录解决方案,根据基于 rsyslog 属性的过滤器过滤日志。

先决条件

  • 访问一个或多个 受管节点, 这是您要使用日志记录系统角色配置的系统。
  • 访问控制节点并获得权限, 控制节点 是 Red Hat Ansible Engine 配置其他系统的系统。

    在控制节点上:

    • 安装了 Red Hat Ansible Engine
    • 已安装 rhel-system-roles 软件包
    • 列出受管节点的清单文件。

流程

  1. 使用以下内容 playbook.yml 创建新文件:

    ---
    - name: Deploying files input and configured files output
      hosts: all
      roles:
        - linux-system-roles.logging
      vars:
        logging_inputs:
          - name: files_input0
            type: files
            input_log_path: /var/log/containerA/*.log
          - name: files_input1
            type: files
            input_log_path: /var/log/containerB/*.log
        logging_outputs:
          - name: files_output0
            type: files
            property: msg
            property_op: contains
            property_value: error
            path: /var/log/errors.log
          - name: files_output1
            type: files
            property: msg
            property_op: "!contains"
            property_value: error
            path: /var/log/others.log
        logging_flows:
          - name: flow0
            inputs: [files_input0, files_input1]
            outputs: [files_output0, files_output1]

    使用此配置,所有包含 error 字符串的信息都会记录在 /var/log/errors.log 中,所有其他消息都会登录到 /var/log/others.log

    您可以将 error 属性值替换为您要过滤的字符串。

    您可以根据您的首选项修改变量。

  2. 可选:验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory_file /path/to/file/playbook.yml

验证

  1. 测试 /etc/rsyslog.conf 文件的语法:

    # rsyslogd -N 1
    rsyslogd: version 8.1911.0-6.el8, config validation run (level 1), master config /etc/rsyslog.conf
    rsyslogd: End of config validation run. Bye.
  2. 验证系统是否向日志发送包含 error 字符串的信息:

    1. 发送测试信息:

      # logger error
    2. 查看 /var/log/errors.log 日志,例如:

      # cat /var/log/errors.log
      Aug  5 13:48:31 hostname root[6778]: error

      其中 hostname 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,在本例中是 root

其它资源

  • 安装 rhel-system-roles 软件包,文档位于 /usr/share/ansible/roles/rhel-system-roles.logging/README.html

38.5. 使用日志记录系统角色应用远程日志解决方案

按照以下步骤准备和应用 Red Hat Ansible Engine playbook 来配置远程日志记录解决方案。在这个 playbook 中,一个或多个客户端从 systemd-journal 中提取日志,并将其转发到远程服务器。服务器从 remote_rsyslogremote_files 接收远程输入,并将日志输出到远程主机名指定的目录中的本地文件中。

先决条件

  • 您已在要运行 playbook 的系统中安装了 Red Hat Ansible Engine。

    注意

    您不必在要部署日志记录解决方案的系统中安装 Red Hat Ansible Engine。

  • 您在要从中运行 playbook 的系统中具有 rhel-system-roles 软件包。

    注意

    您不必安装 rsyslog,因为在部署后系统角色会安装 rsyslog

  • 您至少有两个系统:

    • 至少一个是日志服务器。
    • 至少一个是日志记录客户端。

流程

  1. 创建定义所需角色的 playbook:

    1. 创建新 YAML 文件,并在文本编辑器中打开,例如:

      # vi logging-playbook.yml
    2. 将以下内容插入到文件中:

      ---
      - name: Deploying remote input and remote_files output
        hosts: server
        roles:
          - linux-system-roles.logging
        vars:
          logging_inputs:
            - name: remote_udp_input
              type: remote
              udp_ports: [ 601 ]
            - name: remote_tcp_input
              type: remote
              tcp_ports: [ 601 ]
          logging_outputs:
            - name: remote_files_output
              type: remote_files
          logging_flows:
            - name: flow_0
              inputs: [remote_udp_input, remote_tcp_input]
              outputs: [remote_files_output]
      
      - name: Deploying basics input and forwards output
        hosts: clients
        roles:
          - linux-system-roles.logging
        vars:
          logging_inputs:
            - name: basic_input
              type: basics
          logging_outputs:
            - name: forward_output0
              type: forwards
              severity: info
              target: host1.example.com
              udp_port: 601
            - name: forward_output1
              type: forwards
              facility: mail
              target: host1.example.com
              tcp_port: 601
          logging_flows:
            - name: flows0
              inputs: [basic_input]
              outputs: [forward_output0, forward_output1]
      
      [basic_input]
      [forward_output0, forward_output1]

      其中 host1.example.com 是日志服务器。

      注意

      您可以修改 playbook 中的参数以符合您的需要。

      警告

      日志解决方案只适用于在服务器或者客户端系统的 SELinux 策略中定义的端口并在防火墙中打开。默认 SELinux 策略包括端口 601、514、6514、10514 和 20514。要使用不同的端口, 在客户端和服务器系统中修改 SELinux 策略。目前还不支持通过系统角色配置防火墙。

  2. 创建列出您的服务器和客户端的清单文件:

    1. 创建新文件并在文本编辑器中打开该文件,例如:

      # vi inventory.ini
    2. 将以下内容插入到清单文件中:

      [servers]
      server ansible_host=host1.example.com
      [clients]
      client ansible_host=host2.example.com

      其中:* host1.example.com 是日志服务器。* host2.example.com 是日志记录客户端。

  3. 在清单上执行 playbook。

    # ansible-playbook -i /path/to/file/inventory.ini /path/to/file/_logging-playbook.yml

    其中:

    • inventory.ini 是清单文件。
    • logging-playbook.yml 是您创建的 playbook。

验证

  1. 在客户端和服务器系统中测试 /etc/rsyslog.conf 文件的语法:

    # rsyslogd -N 1
    rsyslogd: version 8.1911.0-6.el8, config validation run (level 1), master config /etc/rsyslog.conf
    rsyslogd: End of config validation run. Bye.
  2. 验证客户端系统向服务器发送信息:

    1. 在客户端系统中发送测试信息:

      # logger test
    2. 在服务器系统中查看 /var/log/messages 日志,例如:

      # cat /var/log/messages
      Aug  5 13:48:31 host2.example.com root[6778]: test

      其中 host2.example.com 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,在本例中是 root

其它资源

38.6. 在 RELP 中使用日志记录系统角色

可靠的事件日志协议(RELP)是通过 TCP 网络的用于数据和消息日志记录的网络协议。它可确保可靠地提供事件信息,您可以在不容许任何消息丢失的环境中使用它。

RELP 发送程序以命令的形式传输日志条目,接收方在处理后会确认它们。为确保一致性,RELP 会将事务号保存到每个传输的命令以进行任何消息恢复。

您可以在 RELP 客户端和 RELP 服务器之间考虑使用远程日志系统。RELP 客户端将日志传送到远程日志记录系统,RELP 服务器接收远程日志记录系统发送的所有日志。

管理员可以使用日志记录系统角色配置日志记录系统,以可靠地发送和接收日志条目。

38.6.1. 使用 RELP 配置客户端日志记录

您可以使用日志记录系统角色在 RHEL 系统中配置日志记录,这些日志记录在本地机器上,并通过运行 Ansible playbook 将日志传送到使用 RELP 的远程日志记录系统。

此流程在 Ansible 清单中 clients 组的所有主机上配置 RELP。RELP 配置使用传输层安全(TLS)来加密信息传输以通过网络安全传输日志。

先决条件

  • 具有在要配置 RELP 的受管节点上运行 playbook 的权限。
  • 受管节点列在控制节点上的清单文件中。
  • 在控制节点上安装 ansiblerhel-system-roles 软件包。

流程

  1. 使用以下内容创建 playbook.yml 文件:

    ---
    - name: Deploying basic input and relp output
      hosts: clients
      roles:
        - rhel-system-roles.logging
      vars:
        logging_inputs:
          - name: basic_input
            type: basics
        logging_outputs:
          - name: relp_client
            type: relp
            target: logging.server.com
            port: 20514
            tls: true
            ca_cert: /etc/pki/tls/certs/ca.pem
            cert: /etc/pki/tls/certs/client-cert.pem
            private_key: /etc/pki/tls/private/client-key.pem
            pki_authmode: name
            permitted_servers:
              - '*.server.example.com'
        logging_flows:
          - name: example_flow
            inputs: [basic_input]
            outputs: [relp_client]

    playbook 使用以下设置:

    • target: 这是一个必需的参数,用于指定运行远程日志记录系统的主机名。
    • port: 端口号正在侦听远程日志记录系统。
    • tls: 确保通过网络安全传输日志。如果您不想使用安全打包程序,可以将 tls 变量设置为 false。在使用 RELP 时,默认情况下 tls 参数被设置为 true,它需要密钥/证书和微调 {ca_certcertprivate_key} 和/或 {ca_cert_srccert_srcprivate_key_src}。

      • 如果设置了 {ca_cert_srccert_srcprivate_key_src} triplet,则使用默认的位置 /etc/pki/tls/certs/etc/pki/tls/private 作为受管节点上的目的地从控制节点传输文件。在这种情况下,文件名与三重写中的原始文件名相同
      • 如果设置了 {ca_certcertprivate_key} triplet,则文件应该位于日志记录配置前的默认路径中。
      • 如果同时设置了这两个 triplets,文件将从控制节点的本地路径传输到受管节点的特定路径。
    • ca_cert: 代表 CA 证书的路径。默认路径为 /etc/pki/tls/certs/ca.pem,文件名由用户设置。
    • cert: 代表证书的路径。默认路径为 /etc/pki/tls/certs/server-cert.pem,文件名由用户设置。
    • private_key: 代表到私钥的路径。默认路径为 /etc/pki/tls/private/server-key.pem,文件名由用户设置。
    • ca_cert_src: 保留复制到目标主机的本地 CA 证书文件路径。如果指定了 ca_cert,则会将其复制到位置。
    • cert_src: 保留复制到目标主机的本地证书文件路径。如果指定了证书,则会将其复制到位置。
    • private_key_src: 代表复制到目标主机的本地密钥文件路径。如果指定了 private_key,则会将其复制到位置。
    • pki_authmode: 接受验证模式为 namefingerprint
    • permitted_servers: 日志记录客户端通过 TLS 连接和发送日志的服务器列表。
    • inputs: 日志记录输入字典列表。
    • outputs: 日志输出字典列表。
  2. 可选:验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 运行 playbook:

    # ansible-playbook -i inventory_file playbook.yml

38.6.2. 使用 RELP 配置服务器日志记录

您可以使用日志记录系统角色将 RHEL 系统的日志记录配置为服务器,并通过运行 Ansible playbook 从远程日志记录系统中使用 RELP 接收日志。

此流程在 Ansible 清单中 server 组的所有主机上配置 RELP。RELP 配置使用 TLS 来加密消息传输以通过网络安全传输日志。

先决条件

  • 具有在要配置 RELP 的受管节点上运行 playbook 的权限。
  • 受管节点列在控制节点上的清单文件中。
  • 在控制节点上安装 ansiblerhel-system-roles 软件包。

流程

  1. 使用以下内容创建 playbook.yml 文件:

    ---
    - name: Deploying remote input and remote_files output
      hosts: server
      roles:
        - rhel-system-roles.logging
      vars:
        logging_inputs:
          - name: relp_server
            type: relp
            port: 20514
            tls: true
            ca_cert: /etc/pki/tls/certs/ca.pem
            cert: /etc/pki/tls/certs/server-cert.pem
            private_key: /etc/pki/tls/private/server-key.pem
            pki_authmode: name
            permitted_clients:
              - '*example.client.com'
        logging_outputs:
          - name: remote_files_output
            type: remote_files
        logging_flows:
          - name: example_flow
            inputs: relp_server
            outputs: remote_files_output

    playbook 使用以下设置:

    • port: 端口号正在侦听远程日志记录系统。
    • tls: 确保通过网络安全传输日志。如果您不想使用安全打包程序,可以将 tls 变量设置为 false。在使用 RELP 时,默认情况下 tls 参数被设置为 true,它需要密钥/证书和微调 {ca_certcertprivate_key} 和/或 {ca_cert_srccert_srcprivate_key_src}。

      • 如果设置了 {ca_cert_srccert_srcprivate_key_src} triplet,则使用默认的位置 /etc/pki/tls/certs/etc/pki/tls/private 作为受管节点上的目的地从控制节点传输文件。在这种情况下,文件名与三重写中的原始文件名相同
      • 如果设置了 {ca_certcertprivate_key} triplet,则文件应该位于日志记录配置前的默认路径中。
      • 如果同时设置了这两个 triplets,文件将从控制节点的本地路径传输到受管节点的特定路径。
    • ca_cert: 代表 CA 证书的路径。默认路径为 /etc/pki/tls/certs/ca.pem,文件名由用户设置。
    • cert: 代表证书的路径。默认路径为 /etc/pki/tls/certs/server-cert.pem,文件名由用户设置。
    • private_key: 代表到私钥的路径。默认路径为 /etc/pki/tls/private/server-key.pem,文件名由用户设置。
    • ca_cert_src: 保留复制到目标主机的本地 CA 证书文件路径。如果指定了 ca_cert,则会将其复制到位置。
    • cert_src: 保留复制到目标主机的本地证书文件路径。如果指定了证书,则会将其复制到位置。
    • private_key_src: 代表复制到目标主机的本地密钥文件路径。如果指定了 private_key,则会将其复制到位置。
    • pki_authmode: 接受验证模式为 namefingerprint
    • permitted_clients: 日志记录服务器通过 TLS 连接和发送日志的客户端列表。
    • inputs: 日志记录输入字典列表。
    • outputs: 日志输出字典列表。
  2. 可选:验证 playbook 语法。

    # ansible-playbook --syntax-check playbook.yml
  3. 运行 playbook:

    # ansible-playbook -i inventory_file playbook.yml

38.7. 在 TLS 中使用日志记录系统角色

传输层安全(TLS)是一个加密协议,用于通过计算机网络安全通讯。

作为管理员,您可以使用 RHEL 上的日志记录系统角色配置使用 Red Hat Ansible Automation Platform 进行日志的安全传输。

38.7.1. 使用 TLS 配置客户端日志记录

您可以使用日志记录系统角色在 RHEL 系统中配置日志记录,这些日志记录在本地机器上,并通过运行 Ansible playbook 将日志传送到使用 TLS 的远程日志记录系统。

此流程在 Ansible 清单中客户端组中的所有主机上配置 TLS。TLS 协议会加密信息传输以便通过网络安全传输日志。

先决条件

  • 具有在要配置 TLS 的受管节点上运行 playbook 的权限。
  • 受管节点列在控制节点上的清单文件中。
  • 在控制节点上安装 ansiblerhel-system-roles 软件包。

流程

  1. 使用以下内容创建 playbook.yml 文件:

    ---
    - name: Deploying files input and forwards output with certs
      hosts: clients
      roles:
        - rhel-system-roles.logging
      vars:
        logging_pki_files:
          - ca_cert_src: /local/path/to/ca_cert.pem
            cert_src: /local/path/to/cert.pem
            private_key_src: /local/path/to/key.pem
        logging_inputs:
          - name: input_name
            type: files
            input_log_path: /var/log/containers/*.log
        logging_outputs:
          - name: output_name
            type: forwards
            target: your_target_host
            tcp_port: 514
            tls: true
            pki_authmode: x509/name
            permitted_server: 'server.example.com'
        logging_flows:
          - name: flow_name
            inputs: [input_name]
            outputs: [output_name]

    playbook 使用以下参数:

    logging_pki_files
    使用此参数,您可以配置 TLS,并必须传递 ca_cert_srccert_srcprivate_key_src 参数。
    ca_cert
    代表到 CA 证书的路径。默认路径为 /etc/pki/tls/certs/ca.pem,文件名由用户设置。
    cert
    代表证书的路径。默认路径为 /etc/pki/tls/certs/server-cert.pem,文件名由用户设置。
    private_key
    代表到私钥的路径。默认路径为 /etc/pki/tls/private/server-key.pem,文件名由用户设置。
    ca_cert_src
    重新保留复制到目标主机的本地 CA 证书文件路径。如果指定了 ca_cert,它将复制到位置。
    cert_src
    重新包含复制到目标主机的本地证书文件路径。如果指定了 cert,它将复制到位置。
    private_key_src
    代表复制到目标主机的本地密钥文件路径。如果指定了 private_key,它将复制到位置。
    tls
    使用此参数可确保通过网络安全传输日志。如果您不想使用安全打包程序,可以设置 tls: true
  2. 验证 playbook 语法:

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory_file playbook.yml

38.7.2. 使用 TLS 配置服务器日志记录

您可以使用日志记录系统角色将 RHEL 系统的日志记录配置为服务器,并通过运行 Ansible playbook 从远程日志记录系统中接收使用 TLS 的日志。

此流程在 Ansible 清单中的服务器组中的所有主机上配置 TLS。

先决条件

  • 具有在要配置 TLS 的受管节点上运行 playbook 的权限。
  • 受管节点列在控制节点上的清单文件中。
  • 在控制节点上安装 ansiblerhel-system-roles 软件包。

流程

  1. 使用以下内容创建 playbook.yml 文件:

    ---
    - name: Deploying remote input and remote_files output with certs
      hosts: server
      roles:
        - rhel-system-roles.logging
      vars:
        logging_pki_files:
          - ca_cert_src: /local/path/to/ca_cert.pem
            cert_src: /local/path/to/cert.pem
            private_key_src: /local/path/to/key.pem
        logging_inputs:
          - name: input_name
            type: remote
            tcp_ports: 514
            tls: true
            permitted_clients: ['clients.example.com']
        logging_outputs:
          - name: output_name
            type: remote_files
            remote_log_path: /var/log/remote/%FROMHOST%/%PROGRAMNAME:::secpath-replace%.log
            async_writing: true
            client_count: 20
            io_buffer_size: 8192
        logging_flows:
          - name: flow_name
            inputs: [input_name]
            outputs: [output_name]

    playbook 使用以下参数:

    logging_pki_files
    使用此参数,您可以配置 TLS,并必须传递 ca_cert_srccert_srcprivate_key_src 参数。
    ca_cert
    代表到 CA 证书的路径。默认路径为 /etc/pki/tls/certs/ca.pem,文件名由用户设置。
    cert
    代表证书的路径。默认路径为 /etc/pki/tls/certs/server-cert.pem,文件名由用户设置。
    private_key
    代表到私钥的路径。默认路径为 /etc/pki/tls/private/server-key.pem,文件名由用户设置。
    ca_cert_src
    重新保留复制到目标主机的本地 CA 证书文件路径。如果指定了 ca_cert,它将复制到位置。
    cert_src
    重新包含复制到目标主机的本地证书文件路径。如果指定了 cert,它将复制到位置。
    private_key_src
    代表复制到目标主机的本地密钥文件路径。如果指定了 private_key,它将复制到位置。
    tls
    使用此参数可确保通过网络安全传输日志。如果您不想使用安全打包程序,可以设置 tls: true
  2. 验证 playbook 语法:

    # ansible-playbook --syntax-check playbook.yml
  3. 在清单文件上运行 playbook:

    # ansible-playbook -i inventory_file playbook.yml

38.8. 其它资源

  • RHEL 系统角色入门
  • 安装 rhel-system-roles 软件包,文档位于 /usr/share/ansible/roles/rhel-system-roles.logging/README.html
  • RHEL 系统角色 知识库文章
  • 有关 ansible-playbook 命令的详情请参考 ansible-playbook(1) man page。

第 39 章 Python 简介

Python 是一个高级别的编程语言,它支持多个编程范例,如面向对象、需要、功能和程序范例。Python 具有动态语义,可用于通用编程。

在 Red Hat Enterprise Linux 中,很多安装在系统中的软件包,如提供系统工具的软件包、数据分析工具或者 Web 应用程序,都使用 Python 编写。要使用这些软件包,您必须安装 python* 软件包。

39.1. Python 版本

广泛使用两个不兼容的 Python 版本: Python 2.x 和 Python 3.x。RHEL 8 提供以下 Python 版本。

表 39.1. RHEL 8 中的 Python 版本

版本要安装的软件包命令示例从现在开始可用生命周期

Python 3.6

python3

python3, pip3

RHEL 8.0

full RHEL 8

Python 2.7

python2

python2, pip2

RHEL 8.0

较短

Python 3.8

python38

python3.8, pip3.8

RHEL 8.2

较短

Python 3.9

python39

python3.9, pip3.9

RHEL 8.4

较短

有关支持长度的详情,请查看 Red Hat Enterprise Linux 生命周期Red Hat Enterprise Linux 8 Application Streams 生命周期

每个 Python 版本都以一个单独的模块的形式发布,您可根据设计在同一个系统上并行安装多个模块。

python38python39 模块不包括为 python36 模块提供的对系统工具(RPM、DNF、SELinux 等等)的绑定。

重要

在安装、调用或者与之交互时,始终指定 Python 版本。例如:在软件包和命令名称中使用 python3 而不是使用 python。所有与 Python 相关的命令都应该包括版本,例如 pip3pip2pip3.8pip3.9

RHEL 8 中默认不提供未指定版本的 python 命令(/usr/bin/python)。您可以使用 alternatives 命令进行配置 ; 具体步骤请参阅 配置未指定版本的 Python。任何手动对 /usr/bin/python 的更改(使用 alternatives 命令所做的更改除外)可能会在更新后被覆盖。

作为系统管理员,使用 Python 3,理由如下:

  • Python 3 代表 Python 项目的主要开发方向。
  • 对上游社区中的 Python 2 的支持于 2020 年结束。
  • 常用 Python 库在上游社区中断了 Python 2 支持。
  • Red Hat Enterprise Linux 8 中的 Python 2 的生命周期会更短,旨在为客户更平稳地转换到 Python 3

对于开发人员,Postg 3 比 Python 2 有以下优点:

  • Python 3 可让您更轻松地编写明确、可维护和正确的代码。
  • 使用 Python 3 编写的代码将具有较长的生命周期。
  • Python 3 具有新功能,包括 asyncio、f-strings、高级解包、只关键字参数和链路例外。

但是,旧软件可能需要 /usr/bin/python 配置为 Python 2。因此,Red Hat Enterprise Linux 8 没有发布默认的 python 软件包,您可在使用 Python 2 和 3 作为 /usr/bin/python 进行选择,如 配置未指定版本的 Python 所述

重要

Red Hat Enterprise Linux 8 中的系统工具使用由内部 platform-python 软件包提供的 Python 版本 3.6。红帽建议客户使用 python36 软件包。

第 40 章 安装和使用 Python

在 Red Hat Enterprise Linux 8 中, Python 3 由 AppStream 软件仓库中的 python36python38python39 模块提供。

警告

由于模糊性,默认使用未指定版本的 python 命令安装或运行 Python 无法正常工作。总是指定 Python 版本,或使用 alternatives 命令配置系统默认版本。

40.1. 安装 Python 3

根据设计,您可以并行安装 RHEL 8 模块,包括 python27python36python38python39 模块。请注意,单一模块中的多个流不支持并行安装。

您可以安装 Python 3.8 和 Python 3.9,包括为其中任何一个版本构建的软件包,与 Python 3.6 并行,但 mod_wsgi 模块除外。由于 Apache HTTP 服务器的限制,在一个系统中只能安装其中一个 python3-mod_wsgipython38-mod_wsgipython39-mod_wsgi 软件包。

流程

  • 要从 python36 模块安装 Python 3.6,请使用:

    # yum install python3

    python36:3.6 模块流会自动启用。

  • 要从 python38 模块安装 Python 3.8,请使用:

    # yum install python38

    python38:3.8 模块流会自动启用。

  • 要从 python39 模块安装 Python 3.9,请使用:

    # yum install python39

    python39:3.9 模块流会自动启用。

验证步骤

  • 要验证您系统中安装的 Python 版本,请使用特定于您需要的 Python 版本的 python 命令的 --version 选项。

    • 对于 Python 3.6:

      $ python3 --version
    • 对于 Python 3.8:

      $ python3.8 --version
    • 对于 Python 3.9:

      $ python3.9 --version

40.2. 安装额外的 Python 3 软件包

对于 Python 3.6 的附加组件模块的软件包通常会使用 python3- 前缀, Python 3.8 的软件包包括 python38- 前缀, Python 3.9 的软件包包括 python39- 前缀。安装其他 Python 软件包时始终包含前缀,如下例所示。

流程

  • 要为 Python 3.6 安装 Requests 模块,请使用:

    # yum install python3-requests
  • 要为 Python 3.8 安装 Cython 扩展,请使用:

    # yum install python38-Cython
  • 要从 Python 3.9 安装 pip 软件包安装程序,请使用:

    # yum install python39-pip

40.3. 为开发人员安装额外的 Python 3 工具

开发人员的其他 Python 工具通过相应的 python3x-devel 模块中的 CodeReady Linux Builder 软件仓库发布。

python38-devel 模块包含 python38-pytest 软件包及其依赖项: pyparsingatomicwritesattrspackagingpymore-itertoolspluggywcwidth 软件包。

python39-devel 模块包含 python39-pytest 软件包及其依赖项: pyparsingattrspackagingpymore-itertoolspluggywcwidthiniconfigpybind11 软件包。python39-devel 模块还包含 python39-debugpython39-Cython 软件包。

重要

红帽不支持 CodeReady Linux Builder 软件仓库及其内容。

要从 python39-devel 模块安装软件包,请使用以下步骤。

流程

  1. 启用 CodeReady Linux Builder 存储库:

    # subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms
  2. 启用 python39-devel 模块:

    # yum module enable python39-devel
  3. 安装 python39-pytest 软件包:

    # yum install python39-pytest

要从 python38-devel 模块中安装软件包,请将 python39- 替换为 python38-。

40.4. 安装 Python 2

一些应用程序和脚本还没有完全移植到 Python 3,需要 Python 2 运行。Red Hat Enterprise Linux 8 允许并行安装 Python 3 和 Python 2。如果您需要 Python 2 功能,请安装 python27 模块,该模块可在 AppStream 仓库中找到。

警告

请注意, Python 3 是 Python 项目的主要开发方向。对 Python 2 的支持正在被逐渐取消。python27 模块的支持周期短于 Red Hat Enterprise Linux 8。

流程

  • 要从 python27 模块安装 Python 2.7,请使用:

    # yum install python2

    python27:2.7 模块流会自动启用。

带有 Python 2 的附加组件模块的软件包通常使用 python2- 前缀。安装其他 Python 软件包时始终包含前缀,如下例所示。

  • 要为 Python 2,安装 Requests 模块,请使用:

    # yum install python2-requests
  • 要为 Python 2,安装 Cython 扩展,请使用:

    # yum install python2-Cython

验证步骤

  • 要验证您系统中安装的 Python 版本,请使用:

    $ python2 --version
注意

根据设计,您可以并行安装 RHEL 8 模块,包括 python27python36python38python39 模块。

40.5. 从 Python 2 迁移到 Python 3

作为开发者,您可能想要将之前使用 Python 2 编写的代码迁移到 Python 3。

有关如何将大型代码库迁移到 Python 3 的更多信息,请参阅 Storageative Python 3 Porting Guide

请注意,在迁移后,原始 Python 2 代码就可以被 Python 3 解释器解释,也可以被 Python 2 解释器解析。

40.6. 使用 Python

在运行 Python 解释器或 Python 相关命令时,总是指定版本。

先决条件

  • 确定安装了 Python 所需的版本。

流程

  • 要运行 Python 3.6 解释器或者相关命令,请使用:

    $ python3
    $ python3 -m cython --help
    $ pip3 install package
  • 要运行 Python 3.8 解释器或者相关命令,请使用:

    $ python3.8
    $ python3.8 -m cython --help
    $ pip3.8 install package
  • 要运行 Python 3.9 解释器或者相关命令,请使用:

    $ python3.9
    $ python3.9 -m pip --help
    $ pip3.9 install package
  • 要运行 Python 2 解释器或者相关命令,请使用:

    $ python2
    $ python2 -m cython --help
    $ pip2 install package

第 41 章 配置未指定版本的 Python

系统管理员可以使用 alternatives 命令配置位于 /usr/bin/python 的未指定版本的 python 命令。请注意,在将未指定版本的命令配置为对应的版本前,必须安装所需的 python3python38python39python2 软件包。

重要

/usr/bin/python 可执行文件由 alternatives 系统控制。更新时可能会覆盖任何手动更改。

其他 Python 相关命令,如 pip3,没有可配置的未指定版本的变体。

41.1. 直接配置未指定版本的 python 命令

您可以将未指定版本的 python 命令直接配置为特定的 Python 版本。

先决条件

  • 确定安装了 Python 所需的版本。

流程

  • 要将未指定版本的 python 命令配置为 Python 3.6,请使用:

    # alternatives --set python /usr/bin/python3
  • 要将未指定版本的 python 命令配置为 Python 3.8,请使用:

    # alternatives --set python /usr/bin/python3.8
  • 要将未指定版本的 python 命令配置为 Python 3.9,请使用:

    # alternatives --set python /usr/bin/python3.9
  • 要将未指定版本的 python 命令配置为 Python 2,请使用:

    # alternatives --set python /usr/bin/python2

41.2. 以互动方式将未指定版本的 python 命令配置为所需的 Python 版本

您可以交互式地将未指定版本的 python 命令配置为所需的 Python 版本。

先决条件

  • 确定安装了 Python 所需的版本。

流程

  1. 要以互动方式配置未指定版本的 python 命令,请使用:

    # alternatives --config python
  2. 从提供的列表中选择所需版本。
  3. 要重置此配置并删除未指定版本的 python 命令,请使用:

    # alternatives --auto python

41.3. 其它资源

  • alternatives(8)unversioned-python(1) man page

第 42 章 打包 Python 3 RPM

大多数 Python 项目都使用 Setuptools 进行打包,并在 setup.py 文件中定义软件包信息。有关 Setuptools 打包的详情请参考 Setuptools 文档

您还可以将 Python 项目打包到 RPM 软件包中,与 Setuptools 打包相比,它提供以下优点:

  • 在其它 RPM 上指定软件包的依赖关系(甚至非 Python)
  • 加密签名

    使用加密签名时,RPM 软件包的内容可与操作系统的其余部分一起验证、集成和测试。

42.1. Python 软件包的 SPEC 文件描述

SPEC 文件包含 rpmbuild 工具用来构建 RPM 的说明。这些说明包含在一系列部分中。SPEC 文件包含定义这些部分的两个主要部分:

  • 注释(包含一系列在正文中使用的元数据项)
  • 正文(包含指令的主要部分)

Python 项目的 RPM SPEC 文件与非 Python RPM SPEC 文件相比具有一些特殊性。最值得注意的是, Python 库的任何 RPM 软件包的名称必须始终包含决定这个版本的前缀,例如:对于 Python 3.6, python38 代表 Python 3.8,或 python39 用于 Python 3.9。python3

以下 SPEC 文件示例中显示了 python3-detox 软件包的以下 SPEC 文件示例。有关此类详情的描述,请查看示例下面的备注。

%global modname detox                                                           1

Name:           python3-detox                                                   2
Version:        0.12
Release:        4%{?dist}
Summary:        Distributing activities of the tox tool
License:        MIT
URL:            https://pypi.io/project/detox
Source0:        https://pypi.io/packages/source/d/%{modname}/%{modname}-%{version}.tar.gz

BuildArch:      noarch

BuildRequires:  python36-devel                                                  3
BuildRequires:  python3-setuptools
BuildRequires:  python36-rpm-macros
BuildRequires:  python3-six
BuildRequires:  python3-tox
BuildRequires:  python3-py
BuildRequires:  python3-eventlet

%?python_enable_dependency_generator                                            4

%description

Detox is the distributed version of the tox python testing tool. It makes efficient use of multiple CPUs by running all possible activities in parallel.
Detox has the same options and configuration that tox has, so after installation you can run it in the same way and with the same options that you use for tox.

    $ detox

%prep
%autosetup -n %{modname}-%{version}

%build
%py3_build                                                                      5

%install
%py3_install

%check
%{__python3} setup.py test                                                      6

%files -n python3-%{modname}
%doc CHANGELOG
%license LICENSE
%{_bindir}/detox
%{python3_sitelib}/%{modname}/
%{python3_sitelib}/%{modname}-%{version}*

%changelog
...
1
modname 包含 Python 项目的名称。在这个示例中是 detox
2
将 Python 项目打包到 RPM 中时,需要将 python3 前缀添加到项目的原始名称中。此处的原始名称是 detox, RPM 的名称python3-detox
3
buildRequires 指定构建和测试此软件包需要哪些软件包。在 BuildRequires 中,始终包含提供构建 Python 软件包所需的工具的项目: python36-develpython3-setuptools。需要 python36-rpm-macros 软件包,以便自动将带有 /usr/bin/python3 解释器指令的文件改为 /usr/bin/python3.6
4
每个 Python 软件包都需要一些其他软件包正常工作。这些软件包也需要在 SPEC 文件中指定。要指定 依赖项, 您可以使用 %python_enable_dependency_generator 宏 自动使用 setup.py 文件中定义的依赖项。如果软件包的依赖项没有使用 Setuptools 指定,在额外的 Requires 指令中指定它们。
5
% py3_build%py3_install 宏分别运行 setup.py buildsetup.py install 命令,以及额外的参数来指定安装位置、要使用的解释器和其他详情。
6
check 部分提供了一个运行正确版本 Python 的宏。% {__python3} 宏包含 Python 3 解释器的路径,例如 /usr/bin/python3。我们建议总是使用宏而不是字面路径。

42.2. Python 3 RPM 的通用宏

在 SPEC 文件中,始终使用在以下 Macros for Python 3 RPMs 表中描述的宏,而不是硬编码其值。

在宏名称中,总是使用 python3 或者 python2 而不是未指定版本的 python。在 SPEC 文件的 BuildRequires 中将特定的 Python 3 版本配置为 python36-rpm-macrospython38-rpm-macrospython39-rpm-macros

表 42.1. Python 3 RPM 的宏

普通定义描述

%{__python3}

/usr/bin/python3

Python 3 解释器

%{python3_version}

3.6

Python 3 解释器的完整版本。

%{python3_sitelib}

/usr/lib/python3.6/site-packages

其中安装了 pure-Python 模块。

%{python3_sitearch}

/usr/lib64/python3.6/site-packages

其中安装包含特定架构扩展的模块。

%py3_build

 

使用适合系统软件包的参数运行 setup.py build 命令。

%py3_install

 

使用适合系统软件包的参数运行 setup.py install 命令。

42.3. 自动提供 Python RPM

当打包 Python 项目时,请确保在生成的 RPM 中包含以下目录(如果这些目录存在):

  • .dist-info
  • .egg-info
  • .egg-link

在这些目录中,RPM 构建过程会自动生成虚拟 pythonX.Ydist 提供,例如 python3.6dist(detox)。这些虚拟提供由 %python_enable_dependency_generator 宏指定的软件包使用。

第 43 章 处理 Python 脚本中的解释器指令

在 Red Hat Enterprise Linux 8 中,可执行 Python 脚本应该使用解释器指令(也称为 hashbangs 或 shebangs),该指令至少明确指定了主 Python 版本。例如:

#!/usr/bin/python3
#!/usr/bin/python3.6
#!/usr/bin/python2

在构建任何 RPM 软件包时, /usr/lib/rpm/redhat/brp-mangle-shebangs buildroot 策略(BRP)脚本会自动运行,并尝试在所有可执行文件中更正解释器指令。

BRP 脚本在遇到带有模糊解释器指令的 Python 脚本时会产生错误,例如:

#!/usr/bin/python

或者

#!/usr/bin/env python

43.1. 修改 Python 脚本中的解释器指令

修改 Python 脚本中导致 RPM 构建时构建错误的解释器指令。

先决条件

  • Python 脚本中的一些解释指令会导致构建错误。

流程

要修改解释器指令,请完成以下任务之一:

  • 应用 platform-python-devel 软件包中的 pathfix.py 脚本:

    # pathfix.py -pn -i %{__python3} PATH

    请注意,可以指定多个 PATHs。如果 PATH 是一个目录, pathfix.py 将递归扫描与模式 ^[a-zA-Z0-9_]+\.py$ 匹配的 Python 脚本,而不只是那些带有模糊解释器指令的脚本。在 %prep 部分添加这个命令,或者在 %install 部分末尾添加这个命令。

  • 修改打包的 Python 脚本,使其符合预期格式。为此, pathfix.py 也可以在 RPM 构建过程之外使用。当在 RPM 构建之外运行 pathfix.py 时,将上面示例中的 %{__python3} 替换为解释器指令的路径,如 /usr/bin/python3

如果打包的 Python 脚本需要 Python 3.6 以外的版本,请调整前面的命令使其包含所需的版本。

43.2. 更改自定义软件包中的 /usr/bin/python3 解释器指令

默认情况下, /usr/bin/python3 格式的解释器指令被从 platform-python 软件包中指向 Python 的解释器指令替代,该指令用于使用 Red Hat Enterprise Linux 的系统工具。您可以更改自定义软件包中的 /usr/bin/python3 解释器指令,以指向从 AppStream 软件仓库安装的 Python 的特定版本。

流程

  • 要为 Python 的特定版本构建您的软件包,请将相应的 python 软件包的 python*-rpm-macros 子软件包添加到 SPEC 文件的 BuildRequires 部分。例如,对于 Python 3.6,包括以下行:

    BuildRequires:  python36-rpm-macros

    因此,自定义软件包中的 /usr/bin/python3 解释器指令会自动转换为 /usr/bin/python3.6

注意

要防止 BRP 脚本检查和修改解释器指令,请使用以下 RPM 指令:

%undefine %brp_mangle_shebangs

第 44 章 使用 PHP 脚本语言

超级文本预处理器(PHP)主要用于服务器端脚本,它可让您使用 web 服务器运行 PHP 代码。

在 RHEL 8 中,PHP 脚本语言由 php 模块提供,该模块在多个流(版本)中可用。

根据您的用例,您可以安装所选模块流的特定配置集:

  • common - 使用 Web 服务器的服务器端脚本的默认配置集。它包括几个广泛使用的扩展。
  • minimal - 这个配置集只安装用于使用 PHP 的脚本的命令行界面,而无需使用 Web 服务器。
  • devel - 这个配置集包括 common 配置集中的软件包,以及用于开发目的的其他软件包。

44.1. 安装 PHP 脚本语言

这部分论述了如何安装 php 模块的所选版本。

流程

  • 要使用默认配置集安装 php 模块流,请使用:

    # yum module install php:stream

    使用您要安装的 PHP 版本替换 stream

    例如,要安装 PHP 7.4:

    # yum module install php:7.4

    默认 common 配置集还会安装 php-fpm 软件包,并预配置用于 Apache HTTP Servernginx 的 PHP。

  • 要安装 php 模块流的特定配置集,请使用:

    # yum module install php:stream/profile

    使用所需版本和 配置集 替换 stream, 使用您要安装的配置集的名称。

    例如,要在没有 web 服务器的情况下安装 PHP 7.4:

    # yum module install php:7.4/minimal

其它资源

44.2. 在 web 服务器中使用 PHP 脚本语言

44.2.1. 在 Apache HTTP 服务器中使用 PHP

在 RHEL 8 中, Apache HTTP Server 可让您将 PHP 作为 FastCGI 进程服务器运行。FastCGI Process Manager(FPM)是一个替代的 PHP FastCGI 守护进程,允许一个网站管理高负载。在 RHEL 8 中,PHP 默认使用 FastCGI Process Manager。

这部分论述了如何使用 FastCGI 进程服务器运行 PHP 代码。

先决条件

流程

  1. 安装 httpd 模块:

    # yum module install httpd:2.4
  2. 启动 Apache HTTP Server:

    # systemctl start httpd

    或者,如果 Apache HTTP Server 已在您的系统中运行,在安装 PHP 后重启 httpd 服务:

    # systemctl restart httpd
  3. 启动 php-fpm 服务:

    # systemctl start php-fpm
  4. 可选:启用这两个服务可在引导时启动:

    # systemctl enable php-fpm httpd
  5. 要获取有关 PHP 设置的信息,请在 /var/www/html/ 目录中使用以下内容创建 index.php 文件:

    echo '<?php phpinfo(); ?>' > /var/www/html/index.php
  6. 要运行 index.php 文件,请将浏览器指向:

    http://<hostname>/
  7. 可选:如果您有特定的要求,请调整配置:

    • /etc/httpd/conf/httpd.conf - 通用 httpd 配置
    • /etc/httpd/conf.d/php.conf - 用于 PHP 的配置 httpd
    • /usr/lib/systemd/system/httpd.service.d/php-fpm.conf - 默认情况下启动 php-fpm 服务 httpd
    • /etc/php-fpm.conf - FPM 主配置
    • /etc/php-fpm.d/www.conf - 默认 www 池配置

例 44.1. 运行一个 "Hello, World!" 使用 Apache HTTP 服务器的 PHP 脚本

  1. /var/www/html/ 目录中为您的项目创建一个 hello 目录:

    # mkdir hello
  2. /var/www/html/hello/ 目录中创建一个包含以下内容的 hello.php 文件:

    # <!DOCTYPE html>
    <html>
    <head>
    <title>Hello, World! Page</title>
    </head>
    <body>
    <?php
        echo 'Hello, World!';
    ?>
    </body>
    </html>
  3. 启动 Apache HTTP Server:

    # systemctl start httpd
  4. 要运行 hello.php 文件,请将浏览器指向:

    http://<hostname>/hello/hello.php

    因此,会显示一个带有 "Hello, World!" 文本的网页。

44.2.2. 在 nginx web 服务器中使用 PHP

这部分论述了如何通过 nginx web 服务器运行 PHP 代码。

先决条件

流程

  1. 安装 nginx 模块流:

    # yum module install nginx:stream

    使用您要安装的 nginx 版本替换 stream

    例如,要安装 nginx 版本 1.18:

    # yum module install nginx:1.18
  2. 启动 nginx 服务器:

    # systemctl start nginx

    或者,如果 nginx 服务器已在您的系统中运行,在安装 PHP 后重启 nginx 服务:

    # systemctl restart nginx
  3. 启动 php-fpm 服务:

    # systemctl start php-fpm
  4. 可选:启用这两个服务可在引导时启动:

    # systemctl enable php-fpm nginx
  5. 要获取有关 PHP 设置的信息,请在 /usr/share/nginx/html/ 目录中使用以下内容创建 index.php 文件:

    echo '<?php phpinfo(); ?>' > /usr/share/nginx/html/index.php
  6. 要运行 index.php 文件,请将浏览器指向:

    http://<hostname>/
  7. 可选:如果您有特定的要求,请调整配置:

    • /etc/nginx/nginx.conf - nginx 主配置
    • /etc/nginx/conf.d/php-fpm.conf - FPM 配置 nginx
    • /etc/php-fpm.conf - FPM 主配置
    • /etc/php-fpm.d/www.conf - 默认 www 池配置

例 44.2. 运行一个 "Hello, World!" 使用 nginx 服务器的 PHP 脚本

  1. /usr/share/nginx/html/ 目录中为您的项目创建一个 hello 目录:

    # mkdir hello
  2. /usr/share/nginx/html/hello/ 目录中创建一个包含以下内容的 hello.php 文件:

    # <!DOCTYPE html>
    <html>
    <head>
    <title>Hello, World! Page</title>
    </head>
    <body>
    <?php
        echo 'Hello, World!';
    ?>
    </body>
    </html>
  3. 启动 nginx 服务器:

    # systemctl start nginx
  4. 要运行 hello.php 文件,请将浏览器指向:

    http://<hostname>/hello/hello.php

    因此,会显示一个带有 "Hello, World!" 文本的网页。

44.3. 使用命令行界面运行 PHP 脚本

PHP 脚本通常使用 web 服务器运行,但也可以使用命令行界面运行。

如果您只想使用命令行运行 php 脚本,请安装 php 模块流的 minimal 配置集。

详情请查看 第 44.1 节 “安装 PHP 脚本语言”

先决条件

流程

  1. 在文本编辑器中创建 filename.php 文件

    filename 替换为您的文件名称。

  2. 从命令行执行创建的 filename.php 文件:

    # php filename.php

例 44.3. 运行一个 "Hello, World!" 使用命令行界面的 PHP 脚本

  1. 使用文本编辑器创建带有以下内容的 hello.php 文件:

    <?php
        echo 'Hello, World!';
    ?>
  2. 从命令行执行 hello.php 文件:

    # php hello.php

    因此,"Hello, World!"会被打印。

44.4. 其它资源

  • httpd(8) - 包含命令行选项的完整列表的 httpd 服务的手册页。
  • httpd.conf(5) - httpd 配置的说明 httpd 配置文件结构和位置的手册页。
  • nginx(8) - 包含命令行选项和信号列表的 nginx web 服务器手册页。
  • php-fpm(8) - PHP FPM 手册页描述其命令行选项和配置文件的完整列表。

第 45 章 使用 langpacks

langpacks 是 meta-packages,用于为系统中安装的每个软件包安装额外附加软件包,其中包含翻译、字典和本地化内容。

在 Red Hat Enterprise Linux 8 系统中, langpacks 安装基于 langpacks-<langcode> 语言 meta-packages 和 RPM 弱依赖项(Supplements tag)。

可为所选语言使用 langpacks 有两个先决条件。如果满足这些先决条件,在事务集中自动为所选语言拉取语言 meta-packages。

先决条件

  • 在系统中安装了所选语言的 langpacks-<langcode> meta-package。

    在 Red Hat Enterprise Linux 8 中,使用 Anaconda 安装程序自动安装 langpacks meta 软件包,因为这些软件包位于 Application Stream 软件仓库中。

    如需更多信息,请参阅。 第 45.1 节 “检查提供 langpacks 的语言”

  • 要搜索语言软件包的基本软件包已经安装在系统中。

45.1. 检查提供 langpacks 的语言

下面介绍这个过程检查哪些语言提供 langpacks。

流程

  • 执行以下命令:

    # yum list langpacks-*

45.2. 使用基于 RPM 弱依赖项的 langpacks

本节论述了在查询基于 RPM 弱依赖项的 langpack、安装或删除语言支持时您可能需要执行的多个操作。

45.2.1. 列出已安装的语言支持

要列出已经安装的语言支持,请使用这个步骤。

流程

  • 执行以下命令:

    # yum list installed langpacks*

45.2.2. 检查语言支持是否可用

要检查是否有语言支持,请使用以下步骤。

流程

  • 执行以下命令:
# yum list available langpacks*

45.2.3. 列出为语言安装的软件包

要列出为任何语言安装的软件包,请使用以下步骤:

流程

  • 执行以下命令:

    # yum repoquery --whatsupplements langpacks-<locale_code>

45.2.4. 安装语言支持

要添加新的语言支持,请使用以下步骤。

流程

  • 执行以下命令:

    # yum install langpacks-<locale_code>

45.2.5. 删除语言支持

要删除所有安装的语言支持,请使用以下步骤。

流程

  • 执行以下命令:

    # yum remove langpacks-<locale_code>

45.3. 使用 glibc-langpack-<locale_code> 保存磁盘空间

目前,所有区域设置都存储在 /usr/lib/locale/locale-archive 文件中,这需要大量磁盘空间。

在磁盘空间是一个关键问题(如容器和云镜像)或者只需要一些本地的系统中,您可以使用 glibc locale langpack 软件包(glibc-langpack-<locale_code>)。

要单独安装区域设置,并获得较小的软件包安装内存,请使用以下步骤。

流程

  • 执行以下命令:

    # yum install glibc-langpack-<locale_code>

使用 Anaconda 安装操作系统时,会为您在安装过程中使用的语言安装 glibc-langpack-<locale_code>,以及您选择为附加语言的语言。请注意,包含所有区域设置的 glibc-all-langpacks 会被默认安装,因此会重复一些区域设置。如果您为一个或多个所选语言安装了 glibc-langpack-<locale_code>,您可以在安装后删除 glibc-all-langpacks 以保存磁盘空间。

请注意,只安装所选 glibc-langpack-<locale_code> 软件包而不是 glibc-all-langpacks 软件包会影响运行时性能。

注意

如果磁盘空间不是问题,使用 glibc-all-langpacks 软件包安装所有区域空间。

第 46 章 Tcl/Tk 入门

46.1. Tcl/Tk 介绍

工具命令语言(Tcl) 是一个动态编程语言。这个语言的解释器以及 C 库由 tcl 软件包提供。

使用与 Tk(Tcl/Tk ) 配对 的 Tcl 可启用跨平台 GUI 应用程序。TKtk 软件包提供。

请注意,Tk 可以引用以下任意一种:

  • 用于多种语言的编程工具包
  • Tk C 库绑定可用于多种语言,如 C、Ruby、Perl 和 Python
  • 一个需要解释器来实例化 Tk 控制台
  • 为特定 Tcl 解释器添加多个新命令的 Tk 扩展

有关 Tcl/Tk 的更多信息,请参阅 Tcl/Tk 手册 或者 Tcl/Tk 文档网页

46.2. Tcl/Tk 8.6 中的显著变化

Red Hat Enterprise Linux 7 使用 Tcl/Tk 8.5。在 Red Hat Enterprise Linux 8 中, Tcl/Tk 版本 8.6 在 Base OS 软件仓库中提供。

Tcl/Tk 8.5 相比,Tcl/Tk 8.6 的主要变化有:

  • 基于对象的编程支持
  • 无堆栈评估实施
  • 增强的例外处理
  • 使用 Tcl 构建并安装的第三方软件包集合
  • 启用多线程操作
  • 对 SQL 数据库增强脚本的支持
  • IPv6 网络支持
  • 内置 Zlib 压缩
  • 列表处理

    有两个新命令 lmapdict map 可用,允许对 Tcl 容器进行转换。

  • 根据脚本堆栈的频道

    有两个新命令 chan pushchan pop 可用,允许向 I/O 频道添加或删除转换。

Tk 中的主要变化包括:

  • 内置 PNG 镜像支持
  • 忙窗口

    提供了一个新命令 tk busy,它可禁用窗口或 widget 的用户互动并显示忙碌光标。

  • 新的字体选择对话框界面
  • 绿色文本支持
  • 将项移至 canvas 支持

有关 Tcl 8.5 和 Tcl 8.6 之间更改的详细列表,请参阅 Tcl /Tk 8.6 的更改

46.3. 迁移到 Tcl/Tk 8.6

Red Hat Enterprise Linux 7 使用 Tcl/Tk 8.5。在 Red Hat Enterprise Linux 8 中, Tcl/Tk 版本 8.6 在 Base OS 软件仓库中提供。

本节论述了以下对象到 Tcl/Tk 8.6 的迁移路径:

  • 开发人员在编写 Tcl 扩展或将 Tcl 解释器嵌入到自己的应用程序中
  • 使用 Tcl/Tk脚本任务的用户

46.3.1. Tcl 扩展开发者的迁移路径

要使您的代码与 Tcl 8.6 兼容,请使用以下步骤。

流程

  1. 重写代码以使用 interp 结构。例如,如果您的代码读取 interp→errorLine,请重写它以使用以下功能:

    Tcl_GetErrorLine(interp)

    这是必要的,因为 Tcl 8.6 限制对 interp 结构成员的直接访问。

  2. 要使您的代码与 Tcl 8.5Tcl 8.6 兼容,请使用您的 C 或者 C++ 应用程序或包含 Tcl 库的扩展的标头文件中的以下代码片段:

    # include <tcl.h>
    # if !defined(Tcl_GetErrorLine)
    # define Tcl_GetErrorLine(interp) (interp→errorLine)
    # endif

46.3.2. 使用 Tcl/Tk 脚本化任务的用户迁移路径

Tcl 8.6 中,大多数脚本的工作方式与之前的 Tcl 版本相同。

要将代码迁移到 Tcl 8.6 中,请使用这个步骤。

流程

  • 在编写可移植代码时,请确定不使用 Tk 8.6 中不再支持的命令:

    tkIconList_Arrange
    tkIconList_AutoScan
    tkIconList_Btn1
    tkIconList_Config
    tkIconList_Create
    tkIconList_CtrlBtn1
    tkIconList_Curselection
    tkIconList_DeleteAll
    tkIconList_Double1
    tkIconList_DrawSelection
    tkIconList_FocusIn
    tkIconList_FocusOut
    tkIconList_Get
    tkIconList_Goto
    tkIconList_Index
    tkIconList_Invoke
    tkIconList_KeyPress
    tkIconList_Leave1
    tkIconList_LeftRight
    tkIconList_Motion1
    tkIconList_Reset
    tkIconList_ReturnKey
    tkIconList_See
    tkIconList_Select
    tkIconList_Selection
    tkIconList_ShiftBtn1
    tkIconList_UpDown

    请注意,您可以在 /usr/share/tk8.6/unsupported.tcl 文件中检查不支持的命令列表。

法律通告

Copyright © 2021 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.