Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

系统管理员指南

Red Hat Enterprise Linux 7

RHEL 7 的部署、配置和管理

摘要

系统管理员指南记录了有关 Red Hat Enterprise Linux 7 的部署、配置和管理相关信息。它面向对系统有基本了解的系统管理员。
注意
如果您想将 Red Hat Enterprise Linux 7 与 Linux 容器功能搭配使用,请参阅 Red Hat Enterprise Linux Atomic Host 产品文档。有关在 Red Hat Enterprise Linux 7 中实施的一般 Linux 容器概念及其当前功能的概述 ,请参见红帽系统中的容器概述Red Hat Enterprise Linux Atomic Host 7 Managing Containers指南中介绍了与容器管理和管理相关的主题。

部分 I. 基本系统配置

这部分涵盖了基本的安装后任务和基本系统管理任务,如键盘配置、日期和时间配置、管理用户和组以及获取特权。

第 1 章 开始使用

本章论述了安装 Red Hat Enterprise Linux 7 后您可能需要执行的基本任务。

请注意,这些项目可能包括在安装过程中通常已经完成的任务,但不一定必须完成,比如注册系统。处理这些任务的子章节提供了如何在安装过程中实现这个问题的简要概述,以及在特殊章节中查看相关文档的链接。

有关红帽企业 Linux 7 安装的详细信息,请参阅红帽企业 Linux 7 安装指南

注意

本章提到要执行的一些命令。root 用户输入的命令在提示符中具有 #,而常规用户可以执行的命令在其提示符中具有 $

有关常见安装后任务的更多信息,请参阅 Red Hat Enterprise Linux 7 安装指南

虽然可以通过命令行来完成所有安装后任务,也可以使用 Web 控制台 工具来执行其中一些任务。

Web 控制台以及它可以使用什么任务

Web 控制台是一个 系统管理工具,提供通过 Web 浏览器监控和管理服务器的用户界面。

Web 控制台 可用于执行这些任务:

  • 监控基本系统特性,如硬件、互联网连接或性能特性
  • 分析系统日志文件的内容
  • 配置基本网络功能,如接口、网络日志、数据包大小
  • 管理用户帐户
  • 监控并配置系统服务
  • 创建诊断报告
  • 设置内核转储配置
  • 配置 SELinux
  • 管理系统订阅
  • 访问终端

有关安装和使用 Web 控制台 的详情,请参阅使用 RHEL 7 web 控制台管理系统

1.1. 环境的基本配置

环境的基本配置包括:

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

这些项目的设置通常是安装过程的一部分。

如需更多信息,请参阅根据安装方法划分的源:

如果您需要在安装后重新配置环境的基本特性,请按照本节中的内容进行操作。

1.1.1. 配置日期和时间简介

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

Red Hat Enterprise Linux 7 使用以下守护进程来实现 NTP

如果要使用 ntpd 而不是默认的 chronyd,则需要禁用 chronyd 、安装、启用和配置 ntpd,如 第 19 章 使用 ntpd 配置 NTP 所示。

显示当前日期和时间

要显示当前的日期和时间,请使用以下命令之一:

~]$ date
~]$ timedatectl

请注意,timedatectl 命令提供更为详细的输出,包括通用时间、当前使用的时区、网络时间协议(NTP)配置的状态,以及一些附加信息。

有关配置日期和时间的详情请参考 第 3 章 配置日期和时间

1.1.2. 配置系统区域介绍

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

处理系统区域的基本任务:

  • 列出可用的系统区域设置:

    ~]$ localectl list-locales
  • 显示系统区域设置的当前状态:

    ~]$ localectl status
  • 设置或更改默认系统区域设置:

    ~]# localectl set-locale LANG=locale

有关配置系统区域设置的详情请参考 第 2 章 系统位置和键盘配置

1.1.3. 配置键盘布局简介

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

处理键盘布局的基本任务包括:

  • 列出可用的键映射:

    ~]$ localectl list-keymaps
  • 显示 keymap 设置的当前状态:

    ~]$ localectl status
  • 设置或更改默认系统键映射:

    ~]# localectl set-keymap

有关配置键盘布局的详情请参考 第 2 章 系统位置和键盘配置

1.2. 配置和检查网络访问

网络访问通常在安装过程中配置。但是,安装过程不会提示您在一些常见安装路径中配置网络接口。因此,安装后可能不会配置网络访问。如果发生这种情况,您可以在安装后配置网络访问。

有关在安装过程中配置网络访问的快速入门,请参阅 第 1.2.1 节 “在安装过程中配置网络访问”。要在安装后配置网络访问,您可以使用 nmcli 命令行实用程序,如 Red Hat Enterprise Linux 7 网络指南nmtui 文本用户界面实用程序所述,如 Red Hat Enterprise Linux 7 网络指南 中所述。

nmclinmtui 实用程序还允许您添加一个或多个新网络连接,以及修改和检查现有连接。如果要使用 nmcli 创建和管理网络连接,请参阅 第 1.2.2 节 “使用 nmcli 在安装过程后管理网络连接”。如果要使用 nmtui 创建和管理网络连接,请参阅 第 1.2.3 节 “使用 nmtui 在安装过程后管理网络连接”

1.2.1. 在安装过程中配置网络访问

在安装过程中配置网络访问的方法:

  • Anaconda 安装程序图形用户界面中的安装概述 屏幕中的 Network & Hostname 菜单
  • Anaconda 安装程序文本模式中的 网络设置 选项
  • Kickstart 文件

当系统在安装完成后第一次引导时,您在安装过程中配置的所有网络接口都会被自动激活。

有关在安装过程中网络访问配置的详细信息,请参阅 Red Hat Enterprise Linux 7 安装指南

1.2.2. 使用 nmcli 在安装过程后管理网络连接

root 用户身份运行以下命令,以使用 nmcli 实用程序管理网络连接。

创建新连接:

~]# nmcli con add type type of the connection "con-name" connection name ifname ifname interface-name the name of the interface ipv4 address ipv4 address gw4 address gateway address

修改现有连接:

~]# nmcli con mod "con-name"

显示所有连接:

~]# nmcli con show

显示活跃连接:

~]# nmcli con show --active

显示特定连接的所有配置设置:

~]# nmcli con show "con-name"

有关 nmcli 命令行实用程序的更多信息,请参阅 Red Hat Enterprise Linux 7 网络指南

1.2.3. 使用 nmtui 在安装过程后管理网络连接

NetworkManager 文本用户界面(TUI)实用程序 nmtui 提供了通过控制 NetworkManager 配置网络的文本界面。

有关安装和使用 nmtui 文本界面工具的更多信息,请参阅 Red Hat Enterprise Linux 7 网络指南

1.2.4. 在 Web 控制台中管理网络

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

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

图 1.1. 在 Web 控制台中管理网络

Networking n

1.3. 注册系统管理订阅的基础知识

1.3.1. 红帽订阅是什么以及哪些任务可供使用

订阅涵盖在红帽企业 Linux 7 上安装的产品(包括操作系统本身)。

Red Hat Content Delivery Network 订阅用来跟踪:

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

1.3.2. 安装过程中注册系统

这部分提供了在安装过程中注册 Red Hat Enterprise Linux 7 的简单概述。如果在安装后您的操作系统没有注册,您可以通过阅读本节来找出安装过程中可能会错过的内容。有关详细信息,请参阅《红帽企业 Linux 7 安装指南 》。

基本上,在安装过程中注册该系统的方法有两种:

  • 通常,注册是 Initial Setup 配置 过程的一部分。如需更多信息,请参阅 Red Hat Enterprise Linux 7 安装指南
  • 另一个选项是将 Subscription Manager 作为安装后脚本运行,该脚本 会在安装完成时并在第一次重启系统前执行自动注册。为确保这一点,修改 Kickstart 文件的 %post 部分。有关将订阅管理器作为安装后脚本运行的详情,请参考 Red Hat Enterprise Linux 7 安装指南

1.3.3. 安装后注册系统

如果您在安装过程中没有注册您的系统,则可以应用以下步骤进行操作。请注意,这个过程中的所有命令都需要以 root 用户身份执行。

注册和订阅您的系统

  1. 注册您的系统:

    ~]# subscription-manager register

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

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

    ~]# subscription-manager list --available

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

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

    ~]# subscription-manager attach --pool=pool_id

有关注册您的系统以及附加 Red Hat Content Delivery Network 订阅的详情请参考 第 7 章 注册系统管理并管理订阅

1.3.4. 将系统注册到 EUS 内容

要访问延长的更新支持(EUS)内容,请按以下方式注册您的系统:

  1. 验证 EUS 权利是否可用:

    ~]# subscription-manager list --available --matches="*Extended Update Support"
        +-------------------------------------------+
            Available Subscriptions
        +-------------------------------------------+
        Subscription Name:   Extended Update Support
        Provides:            Red Hat Enterprise Linux High Availability for x86_64 - Extended Update Support
                             Red Hat Enterprise Linux Resilient Storage for x86_64 - Extended Update Support
                             Red Hat Enterprise Linux for x86_64 - Extended Update Support
                             Red Hat EUCJP Support (for RHEL Server) - Extended Update Support
                             RHEL for SAP - Extended Update Support
                             Red Hat Enterprise Linux Load Balancer (for RHEL Server) - Extended Update Support
                             Red Hat Enterprise Linux Scalable File System (for RHEL Server) - Extended Update Support
                             Red Hat CodeReady Linux Builder for x86_64 - Extended Update Support
                             RHEL for SAP HANA - Extended Update Support
                             Red Hat Enterprise Linux High Performance Networking (for RHEL Server) - Extended Update Support
                             Oracle Java (for RHEL Server) - Extended Update Support
                             Red Hat S-JIS Support (for RHEL Server) - Extended Update Support
        SKU:                 RH00030
        Contract:            12069074
        Pool ID:             8a99f9ac7238188b01723d9c8a8a06a9
        Provides Management: No
        Available:           8
        Suggested:           0
        Service Level:       Layered
        Service Type:        L1-L3
        Subscription Type:   Instance Based
        Starts:              05/22/2020
        Ends:                05/21/2021
        System Type:         Physical
  2. 使用池标识符附加适用的订阅:

    ~]# subscription-manager attach --pool 8a99f9ac7238188b01723d9c8a8a06a9
  3. 将为系统启用的默认软件仓库替换为 EUS 变体:

    ~]# subscription-manager repos --disable \*
  4. 启用代表使用 RHEL 修订版本设置的 EUS 内容的软件仓库:

    ~]# subscription-manager repos --enable rhel-7-server-eus-rpms
  5. 为最终系统选择所需的和支持发行版本:

    ~]# subscription-manager release --set 7.6

对于当前支持的 EUS 版本,请参阅延长更新支持附加组件

1.3.5. 将系统注册到 E4S 内容

以下流程描述了如何注册系统和利用 E4S 内容。

  1. 使用以下命令注册您的系统:

    ~]# subscription-manager register
  2. 验证 E4S 权利是否可用:

    ~]# subscription-manager list --available --matches="*Update Services for SAP Solutions*"
    +-------------------------------------------+
        Available Subscriptions
    +-------------------------------------------+
    Subscription Name:   Red Hat Enterprise Linux for SAP Solutions, Standard (Physical or Virtual Nodes)
    Provides:            dotNET on RHEL Beta (for RHEL Server)
                         Red Hat CodeReady Linux Builder for x86_64
                         Red Hat Enterprise Linux for SAP HANA for x86_64
                         Red Hat Ansible Engine
                         RHEL for SAP HANA - Update Services for SAP Solutions
                         Red Hat Enterprise Linux Scalable File System (for RHEL Server) - Extended Update Support
                         RHEL for SAP HANA - Extended Update Support
                         Red Hat Enterprise Linux Atomic Host Beta
                         Red Hat Beta
                         Red Hat EUCJP Support (for RHEL Server) - Extended Update Support
                         Red Hat Enterprise Linux High Availability for x86_64
                         Red Hat Enterprise Linux Load Balancer (for RHEL Server) - Extended Update Support
                         dotNET on RHEL (for RHEL Server)
                         Red Hat CodeReady Linux Builder for x86_64 - Extended Update Support
                         Red Hat Enterprise Linux High Availability - Update Services for SAP Solutions
                         Red Hat Enterprise Linux Resilient Storage for x86_64 - Extended Update Support
                         Red Hat Enterprise Linux High Availability for x86_64 - Extended Update Support
                         Oracle Java (for RHEL Server)
                         Red Hat Enterprise Linux Server - Update Services for SAP Solutions
                         Red Hat Software Collections (for RHEL Server)
                         Red Hat Enterprise Linux Scalable File System (for RHEL Server)
                         Red Hat Enterprise Linux High Performance Networking (for RHEL Server) - Extended Update Support
                         RHEL for SAP - Update Services for SAP Solutions
                         Oracle Java (for RHEL Server) - Extended Update Support
                         Red Hat Enterprise Linux Atomic Host
                         Red Hat Developer Tools (for RHEL Server)
                         Red Hat Software Collections Beta (for RHEL Server)
                         Red Hat Enterprise Linux Server
                         Red Hat Enterprise Linux for SAP Applications for x86_64
                         Red Hat Developer Tools Beta (for RHEL Server)
                         Red Hat Enterprise Linux for x86_64
                         Red Hat Enterprise Linux for x86_64 - Extended Update Support
                         RHEL for SAP - Extended Update Support
                         Red Hat Developer Toolset (for RHEL Server)
                         Red Hat S-JIS Support (for RHEL Server) - Extended Update Support
    SKU:                 RH00764
    Contract:            11977725
    Pool ID:             8a85f99c6c4825eb016c4a30d3493064
    Provides Management: Yes
    Available:           18
    Suggested:           0
    Service Level:       Standard
    Service Type:        L1-L3
    Subscription Type:   Instance Based
    Starts:              03/29/2020
    Ends:                12/31/2021
    System Type:         Physical
  3. 使用池标识符附加适用的订阅:

    ~]# subscription-manager attach --pool=#################
  4. 将为系统启用的默认软件仓库替换为 EUS 变体:

    ~]# subscription-manager repos --disable="*"
  5. 启用代表正在使用的 RHEL 修订的 E4S 内容的软件仓库:

    ~]# subscription-manager --enable=rhel-7-server-e4s-rpms
  6. 清除存储库缓存并将系统锁定到支持您的 SAP 应用程序的 E4S 有效发行版本:

    ~]# yum clean all && subscription-manager release --set=7.7

1.4. 安装软件

这部分提供了在 Red Hat Enterprise Linux 7 系统中完成软件安装基础知识的信息。它提到了在 第 1.4.1 节 “软件安装的先决条件” 中安装软件所需的先决条件,提供 第 1.4.2 节 “软件打包和软件存储库系统简介” 中软件打包和软件存储库的基本信息,并参考 第 1.4.3 节 “使用 Subscription Manager 和 Yum 管理基本软件安装任务” 中与软件安装相关的基本任务。

1.4.1. 软件安装的先决条件

Red Hat Content Delivery Network 订阅服务提供处理红帽软件库存的机制,并可让您安装其他软件或更新已安装的软件包。您可以在注册系统并附加订阅后开始安装软件,如 第 1.3 节 “注册系统管理订阅的基础知识” 所述。

1.4.2. 软件打包和软件存储库系统简介

Red Hat Enterprise Linux 系统上的所有软件都被分成 RPM 包,这些软件包存储在特定的存储库中。当系统订阅 Red Hat Content Delivery Network 时,会在 /etc/yum.repos.d/ 目录中创建一个仓库文件。

使用 yum 实用程序管理软件包操作:

  • 搜索软件包信息
  • 安装软件包
  • 更新软件包
  • 删除软件包
  • 检查当前可用的软件仓库列表
  • 添加或删除软件仓库
  • 启用或禁用软件仓库

有关与安装软件相关的基本任务的详情请参考 第 1.4.3 节 “使用 Subscription Manager 和 Yum 管理基本软件安装任务”。有关管理软件存储库的详情请参考 第 7.2 节 “管理软件存储库”。有关使用 yum 工具的详情请参考 第 9 章 yum

1.4.3. 使用 Subscription Manager 和 Yum 管理基本软件安装任务

安装操作系统后可能需要的最基本软件安装任务包括:

  • 列出所有可用存储库:

    ~]# subscription-manager repos --list
  • 列出所有当前启用的软件仓库:

    ~]$ yum repolist
  • 启用或禁用存储库:

    ~]# subscription-manager repos --enable repository
    ~]# subscription-manager repos --disable repository
  • 搜索与特定字符串匹配的软件包:

    ~]$ yum search string
  • 安装软件包:

    ~]# yum install package_name
  • 更新所有软件包及其依赖项:

    ~]# yum update
  • 更新软件包:

    ~]# yum update package_name
  • 卸载软件包以及依赖于它的任何软件包:

    ~]# yum remove package_name
  • 列出所有已安装和可用软件包的信息:

    ~]$ yum list all
  • 列出所有安装的软件包信息:

    ~]$ yum list installed

1.5. 在引导时启动 systemd 服务

Systemd 是 Linux 操作系统的系统和服务管理器,它引进了 systemd 单元的概念。有关 systemd 的详情请参考 第 10.1 节 “systemd 简介”

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

1.5.1. 启用或禁用服务

您可以在安装过程中在引导时启用或禁用的服务,或者您可以在安装的操作系统中启用或禁用服务。

要在安装过程中在引导时启用或禁用的服务列表,请使用 Kickstart 文件中的 services 选项:

services [--disabled=list] [--enabled=list]
注意

禁用的服务列表会在启用的服务列表前进行处理。因此,如果服务出现在这两个列表中,它将被启用。服务列表应以逗号分隔的格式指定。不要在服务列表中包含空格。有关详细信息,请参阅《Red Hat Enterprise Linux 7 安装指南》。

在已安装的操作系统中启用或禁用服务:

~]# systemctl enableservice_name
~]# systemctl disableservice_name

详情请查看 第 10.2 节 “管理系统服务”

1.5.2. 在 web 控制台中管理服务

Web 控制台中,选择 Services 来管理 systemd 目标、服务、套接字、计时器和路径。您可以检查其状态、启动或停止它们、启用或禁用它们、启用或禁用它们。

图 1.2. 在 web 控制台中管理服务

systemd n

1.5.3. systemd 服务中的其他资源

有关 systemd 的详情请参考 第 10 章 使用 systemd 管理服务

1.6. 使用防火墙、SELinux 和 SSH 日志提高系统安全性

计算机安全性是保护计算机系统免受硬件、软件或信息损坏或损害其提供的服务的影响或错误。因此,确保计算机安全性是关键任务,不仅在企业中处理敏感数据或处理某些业务交易。

计算机安全性包括各种功能和工具。本节仅涵盖安装操作系统后您需要配置的基本安全功能。有关保护红帽企业 Linux 7 安全性的详细信息,请参阅红帽企业 Linux 7 安全指南

1.6.1. 确保防火墙已启用并正在运行

1.6.1.1. 什么是防火墙问题及其如何增强系统安全性

防火墙是一种网络安全系统,它根据预先确定的安全规则监控和控制传入和传出的网络流量。防火墙通常在可信、安全的内部网络和其他外部网络之间建立一个障碍。

在 Red Hat Enterprise Linux 7 中,防火墙由 firewalld 服务提供,该服务会在安装 Red Hat Enterprise Linux 期间自动启用。但是,如果您明确禁用该服务,例如在 kickstart 配置中,您可以重新启用它,如 第 1.6.1.2 节 “重新启用 firewalld 服务” 所述。有关 Kickstart 文件中的防火墙设置选项概述,请参阅 Red Hat Enterprise Linux 7 安装指南

1.6.1.2. 重新启用 firewalld 服务

如果 firewalld 服务在安装后被禁用,红帽建议红帽考虑重新启用该服务。

您可以以常规用户身份显示 firewalld 的当前状态:

~]$ systemctl status firewalld

如果没有启用并运行 firewalld,切换到 root 用户并更改其状态:

~]# systemctl start firewalld
~]# systemctl enable firewalld

有关与 firewalld 相关的安装后流程的更多信息,请参阅 Red Hat Enterprise Linux 7 安全指南。有关配置和使用防火墙的详情,请查看 Red Hat Enterprise Linux 7 安全指南

1.6.2. 确定适当的 SELinux 状态

1.6.2.1. SELinux 是什么及其如何增强系统安全性

Security Enhanced Linux(SELinux) 是一个额外的系统安全层,它决定哪个进程可以访问哪些文件、目录和端口。

SELinux 状态

SELinux 有两个可能的状态:

  • Enabled
  • Disabled

禁用 SELinux 时,仅使用自主访问控制(DAC)规则。

SELinux 模式

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

  • Enforcing
  • Permissive

强制模式意味着 SELinux 策略会被强制实施。SELinux 根据 SELinux 策略规则拒绝访问,并且只启用特别允许的交互。强制模式是安装后的默认模式,也是最安全的 SELinux 模式。

许可模式意味着 SELinux 策略不会被强制实施。SELinux 不会拒绝访问,但是对于在 enforcing 模式运行时会被拒绝的操作,则会记录拒绝信息。Permissive 模式是安装过程中的默认模式。在某些情况下,以 permissive 模式运行也很有用,例如,在进行故障排除时您需要访问 Access Vector Cache(AVC)拒绝。

有关 Red Hat Enterprise Linux 7 中 SELinux 的更多信息,请参阅 Red Hat Enterprise Linux 7 SELinux 用户和管理员指南

1.6.2.2. 确保 SELinux 所需的状态

默认情况下,SELinux 在安装过程中以 permissive 模式运行,安装完成后处于强制模式。

然而,在某些特定情况下,SELinux 可能会明确设置为 permissive 模式,或者甚至可能在安装的操作系统中禁用。可以在 kickstart 配置中设置此设置,例如:有关 Kickstart 文件中的 SELinux 设置选项概述,请参阅 Red Hat Enterprise Linux 7 安装指南

重要

红帽建议使您的系统保持在 enforcing 模式下。

显示当前的 SELinux 模式,并根据需要设置模式:

确保 SELinux 所需的状态

  1. 显示当前生效的 SELinux 模式:

    ~]$ getenforce
  2. 如果需要,请在 SELinux 模式之间切换。

    切换可以是临时的,也可以是永久性的。临时切换不会在重新启动后保留,而永久切换为:

    • 临时切换到 enforcing 或 permissive 模式:

      ~]# setenforce Enforcing
      ~]# setenforce Permissive
    • 要永久设置 SELinux 模式,修改 /etc/selinux/config 配置文件中的 SELINUX 变量。

      例如,将 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

1.6.2.3. 在 web 控制台中管理 SELinux

Web 控制台中,使用 SELinux 选项打开或关闭 SELinux 强制策略。

默认情况下,web 控制台中的 SELinux enforcing 策略是 on,SELinux 在 enforcing 模式下运行。通过关闭 SELinux,您可以将 SELinux 切换为 permissive 模式。请注意,与 /etc/sysconfig/selinux 文件中的默认配置偏差会在下一次引导时自动恢复。

图 1.3. 在 web 控制台中管理 SELinux

n 上的 SELinux

1.6.3. 使用基于 SSH 的身份验证

1.6.3.1. 基于 SSH 的身份验证及其如何增强系统安全性

如果要保护与其他计算机的通信,您可以使用基于 SSH 的身份验证。

安全外壳(SSH)是一种协议,可促进客户端-服务器通信,并允许用户远程登录任何运行 SSH 的主机系统。SSH 加密连接。客户端使用加密将其身份验证信息传输到服务器,会话期间发送和接收的所有数据也在加密下传输。

SSH 使其用户无需输入密码即可进行身份验证。为此,SSH 使用私钥-公钥方案。

有关 SSH 保护的详情请参考 第 12.1.2 节 “主要功能”

1.6.3.2. 建立 SSH 连接

为了能够使用 SSH 连接,创建由公钥和私钥组成的两对密钥。

创建密钥文件并将 Them 复制到服务器

  1. 生成公钥和私钥:

    ~]$ ssh-keygen

    这两个密钥都存储在 ~/.ssh/ 目录中:

    • ~/.ssh/id_rsa.pub - public key
    • ~/.ssh/id_rsa - private key

      公钥不需要是保密的。它用于验证私钥。私钥是机密。您可以选择使用密钥生成过程中指定的密语来保护私钥。使用密码短语时,身份验证更安全,但不再是免密码操作。您可以使用 ssh-agent 命令避免这种情况。在这种情况下,您将仅在会话开始时输入一次密码短语。有关 ssh-agent 配置的详情请参考 第 12.2.4 节 “使用基于密钥的身份验证”

  2. 将最新修改的公钥复制到您要登录到的远程机器中:

    ~]# ssh-copy-id USER@hostname

    现在,您可以安全地输入系统,但不会输入密码。

1.6.3.3. 禁用 SSH Root 登录

要提高系统安全性,您可以禁用 root 用户的 SSH 访问,这是默认启用的。

有关此主题的更多信息,请参阅 Red Hat Enterprise Linux 7 安全指南

禁用 SSH Root 登录

  1. 访问 /etc/ssh/sshd_config 文件:

    ~]# vi /etc/ssh/sshd_config
  2. #PermitRootLogin yes 的行改为:

    PermitRootLogin no
  3. 重启 sshd 服务:

    ~]# systemctl restart sshd

1.7. 管理用户帐户的基础知识

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

普通帐户和系统帐户

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

系统帐户代表系统上的特定应用程序标识符。此类帐户通常仅在软件安装时添加或操作,且不会在以后进行修改。

警告

系统帐户假定在一个系统中本地可用。如果远程配置和提供这些帐户,如 LDAP 配置实例中,则可能会出现系统中断和服务启动故障。

对于系统帐户,1000 以下的用户 ID 被保留。对于普通帐户,使用从 1000 开始的 ID。但推荐做法是使用从 5000 开始的 ID。如需更多信息,请参阅 第 4.1 节 “用户和组介绍”。分配 ID 的指南可以在 /etc/login.defs 文件中找到。

# Min/max values for automatic uid selection in useradd
#
UID_MIN         1000
UID_MAX         60000
# System accounts
SYS_UID_MIN        201
SYS_UID_MAX        999

对于哪些组和哪些组,它们可以用作哪些用途

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

1.7.1. 管理用户帐户和组的最基本命令行工具

管理用户帐户和组群的最基本任务以及适当的命令行工具,包括:

  • 显示用户和组群 ID:

    ~]$ id
  • 创建新用户帐户:

    ~]# useradd [options] user_name
  • 为属于用户名的用户帐户分配新密码

    ~]# passwd user_name
  • 将用户添加到组中:

    ~]# usermod -a -G group_name user_name

有关管理用户和组的详情请参考 第 4 章 管理用户和组

如果要使用图形用户界面管理用户和组,请参阅 第 4.2 节 “在图形环境中管理用户”

1.7.2. 在 web 控制台中管理用户帐户

要在 web 控制台中 管理帐户,请选择 Accounts 菜单。

图 1.4. 在 web 控制台中管理用户帐户

帐户 n

1.8. 使用 kdump 机制转储已清除内核

本节介绍了内核崩溃转储机制,也称为 kdump,并在 第 1.8.1 节 “kdump 是什么,它可以用于什么任务” 中简单解释了 kdump 的用途。

激活 kdump 服务是安装过程的一部分,默认情况下,k dump 在安装过程中启用。本节总结了如何在 第 1.8.2 节 “在安装过程中启用和激活 kdump” 安装过程中激活 kdump,并在安装 第 1.8.3 节 “确保安装过程后已安装并启用 kdump” 后禁用 kdump 服务时如何手动启用 kdump 服务。

您还可以使用 Web 控制台配置 kdump。如需更多信息,请参阅 第 1.8.4 节 “在 web 控制台中配置 kdump”

1.8.1. kdump 是什么,它可以用于什么任务

如果系统崩溃,您可以使用名为 kdump 的内核崩溃转储机制,以便保存系统内存内容,以便稍后进行分析。kdump 机制依赖于 kexec 系统调用,该调用可用于从另一个内核上下文引导 Linux 内核,绕过 BIOS,并保留第一个内核内存内容,否则会丢失第一个内核的内存内容。

当发生内核崩溃时,kdump 使用 kexec 引导进入第二个内核(捕获内核),该内核位于第一个内核无法访问的系统内存的保留部分。第二个内核捕获崩溃内核的内存(崩溃转储)的内容并将其保存。

1.8.2. 在安装过程中启用和激活 kdump

在安装过程中,可以在 Anaconda 安装程序中或使用 Kickstart 文件中的 %addon com_redhat_kdump 命令来启用和激活 kdump

如需更多信息,请参阅根据安装方法划分的源:

1.8.3. 确保安装过程后已安装并启用 kdump

确保安装了 kdump 并进行配置:

检查 kdump 是否已安装并配置 kdump

  1. 检查是否在您的系统中安装了 kdump:

    ~]$ rpm -q kexec-tools
  2. 如果没有安装 kdump,请以 root 用户身份 输入:

    ~]# yum install kexec-tools
  3. 配置 kdump

    使用命令行或图形用户界面。

    这两个选项均在 Red Hat Enterprise Linux 7 内核崩溃指南中进行了详细介绍。

    如果您需要安装图形配置工具:

    ~]# yum install system-config-kdump

1.8.4. 在 web 控制台中配置 kdump

Web 控制台中,选择 Kernel dump 进行验证:

  • kdump 状态
  • kdump保留的内存量
  • 崩溃转储文件的位置

图 1.5. 在 web 控制台中配置 kdump

kdump n

1.8.5. kdump 上的其他资源

有关 kdump 的更多信息,请参阅 Red Hat Enterprise Linux 7 内核崩溃指南。

1.9. 执行系统救援并使用 ReaR 创建系统备份

当软件或硬件故障破坏操作系统时,您需要一种机制来救援系统。保存系统备份也很有用。红帽建议使用 Relax-and-Recover(ReaR)工具来满足这两个需求。

1.9.1. ReaR 是否和哪些任务可供使用

Rear 是一个灾难恢复和系统迁移实用程序,可让您创建完整的救援系统。默认情况下,这个救援系统只恢复存储布局和启动加载器,而不是实际的用户和系统文件。

此外,某些备份软件允许您集成 ReaR 以用于灾难恢复。

rear 启用执行以下任务:

  • 在新硬件中引导救援系统
  • 复制原始存储布局
  • 恢复用户和系统文件

1.9.2. 安装和配置 ReaR 的快速入门

要安装 ReaR,以 root 用户身份输入:

~]# yum install rear

使用 /etc/rear/local.conf 文件中的设置来配置 ReaR。

如需更多信息,请参阅 第 27.1 节 “基本 ReaR 用法”

1.9.3. 使用 ReaR 创建救援系统的快速入门

要创建救援系统,请以 root 用户身份 执行以下命令
~]# rear mkrescue

有关使用 ReaR 创建救援系统的详情请参考 第 27.1.3 节 “创建救援系统”

1.9.4. 使用备份软件配置 ReaR 的快速入门

Rear 包含完全集成的内置或内部备份方法,称为 NETFS。

要使 ReaR 使用其内部备份方法,请将这些行添加到 /etc/rear/local.conf 文件中:

BACKUP=NETFS
BACKUP_URL=backup location

您还可以将 ReaR 配置为在创建新归档时保留之前的备份归档,方法是在 /etc/rear/local.conf 中添加以下行:

NETFS_KEEP_OLD_BACKUP_COPY=y

要让备份递增,意味着每次运行时只备份更改的文件,将这一行添加到 /etc/rear/local.conf 中:

BACKUP_TYPE=incremental

有关使用 ReaR NETFS 内部备份方法的详情请参考 第 27.2.1 节 “内置备份方法”

有关支持的外部备份方法和不支持的备份方法的详情,请参考 第 27.2.2 节 “支持的备份方法”第 27.2.3 节 “不支持的备份方法”

1.10. 使用日志文件来故障排除问题

在对问题进行故障排除时,您可能会欣赏包含不同操作系统信息和消息的日志文件。Red Hat Enterprise Linux 7 中的日志记录系统基于内置的 syslog 协议。特定的程序使用这个系统记录事件并将其整理到日志文件中,这些文件在审核操作系统和故障排除各种问题时非常有用。

有关日志文件的详情请参考 第 23 章 查看和管理日志文件

1.10.1. 服务处理 syslog 消息

系统日志消息由两个服务处理:

  • systemd-journald 守护进程 - 收集来自内核的消息、启动过程的早期阶段、标准输出以及守护进程在启动和运行过程中的错误,以及 syslog,并将消息转发到 rsyslog 服务以便进一步处理。
  • rsyslog 服务 - 按类型和优先级清理 syslog 消息,并将其写入 /var/log 目录中的文件,以持久存储日志。

1.10.2. 保护 syslog 消息的子目录

系统日志消息根据包含的信息和日志类型保存在 /var/log 目录下的不同子目录中:

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

1.11. 访问红帽支持

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

本节描述:

1.11.1. 通过红帽客户门户网站获取红帽支持

通过使用红帽客户门户网站,您可以:

  • 创建新的支持问题单
  • 与红帽专家开启实时聊天
  • 通过致电或发送电子邮件联系红帽专家

要访问红帽客户门户,请访问

要使用与红帽支持相关的红帽客户门户网站服务,您可以使用:

  • Web 浏览器
  • 红帽支持工具

1.11.1.1. Red Hat 支持工具及其可以用于哪些任务

红帽支持工具 是基于命令行的工具,可为基于订阅的红帽访问服务提供一个文本控制台界面。此工具包含在 redhat-support-tool 软件包中。

红帽支持工具 可让您执行与支持相关的任务,例如:

  • 打开或更新支持问题单
  • 搜索红帽知识库解决方案
  • 分析 Python 和 Java 错误

以互动模式启动该工具:

~]$ redhat-support-tool
Welcome to the Red Hat Support Tool.
Command (? for help):

在互动模式中,输入?显示可用命令

Command (? for help): ?

有关安装和使用红帽支持工具的更多信息,请参阅 第 8 章 使用红帽支持工具访问支持 和红帽知识库文章 Red Hat Access: Red Hat Support Tool

1.11.2. 使用 SOS 报告故障排除问题

SOS 报告 从 Red Hat Enterprise Linux 系统收集配置详情、系统信息和诊断信息。当您创建一个支持问题单时附加报告。

请注意,SOS 报告sos 软件包中提供,该软件包未安装 Red Hat Enterprise Linux 7 的默认最小安装。

安装 sos 软件包:

~]# yum install sos

生成 SOS 报告

~]# sosreport

要将 sos 报告 附加到您的支持问题单中,请参阅红帽知识库文章 如何将文件附加到红帽支持问题单?请注意,在附加 sos 报告时,系统会提示您输入支持案例的数量。

有关 SOS 报告 的更多信息,请参阅红帽知识库文章 什么是 sosreport 以及如何在 Red Hat Enterprise Linux 4.6 及之后的版本中创建?

第 2 章 系统位置和键盘配置

系统区域设置指定系统服务和用户界面的语言设置键盘布局设置控制文本控制台和图形用户界面中使用的布局

可以通过修改 /etc/locale.conf 配置文件或使用 localectl 实用程序来设置这些设置。此外,您可以使用图形用户界面执行任务;有关此方法的说明,请参阅 Red Hat Enterprise Linux 7 安装指南

2.1. 设置系统区域

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

/etc/locale.conf 的基本文件格式是一个以换行分隔的变量分配列表。例如:在 /etc/locale.conf 中带有英语信息的德语区域设置如下:

LANG=de_DE.UTF-8
LC_MESSAGES=C

此处,LC_MESSAGES 选项决定用于写入到标准错误输出的诊断消息的区域设置。要进一步指定 /etc/locale.conf 中的 区域设置,您可以使用几个其他选项,具体会在 表 2.1 “在 /etc/locale.conf 中可配置的选项” 中概述。有关这些选项的详情,请查看 locale(7) 手册页。请注意,不应在 /etc/locale.conf 中配置 LC_ALL 选项,它代表所有可能的选项。

表 2.1. 在 /etc/locale.conf 中可配置的选项

选项描述

LANG

为系统区域设置提供默认值。

LC_COLLATE

更改比较本地字母中字符串的函数行为。

LC_CTYPE

更改字符处理和分类功能以及多字节字符函数的行为。

LC_NUMERIC

描述数字通常的打印方式,详情包括十进制点和十进制逗号。

LC_TIME

更改当前时间、24 小时与 12 小时的显示。

LC_MESSAGES

确定用于写入到标准错误输出的诊断消息的区域设置。

2.1.1. 显示当前状态

localectl 命令可用于查询和更改系统区域设置和键盘布局设置。要显示当前的设置,请使用 status 选项:

localectl status

例 2.1. 显示当前状态

上一命令的输出列出了当前设置的区域设置、为控制台和 X11 窗口系统配置的键盘布局。

~]$ localectl status
  System Locale: LANG=en_US.UTF-8
    VC Keymap: us
   X11 Layout: n/a

2.1.2. 列出可用的区域

要列出您的系统所有可用区域,请输入:

localectl list-locales

例 2.2. 列出区域

假设您想要选择特定的英语区域设置,但您不确定它是否在系统中可用。您可以使用以下命令列出所有英语区域来检查:

~]$ localectl list-locales | grep en_
en_AG
en_AG.utf8
en_AU
en_AU.iso88591
en_AU.utf8
en_BW
en_BW.iso88591
en_BW.utf8

output truncated

2.1.3. 设置区域

要设置默认系统区域设置,以 root 用户身份运行以下命令:

localectl set-locale LANG=locale

使用区域名称替换 locale,使用 localectl list-locales 命令找到。以上语法还可用于从 表 2.1 “在 /etc/locale.conf 中可配置的选项” 配置参数。

例 2.3. 更改默认区域

例如,如果要将 English 设为默认区域设置,请先使用 list-locales 来查找此区域设置的名称。然后,作为 root 用户 以以下格式输入命令:

~]# localectl set-locale LANG=en_GB.utf8

2.1.4. 在使用 Kickstart 安装时永久进行系统区域设置

使用 Red Hat Kickstart 安装方法安装 Red Hat Enterprise Linux 时,升级操作系统后系统区域设置可能不会保留。

当 Kickstart 文件的 %packages 部分包含 --instLang 选项时,_install_langs RPM 宏被设置为这个安装的特定值,并相应地调整已安装的区域集合。但是,这个调整只会影响此安装,而不是后续升级。如果升级重新安装 glibc 软件包,则会升级整个区域集合,而不是只升级您在安装过程中请求的区域设置。

为避免这种情况,请永久选择区域设置。您有以下选项:

在 Kickstart 安装过程中设置 RPM 宏

  1. 修改 Kickstart 文件的 %post 部分:

    LANG=en_US
    echo "%_install_langs $LANG" > /etc/rpm/macros.language-conf
    
    yum-config-manager --setopt=override_install_langs=$LANG --save
  2. 修改 Kickstart 文件的 %packages 部分:

    %packages
    yum-utils*
    %end

全局设置 RPM 宏

  1. /etc/rpm/macros.language-conf 中创建包含以下内容的 RPM 配置文件:

    %_install_langs LANG

    LANGinstLang 选项的值。

  2. 使用以下内容更新 /etc/yum.conf 文件:

    override_install_langs=LANG

2.2. 更改键盘布局

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

2.2.1. 显示当前设置

如前文所述,您可以使用以下命令检查当前的键盘布局配置:

localectl status

例 2.4. 显示键盘设置

在以下输出中,您可以看到为虚拟控制台和 X11 窗口系统配置的键盘布局。

~]$ localectl status
  System Locale: LANG=en_US.utf8
    VC Keymap: us
   X11 Layout: us

2.2.2. 列出可用的键映射

要列出系统中可以配置的所有可用键盘布局,请输入:

localectl list-keymaps

例 2.5. 搜索部分关键字图

您可以使用 grep 搜索上一命令的输出,以查找特定键映射名称。通常,有多个与当前设置的区域设置兼容的密钥映射。例如,要查找可用的层次键盘布局,请输入:

~]$ localectl list-keymaps | grep cz
cz
cz-cp1250
cz-lat2
cz-lat2-prog
cz-qwerty
cz-us-qwertz
sunt5-cz-us
sunt5-us-cz

2.2.3. 设置 Keymap

要为您的系统设置默认键盘布局,以 root 用户身份运行以下命令:

localectl set-keymap map

使用 localectl list-keymaps 命令输出中的 keymap 的名称替换 map。除非传递 --no-convert 选项,否则所选设置也会应用于 X11 窗口系统的默认键盘映射(在将其转换为最匹配的 X11 键盘映射)。这也适用于反向,您可以以 root 用户身份使用以下命令来指定键映射:

localectl set-x11-keymap map

如果您希望 X11 布局与控制台布局不同,请使用 --no-convert 选项。

localectl --no-convert set-x11-keymap map

使用这个选项时,可以在不更改之前的控制台布局设置的情况下指定 X11 密钥映射。

例 2.6. 设置 X11 Keymap 并行

假设您想要在图形界面中使用德语键盘布局,但对于要保留美国键盘映射的控制台操作。要做到这一点,以 root 用户身份输入:

~]# localectl --no-convert set-x11-keymap de

然后,您可以通过检查当前状态来验证您的设置是否成功:

~]$ localectl status
  System Locale: LANG=de_DE.UTF-8
    VC Keymap: us
   X11 Layout: de

除了键盘布局(映射)外,还可以指定其他三个选项:

localectl set-x11-keymap map model variant options

使用键盘型号名称、变体和 选项替换 model,用键盘变体和选项组件替换模型,可用于增强键盘行为。默认情况下不设置这些选项。有关 X11 Model、X11 Variant 和 X11 选项的更多信息,请参阅 kbd(4) man page。

2.3. 其它资源

有关如何在 Red Hat Enterprise Linux 中配置键盘布局的详情,请查看以下列出的资源:

安装的文档

  • localectl(1)- localectl 命令行实用程序的 man page 文档如何使用此工具配置系统区域设置和键盘布局。
  • loadkeys(1)- loadkeys 命令的 man page 提供了有关如何使用此工具更改虚拟控制台中的键盘布局的更多信息。

另请参阅

第 3 章 配置日期和时间

现代操作系统区分以下两种时钟:

  • 实时时钟 (RTC ),通常称为硬件时钟(通常是系统板上的集成电路),完全独立于操作系统的当前状态并在计算机关机时运行。
  • 系统时钟 (也称为软件时钟 )由内核维护,其初始值基于实时时钟。引导系统且系统时钟初始化后,系统时钟就完全独立于实时时钟。

系统时间始终保持在统一世界时间 (UTTC)中,并根据需要在应用程序中转换为本地时间。本地时间是当前时区的实际时间 ,考虑到夏天节省时间 (DST)。实时时钟可以使用 UTC 或本地时间。建议 UTC。

Red Hat Enterprise Linux 7 提供了三个命令行工具,可用于配置和显示有关系统日期和时间的信息:

  • timedatectl 工具,它是 Red Hat Enterprise Linux 7 中的新功能,是 systemd 的一部分。
  • 传统的 date 命令.
  • 用于访问硬件时钟的 The hwclock 实用程序.

3.1. 使用 timedatectl 命令

timedatectl 工具作为 systemd 系统和服务管理器的一部分发布,可让您查看和更改系统时钟的配置。您可以使用此工具更改当前的日期和时间,设置时区,或者启用与远程服务器自动同步系统时钟。

有关如何以自定义格式显示当前日期和时间的详情,请参考 第 3.2 节 “使用 date 命令”

3.1.1. 显示当前日期和时间

要显示当前的日期和时间,以及有关系统和硬件时钟配置的详细信息,请在没有附加命令行选项的情况下运行 timedatectl 命令:

timedatectl

这会显示本地和通用时间、当前使用的时区、网络时间协议(NTP)配置的状态,以及与 DST 相关的其他信息。

例 3.1. 显示当前日期和时间

以下是一个不使用 NTP 将系统时钟与远程服务器同步的系统中 timedatectl 命令的输出示例:

~]$ timedatectl
   Local time: Mon 2016-09-16 19:30:24 CEST
 Universal time: Mon 2016-09-16 17:30:24 UTC
    Timezone: Europe/Prague (CEST, +0200)
   NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
   DST active: yes
 Last DST change: DST began at
         Sun 2016-03-31 01:59:59 CET
         Sun 2016-03-31 03:00:00 CEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
         Sun 2016-10-27 02:59:59 CEST
         Sun 2016-10-27 02:00:00 CET
重要

timedatectl 不会立即注意到对 chronyntpd 状态的更改。如果更改了这些工具的配置或状态,请输入以下命令:

~]# systemctl restart systemd-timedated.service

3.1.2. 更改当前时间

要更改当前时间,以 root 用户身份在 shell 提示符后输入以下内容:

timedatectl set-time HH:MM:SS

HH 替换为一小时,MM 替换为一分钟,SS 替换为秒,全部以两位数形式键入。

此命令同时更新系统时间和硬件时钟。结果类似于使用 date --sethwclock --systohc 命令。

如果启用了 NTP 服务,该命令将失败。请参阅 第 3.1.5 节 “将系统时钟与远程服务器同步” 以临时禁用该服务。

例 3.2. 更改当前时间

要将当前时间更改为 11:26,以 root 用户身份运行以下命令:

~]# timedatectl set-time 23:26:00

默认情况下,系统配置为使用 UTC。要将您的系统配置为在本地时间维护时钟,以 root 用户身份使用 set-local-rtc 选项运行 timedatectl 命令:

timedatectl set-local-rtc boolean

要将您的系统配置为在本地时间维护时钟,请将 布尔值 替换为 yes (或者 y、ytruet1)。要将系统配置为使用 UTC,请将 布尔值 替换为 no (或者 n、nfalsef0)。默认选项为 no

3.1.3. 更改当前日期

要更改当前日期,以 root 用户身份在 shell 提示符后输入以下内容:

timedatectl set-time YYYY-MM-DD

YYY 替换为四位数年,MM 替换为两位数月,DD 替换为每月的两位数。

请注意,在不指定当前时间的情况下更改日期会导致将时间设置为 00:00:00。

例 3.3. 更改当前日期

要将当前日期更改为 2017 年 6 月 2 日并保留当前时间(下午 11:26),以 root 用户身份运行以下命令:

~]# timedatectl set-time "2017-06-02 23:26:00"

3.1.4. 更改时区

要列出所有可用时区,在 shell 提示符后输入以下内容:

timedatectl list-timezones

要更改当前使用的时区,以 root 用户身份输入

timedatectl set-timezone time_zone

使用 time datectl list-timezones 命令列出的任何值替换 time _zone

例 3.4. 更改时区

要确定哪一个时区与您当前位置最接近,请使用 timedatectl 命令和 list-timezones 命令行选项。例如,要列出欧洲所有可用时区,请输入:

~]# timedatectl list-timezones | grep Europe
Europe/Amsterdam
Europe/Andorra
Europe/Athens
Europe/Belgrade
Europe/Berlin
Europe/Bratislava

要将时区更改为 欧洲/地区,root 用户身份输入

~]# timedatectl set-timezone Europe/Prague

3.1.5. 将系统时钟与远程服务器同步

与前面部分所述的手动调整不同,timedatectl 命令还允许您使用 NTP 协议自动与一组远程服务器同步系统时钟。启用 NTP 可启用 chronydntpd 服务,具体取决于安装了哪些服务。

使用以下命令可以启用或禁用 NTP 服务:

timedatectl set-ntp boolean

要让您的系统能够将系统时钟与远程 NTP 服务器同步,请将 布尔值 替换为 yes (默认选项)。要禁用此功能,请将 布尔值 替换为 no

例 3.5. 将系统时钟与远程服务器同步

要启用与远程服务器自动同步系统时钟,请输入:

~]# timedatectl set-ntp yes

如果未安装 NTP 服务,命令将失败。如需更多信息,请参阅 第 18.3.1 节 “安装 chrony”

3.2. 使用 date 命令

date 实用程序在所有 Linux 系统上可用,并允许您显示和配置当前日期和时间。它经常在脚本中使用,以自定义格式显示系统时钟的详细信息。

有关如何更改时区或启用与远程服务器自动同步系统时钟的详情请参考 第 3.1 节 “使用 timedatectl 命令”

3.2.1. 显示当前日期和时间

要显示当前的日期和时间,请在没有附加命令行选项的情况下运行 date 命令:

date

这将显示星期几,后跟当前日期、本地时间、缩写时区和年份。

默认情况下,date 命令显示本地时间。要在 UTC 中显示时间,请使用 --utc 或 -u 命令行选项运行命令:

date --utc

您还可以在命令行中提供 +"格式" 选项来自定义显示信息的格式:

date +"format"

使用一个或多个支持的控制序列替换格式,如 例 3.6 “显示当前日期和时间” 所示。有关这些选项的完整列表,请参阅 表 3.1 “常用控制序列”,了解最常用格式化选项的列表,或 日期(1)手册页。

表 3.1. 常用控制序列

控制序列描述

%H

HH 格式的小时(如 17)。

%M

MM 格式的分钟(如 30)。

%S

SS 格式的第二个版本(如 24)。

%d

DD 格式的月日(如 16)。

%m

MM 格式的月份(如 09)。

%Y

YYYY 格式的年份(例如: 2016 年)。

%Z

时区缩写(如 CEST)。

%F

YYYY-MM-DD 格式的完整日期(例如 2016-09-16)。此选项等于 %Y-%m-%d

%T

HH:MM:SS 格式的全职(例如 17:30:24)。这个选项等于 %H:%M:%S

例 3.6. 显示当前日期和时间

要显示当前日期和本地时间,在 shell 提示符后输入以下内容:

~]$ date
Mon Sep 16 17:30:24 CEST 2016

要在 UTC 中显示当前的日期和时间,在 shell 提示符后输入以下内容:

~]$ date --utc
Mon Sep 16 15:30:34 UTC 2016

要自定义 date 命令的输出,请输入:

~]$ date +"%Y-%m-%d %H:%M"
2016-09-16 17:30

3.2.2. 更改当前时间

要更改当前时间,以 root 用户身份使用 --set 或 -s 选项运行 date 命令:

date --set HH:MM:SS

HH 替换为一小时,MM 替换为一分钟,SS 替换为秒,全部以两位数形式键入。

默认情况下,date 命令会将系统时钟设置为本地时间。要在 UTC 中设置系统时钟,请使用 --utc-u 命令行选项运行命令:

date --set HH:MM:SS --utc

例 3.7. 更改当前时间

要将当前时间更改为 11:26,以 root 用户身份运行以下命令:

~]# date --set 23:26:00

3.2.3. 更改当前日期

要更改当前日期,以 root 用户身份使用 --set 或 -s 选项运行 date 命令:

date --set YYYY-MM-DD

YYY 替换为四位数年,MM 替换为两位数月,DD 替换为每月的两位数。

请注意,在不指定当前时间的情况下更改日期会导致将时间设置为 00:00:00。

例 3.8. 更改当前日期

要将当前日期更改为 2017 年 6 月 2 日并保留当前时间(下午 11:26),以 root 用户身份运行以下命令:

~]# date --set "2017-06-02 23:26:00"

3.3. 使用 hwclock 命令

hwclock 是访问硬件时钟的实用程序,也称为实时时钟(RTC)。硬件时钟独立于您使用的操作系统,即使在机器关闭时也能正常工作。此实用程序用于显示硬件时钟的时间。Hwclock 还包含用于补偿硬件时钟中系统偏移的功能。

硬件时钟存储以下值:year、month、day、hour、minute 和 second。它无法存储时间标准、本地时间或协调的通用时间(UTC),也无法设置夏天制(DST)。

The hwclock 实用程序将其设置保存在 /etc/adjtime 文件中,该文件会在您进行第一次更改时创建,例如,当您手动设置时间或将硬件时钟与系统时间同步时。

注意

有关 Red Hat Enterprise Linux 6 和 7 之间的 hwclock 行为更改,请参阅 Red Hat Enterprise Linux 7 迁移规划指南

3.3.1. 显示当前日期和时间

由于 root 用户将日期和时间返回本地时间的日期和时间到标准输出,因此不带命令行选项的 Running hwclock

hwclock

请注意,在 hwclock 命令中使用 --utc 或 --localtime 选项并不意味着您在 UTC 或本地时间显示硬件时钟时间。这些选项用于设置硬件时钟,以在其中任何一个中保持时间。时间始终在本地时间显示。另外,使用 hwclock --utc or hwclock --local 命令不会更改 /etc/adjtime 文件中的记录。如果您知道 /etc/adjtime 中保存的设置不正确,但您不想更改设置,此命令非常有用。另一方面,如果以错误的方式使用命令,您可能会收到误导的信息。详情请查看 hwclock(8)手册页。

例 3.9. 显示当前日期和时间

要显示当前日期以及硬件时钟的当前本地时间,以 root 用户身份运行:

~]# hwclock
Tue 15 Apr 2017 04:23:46 PM CEST   -0.329272 seconds

CEST 是时区缩写,代表中欧夏季时间。

有关如何更改时区的详情请参考 第 3.1.4 节 “更改时区”

3.3.2. 设置日期和时间

除了显示日期和时间外,您还可以手动将硬件时钟设置为特定的时间。

当您需要更改硬件时钟日期和时间时,您可以根据您的规格附加 --set--date 选项:

hwclock --set --date "dd mmm yyyy HH:MM"

dd 替换为一天(一个两位数),mmm 替换为一个月(一个三字母缩写),yyy 替换为一年(四位数字)、HH 替换为一小时(两位数),MM 替换为分钟(两位数)。

同时,您还可以通过添加 --utc 或 -- localtime 选项,将硬件时钟设置为在 UTC 或本地时间中保持时间。在这种情况下,UTCLOCAL 会记录在 /etc/adjtime 文件中。

例 3.10. 将硬件时钟设置为特定日期和时间

如果要将日期和时间设置为特定值,例如:"21:17, 2016 年 10 月 21 日",并在 UTC 中保持硬件时钟,以 root 用户身份以以下格式运行命令:

~]# hwclock --set --date "21 Oct 2016 21:17" --utc

3.3.3. 同步日期和时间

您可以在两个方向上同步硬件时钟和当前系统时间。

  • 您可以使用这个命令将硬件时钟设置为当前系统时间:

    hwclock --systohc

    请注意,如果您使用 NTP,硬件时钟每 11 分钟会自动同步到系统时钟中,此命令仅在启动时用于获得合理的初始系统时间。

  • 或者,您可以使用以下命令从硬件时钟设置系统时间:

    hwclock --hctosys

当您同步硬件时钟和系统时间时,您还可以通过添加 --utc 或 -- localtime 选项来指定是否要将硬件时钟保留在本地时间或 UTC 中。与使用 --set 类似UTCLOCAL 也会记录在 /etc/adjtime 文件中。

The hwclock --systohc --utc 命令的功能类似于 timedatectl set-local-rtc false,s hwclock --systohc --local 命令是 timedatectl set-local-rtc true 的替代选择。

例 3.11. 将硬件时钟与系统时间同步

要将硬件时钟设置为当前系统时间并保留硬件时钟在本地时间,以 root 用户身份运行以下命令:

~]# hwclock --systohc --localtime

为避免时区和 DST 切换出现问题,建议在 UTC 中保持硬件时钟。显示的 例 3.11 “将硬件时钟与系统时间同步” 很有用,例如,如果使用 Windows 系统进行多次引导,且假设硬件时钟默认在本地时间运行,所有其他系统还需要使用本地时间容纳它。虚拟机也可能需要它;如果主机提供的虚拟硬件时钟正在本地时间运行,则还需要将 guest 系统配置为使用本地时间。

3.4. 其它资源

有关如何在 Red Hat Enterprise Linux 7 中配置日期和时间的详情,请查看以下列出的资源。

安装的文档

  • timedatectl(1)- timedatectl 命令行工具的 man page 记录了如何使用该工具查询和更改系统时钟及其设置。
  • 日期(1)- date 命令的 man page 提供了受支持命令行选项的完整列表。
  • hwclock(8)- the hwclock 命令的 man page 提供了所支持的命令行选项的完整列表。

另请参阅

第 4 章 管理用户和组

用户和组群的控制是 Red Hat Enterprise Linux 系统管理的核心元素。本章解释了如何在图形用户界面和命令行中添加、管理和删除用户和组,并介绍高级主题,如创建组目录。

4.1. 用户和组介绍

虽然用户可以是用户(这意味着与物理用户相关联的帐户),或者是特定应用使用的帐户,但组是组织的逻辑表达式,将用户连接在一起以实现共同目的。组中的用户共享相同的读取、写入或执行该组所拥有的文件的权限。

每个用户都与一个唯一数字标识号关联,称为用户 ID (UID)。类似地,每个组都与组 ID( GID)关联。创建文件的用户也是该文件的所有者和组所有者。文件会为所有者、组和其他任何人单独分配读取、写入和执行权限。文件所有者只能由 root 更改,并且 root 用户和文件所有者都可以更改访问权限。

此外,Red Hat Enterprise Linux 支持文件和目录的访问控制列表(ACL ),它们允许设置所有者之外的特定用户的权限。有关这个功能的详情请参考 第 5 章 访问控制列表

保留的用户和组群 ID

Red Hat Enterprise Linux 为系统用户和组保留 1000 以下的用户和组群 ID。默认情况下,用户管理器 不显示系统用户。保留的用户和组 ID 记录在 setup 软件包中。要查看文档,请使用这个命令:

cat /usr/share/doc/setup*/uidgid

建议的做法是分配尚未保留的 5,000 个 ID,因为保留范围将来可能会增加。要使分配给新用户的 ID 默认从 5,000 开始,请更改 /etc/login.defs 文件中的 UID _MIN 和 GID_MIN 指令:

[file contents truncated]
UID_MIN         5000
[file contents truncated]
GID_MIN         5000
[file contents truncated]
注意

对于在更改 UID_MIN 和 GID_MIN 指令之前创建的用户,UID 仍会从默认的 1000 开始。

即使使用以 5,000 开头的新用户和组 ID,建议不要提高 1000 以上系统保留的 ID,以避免与保留 1000 限制的系统冲突。

4.1.1. 用户专用组

Red Hat Enterprise Linux 使用用户专用组 (UPG)方案,这使 UNIX 组更易于管理。无论何时在系统中添加新用户,都会创建一个用户私人组群。它的名称与为其创建的用户的名称相同,并且该用户是用户专用组的唯一成员。

用户专用组可以安全地为新创建的文件或目录设置默认权限,从而允许该用户的用户和组对文件或目录进行修改

此设置决定了哪些权限应用到新创建的文件或目录,称为 umask,并在 /etc/bashrc 文件中配置。通常在基于 UNIX 的系统上,umask 设置为 022,它只允许创建文件或目录的用户进行修改。在此方案下,所有其他用户(包括创建者组的成员 )不得进行任何修改。但是,根据 UPG 方案,这种"组保护"并不是必需的,因为每个用户都有自己的专用组。如需更多信息,请参阅 第 4.3.5 节 “使用 umask为新文件设置默认权限”

所有组的列表存储在 /etc/group 配置文件中。

4.1.2. shadow 密码

在有多个用户的环境中,使用 shadow -utils 软件包提供的shadow 密码 来增强系统身份验证文件的安全性非常重要。因此,安装程序默认启用 shadow 密码。

以下是影子密码相对于传统在基于 UNIX 的系统中存储密码的优势列表:

  • 影子密码通过将加密的密码哈希从全局可读的 /etc/passwd 文件移动到 /etc/ shadow,这仅可由 root 用户读取,从而提高系统安全性。
  • 影子密码存储有关密码有效期的信息.
  • 影子密码允许实施 /etc/login.defs 文件中设置的一些安全策略。

shadow-utils 软件包提供的大多数实用程序可以正常工作,无论是否启用了 shadow 密码。但是,由于密码过期信息只存储在 /etc/shadow 文件中,一些实用程序和命令在未首先启用影子密码的情况下无法正常工作:

  • 用于设置密码期限参数的 chage 实用程序。详情请查看 Red Hat Enterprise Linux 7 安全指南中 的密码 安全部分。
  • 用于管理 /etc/group 文件的 gpasswd 实用程序。
  • usermod 命令带有 -e、--expiredate 或 -f, --inactive 选项。
  • useradd 命令带有 -e、--expiredate 或 -f, --inactive 选项。

4.2. 在图形环境中管理用户

通过 Users 实用程序,您可以在图形用户界面中查看、修改、添加和删除本地用户。

4.2.1. 使用用户设置工具

Super 键以进入活动概览,键入 Users,然后按 Enter 键。此时 会出现用户 设置工具。Super 键显示在各种 guis 中,具体取决于键盘和其他硬件,但通常作为 Windows 或 Command 键,通常在空格的左侧。或者,也可以在点击屏幕右上角的用户名后,从 Settings 菜单打开 Users 实用程序。

要更改用户帐户,请先选择"解除锁定 "按钮,然后按照显示的对话框进行自己验证。请注意,除非您具有超级用户特权,否则应用将提示您以 root 身份进行身份验证。要添加和删除用户,可分别选择 +- 按钮。要将用户添加到管理组 wheel 中,请将 Account Type 从 Standard 更改为 Administrator。要编辑用户的语言设置,请选择语言,然后显示一个下拉菜单。

图 4.1. 用户设置工具

用户设置工具

创建新用户时,该帐户会在设置密码之前禁用。"密码"下拉菜单(如 图 4.2 “密码菜单” 所示)包含设置管理员密码、在第一次登录时立即选择密码的选项,或者创建不需要登录的客户机帐户。您还可以从此菜单中禁用或启用帐户。

图 4.2. 密码菜单

Password 菜单

4.3. 使用命令行工具

除了 第 4.2 节 “在图形环境中管理用户” 中描述的 用户设置工具(用于基本管理用户 )外,您还可以使用命令行工具管理 表 4.1 “管理用户和组的命令行工具” 中列出的用户和组。

表 4.1. 管理用户和组的命令行工具

工具描述

id

显示用户和组 ID.

useradd, usermod, userdel

用于添加、修改和删除用户帐户的标准实用程序.

groupaddgroupmodgroupdel

用于添加、修改和删除组的标准实用程序.

gpasswd

实用程序主要用于修改由 newgrp 命令使用的 /etc/g shadow 文件中的组密码。

pwck,grpck

可用于验证密码、组和相关影子文件的实用程序.

pwconv, pwunconv

实用程序,可用于将密码转换为影子密码,或者从影子密码转换回标准密码。

grpconv, grpunconv

与前面的 类似,这些实用程序可用于转换组帐户的影子信息。

4.3.1. 添加新用户

要在系统中添加新用户,以 root 用户身份在 shell 提示符后输入以下内容:

useradd options username

…其中选项是命令行选项,如 表 4.2 “常用 useradd 命令行选项” 所述。

默认情况下,user add 命令会创建一个锁定的用户帐户。要解锁帐户,以 root 用户身份运行以下命令来分配密码:

passwd username

(可选)您可以设置密码过期策略。请参阅 Red Hat Enterprise Linux 7 安全指南中 的密码安全部分

表 4.2. 常用 useradd 命令行选项

选项 

-c '评论'

注释可以被替换为任何字符串。此选项通常用于指定用户的全名。

-d home_directory

要使用的主目录,而不是默认的 /home/username/

-e date

以 YYYY-MM-DD 格式禁用的帐户的日期。

-f days

密码到期之后的天数,直到禁用帐户为止.如果指定了 0,则帐户会在密码过期后立即禁用。如果指定了 -1,则在密码过期后不会禁用帐户。

-g group_name

用户默认(主要)组的组名或组号。组必须在此处指定之前存在。

-G group_list

以逗号分开的额外(补充,非默认)组名或组号列表,用户是其中的成员。组必须在此处指定之前存在。

-m

如果主目录不存在,则创建该目录。

-M

不要创建主目录。

-N

不要为用户创建用户专用组。

-p password

通过 crypt 加密的密码

-r

创建 UID 小于 1000 且没有主目录的系统帐户。

-s

用户的登录 shell,默认为 /bin/bash

- UUID

用户的用户 ID,它必须唯一且大于 999。

重要

在 Red Hat Enterprise Linux 7 中,系统和普通用户的默认 ID 范围已从早期版本中更改。在以前的版本中,UID 1-499 用于系统用户和以上正常用户的值。系统用户的默认范围现在是 1-999。因为这个变化,当迁移到 Red Hat Enterprise Linux 7 时,如果有用户的 UID 和 GID 在 500 到 999 之间,则可能会造成问题。UID 和 GID 的默认范围可以在 /etc/login.defs 文件中更改。

解释进程

以下步骤演示了在启用了影子密码的系统上发出 useradd juan 命令时会发生什么情况:

  1. /etc/passwd 中为 juan 创建一个新行:

    juan:x:1001:1001::/home/juan:/bin/bash

    该行具有以下特征:

    • 它以用户名 juan 开始。
    • 密码字段有一个 x 表示系统正在使用 shadow 密码。
    • 创建大于 999 的 UID。在 Red Hat Enterprise Linux 7 下,1000 以下的 UID 保留给系统使用,不应分配给用户。
    • 创建大于 999 的 GID。在 Red Hat Enterprise Linux 7 下,1000 以下的 GID 保留给系统使用,不应分配给用户。
    • 可选的 GECOS 信息留空。GECOS 字段可用于提供有关用户的其他信息,如用户的全名或电话号码。
    • juan 的主目录设为 /home/juan/
    • 默认 shell 设置为 /bin/bash
  2. /etc/shadow 中为 juan 创建一个新行:

    juan:!!:14798:0:99999:7:::

    该行具有以下特征:

    • 它以用户名 juan 开始。
    • 两个感叹号(!!)显示在 /etc/shadow 文件的密码字段中,该字段将锁定帐户。

      注意

      如果使用 -p 标志传递加密的密码,则会将其放置在用户新行中的 /etc/shadow 文件中。

    • 密码设置为永不过期。
  3. /etc/group 中为名为 juan 的组创建一个新行:

    juan:x:1001:

    与用户同名的组称为用户专用组。有关用户私人组群的详情请参考 第 4.1.1 节 “用户专用组”

    /etc/group 中创建的行具有以下特征:

    • 它以组名 juan 开头。
    • 在密码字段中会出现 x,表示系统正在使用 shadow 组密码。
    • GID 与 /etc/passwd 中为 juan 的主组列出的匹配。
  4. /etc/gshadow 中为名为 juan 的组创建一个新行:

    juan:!::

    该行具有以下特征:

    • 它以组名 juan 开头。
    • 感叹号(!)显示在 /etc/gshadow 文件的密码字段中,该文件将锁定组。
    • 所有其他字段均为空。
  5. /home 目录中为用户 juan 创建一个目录:

    ~]# ls -ld /home/juan
    drwx------. 4 juan juan 4096 Mar 3 18:23 /home/juan

    该目录归用户 juan 和组 juan 所有。它 仅对 用户 juan 具有 读取写入 和执行 特权。所有其他权限都将被拒绝。

  6. /etc/skel/ 目录中的文件(包含默认用户设置)复制到新的 /home/juan/ 目录中:

    ~]# ls -la /home/juan
    total 28
    drwx------. 4 juan juan 4096 Mar 3 18:23 .
    drwxr-xr-x. 5 root root 4096 Mar 3 18:23 ..
    -rw-r--r--. 1 juan juan  18 Jun 22 2010 .bash_logout
    -rw-r--r--. 1 juan juan 176 Jun 22 2010 .bash_profile
    -rw-r--r--. 1 juan juan 124 Jun 22 2010 .bashrc
    drwxr-xr-x. 4 juan juan 4096 Nov 23 15:09 .mozilla

此时系统上存在名为 juan 的锁定帐户。要激活它,管理员接下来必须使用 passwd 命令为帐户分配密码,也可以设置密码过期指南(详情请参阅 Red Hat Enterprise Linux 7 安全指南中 的密码安全部分 )。

4.3.2. 添加新组

要在系统中添加新组,以 root 用户身份在 shell 提示符后输入以下内容:

groupadd options group_name

…其中选项是命令行选项,如 表 4.3 “常用 groupadd 命令行选项” 所述。

表 4.3. 常用 groupadd 命令行选项

选项描述

-f,--force

-g gidgid 搭配使用 时,groupadd 将为 选择另一个唯一。

-g gid

组的组 ID,它必须唯一且大于 999。

-k,--key key=value

覆盖 /etc/login.defs defaults。

-o,--non-unique

允许使用重复的 GID 创建组.

-p,--password password

将此加密密码用于新组。

-r

创建 GID 小于 1000 的系统组。

4.3.3. 将现有用户添加到现有组中

使用 usermod 实用程序将现有用户添加到现有的组中。

usermod 的各种选项对用户的主组以及他/她的补充组有不同影响。

要覆盖用户的主组群,以 root 用户身份运行以下命令:

~]# usermod -g group_name user_name

要覆盖用户的补充组,以 root 用户身份运行以下命令:

~]# usermod -G group_name1,group_name2,... user_name

请注意,在这种情况下,用户的所有前一个补充组都会被新组或多个新组替代。

要在用户的附加组中添加一个或多个组,以 root 用户身份运行以下命令之一:

~]# usermod -aG group_name1,group_name2,... user_name
~]# usermod --append -G group_name1,group_name2,... user_name

请注意,在这种情况下,新组会添加到用户的当前补充组中。

4.3.4. 创建组目录

系统管理员通常喜欢为每个主要项目创建组,并在需要访问该项目的文件时将人员分配给组。采用这种传统方案时,文件管理比较困难;当有人创建文件时,它与其所属的主要组相关联。当单个人处理多个项目时,将正确的文件与正确的组关联变得困难。但是,使用 UPG 方案时,组会自动分配到设置了 setgid 位的目录中创建的文件。setgid 位使得管理共享一个通用目录的组项目非常简单,因为用户在该目录中创建的任何文件都归拥有该目录的组所有。

例如,一组人需要处理 /opt/myproject/ 目录中的文件。些人信任修改此目录的内容,但不是每个人。

  1. root 用户身份,在 shell 提示符下键入以下内容来创建 /opt/myproject/ 目录:

    mkdir /opt/myproject
  2. 在系统中添加 myproject 组:

    groupadd myproject
  3. /opt/myproject/ 目录的内容与 myproject 组关联:

    chown root:myproject /opt/myproject
  4. 允许组中的用户在目录中创建文件并设置 setgid 位

    chmod 2775 /opt/myproject

    此时,myproject 的所有成员都可以在 /opt/myproject/ 目录中创建和编辑文件,无需管理员每次用户写入新文件时更改文件权限。要验证权限是否已正确设置,请运行以下命令:

    ~]# ls -ld /opt/myproject
    drwxrwsr-x. 3 root myproject 4096 Mar 3 18:31 /opt/myproject
  5. 将用户添加到 myproject 组:

    usermod -aG myproject username

4.3.5. 使用 umask为新文件设置默认权限

当进程创建文件时,该文件具有特定的默认权限,例如 -rw-rw-r--这些初始权限部分由文件模式创建掩码定义 ,也称为文件权限掩码或 umask。每个进程都有自己的 umask,例如,默认情况下 bash 具有 umask 0022。可以更改进程 umask

umask 包括什么

umask 由与标准文件权限对应的位组成。例如,对于 umask 0137,数字表示:

  • 0 = 无含义,它始终为 0 (umask 不影响特殊位)
  • 1 = 对于所有者权限,将设置执行位
  • 3 = 对于组权限,会设置执行位和写入位
  • 7 = 对于其他权限,将设置执行、写入和读取位

Umasks 可以用二进制、八进制或符号表示法表示。例如,八进制表示 0137 等于符号表示 u=rw-,g=r--,o=---。符号表示规格与八进制表示规范相反:它显示允许的权限,而不是禁止的权限。

umask 的工作原理

umask 禁止为文件设置权限

  • umask 中设置了一个位时,该文件中将取消设置。
  • umask 中未设置位时,可以在 文件中设置它,具体取决于其他因素。

下图显示了 umask 0137 如何影响新文件的创建。

图 4.3. 在创建文件时应用 umask

用户组 Umask 示例
重要

出于安全原因,在默认情况下,常规文件将不能拥有执行权限。因此,即使 umask 为0000 (不禁止任何权限),新的常规文件仍不具有执行权限。但是,可以创建具有执行权限的目录:

[john@server tmp]$ umask 0000
[john@server tmp]$ touch file
[john@server tmp]$ mkdir directory
[john@server tmp]$ ls -lh .
total 0
drwxrwxrwx. 2 john john 40 Nov 2 13:17 directory
-rw-rw-rw-. 1 john john 0 Nov 2 13:17 file

4.3.5.1. 在 Shell 中管理 umask

对于常用的 shell,如 bashkshzshtcshumask 使用 umask shell 内置 进行管理。从 shell 启动的进程继承其 umask。

显示当前掩码

使用数值表示法显示当前的 umask:

~]$ umask
0022

使用符号表示法显示当前的 umask:

~]$ umask -S
u=rwx,g=rx,o=rx
使用 umask 在 shell 中设置掩码

使用数值表示法运行为当前 shell 会话设置 umask:

~]$ umask octal_mask

用从 07 的四位或更少数字替换 octal_mask。提供三个或更少的数字时,权限会像命令包含前导零一样设置。例如,umask 7 转换为 0007

例 4.1. 使用 Octal 表示设置 umask

要禁止新文件拥有所有者和组的写入和执行权限,并且不允许其他人拥有任何权限:

~]$ umask 0337

或只需:

~]$ umask 337

使用符号表示法为当前 shell 会话设置 umask

~]$ umask -S symbolic_mask

例 4.2. 使用符号链接表示设置 umask

使用符号表示法设置 umask 0337

~]$ umask -S u=r,g=r,o=
使用默认的 shell umask

Shell 通常有一个配置文件,其中设置了其默认 umask。对于 bash,它是 /etc/bashrc。显示默认 bash umask:

~]$ grep -i -B 1 umask /etc/bashrc

输出显示是否设置了 umask,可使用 umask 命令或 UMASK 变量。在以下示例中,使用 umask 命令将 umask 设置为 022

~]$ grep -i -B 1 umask /etc/bashrc
  # By default, we want umask to get set. This sets it for non-login shell.
--
  if [ $UID -gt 199 ] && [ id -gn = id -un ]; then
    umask 002
  else
    umask 022

要更改 bash 的默认 umask,请在 /etc/bashrc 中更改 umask 命令调用或 UMASK 变量分配。本例将默认 umask 更改为 0227

  if [ $UID -gt 199 ] && [ id -gn = id -un ]; then
    umask 002
  else
    umask 227
使用特定用户的默认 shell umask

默认情况下,新用户的 bash umask 默认为 /etc/bashrc 中定义的 umask。

要为 特定用户更改 bash umask,请在用户的 $HOME/.bashrc 文件中添加对 umask 命令的调用。例如,将用户 john bash umask 更改为 0227

john@server ~]$ echo 'umask 227' >> /home/john/.bashrc
为新创建的主目录设置默认权限

要更改创建用户主目录的权限,请在 /etc/login.defs 文件中更改 UMASK 变量:

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077

4.4. 其它资源

有关如何在 Red Hat Enterprise Linux 中管理用户和组的详情,请查看以下列出的资源。

安装的文档

有关管理用户和组的各种工具的详情,请查看以下 man page:

  • useradd(8)- useradd 命令的 man page 描述了如何使用它创建新用户。
  • userdel(8)- userdel 命令的 man page 描述了如何使用它删除用户。
  • usermod(8)- usermod 命令的 man page 描述了如何使用它修改用户。
  • groupadd(8)- groupadd 命令的 man page 描述了如何使用它创建新组。
  • groupdel(8)- groupdel 命令的 man page 描述了如何使用它删除组。
  • groupmod(8)- groupmod 命令的 man page 包括了如何使用它修改组成员资格。
  • gpasswd(1)- gpasswd 命令的 man page 描述了如何管理 /etc/group 文件。
  • grpck(8)- grpck 命令的 man page 记录了如何使用它来验证 /etc/group 文件的完整性。
  • pwck(8)- pwck 命令的 man page 描述了如何使用它来验证 /etc/passwd 和 /etc /shadow 文件的完整性。
  • pwconv(8)- pwconv、pw unconvgrpconvgrpunconv 命令的手册页记录了如何转换密码和组的影子信息。
  • ID(1)- id 命令的 man page 记录了如何显示用户和组 ID。
  • umask(2)- umask 命令的 man page 记录了如何使用文件模式创建掩码。

有关相关配置文件的详情请参考:

  • (5)- /etc/group 文件的 man page 文档如何使用此文件定义系统组。
  • passwd(5)- /etc/passwd 文件的 man page 文档如何使用此文件定义用户信息。
  • Shadow(5)- /etc/shadow 文件的 man page 文档如何使用此文件为系统设置密码和帐户过期信息。

在线文档

  • 红帽企业 Linux 7 安全指南 - 红帽企业 Linux 7 的安全 指南 提供了其他信息,如何通过启用密码期限和用户帐户锁定来确保工作站的安全。

另请参阅

第 5 章 访问控制列表

文件和目录为文件所有者、与 文件关联的组以及系统的所有其他用户设置了权限集。但是,这些权限集存在限制。例如,无法为不同的用户配置不同的权限。因此,实施了访问控制列表 (ACL)。

Red Hat Enterprise Linux 内核为 ext3 文件系统和 NFS 导出的文件系统提供 ACL 支持。通过 Samba 访问的 ext3 文件系统也可识别 ACL。

除了内核中的支持外,还需要 acl 软件包来实现 ACL。它包含用于添加、修改、删除和检索 ACL 信息的实用程序。

cpmv 命令复制或移动任何与文件和目录关联的 ACL。

5.1. 挂载文件系统

在将 ACL 用于文件或目录之前,文件或目录的分区必须使用 ACL 支持进行挂载。如果它是一个本地 ext3 文件系统,它可以使用以下命令挂载:

mount -t ext3 -o acl device-name 分区

例如:

mount -t ext3 -o acl /dev/VolGroup00/LogVol02 /work

或者,如果分区在 /etc/fstab 文件中列出,则分区的条目可以包含 acl 选项:

LABEL=/work   /work    ext3  acl    1 2

如果通过 Samba 访问 ext3 文件系统并且为其启用了 ACL,则识别 ACL,因为 Samba 已使用 --with-acl-support 选项编译。访问或挂载 Samba 共享时不需要特殊标志。

5.1.1. NFS

默认情况下,如果 NFS 服务器导出的文件系统支持 ACL,并且 NFS 客户端可以读取 ACL,客户端系统将使用 ACL。

要在配置服务器时禁用 NFS 共享上的 ACL,请在 /etc/exports 文件中包含 no_acl 选项。要在客户端上挂载 NFS 共享时禁用 ACL,请通过命令行或 /etc/fstab 文件使用 no_acl 选项进行挂载。

5.2. 设置访问权限 ACL

ACL 有两种类型:访问 ACL 和默认 ACL。访问 ACL 是特定文件或目录的访问控制列表。默认 ACL 只能与目录关联;如果目录中的文件没有访问权限 ACL,它将使用目录的默认 ACL 规则。默认 ACL 是可选的。

可以配置 ACL:

  1. 每个用户
  2. 每个组
  3. 通过有效的权限掩码
  4. 对于不在文件用户组中的用户

setfacl 实用程序为文件和目录设置 ACL。使用 -m 选项添加或修改文件或目录的 ACL:

# setfacl -m rules files

规则(规则)必须以以下格式指定:如果通过逗号分隔多个规则,则可以在同一命令中指定多个规则。

u:uid:perms
设置用户的访问权限 ACL。可以指定用户名或 UID。用户可以是系统上的任何有效用户。
g:gid:perms
设置组的访问权限 ACL。可以指定组名或 GID。组可以是系统上的任何有效组。
m:perms
设置有效的权利掩码。掩码是所属组以及所有用户和组条目的所有权限的并集。
O:perms
为 组中不属于 文件的用户设置访问权限 ACL。

权限(perms)必须是字符 rwx 的组合,用于读取、写入和执行。

如果文件或目录已具有 ACL,并且使用了 setfacl 命令,则其他规则将添加到现有 ACL 中或修改现有规则。

例 5.1. 授予读取和写入权限

例如,为用户和rius 授予读取和写入权限:

# setfacl -m u:andrius:rw /project/somefile

要删除用户、组群或其他用户的所有权限,请使用 -x 选项且不指定任何权限:

# setfacl -x rules files

例 5.2. 删除所有权限

例如,要从 UID 500 的用户中删除所有权限:

# setfacl -x u:500 /project/somefile

5.3. 设置默认 ACL

要设置默认 ACL,请在规则前面添加 d: 并指定目录而不是文件名。

例 5.3. 设置默认 ACL

例如,要将 /share/ 目录的默认 ACL 设置为对不属于用户组的用户读取和执行(单个文件的访问 ACL 可以覆盖):

# setfacl -m d:o:rx /share

5.4. 检索 ACL

要确定文件或目录的现有 ACL,请使用 getfacl 命令。在以下示例中,getfacl 用于确定文件的现有 ACL。

例 5.4. 检索 ACL

# getfacl home/john/picture.png

以上命令返回以下输出:

# file: home/john/picture.png
# owner: john
# group: john
user::rw-
group::r--
other::r--

如果指定了具有默认 ACL 的目录,则默认 ACL 也会显示如下所述。例如,getfacl home/sales/ 将显示类似的输出:

# file: home/sales/
# owner: john
# group: john
user::rw-
user:barryg:r--
group::r--
mask::r--
other::r--
default:user::rwx
default:user:john:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

5.5. 使用 ACL 归档文件系统

默认情况下,转储 命令现在在备份操作期间保留 ACL。使用 tar 归档文件或文件系统时,请使用 --acls 选项来保留 ACL。类似地,使用 cp 通过 ACL 复制文件时,请包含 --preserve=mode 选项,以确保在之后复制 ACL。此外,cp-a 选项(等同于 -dR --preserve=all)也会在备份期间保留 ACL 以及其他信息,如时间戳、SELinux 上下文等。有关 转储tar 或 cp 的更多信息,请参考其各自的 man page。

星级 实用程序与 tar 实用程序类似,它可以用于生成文件存档;但是,其某些选项有所不同。有关更常用的选项列表,请参阅 表 5.1 “号命令行选项”。有关所有可用选项,请参阅 man 星。需要 星级 软件包才能使用此实用程序。

表 5.1. 号命令行选项

选项描述

-c

创建存档文件.

-n

不要提取文件;将 与 -x 结合使用来显示提取文件的作用。

-r

替换存档中的文件.文件写入存档文件的末尾,用相同路径和文件名替换所有文件。

-t

显示存档文件的内容.

-u

更新存档文件。如果存档中不存在这些文件,或者文件比存档中相同名称的文件更新,则文件将写入存档的末尾。只有在归档是文件或者可能后退空间的未阻塞磁带时才起作用。

-x

从存档中提取文件。如果与 -U 和存档中的文件一起使用,则不会提取该文件。

-help

显示最重要的选项。

-xhelp

显示最小选项。

-/

从存档中提取文件时,请勿从文件名剥离前导斜杠。默认情况下,提取文件时会剥离它们。

-ACL

创建或提取时,归档或恢复与文件和目录关联的任何 ACL。

5.6. 与旧系统的兼容性

如果在给定文件系统上的任何文件上设置了 ACL,则该文件系统具有 ext_attr 属性。使用以下命令查看此属性:

# tune2fs -l filesystem-device

获取 ext_attr 属性的文件系统可以使用较旧的内核挂载,但这些内核不会强制实施任何已设置的 ACL。

1.22 版及 e2 fsprogs 软件包(包括红帽企业 Linux 2.1 和 4 中的版本)中包含的 e2fs ck 实用程序的版本可以检查具有 ext_attr 属性的文件系统。旧版本拒绝检查。

5.7. ACL 参考

详情请参考以下 man page。

  • man acl - ACL 的说明
  • man getfacl - 讨论如何获取文件访问控制列表
  • man setfacl - 说明如何设置文件访问控制列表
  • man 星 - 解释有关 星形 实用程序及其多个选项的更多信息

第 6 章 获取特权

系统管理员,在某些情况下,用户需要使用管理访问权限来执行某些任务。以 root 用户身份 访问系统具有潜在的危险性,可能会导致系统和数据出现广泛损坏。本章涵盖了使用 setuid 程序(如 susudo )获取管理权限的方法。这些程序允许特定用户执行通常仅对 root 用户可用的任务,同时保持更高级别的控制和系统安全性。

有关管理控制、潜在威胁和防止不当使用特权访问造成的数据丢失的更多信息,请参阅 Red Hat Enterprise Linux 7 安全指南

6.1. 使用 su 实用程序配置管理访问权限

当用户执行 su 命令时,系统会提示他们输入 root 密码,并且在验证后,系统会获得 root shell 提示符。

使用 su 命令登录后,该用户 root 用户,对系统具有绝对管理访问权限。请注意,这种访问仍会受到 SELinux 实施的限制(如果已启用)。此外,用户一旦成为 root 用户,便可以使用 su 命令更改为系统上的任何其他用户,而无需提示输入密码。

由于该程序如此强大,组织内的管理员可能希望限制谁有权访问 命令。

执行此操作的一种最简单的方法是将用户添加到名为 wheel 的特殊管理组中。要做到这一点,以 root 用户身份输入以下命令:

~]# usermod -a -G wheel username

在上一命令中,将 username 替换为您要添加到 wheel 组 的用户名。

您还可以使用 Users 设置工具来 修改组成员资格,如下所示:请注意,您需要管理员特权来执行此步骤。

  1. Super 键以进入活动概览,键入 Users,然后按 Enter 键。此时 会出现用户 设置工具。Super 键显示在各种 guis 中,具体取决于键盘和其他硬件,但通常作为 Windows 或 Command 键(通常在 空格栏 的左侧)。
  2. 要启用更改,请单击 Unlock 按钮并输入有效的管理员密码。
  3. 单击左侧列中的用户图标,以显示用户在右侧窗格中的属性。
  4. 将帐户类型从 Standard 更改为 Administrator。这会将用户添加到 wheel 组。

有关 用户 工具的详情,请查看 第 4.2 节 “在图形环境中管理用户”

将所需的用户添加到 wheel 组后,建议仅允许这些特定用户使用 su 命令。为此,请编辑 su/etc/pam.d/su 的可插拔验证模块 (PAM)配置文件。在文本编辑器中打开此文件,并通过删除 # 字符取消注释下面这一行:

#auth      required    pam_wheel.so use_uid

这一更改意味着只有管理组 wheel 的成员可以使用 su 命令切换到其他用户。

6.2. 使用 sudo 实用程序配置管理访问权限

sudo 命令提供了另一种授予用户管理访问权限的方法。当受信任的用户在管理命令之前加上 sudo 时,系统会提示他们输入 自己的 密码。然后,当它们经过身份验证并假定允许 命令时,将像 root 用户一样执行管理命令。

sudo 命令的基本格式如下:

sudo command

在上例中,命令 将被替换为通常保留给 root 用户的命令,如 mount

sudo 命令具有高度的灵活性。例如,只有 /etc/sudoers 配置文件中列出的用户才能使用 sudo 命令,命令则在 用户的 shell 中执行,而不是 root shell。这意味着可以完全禁用 root shell,如 Red Hat Enterprise Linux 7 安全指南 中所示。

使用 sudo 命令的每个成功身份验证都会记录到文件 /var/log/messages,而与签发者的用户名一同发布的命令将记录到 /var/log/secure 文件。如果需要额外的日志记录,请使用 pam_tty_audit 模块为指定用户启用 TTY 审核,方法是在 /etc/pam.d/system-auth 文件中添加以下行:

session required pam_tty_audit.so disable=pattern enable=pattern

其中,pattern 代表通过可选方式使用 glob 的以逗号分隔的用户列表。例如,以下配置将为 root 用户启用 TTY 审核,并为所有其他用户禁用它:

session required pam_tty_audit.so disable=* enable=root
重要

为 TTY 审计记录配置 pam_tty_audit PAM 模块,仅用于 TTY 输入。这意味着,当被审计用户登录时,pam_tty_audit 会记录用户在 /var/log/audit/audit.log 文件中进行的确切击键操作。如需更多信息,请参阅 pam_tty_audit(8)手册页。

sudo 命令的另一个优点是,管理员可以允许不同的用户根据自己的需要访问特定的命令。

想要编辑 sudo 配置文件 /etc/sudoers 的管理员应使用 visudo 命令。

要授予某人完整的管理权限,请键入 visudo 并添加类似用户权限规范部分中的下面这一行:

juan ALL=(ALL) ALL

此示例表示用户 juan 可以从任何主机使用 sudo 并执行任何命令。

以下示例演示了配置 sudo 时可能的粒度:

%users localhost=/usr/sbin/shutdown -h now

这个示例表示,users 系统组 的任何成员都可以发出 /sbin/shutdown -h 命令,只要它 从控制台发布。

sudoers 的 man page 包含此文件的选项的详细列表。

您还可以使用 /etc/sudoers 文件中的 NOPASSWD 选项配置不需要提供任何密码的 sudo 用户:

user_name ALL=(ALL)	NOPASSWD: ALL

但是,即使对于此类用户,sudo 也 运行 可插拔验证模块(PAM)帐户管理模块,这可以检查 PAM 模块在身份验证阶段之外实施的限制。这样可确保 PAM 模块正常工作。例如,如果 pam_time 模块,基于时间的帐户限制不会失败。

警告

始终将 sudo 包含在所有基于 PAM 的访问控制规则中允许的服务列表中。否则,用户在尝试访问 sudo 时将收到"权限被拒绝"错误消息,但根据当前的访问控制规则禁止访问。

如需更多信息,请参阅在修补 Red Hat Enterprise Linux 7.6 后,Edo 给出了 permission denied 错误。

重要

使用 sudo 命令时,请记住几个潜在的风险:您可以按照上述所述,使用 visudo 编辑 /etc/sudoers 配置文件来避免它们。将 /etc/sudoers 文件保留为默认状态可授予 wheel 组中的每个用户 无限制 root 访问权限。

  • 默认情况下,s udo 将密码存储为五分钟的超时时间。在此期间内,任何后续使用 命令都不会提示用户输入密码。如果用户在仍登录时无人值守和解锁其工作站,则攻击者可能会利用此功能。可以通过在 /etc/sudoers 文件中添加以下行来更改此行为:

    Defaults  timestamp_timeout=value

    其中 value 是所需的超时长度(以分钟为单位)。将 值设 为 0 会导致 sudo 每次都需要密码。

  • 如果帐户泄露,攻击者可以使用 sudo 打开具有管理权限的新 shell:

    sudo /bin/bash

    root 用户身份以这种或类似的方式打开新 shell 可让攻击者在理论上无限制的时间内管理访问,绕过 /etc/sudoers 文件中指定的超时时间,并且无需攻击者再次为 sudo 输入密码,直到新打开的会话关闭为止。

6.3. 其它资源

虽然允许用户获得管理特权的程序存在潜在的安全风险,但安全性本身超出了本书的范围。因此,您应该参考以下列出的资源来了解有关安全和特权访问的更多信息。

安装的文档

  • su(1)- su 的 man page 提供了关于此命令可用选项的信息。
  • sudo(8)- sudo 的 man page 包含此命令的详细描述,列出了可用于自定义其行为的选项。
  • PAM(8)- 描述在 Linux 中使用可插拔验证模块(PAM)的 man page。

在线文档

  • 红帽企业 Linux 7 安全指南 - 红帽企业 Linux 7 安全指南 更详细地介绍了与 setuid 程序相关的潜在安全问题,以及用于缓解这些风险的技术。

另请参阅

部分 II. 订阅和支持

要在 Red Hat Enterprise Linux 系统中接收软件更新,必须订阅 Red Hat Content Delivery Network (CDN)并启用适当的软件仓库。这部分论述了如何为 Red Hat Content Delivery Network 订阅系统。

红帽通过 客户门户 提供支持,您可以使用 红帽支持工具直接从命令行访问该支持。这部分论述了此命令行工具的使用。

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

订阅服务提供处理红帽软件库存的机制,并允许您使用 yum 软件包管理器安装其他软件或将已安装的程序更新为更新的版本。在红帽企业 Linux 7 中,建议注册您的系统并附加订阅 是使用红帽订阅管理

注意

也可以在初始设置过程中注册系统并附加订阅。有关初始设置的详情,请查看 Red Hat Enterprise Linux 7 的《安装指南》中 的初始设置章节。请注意,Initial Setup 应用程序仅在安装时在 X Window 系统安装的系统上可用。

7.1. 注册系统和附加订阅

完成以下步骤以注册您的系统并使用红帽订阅管理附加一个或多个订阅。请注意,所有 subscription-manager 命令都应以 root 用户身份运行。

  1. 运行以下命令注册您的系统。此时会提示您输入您的用户名和密码。请注意: 用户名和密码与您的红帽客户门户网站登录证书相同。

    subscription-manager register
  2. 确定您需要的订阅池 ID。要做到这一点,在 shell 提示符后输入以下内容以显示系统可用的所有订阅列表:

    subscription-manager list --available

    对于每个可用的订阅,这个命令会显示其名称、唯一标识符、到期日期以及与订阅相关的其他详情。要列出所有架构的订阅,请添加 --all 选项。池 ID 列在以 池 ID 开头的行上。

  3. 输入以下命令为您的系统附加适当的订阅:

    subscription-manager attach --pool=pool_id

    pool_id 替换为您在上一步中确定的池 ID。

    要验证您的系统当前已附加的订阅列表,请运行:

    subscription-manager list --consumed

有关如何使用红帽订阅管理注册您的系统并将其与订阅关联的详情,请参考指定的解决方案文章有关订阅的综合信息,请参阅红帽订阅管理指南集合

7.2. 管理软件存储库

当系统订阅 Red Hat Content Delivery Network 时,会在 /etc/yum.repos.d/ 目录中创建一个仓库文件。要验证,请使用 yum 列出所有启用的软件仓库:

yum repolist

红帽订阅管理还允许您手动启用或禁用红帽提供的软件存储库。要列出所有可用的软件仓库,请使用以下命令:

subscription-manager repos --list

软件仓库名称取决于您使用的 Red Hat Enterprise Linux 的具体版本,其格式如下:

rhel-version-variant-rpms
rhel-version-variant-debug-rpms
rhel-version-variant-source-rpms

其中 version 是 Red Hat Enterprise Linux 系统版本(6 或 7),变体 是 Red Hat Enterprise Linux 系统变体(服务器工作站),例如:

rhel-7-server-rpms
rhel-7-server-debug-rpms
rhel-7-server-source-rpms

要启用存储库,请输入以下命令:

subscription-manager repos --enable repository

使用要启用的存储库的名称替换 repository。

同样,要禁用存储库,请使用以下命令:

subscription-manager repos --disable repository

第 9.5 节 “配置 Yum 和 Yum 存储库” 提供关于使用 yum 管理软件存储库的详细信息。

如果要自动更新存储库,您可以使用 yum-cron 服务。如需更多信息,请参阅 第 9.7 节 “使用 Yum-cron 自动刷新软件包数据库和下载更新”

7.3. 删除订阅

要删除特定的订阅,请完成以下步骤:

  1. 通过列出已附加订阅的信息,确定您要删除的订阅的序列号:

    subscription-manager list --consumed

    序列号是列为 串行 号。例如,以下示例中的 744993814251016831:

    SKU:        ES0113909
    Contract:     01234567
    Account:      1234567
    Serial:      744993814251016831
    Pool ID:      8a85f9894bba16dc014bccdd905a5e23
    Active:      False
    Quantity Used:   1
    Service Level:   SELF-SUPPORT
    Service Type:   L1-L3
    Status Details:
    Subscription Type: Standard
    Starts:      02/27/2015
    Ends:       02/27/2016
    System Type:    Virtual
  2. 按如下所示输入命令以删除所选订阅:

    subscription-manager remove --serial=serial_number

    使用您在上一步中确定的序列号替换 serial_number

要删除附加到该系统的所有订阅,请运行以下命令:

subscription-manager remove --all

7.4. 其它资源

有关如何使用红帽订阅管理注册您的系统并将其与订阅关联的更多信息,请参阅以下列出的资源。

安装的文档

  • subscription-manager(8)- Red Hat Subscription Management 的 man page 提供了支持的选项和命令的完整列表。

另请参阅

第 8 章 使用红帽支持工具访问支持

红帽支持工具 redhat-support-tool 软件包中可作为交互式 shell 和单一执行计划运行。它可以通过 SSH 或从任何终端运行。例如,它可从命令行搜索红帽知识库,直接在命令行中复制解决方案,打开和更新支持案例,并向红帽发送文件进行分析。

8.1. 安装红帽支持工具

默认情况下,红帽支持工具 在 Red Hat Enterprise Linux 中安装。如果需要,请以 root 用户身份 输入以下命令:

~]# yum install redhat-support-tool

8.2. 使用命令行注册红帽支持工具

要使用命令行将红帽支持工具注册到客户门户中,请运行以下命令:

~]# redhat-support-tool config user username

其中 username 是红帽客户门户网站帐户的用户名。

~]# redhat-support-tool config password
Please enter the password for username:

8.3. 在互动 Shell 模式中使用红帽支持工具

要在互动模式下启动该工具,请输入以下命令:

~]$ redhat-support-tool
Welcome to the Red Hat Support Tool.
Command (? for help):

工具可以作为非特权用户运行,因此可以减少一组命令,或者以 root 用户身份运行。

可以通过输入 ? 字符列出这些命令。程序或菜单选择可以通过输入 qe 字符退出。当您首次搜索知识库或支持案例时,系统会提示您输入您的红帽客户门户网站用户名和密码。另外,使用交互模式为您的红帽客户门户网站帐户设置用户名和密码,并选择性地将其保存到配置文件中。

8.4. 配置红帽支持工具

当处于互动模式中时,可以通过输入命令 config --help 来列出配置选项:

~]# redhat-support-tool
Welcome to the Red Hat Support Tool.
Command (? for help): config --help

Usage: config [options] config.option <new option value>

Use the 'config' command to set or get configuration file values.
Options:
 -h, --help  show this help message and exit
 -g, --global Save configuration option in /etc/redhat-support-tool.conf.
 -u, --unset  Unset configuration option.

The configuration file options which can be set are:
 user   : The Red Hat Customer Portal user.
 password : The Red Hat Customer Portal password.
 debug   : CRITICAL, ERROR, WARNING, INFO, or DEBUG
 url    : The support services URL. Default=https://api.access.redhat.com
 proxy_url : A proxy server URL.
 proxy_user: A proxy server user.
 proxy_password: A password for the proxy server user.
 ssl_ca  : Path to certificate authorities to trust during communication.
 kern_debug_dir: Path to the directory where kernel debug symbols should be downloaded and cached. Default=/var/lib/redhat-support-tool/debugkernels

Examples:
- config user
- config user my-rhn-username
- config --unset user

使用互动模式注册红帽支持工具

要使用互动模式将红帽支持工具注册到客户门户中,请按如下操作:

  1. 输入以下命令启动工具:

    ~]# redhat-support-tool
  2. 输入您的红帽客户门户网站用户名:

    Command (? for help): config user username

    要将您的用户名保存到全局配置文件中,请添加 -g 选项。

  3. 输入您的红帽客户门户网站密码:

    Command (? for help): config password
    Please enter the password for username:

8.4.1. 将设置保存到配置文件中

红帽支持工具( 除非另有指示)使用 ~/.redhat-support-tool/redhat-support-tool/redhat-support-tool.conf 配置文件在本地存储值和选项。如果需要,建议将密码保存到此文件,因为它仅可由特定用户读取。当工具启动时,它将从全局配置文件 /etc/redhat-support-tool.conf 和本地配置文件中读取值。本地存储的值和选项优先于全局存储设置。

警告

建议 不要将 密码保存在全局 /etc/redhat-support-tool.conf 配置文件中,因为密码仅经过 base64 编码且易于解码。此外,文件完全可读。

要在全局配置文件中保存值或选项,请按如下所示添加 -g, --global 选项:

Command (? for help): config setting -g value
注意

为了能够在全局范围内保存设置,使用 -g、--global 选项,红帽支持工具 必须以 root 用户身份运行,因为普通用户没有写入 /etc/redhat-support-tool.conf 所需的权限。

要从本地配置文件中删除值或选项,请添加 -u, --unset 选项,如下所示:

Command (? for help): config setting -u value

这将清除(未设置)工具中的 参数,并回退到全局配置文件中的等效设置(如果可用)。

注意

以非特权用户身份运行时,无法使用 -u, --unset 选项删除存储在全局配置文件中的值,但是它们可以通过与 -u, --unset 选项同时使用 -u, --unset 选项 从工具的当前运行实例中清除、 取消设置。如果以 root 身份运行,则可以使用 -g、--global 和 -u, -- unset 选项同时从全局配置文件中删除值和选项。

8.5. 使用互动模式打开和更新支持案例

使用互动模式打开新的支持案例

要使用互动模式打开一个新的支持问题单,请按如下所示:

  1. 输入以下命令启动工具:

    ~]# redhat-support-tool
  2. 输入 opencase 命令:

    Command (? for help): opencase
  3. 按照屏幕上的 提示选择产品和版本。
  4. 输入案例摘要。
  5. Ctrl+D
  6. 选择案例的严重性。
  7. 在打开支持问题单前,可以选择查看此问题是否有解决方案。
  8. 确认您仍然希望打开支持案例。

    Support case 0123456789 has successfully been opened
  9. (可选)选择附加 SOS 报告。
  10. (可选)选择附加文件。

使用交互模式查看和更新现有支持案例

要使用互动模式查看和更新现有支持问题单,请按如下操作:

  1. 输入以下命令启动工具:

    ~]# redhat-support-tool
  2. 输入 getcase 命令:

    Command (? for help): getcase case-number

    其中 case-number 是您要查看和更新的情况的编号。

  3. 按照屏幕提示中的 以查看案例、修改或添加注释、获取或添加附件。

使用互动模式修改现有支持案例

要使用互动模式修改现有支持问题单的属性,请按如下所示:

  1. 输入以下命令启动工具:

    ~]# redhat-support-tool
  2. 输入 修改问题单 命令:

    Command (? for help): modifycase case-number

    其中 case-number 是您要查看和更新的情况的编号。

  3. 修改选择列表会出现:

    Type the number of the attribute to modify or 'e' to return to the previous menu.
     1 Modify Type
     2 Modify Severity
     3 Modify Status
     4 Modify Alternative-ID
     5 Modify Product
     6 Modify Version
    End of options.

    按照屏幕提示中的,修改一个或多个选项。

  4. 例如,要修改状态,请输入 3

    Selection: 3
     1  Waiting on Customer
     2  Waiting on Red Hat
     3  Closed
    Please select a status (or 'q' to exit):

8.6. 在命令行中查看支持案例

在命令行中查看案例的内容可快速轻松地从命令行应用解决方案。

要在命令行中查看现有支持问题单,请输入以下命令:

~]# redhat-support-tool getcase case-number

其中 case-number 是您要下载的情况的编号。

8.7. 其它资源

Red Hat 知识库文章 红帽支持工具 包含其他信息、示例和视频教程。

部分 III. 安装和管理软件

Red Hat Enterprise Linux 系统上的所有软件都被分成 RPM 包,这些软件包可以被安装、升级或删除。这部分论述了如何使用 Yum 在 Red Hat Enterprise Linux 中管理软件包。

第 9 章 yum

yum 是红帽软件包管理器,可以查询有关可用软件包的信息,从存储库获取软件包,安装和卸载它们,并将整个系统更新至最新可用版本。yum 在更新、安装或删除软件包时执行自动依赖项解析,因此能够自动确定、获取和安装所有可用的依赖软件包。

yum 可使用新的、额外的存储库或软件包来源进行配置,也可提供许多插件来增强和扩展其功能。yum 可以执行 RPM 可以执行的许多相同任务;此外,许多命令行选项类似。yum 可以在一台机器或一组机器上轻松、简单的软件包管理。

以下部分假设您的系统在安装过程中注册了红帽订阅管理,如 Red Hat Enterprise Linux 7 安装指南所述。如果您的系统没有订阅,请参阅 第 7 章 注册系统管理并管理订阅

重要

yum 通过启用 GPG(Gnu Privacy Guard)对 GPG 签名包(软件包源)或单个存储库打开的签名验证来提供安全软件包管理。启用签名验证后,yum 将拒绝安装任何未使用该存储库的正确密钥签名的 GPG 软件包。这意味着,您可以信任在您的系统上下载和安装的 RPM 软件包来自红帽等可信源,并在传输过程中不会被修改。有关使用 yum 启用签名检查的详情,请查看 第 9.5 节 “配置 Yum 和 Yum 存储库”

yum 还可让您轻松设置自己的 RPM 软件包存储库,以便在其他计算机上下载和安装。yum 尽可能使用 并行下载 多个软件包和元数据来加快下载。

学习 yum 是一项合理的投资,因为它通常是执行系统管理任务的最快方法,而且除了 PackageKit 图形包管理工具提供的功能之外。

注意

您必须具有超级用户权限,才能使用 yum 在您的系统上安装、更新或删除软件包。本章中的所有示例都假定您已使用 susudo 命令获取了超级用户权限。

9.1. 检查和更新软件包

yum 可让您检查您的系统是否有等待应用的更新。您可以列出需要更新的软件包,并整体更新它们,也可以更新选定的单个软件包。

9.1.1. 检查更新

要查看系统中安装的软件包有可用的更新,请使用以下命令:

yum check-update

例 9.1. yum check-update 命令的输出示例

yum check-update 的输出结果如下:

~]# yum check-update
Loaded plugins: product-id, search-disabled-repos, subscription-manager
dracut.x86_64             033-360.el7_2   rhel-7-server-rpms
dracut-config-rescue.x86_64      033-360.el7_2   rhel-7-server-rpms
kernel.x86_64             3.10.0-327.el7   rhel-7-server-rpms
rpm.x86_64              4.11.3-17.el7   rhel-7-server-rpms
rpm-libs.x86_64            4.11.3-17.el7   rhel-7-server-rpms
rpm-python.x86_64           4.11.3-17.el7   rhel-7-server-rpms
yum.noarch              3.4.3-132.el7   rhel-7-server-rpms

以上输出中的软件包列为具有可用的更新。列表中的第一个软件包是 dracut。示例输出中的每一行都由多个行组成,如果是 dracut

  • dracut - 软件包的名称,
  • x86_64 - 构建软件包的 CPU 架构,
  • 033 - 要安装的更新软件包的版本,
  • 360.el7 - 更新软件包的发布,
  • _2 - 构建版本,作为 z-stream 更新的一部分添加.
  • rhel-7-server-rpms - 更新软件包所在的存储库。

输出中还显示,我们可以更新内核( 内核 包)、yum 和 RPM(yum rpm 包),以及它们的依赖项(如 rpm -libs 和 rpm- python 软件包),所有这些都使用 yum 命令。

9.1.2. 更新软件包

您可以选择更新单个软件包、多个软件包或所有软件包。如果您更新的软件包或软件包的任何依赖项都有可用更新,则它们也会更新。

更新单个软件包

要更新单个软件包,以 root 用户身份运行以下命令:

yum update package_name

例 9.2. 更新 rpm 软件包

要更新 rpm 软件包,请输入:

~]# yum update rpm
Loaded plugins: langpacks, product-id, subscription-manager
Updating Red Hat repositories.
INFO:rhsm-app.repolib:repos updated: 0
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package rpm.x86_64 0:4.11.1-3.el7 will be updated
--> Processing Dependency: rpm = 4.11.1-3.el7 for package: rpm-libs-4.11.1-3.el7.x86_64
--> Processing Dependency: rpm = 4.11.1-3.el7 for package: rpm-python-4.11.1-3.el7.x86_64
--> Processing Dependency: rpm = 4.11.1-3.el7 for package: rpm-build-4.11.1-3.el7.x86_64
---> Package rpm.x86_64 0:4.11.2-2.el7 will be an update
--> Running transaction check
...
--> Finished Dependency Resolution

Dependencies Resolved
=============================================================================
 Package          Arch    Version     Repository    Size
=============================================================================
Updating:
 rpm            x86_64   4.11.2-2.el7  rhel      1.1 M
Updating for dependencies:
 rpm-build         x86_64   4.11.2-2.el7  rhel      139 k
 rpm-build-libs      x86_64   4.11.2-2.el7  rhel       98 k
 rpm-libs         x86_64   4.11.2-2.el7  rhel      261 k
 rpm-python        x86_64   4.11.2-2.el7  rhel       74 k

Transaction Summary
=============================================================================
Upgrade 1 Package (+4 Dependent packages)

Total size: 1.7 M
Is this ok [y/d/N]:

这个输出包含几个值得关注的项目:

  1. 加载的插件:Langpacks、products-id、subscription-manager - Yum 始终通知您已安装和启用哪些 yum 插件。有关 yum 插件的常规信息,或 第 9.6.3 节 “使用 Yum 插件” 的常规信息,请参阅 第 9.6 节 “yum 插件” 以了解特定插件的描述。
  2. rpm.x86_64 - 您可以下载并安装新的 rpm 软件包及其依赖项。对每个软件包执行事务检查。
  3. yum 显示更新信息,然后提示您确认更新;yum 默认以交互方式运行。如果您知道 yum 命令计划执行 哪些事务,您可以使用 -y 选项自动 回答 yum 询问的任何问题(在这种情况下,它以非交互方式运行)。但是,您应该始终检查 yum 计划对系统做出哪些更改,以便您可以轻松地对可能出现的任何问题进行故障排除。您也可以选择下载软件包而不进行安装。为此,请在下载提示符处选择 d 选项。这将启动所选软件包的背景下载。

    如果事务失败,您可以使用 yum history 命令查看 yum 事务 历史记录,如 第 9.4 节 “使用事务历史记录” 所述。

重要

无论您使用 yum update 或 yum install 命令,yum 始终都会 安装 新内核。

另一方面,使用 RPM 时,务必使用 rpm -i 内核命令来 安装新内核,而不是 rpm -u 内核 (替换 当前内核)。

同样,也可以更新软件包组。以 root 用户身份键入:

yum group update group_name

在这里,使用您要更新的软件包组的名称替换 group_name。有关软件包组的详情请参考 第 9.3 节 “使用软件包组”

yum 还 提供与 启用 的过时 配置选项相同的 升级 命令(请参阅 第 9.5.1 节 “设置 [main] 选项”)。默认情况下,/etc/yum.conf 中打开了过时的 功能,这使得这两个命令具有同等性。

更新所有软件包及其依赖项

要更新所有软件包及其依赖项,请使用不带任何参数的 yum update 命令:

yum update
yum update --security

您还可以仅将软件包更新为包含最新安全更新的版本。以 root 用户身份键入:

yum update-minimal --security

例如,假设:

  • kernel-3.10.0-1 软件包安装在您的系统中;
  • kernel-3.10.0-2 软件包已作为安全更新发布;
  • kernel-3.10.0-3 软件包已作为程序错误修复更新发布。

然后 yum update-minimal --security 将软件包更新至 kernel-3.10.0-2yum update --security 将软件包更新为 kernel-3.10.0-3

自动更新软件包

要刷新软件包数据库并自动下载更新,您可以使用 yum-cron 服务。如需更多信息,请参阅 第 9.7 节 “使用 Yum-cron 自动刷新软件包数据库和下载更新”

9.1.3. 使用 ISO 和 Yum 升级系统离线

对于与互联网或红帽网络断开连接的系统,将 yum update 命令与 Red Hat Enterprise Linux 安装 ISO 映像配合使用是将系统升级到最新次要版本的一种简单快速方式。以下步骤演示了升级过程:

  1. 创建目标目录以挂载您的 ISO 映像。挂载时不会自动创建该目录,因此请在继续下一步之前创建该目录。以 root 用户身份键入:

    mkdir mount_dir

    使用挂载目录的路径替换 mount_dir。通常,用户将其创建为 /media 目录中的子目录。

  2. 将 Red Hat Enterprise Linux 7 安装 ISO 镜像挂载到之前创建的目标目录中。以 root 用户身份键入:

    mount -o loop iso_name mount_dir

    iso_name 替换为您的 ISO 镜像的路径,mount_dir 替换为目标目录的路径。此处需要 -o loop 选项,才能将文件挂载为块设备。

  3. media.repo 文件从 mount 目录复制到 /etc/yum.repos.d/ 目录。 请注意,此目录中的配置文件必须具有.repo 扩展名才能正常工作。

    cp mount_dir/media.repo /etc/yum.repos.d/new.repo

    这会为 yum 存储库创建一个配置文件。使用文件名替换 new.repo,如 rhel7.repo

  4. 编辑新配置文件,使其指向 Red Hat Enterprise Linux 安装 ISO。在 /etc/yum.repos.d/new.repo 文件中添加以下行:

    baseurl=file:///mount_dir

    使用挂载点的路径替换 mount_dir

  5. 更新所有 yum 存储库,包括 /etc/yum.repos.d/new.repo。以 root 用户身份键入:

    yum update

    这会将您的系统升级到挂载的 ISO 镜像提供的版本。

  6. 升级成功后,您可以卸载 ISO 镜像。以 root 用户身份键入:

    umount mount_dir

    其中 mount_dir 是挂载目录的路径。此外,您可以删除在第一步中创建的挂载目录。以 root 用户身份键入:

    rmdir mount_dir
  7. 如果您不会将之前创建的配置文件用于另一个安装或更新,您可以将其删除。以 root 用户身份键入:

    rm /etc/yum.repos.d/new.repo

例 9.3. 从 Red Hat Enterprise Linux 7.0 升级到 7.1

如果需要,需要使用带有较新版本的系统(如 rhel-server-7.1-x86_64-dvd.iso)的 ISO 映像来升级不能访问互联网的系统,请创建用于挂载的目标目录,如 /media/rhel7/。以 root 用户身份,使用您的 ISO 镜像更改到 目录并键入:

~]# mount -o loop
    rhel-server-7.1-x86_64-dvd.iso /media/rhel7/

然后通过从挂载目录中复制 media.repo 文件来为您的镜像设置 yum 存储库:

~]# cp /media/rhel7/media.repo /etc/yum.repos.d/rhel7.repo

要将 yum 识别挂载点为仓库,请在上一步中复制的 /etc/yum.repos.d/rhel7.repo 中添加以下行:

baseurl=file:///media/rhel7/

现在,更新 yum 存储库会将您的系统升级到 rhel-server-7.1-x86_64-dvd.iso 提供的版本。以 root 用户身份执行:

~]# yum update

成功升级您的系统时,您可以卸载镜像,删除目标目录和配置文件:

~]# umount /media/rhel7/
~]# rmdir /media/rhel7/
~]# rm
     /etc/yum.repos.d/rhel7.repo

9.2. 使用软件包

yum 允许您对软件包执行一整套操作,包括搜索软件包、查看有关软件包的信息、安装和删除软件包。

9.2.1. 搜索软件包

您可以使用以下命令搜索所有 RPM 软件包名称、描述和摘要:

yum search term&hellip;

使用您要搜索的软件包名称替换 term

例 9.4. 搜索与特定字符串匹配的软件包

要列出与 "vim"、"gvim" 或 "emacs" 匹配的所有软件包,请输入:

~]$ yum search vim gvim emacs
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
============================= N/S matched: vim ==============================
vim-X11.x86_64 : The VIM version of the vi editor for the X Window System
vim-common.x86_64 : The common files needed by any version of the VIM editor
[output truncated]

============================ N/S matched: emacs =============================
emacs.x86_64 : GNU Emacs text editor
emacs-auctex.noarch : Enhanced TeX modes for Emacs
[output truncated]

 Name and summary matches mostly, use "search all" for everything.
Warning: No matches found for: gvim

yum search 命令可用于搜索您不知道名称但了解相关术语的软件包。请注意,默认情况下,yum search 会在 包名称和摘要中返回匹配项,这样可加快搜索速度。使用 yum search all 命令进行更详细但较慢的搜索。

过滤结果

所有 yum 的 list 命令都允许您通过附加一个或多个 glob 表达式作为参数来过滤结果。glob 表达式是包含一个或多个通配符字符 * (扩展以匹配任何字符子集)和 ? (扩展以匹配任何单个字符)的普通字符字符串。

当将 glob 表达式作为参数传递给 yum 命令时,请小心转义 glob 表达式,否则 Bash shell 会将这些表达式解释为 路径名扩展,并可能 将当前目录中与全局表达式匹配的所有文件传递给 yum。要确定将 glob 表达式传递给 yum,请使用以下方法之一:

  • 在通配符前面使用反斜杠字符转义
  • 双引号或单引号整个 glob 表达式。

下一节中的示例演示了这两种方法的用法。

9.2.2. 列出软件包

要列出所有安装和可用软件包的信息,在 shell 提示符下键入以下内容:

yum list all

要列出与插入 glob 表达式匹配的已安装和可用软件包,请使用以下命令:

yum list glob_expression&hellip;

例 9.5. 列出与 ABRT 相关的软件包

带有各种 ABRT 附加组件和插件的软件包以"abrt-addon-"或"abrt-plugin-"开头。要列出这些软件包,请在 shell 提示符后键入以下命令:请注意如何使用反斜杠字符转义通配符字符:

~]$ yum list abrt-addon\* abrt-plugin\*
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
abrt-addon-ccpp.x86_64          2.1.11-35.el7       @rhel-7-server-rpms
abrt-addon-kerneloops.x86_64       2.1.11-35.el7       @rhel-7-server-rpms
abrt-addon-pstoreoops.x86_64       2.1.11-35.el7       @rhel-7-server-rpms
abrt-addon-python.x86_64         2.1.11-35.el7       @rhel-7-server-rpms
abrt-addon-vmcore.x86_64         2.1.11-35.el7       @rhel-7-server-rpms
abrt-addon-xorg.x86_64          2.1.11-35.el7       @rhel-7-server-rpms

要列出系统上安装的所有软件包,请使用 已安装的 关键字。输出中最右侧的列列出了从中检索软件包的存储库。

yum list installed glob_expression&hellip;

例 9.6. 列出 krb 软件包的所有已安装版本

以下示例演示了如何列出所有以"krb"开头的软件包,后跟一个字符和连字符。这在您要列出特定组件的所有版本时很有用,因为它们按数字区分。整个 glob 表达式都用引号括起,以确保正确处理。

~]$ yum list installed "krb?-*"
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
krb5-libs.x86_64         1.13.2-10.el7          @rhel-7-server-rpms

要列出所有启用的软件仓库中可用于安装的软件包,请使用以下命令:

yum list available glob_expression&hellip;

例 9.7. 列出可用的 gstreamer 插件

例如,要列出包含"gstreamer"和"plugin"的名称的所有可用软件包,请运行以下命令:

~]$ yum list available gstreamer*plugin\*
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Available Packages
gstreamer-plugins-bad-free.i686       0.10.23-20.el7     rhel-7-server-rpms
gstreamer-plugins-base.i686         0.10.36-10.el7     rhel-7-server-rpms
gstreamer-plugins-good.i686         0.10.31-11.el7     rhel-7-server-rpms
gstreamer1-plugins-bad-free.i686      1.4.5-3.el7      rhel-7-server-rpms
gstreamer1-plugins-base.i686        1.4.5-2.el7      rhel-7-server-rpms
gstreamer1-plugins-base-devel.i686     1.4.5-2.el7      rhel-7-server-rpms
gstreamer1-plugins-base-devel.x86_64    1.4.5-2.el7      rhel-7-server-rpms
gstreamer1-plugins-good.i686        1.4.5-2.el7      rhel-7-server-rpms

列出存储库

要列出系统中每个启用的存储库的存储库 ID、名称和软件包数量,请使用以下命令:

yum repolist

要列出这些存储库的更多信息,请添加 -v 选项。启用此选项后,将显示每个列出的存储库的信息,包括文件名、总体大小、最后一次更新的日期和基本 URL。另外,您可以使用生成相同输出的 repoinfo 命令。

yum repolist -v
yum repoinfo

若要列出已启用和禁用的存储库,可使用以下命令:在输出列表中添加一个状态列,以显示启用了哪些存储库。

yum repolist all

通过将 disabled 作为第一个参数传递,您可以将命令输出减少至禁用的存储库。如需进一步规格,您可以将存储库的 ID 或名称或相关的 glob_expressions 作为参数传递。请注意,如果存储库 ID 或名称与插入的参数完全匹配,则即使未传递已启用或禁用 的过滤器,也会列出此存储库。

9.2.3. 显示软件包信息

要显示一个或多个软件包的信息,请使用以下命令(glob 表达式在这里也有效):

yum info package_name&hellip;

使用软件包名称替换 package_name

例 9.8. 显示 abrt 软件包中的信息

要显示 abrt 软件包的信息,请输入:

~]$ yum info abrt
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Installed Packages
Name    : abrt
Arch    : x86_64
Version   : 2.1.11
Release   : 35.el7
Size    : 2.3 M
Repo    : installed
From repo  : rhel-7-server-rpms
Summary   : Automatic bug detection and reporting tool
URL     : https://fedorahosted.org/abrt/
License   : GPLv2+
Description : abrt is a tool to help users to detect defects in applications and
      : to create a bug report with all information needed by maintainer to fix
      : it. It uses plugin system to extend its functionality.

yum info package_name 命令类似于 rpm -q --info package_name 命令,但提供了从 安装 RPM 软件包的 yum 存储库的名称(查找输出中的 From repo: 行)。

使用 yumdb

您还可以使用以下命令查询 yum 数据库以获取有关软件包的替代和有用信息:

yumdb info package_name

此命令提供关于软件包的其他信息,包括软件包的校验和(以及用于生成软件包的算法,如 SHA-256)、命令行上为安装软件包所提供的命令(如果有),以及将软件包安装到系统上的原因( 用户 指明其由用户安装,而 dep 表示它是作为依赖项引入的)。

例 9.9. 查询 yumdb 以了解有关 yum 软件包的信息

要显示 yum 软件包的附加信息,请输入:

~]$ yumdb info yum
Loaded plugins: langpacks, product-id
yum-3.4.3-132.el7.noarch
   changed_by = 1000
   checksum_data = a9d0510e2ff0d04d04476c693c0313a11379053928efd29561f9a837b3d9eb02
   checksum_type = sha256
   command_line = upgrade
   from_repo = rhel-7-server-rpms
   from_repo_revision = 1449144806
   from_repo_timestamp = 1449144805
   installed_by = 4294967295
   origin_url = https://cdn.redhat.com/content/dist/rhel/server/7/7Server/x86_64/os/Packages/yum-3.4.3-132.el7.noarch.rpm
   reason = user
   releasever = 7Server
   var_uuid = 147a7d49-b60a-429f-8d8f-3edb6ce6f4a1

有关 yumdb 命令的更多信息,请参阅 yumdb(8)手册页。

9.2.4. 安装软件包

要安装单个软件包及其所有未安装的依赖项,以 root 用户身份输入以下命令:

yum install package_name

您还可以通过将多个软件包作为参数附加来同时安装多个软件包。要做到这一点,以 root 用户身份输入:

yum install package_name package_name&hellip;

如果要在 multilib 系统(如 AMD64 或 Intel 64 机器)上安装软件包,您可以通过在软件包名称中添加.arch 来指定软件包的构架(只要启用的软件仓库中可用):

yum install package_name.arch

例 9.10. 在 multilib 系统上安装软件包

要为 i686 架构安装 sqlite 软件包,请输入:

~]# yum install sqlite.i686

您可以使用 glob 表达式快速安装多个名称相似的软件包。以 root 用户身份执行:

yum install glob_expression&hellip;

例 9.11. 安装所有udacious插件

如果要安装多个名称相似的软件包时,全局表达式很有用。要安装所有 audacious 插件,请使用以下格式的命令:

~]# yum install audacious-plugins-\*

除了软件包名称和 glob 表达式外,您还可以为 yum install 提供文件名。如果您知道要安装的二进制文件的名称,但不知道其软件包名称,您可以为 yum install 提供路径名称。以 root 用户身份键入:

yum install /usr/sbin/named

yum 随后搜索其包列表,找到提供 /usr/sbin/named 的软件包(如果有),并提示您是否安装它。

如上例中所示,yum install 命令不需要严格定义的参数。它可以处理各种软件包名称和 glob 表达式格式,从而方便用户安装。另一方面,需要花些时间才能正确 解析 输入,特别是您指定了大量软件包时。要优化软件包搜索,您可以使用以下命令来显式定义如何解析参数:

yum install-n name
yum install-na name.architecture
yum install-nevra name-epoch:version-release.architecture

使用 install-n 时,yum 会将 name 解释为软件包的确切名称。install-na 命令告知 yum,后续参数包含用点字符划分的软件包名称和架构。使用 install-nevra 时,yum 期望格式为 name-epoch:version-release.architecture 的参数。同样,搜索要删除的软件包时,您可以使用 yum remove-n、yum remove-na 和 yum remove-nevra

注意

如果您知道要安装包含 命名 二进制的软件包,但您不知道在哪个 bin/ or sbin/ 目录中安装了该文件,请使用带有 glob 表达式的 yum 提供 命令:

~]# yum provides "*bin/named"
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-
       : manager
32:bind-9.9.4-14.el7.x86_64 : The Berkeley Internet Name Domain (BIND) DNS
              : (Domain Name System) server
Repo    : rhel-7-server-rpms
Matched from:
Filename  : /usr/sbin/named

yum 提供"*/file_name" 是查找包含 file_name 的软件包的有用方法。

例 9.12. 安装过程

以下示例提供了使用 yum 的安装概述。要下载并安装最新版本的 httpd 软件包,以 root 用户身份执行:

~]# yum install httpd
Loaded plugins: langpacks, product-id, subscription-manager
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-12.el7 will be updated
---> Package httpd.x86_64 0:2.4.6-13.el7 will be an update
--> Processing Dependency: 2.4.6-13.el7 for package: httpd-2.4.6-13.el7.x86_64
--> Running transaction check
---> Package httpd-tools.x86_64 0:2.4.6-12.el7 will be updated
---> Package httpd-tools.x86_64 0:2.4.6-13.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

执行上述命令后,yum 会加载必要的插件并运行事务检查。在本例中,httpd 已经安装。由于安装的软件包比最新可用版本旧,因此将会进行更新。这同样适用于 httpd 依赖的 httpd -tools 软件包。然后会显示一个事务概述:

================================================================================
 Package    Arch   Version         Repository        Size
================================================================================
Updating:
 httpd     x86_64  2.4.6-13.el7      rhel-x86_64-server-7  1.2 M
Updating for dependencies:
 httpd-tools  x86_64  2.4.6-13.el7      rhel-x86_64-server-7   77 k

Transaction Summary
================================================================================
Upgrade 1 Package (+1 Dependent package)

Total size: 1.2 M
Is this ok [y/d/N]:

在这一步中,yum 会提示您确认安装。除了 y (yes)和 N (否)选项外,您可以选择 d (仅下载)下载软件包,但不能直接安装它们。如果您选择 y,安装会继续包含以下信息,直到成功完成为止。

Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Updating  : httpd-tools-2.4.6-13.el7.x86_64               1/4
 Updating  : httpd-2.4.6-13.el7.x86_64                  2/4
 Cleanup  : httpd-2.4.6-12.el7.x86_64                  3/4
 Cleanup  : httpd-tools-2.4.6-12.el7.x86_64               4/4
 Verifying : httpd-2.4.6-13.el7.x86_64                  1/4
 Verifying : httpd-tools-2.4.6-13.el7.x86_64               2/4
 Verifying : httpd-tools-2.4.6-12.el7.x86_64               3/4
 Verifying : httpd-2.4.6-12.el7.x86_64                  4/4

Updated:
 httpd.x86_64 0:2.4.6-13.el7

Dependency Updated:
 httpd-tools.x86_64 0:2.4.6-13.el7

Complete!

要从系统中的本地目录安装之前下载的软件包,请使用以下命令:

yum localinstall path

使用您要安装的软件包的路径替换 path

9.2.5. 下载软件包

例 9.12 “安装过程” 所示,在某个安装过程点,系统会提示您使用以下信息确认安装:

...
Total size: 1.2 M
Is this ok [y/d/N]:
...

使用 d 选项时,yum 将下载软件包,而不立即安装它们。您稍后可以使用 yum localinstall 命令离线安装这些软件包,也可以与其他设备共享这些软件包。下载的软件包保存在缓存目录的一个子目录中,默认为 /var/cache/yum/$basearch/$releasever/packages/。下载操作以后台模式进行,以便您可以并行使用 yum 进行其他操作。

9.2.6. 删除软件包

与软件包安装类似,yum 可让您卸载它们。要卸载特定软件包以及依赖它的软件包,以 root 用户身份运行以下命令:

yum remove package_name&hellip;

与安装多个软件包时一样,您可以通过在 命令中添加更多软件包名称来一次性删除多个软件包。

例 9.13. 删除多个软件包

要删除 totem,在 shell 提示符后输入以下内容:

~]# yum remove totem

安装 类似,删除 可以使用这些参数:

  • 软件包名称
  • glob 表达式
  • 文件列表
  • 软件包提供
警告

yum 无法删除软件包,除非同时删除依赖于它的软件包。不建议这种类型的操作(只能由 RPM 执行),并可能会使您的系统处于非正常运行状态或导致应用程序无法正常工作或崩溃。

9.3. 使用软件包组

软件包组是满足共同用途的软件包集合,用于实例系统工具或 Sound 和 Video。安装软件包组会拉取一组依赖软件包,从而节省大量时间。yum groups 命令是顶级命令,涵盖在 yum 中对包组执行的所有操作。

9.3.1. 列出软件包组

Summary 选项 用于查看已安装组、可用组、可用环境组的数量,以及已安装和可用的语言组:

yum groups summary

例 9.14. yum group summary 的输出示例

~]$ yum groups summary
Loaded plugins: langpacks, product-id, subscription-manager
Available Environment Groups: 12
Installed Groups: 10
Available Groups: 12

要列出 yum 存储库中的所有软件包组,请添加 list 选项。您可以根据组名称过滤命令输出。

yum group list glob_expression&hellip;

可以将几个可选参数传递给此命令,包括 隐藏 列出未标记为用户可见的组,以及用于列出组 ID 的 id。您可以添加 语言环境已安装可用的 选项,将命令输出减少到特定组类型。

要列出特定组中的强制和可选软件包,请使用以下命令:

yum group info glob_expression&hellip;

例 9.15. 查看 LibreOffice 软件包组的信息

 ~]$ yum group info LibreOffice
Loaded plugins: langpacks, product-id, subscription-manager

Group: LibreOffice
 Group-Id: libreoffice
 Description: LibreOffice Productivity Suite
 Mandatory Packages:
 =libreoffice-calc
  libreoffice-draw
 -libreoffice-emailmerge
  libreoffice-graphicfilter
 =libreoffice-impress
 =libreoffice-math
 =libreoffice-writer
 +libreoffice-xsltfilter
 Optional Packages:
  libreoffice-base
  libreoffice-pyuno

如上例中所示,软件包组中的软件包可以具有使用以下符号标记的不同状态:

  • " - " - 未安装包,不会将其作为包组的一部分安装。
  • " + " - 包未安装,但将在下一次 yum 升级或 yum 组升级时安装。
  • " = " - 包已安装并且作为包组的一部分安装.
  • 无符号 - 软件包已安装,但安装在软件包组之外。这意味着 yum group remove 不会删除这些软件包。

这些区别仅在 group_command 配置参数设置为 对象 时才会进行,这是默认设置。如果您不希望 yum跟踪软件包是否作为组的一部分安装或单独安装,则将此参数设置为不同的值,这将"无符号"包,等同于 "=" 软件包。

您可以使用 yum group mark 命令更改上述软件包状态。例如,yum group 将任何给定安装的包标记为 指定组的成员。要避免在组更新时安装新软件包,请使用 yum group mark blacklist。有关 yum group mark 功能的更多信息,请参阅 yum (8)man page。

注意

您可以使用 @^ 前缀识别环境组,软件包组则可标记为 @。使用 yum group listinfoinstallremove 时,传递 @group_name 以指定软件包组、@^group_name 指定环境组,或者包含它们的 group_name

9.3.2. 安装软件包组

每个软件包组都有一个名称和组 ID(groupid)。要列出所有软件包组的名称,及其组 ID(以括号中显示),请输入:

yum group list ids

例 9.16. 查找软件包组的名称和 groupid

要查找软件包组的名称或 ID,例如与 KDE 桌面环境相关的组,请输入:

~]$ yum group list ids kde\*
Available environment groups:
  KDE Plasma Workspaces (kde-desktop-environment)
Done

某些组由配置的仓库中的设置隐藏。例如,在服务器上,使用 隐藏 命令选项同时列出隐藏组:

~]$ yum group list hidden ids kde\*
Loaded plugins: product-id, subscription-manager
Available Groups:
  KDE (kde-desktop)
Done

您可以将其完整组名(不带 groupid 部分)传递到 group install 命令,以此安装软件包组。以 root 用户身份键入:

yum group install "group name"

您还可以按 groupid 安装。以 root 用户身份执行以下命令:

yum group install groupid

如果您使用 @ 符号附加 groupid 或带引号的组名称,您可以将 groupid 或 quoted 组名传递给 install 命令,该符号告知 yum 想要执行 组安装。以 root 用户身份键入:

yum install @group

使用 groupid 或带引号的组名称替换 group。相同的逻辑适用于环境组:

yum install @^group

例 9.17. 安装 KDE 桌面组的四种等效方法

如前文所述,您可以使用四种替代方案,但使用等效的方式来安装软件包组。对于 KDE Desktop,命令如下所示:

~]# yum group install "KDE Desktop"
~]# yum group install kde-desktop
~]# yum install @"KDE Desktop"
~]# yum install @kde-desktop

9.3.3. 删除软件包组

您可以使用类似于 安装 语法的语法删除软件包组,并使用软件包组的名称或其 id。以 root 用户身份键入:

yum group remove group_name
yum group remove groupid

此外,如果您在 remove 命令前面添加 @-symbol(告知 yum 想要执行组删除),则您也可以将 groupid 或带引号的名称传递给 remove 命令。以 root 用户身份键入:

yum remove @group

使用 groupid 或带引号的组名称替换 group。同样,您可以替换环境组:

yum remove @^group

例 9.18. 删除 KDE 桌面 组的四种等效方法

与安装类似,您可以使用四种替代方案,但使用等效的方法删除软件包组:对于 KDE Desktop,命令如下所示:

~]# yum group remove "KDE Desktop"
~]# yum group remove kde-desktop
~]# yum remove @"KDE Desktop"
~]# yum remove @kde-desktop

9.4. 使用事务历史记录

yum history 命令允许用户查看有关 yum 事务时间表、发生日期和时间、受影响的软件包数量、这些事务是否成功还是被中止的信息,以及是否在不同事务之间更改了 RPM 数据库。此外,此命令可用于撤销或恢复某些事务。所有历史记录数据都存储在 /var/lib/yum/history/ 目录中的历史记录 DB 中

9.4.1. 列出事务

root 用户身份显示二十项最新事务的列表,或者在没有额外参数的情况下运行 yum history,或者在 shell 提示符下键入以下内容:

yum history list

要显示所有事务,请添加 all 关键字:

yum history list all

要只显示给定范围内的事务,请使用以下格式的命令:

yum history list start_id..end_id

您也可以仅列出与特定软件包或软件包相关的事务。要做到这一点,使用带有软件包名称或 glob 表达式的命令:

yum history list glob_expression&hellip;

例 9.19. 列出五个最旧的事务

yum history 列表中,最新的事务会显示在列表的顶部。要显示历史记录数据库中存储的五个最旧的事务的信息,请输入:

~]# yum history list 1..5
Loaded plugins: langpacks, product-id, subscription-manager
ID   | Login user        | Date and time  | Action(s)   | Altered
-------------------------------------------------------------------------------
   5 | User <user>       | 2013-07-29 15:33 | Install    |  1
   4 | User <user>       | 2013-07-21 15:10 | Install    |  1
   3 | User <user>       | 2013-07-16 15:27 | I, U      |  73
   2 | System <unset>      | 2013-07-16 15:19 | Update     |  1
   1 | System <unset>      | 2013-07-16 14:38 | Install    | 1106
history list

所有形式的 yum history list 命令生成表格输出,每行由以下列组成:

  • id - 标识特定事务的整数值。
  • 登录用户 - 用于启动事务的登录会话的用户名称。此信息通常显示在 Full Name <username> 表单中。对于不是由用户发布的事务(如自动系统更新),改为使用 System <unset>
  • 日期和时间 - 签发交易的日期和时间。
  • action(s) - 事务期间执行的操作列表,如 表 9.1 “Action(s)字段的可能值” 所述。
  • 更改 - 受事务影响的软件包数量,后跟 表 9.2 “Altered 字段的可能值” 所述的附加信息。

表 9.1. Action(s)字段的可能值

操作缩写描述

降级

D

至少一个软件包已降级到较旧版本。

擦除

E

至少已删除一个软件包。

安装

I

至少已安装了一个新软件包。

Obsoleting

O

至少一个软件包被标记为过时。

重新安装

R

至少已重新安装了一个软件包。

Update(更新)

U

至少一个软件包已更新为更新的版本。

表 9.2. Altered 字段的可能值

符号描述

<

在事务完成前,rpm db 数据库在 yum 外部更改。

>

事务完成后,rpm db 数据库 在 yum 外部被更改。

*

事务未能完成。

#

事务成功完成,但 yum 返回一个非零退出代码。

E

事务成功完成,但会显示错误或警告。

P

事务成功完成,但 rpmdb 数据库中已存在问题。

s

事务成功完成,但是使用了 --skip-broken 命令行选项并跳过某些软件包。

要将任何已安装软件包的 rpmdb 或 yumdb 数据库内容与当前使用的 rpmdb 或 yumdb 数据库 同步,请输入以下内容:

yum history sync

要显示有关当前使用历史记录数据库的一些总体统计信息,请使用以下命令:

yum history stats

例 9.20. yum history stats 输出示例

~]# yum history stats
Loaded plugins: langpacks, product-id, subscription-manager
File    : //var/lib/yum/history/history-2012-08-15.sqlite
Size    : 2,766,848
Transactions: 41
Begin time : Wed Aug 15 16:18:25 2012
End time  : Wed Feb 27 14:52:30 2013
Counts   :
 NEVRAC : 2,204
 NEVRA : 2,204
 NA   : 1,759
 NEVR  : 2,204
 rpm DB : 2,204
 yum DB : 2,204
history stats

yum 还允许您显示所有过去事务的摘要。要做到这一点,以 root 用户身份运行以下命令:

yum history summary

要只显示给定范围内的事务,请输入:

yum history summary start_id..end_id

yum history list 命令类似,您可以通过提供软件包名称或 glob 表达式来显示与特定软件包或软件包相关的事务摘要:

yum history summary glob_expression&hellip;

例 9.21. 五个最新事务摘要

~]# yum history summary 1..5
Loaded plugins: langpacks, product-id, subscription-manager
Login user         | Time        | Action(s)    | Altered
-------------------------------------------------------------------------------
Jaromir ... <jhradilek>  | Last day      | Install     |    1
Jaromir ... <jhradilek>  | Last week      | Install     |    1
Jaromir ... <jhradilek>  | Last 2 weeks    | I, U       |    73
System <unset>       | Last 2 weeks    | I, U       |   1107
history summary

所有形式的 yum history summary 命令都会 生成与 yum history list 输出类似的简化表格输出。

如上所示,yum history listyum history summary 都面向事务,尽管它们允许您只显示与给定软件包或软件包相关的事务,但它们缺少重要的详情,如软件包版本。要从软件包的视角列出事务,以 root 用户身份运行以下命令:

yum history package-list glob_expression&hellip;

例 9.22. 跟踪软件包历史记录

例如,要跟踪 subscription-manager 和相关软件包的历史记录,在 shell 提示符后输入以下内容:

~]# yum history package-list subscription-manager\*
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
ID   | Action(s)   | Package
-------------------------------------------------------------------------------
   2 | Updated    | subscription-manager-1.13.22-1.el7.x86_64     EE
   2 | Update     |           1.15.9-15.el7.x86_64     EE
   2 | Obsoleted   | subscription-manager-firstboot-1.13.22-1.el7.x86_64 EE
   2 | Updated    | subscription-manager-gui-1.13.22-1.el7.x86_64   EE
   2 | Update     |             1.15.9-15.el7.x86_64   EE
   2 | Obsoleting   | subscription-manager-initial-setup-addon-1.15.9-15.el7.x86_64 EE
   1 | Install    | subscription-manager-1.13.22-1.el7.x86_64
   1 | Install    | subscription-manager-firstboot-1.13.22-1.el7.x86_64
   1 | Install    | subscription-manager-gui-1.13.22-1.el7.x86_64
history package-list

在本例中,初始系统安装过程中安装了三个软件包:subscription -manager、subscription- manager-firstbootsubscription-manager-gui。在第三个事务中,所有这些软件包已从 1.10.11 更新至 1.10.17 版本。

9.4.2. 检查事务

要以 root 用户身份显示单个事务的摘要,以以下格式使用 yum history summary 命令:

yum history summary id

在这里,id 代表事务的 ID。

要更详细地检查特定的事务或事务,以 root 用户身份运行以下命令:

yum history info id&hellip;

id 参数是可选的,当省略它时,yum 会自动使用最后一个事务。请注意,在指定多个事务时,您还可以使用范围:

yum history info start_id..end_id

例 9.23. yum history info 的输出示例

以下是两个事务的输出示例,每个事务都安装一个新的软件包:

~]# yum history info 4..5
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
Transaction ID : 4..5
Begin time   : Mon Dec 7 16:51:07 2015
Begin rpmdb  : 1252:d2b62b7b5768e855723954852fd7e55f641fbad9
End time    :      17:18:49 2015 (27 minutes)
End rpmdb   : 1253:cf8449dc4c53fc0cbc0a4c48e496a6c50f3d43c5
User      : Maxim Svistunov <msvistun>
Return-Code  : Success
Command Line  : install tigervnc-server.x86_64
Command Line  : reinstall tigervnc-server
Transaction performed with:
  Installed   rpm-4.11.3-17.el7.x86_64         @rhel-7-server-rpms
  Installed   subscription-manager-1.15.9-15.el7.x86_64 @rhel-7-server-rpms
  Installed   yum-3.4.3-132.el7.noarch         @rhel-7-server-rpms
Packages Altered:
  Reinstall tigervnc-server-1.3.1-3.el7.x86_64 @rhel-7-server-rpms
history info

您还可以查看其他信息,如事务时使用的配置选项,或者从哪个存储库以及安装某些软件包的原因。要确定某个事务有哪些可用的额外信息,以 root 用户身份在 shell 提示符后输入以下内容:

yum history addon-info id

yum history info 类似,如果没有提供 id,yum 会自动使用最新的事务。引用最新事务的另一种方法是使用 最后一个 关键字:

yum history addon-info last

例 9.24. yum history addon-info输出示例

对于历史记录中的第四个事务,yum history addon-info 命令提供以下输出:

~]# yum history addon-info 4
Loaded plugins: langpacks, product-id, subscription-manager
Transaction ID: 4
Available additional history information:
 config-main
 config-repos
 saved_tx

history addon-info

yum history addon-info 命令的输出中提供了三种类型的信息:

要显示所选类型的附加信息,以 root 用户身份运行以下命令:

yum history addon-info id information

9.4.3. 恢复和重复事务

除了查看事务历史记录外,yum history 命令还提供了恢复或重复所选事务的方法。要恢复事务,以 root 用户身份在 shell 提示符后输入以下内容:

yum history undo id

要重复特定的事务,以 root 用户身份运行以下命令:

yum history redo id

两个命令也接受 最后一个关键字来 撤销或重复最新的事务。

请注意,yum history undoyum history redo 命令只会恢复或重复事务期间执行的步骤。如果事务安装了新软件包,yum history undo 命令将将其卸载,如果事务卸载了软件包,命令将再次安装它。如果这些较旧的软件包仍然可用,这个命令还会尝试将所有更新的软件包降级到之前的版本。

管理多个相同的系统时,yum 还允许您对其中一个系统执行事务,将事务详细信息存储在文件中,并在经过一段时间测试后,在剩余系统上重复同样的事务。要将事务详情保存到文件中,以 root 用户身份在 shell 提示符后输入以下内容:

yum -q history addon-info id saved_tx > file_name

将此文件复制到目标系统后,您可以以 root 用户身份运行以下命令重复事务:

yum load-transaction file_name

您可以配置 load-transaction 来忽略缺少的软件包或 rpmdb 版本。有关这些配置选项的更多信息,请参阅 yum.conf(5)man page。

9.4.4. 启动新事务历史记录

yum 将事务历史记录存储在单个 SQLite 数据库文件中。要启动新的事务历史记录,以 root 用户身份运行以下命令:

yum history new

这将在 /var/lib/yum/history/ 目录中创建一个新的空数据库文件。将保留旧的事务历史记录,但只要 目录中存在更新的数据库文件,就无法访问。

9.5. 配置 Yum 和 Yum 存储库

yum 及相关实用程序的配置信息位于 /etc/yum.conf。此文件包含一个必填 [main] 部分,它允许您设置具有全局效果的 yum 选项,还可包含一个或多个 [repository] 部分,供您设置特定于存储库的选项。但是,建议您在 /etc/yum.repos.d/ 目录中的新或现有. repo 文件中定义单独的仓库。您在 /etc/yum.conf 文件的单独 [repository] 部分中 定义的值会覆盖 [main] 部分中设置的值。

本节演示了如何:

  • 通过编辑 /etc/yum.conf 配置文件的 [main] 部分来设置全局 yum 选项;
  • 通过编辑 /etc/yum .conf 和 /etc/yum. repos.d/ 目录中的 [repository ] 部分 为单个仓库设置选项;
  • 使用 /etc/yum.conf 中的 yum 变量以及 /etc/yum.repos.d/ 目录中的文件,以便正确处理动态版本和体系结构值;
  • 在命令行中添加、启用和禁用 yum 存储库;和
  • 设置您自己的自定义 yum 存储库。

9.5.1. 设置 [main] 选项

/etc/yum.conf 配置文件正好包含一个 [main] 部分,本节中的一些键值对会影响 yum 的运行方式,另一些则影响 yum 如何处理存储库。

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

/etc/yum.conf 配置文件示例类似如下:

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3

[comments abridged]

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

以下是 [main] 部分中最常用的选项:

assumeyes=value

assumeyes 选项确定 yum 是否提示确认关键操作。使用以下之一替换 value

0默认)- yum 提示确认其执行的关键操作。

1 - 不提示确认重要的 yum 操作.如果设置了 assumeyes=1,yum 的行为与命令行选项 -y--assumeyes 相同。

cachedir=directory

使用此选项设置 yum 存储其缓存和数据库文件的目录。使用 目录的绝对路径替换 directory。默认情况下,yum 的缓存目录为 /var/cache/yum/$basearch/$releasever/

有关 $basearch 和 $ releasever yum 变量的描述,请参阅 第 9.5.3 节 “使用 Yum 变量”

debuglevel=value
这个选项指定 yum 生成的输出调试详情。在这里,值是 110 之间的整数。设置更高的 调试级别 值会导致 yum 显示更详细的调试输出。debuglevel=2 是默认值,而 debuglevel=0 禁用调试输出。
exactarch=value

使用这个选项时,您可以将 yum 设置为在更新已安装的软件包时考虑正确的架构。将 value 替换为:

0 - 在更新软件包时不考虑确切的架构。

1默认)- 在更新包时考虑确切的架构。使用这个设置时,yum 不会安装 32 位体系结构的软件包,以更新已在具有 64 位体系结构的系统中安装的软件包。

exclude=package_name more_package_names
exclude 选项允许您在安装或系统更新期间按关键字排除软件包。通过引用以空格分隔的软件包列表,可实现用于排除的多个软件包列表。允许使用通配符的 shell glob 表达式(如 *?)。
gpgcheck=value

使用 gpgcheck 选项指定 yum 是否应对包执行 GPG 签名检查。将 value 替换为:

0 - 禁止对所有存储库中的软件包进行 GPG 签名检查,包括本地软件包安装.

1默认)- 启用检查所有存储库中所有包的 GPG 签名,包括本地包安装.启用 gpgcheck 后,将检查所有包的签名。

如果在 /etc/yum.conf 文件的 [main] 部分中设置了这个选项,它会为所有存储库设置 GPG 检查规则。但是,您也可以为单个存储库设置 gpgcheck= ;即,您可以在一个存储库上启用 GPG 检查,同时禁用另一个存储库。如果 /etc/yum.conf 中存在单个存储库,则设置 gpgcheck= 会覆盖 默认值。

group_command=value

使用 group_command 选项指定 yum group install、yum group upgradeyum group remove 命令如何处理软件包组。在以下位置替换 value

simple - 安装软件包组的所有成员.仅升级之前安装的软件包,但不要安装在此期间添加到组中的软件包。

compat - 类似于 simple,但 yum 升级 也会安装自上一次升级以来添加到组中的软件包。

对象 - (默认.) 使用这个选项,yum 跟踪之前安装的组,并区分作为组一部分安装的软件包和单独安装的软件包。请查看 例 9.15 “查看 LibreOffice 软件包组的信息”

group_package_types=package_type more_package_types
您可以在调用 yum group install 命令时,指定安装哪些类型的包(可选默认必需)。默认选择默认 和强制软件包类型
history_record=value

使用这个选项,您可以将 yum 设置为记录事务历史记录。使用以下之一替换 value

0 - yum 不应该 记录事务的历史记录条目。

1默认)- yum 应记录事务的历史记录条目.此操作需要一定数量的磁盘空间,并在事务中额外花费一些时间,但它提供了有关过去操作的许多信息,这些信息可通过 yum history 命令显示。history_record=1 是默认值。

有关 yum history 命令的详情请参考 第 9.4 节 “使用事务历史记录”

注意

yum 使用历史记录来检测对 yum 之外已完成的 rpmdb 数据源的修改。在这种情况下,yum 显示警告并自动搜索更改 rpmdb 导致的问题。当 history_record 关闭后,yum 无法检测到这些更改并且不执行自动检查。

installonlypkgs=空格 分隔 的软件包 列表

您可以在此处提供一个以空格分隔的软件包列表,供 yum 安装 ,但不会更新。有关默认仅安装的软件包列表,请参阅 yum.conf(5)手册页。

如果将 installonlypkgs 指令添加到 /etc/yum.conf,请确保列出应仅安装 的所有 包,包括 yum.conf(5)的 installonlypkgs 部分下列出的任何包。特别是,请确保内核软件包始终在 installonlypkgs 中列出(默认情况下,当它们是一样),并且 installonly_limit 始终设置为大于 2 的值,以便在默认软件包无法引导时始终可用备份内核。

installonly_limit=value

此选项设置 installonlypkgs 指令中列出的软件包数量,可以同时安装。使用代表 installonlypkgs 中列出的任意单个软件包的最大版本数的整数替换

installonlypkgs 指令的默认值包含多个不同的内核软件包,因此请注意,更改 installonly_limit 的值也会影响单个内核软件包安装版本的最大数量。/etc/yum.conf 中列出的默认值是 installonly_limit=3,最小可能的值为 installonly_limit=2

您无法设置 installonly_limit=1,因为这会阻止 yum 删除正在运行的内核。如果使用 installonly_limit=1,yum 将失败。

使用 installonly_limit=2 可确保一个备份内核可用。但是,建议保留默认设置 installonly_limit=3,以便您有两个备份内核可用。

keepcache=value

keepcache 选项决定 yum 在安装成功后是否保留标头和软件包的缓存。在这里,值是

0默认)- 在成功安装后,请勿保留标头和软件包的缓存。

1 - 在成功安装后保留缓存.

logfile=file_name
要指定日志输出的位置,请将 file_name 替换为 yum 应在其中写入其日志输出的文件的绝对路径。默认情况下,yum logs to /var/log/yum.log
max_connenctions=number
此处的值代表并发连接的最大数量,默认为 5。
multilib_policy=value

如果有多个架构版本可用于软件包安装,则 multilib_policy 选项会设置安装行为。在这里,值代表

最佳 - 为这个系统安装最佳选择架构.例如:在 AMD64 系统中设置 multilib_policy=best 会导致 yum 安装 64 位软件包版本。

all - 始终为每个软件包安装所有可能的架构.例如:当 AMD64 系统中将 multilib_policy 设置为 all 时,yum 会安装软件包的 i686 和 AMD64 版本(如果两者都可用)。

obsoletes=value

obsoletes 选项在更新过程中启用过时的进程逻辑。When 在其 spec 文件中声明它弃用 另一个软件包,在安装了前一个软件包时,前一个软件包会被替换掉。例如,当软件包被重命名时,会声明过时的项。使用以下之一替换 value

0 - 在执行更新时禁用 yum 的过时处理逻辑。

1默认)- 在执行更新时启用 yum 的过时处理逻辑。

plugins=value

这是一个全局交换机来启用或禁用 yum 插件,value 是:

0 - 全局禁用所有 yum 插件.

重要

不建议禁用所有插件,因为某些插件提供重要的 yum 服务。特别是 product-idsubscription-manager 插件,它支持基于证书 的内容交付网络 (CDN)。全局禁用插件作为方便选项,通常仅在诊断 yum 潜在问题时才建议使用。

1默认)- 全局启用所有 yum 插件.使用 plugins=1 时,您仍然可以通过在该插件配置文件中设置 enabled=0 来禁用特定的 yum 插件。

有关各种 yum 插件的详情请参考 第 9.6 节 “yum 插件”。有关控制插件的详情请参考 第 9.6.1 节 “启用、配置和禁用 Yum 插件”

reposdir=directory
此处,目录 是指向其中 .repo 文件的 目录的绝对路径。all .repo 文件包含存储库信息(类似于 /etc/yum.conf 的 [ repository] 部分 )。yum 从 .repo 文件和 /etc/yum.conf 文件的 [repository] 部分 收集所有存储库信息,以创建要用于事务的存储库的主列表。如果没有设置 reposdir,yum 将使用默认目录 /etc/yum.repos.d/
retries=value
此选项设置 yum 在返回错误之前应尝试检索文件的次数。 是一个整数 0 或更高。将值设为 0 时,yum 会永久重试。默认值为 10

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

9.5.2. 设置 [repository] 选项

[repository] 部分,其中 repository 是唯一存储库 ID,如 my_personal_repo (不允许空间),允许您定义单独的 yum 存储库。为避免冲突,自定义存储库不应使用红帽存储库使用的名称。

以下是 [repository] 部分 采用的形式的最小示例:

[repository]
name=repository_name
baseurl=repository_url

每个 [repository ] 部分必须包含以下指令:

name=repository_name
此处 repository_name 是描述存储库的人类可读字符串。
baseurl=repository_url

使用存储库数据目录所在目录的 URL 替换 repository_url

  • 如果存储库可以通过 HTTP 提供,请使用: http://path/to/repo
  • 如果可以通过 FTP 获取软件仓库,请使用: ftp://path/to/repo
  • 如果仓库对机器而言是本地的,请使用: file:///path/to/local/repo
  • 如果特定的在线存储库需要基本的 HTTP 身份验证,您可以通过将用户名和密码放在 URL 中作为 用户名密码@链接 来指定您的用户名和密码。例如:如果 http://www.example.com/repo/ 上的存储库需要用户名"user"和密码"password",则可将 baseurl 链接指定为 http://user:/repo/

    这个 URL 通常是一个 HTTP 链接,例如:

    baseurl=http://path/to/repo/releases/$releasever/server/$basearch/os/

    请注意,yum 总是扩展 URL 中的 $releasever、$arch$basearch 变量。有关 yum 变量的详情请参考 第 9.5.3 节 “使用 Yum 变量”

其他有用的 [repository] 指令包括:

enabled=value

这是告诉 yum 使用或忽略特定库的简单方法,value 是:

0 - 在执行更新和安装时,不要将此存储库作为软件包源包含在内。这是快速打开和关闭存储库的一种简单方法,当您希望从不需要启用更新或安装的仓库中单个软件包时,这很有用。

1 - 将此仓库作为包源包含在内.

也可以通过将 --enablerepo=repo_name 或 --disablerepo=repo_name 选项传递到 yum,或通过 PackageKit 程序的 Add/Remove Software 窗口来执行打开和关闭存储库。

async=value

控制存储库软件包的并行下载。在这里,值是

auto默认)- 如果可能,将使用并行下载,这意味着 yum 会自动为插件创建的存储库禁用它,以避免故障。

on - 为存储库启用并行下载。

off - 禁止并行下载。

还有 [存储库] 选项,其中一部分具有与特定 [main] 选项 相同的形式和功能。有关完整列表,请查看 yum.conf(5)手册页中的 [repository] OPTIONS 部分。

例 9.25. /etc/yum.repos.d/redhat.repo 文件示例

以下是 /etc/yum.repos.d/redhat.repo 文件示例:

#
# Red Hat Repositories
# Managed by (rhsm) subscription-manager
#

[red-hat-enterprise-linux-scalable-file-system-for-rhel-6-entitlement-rpms]
name = Red Hat Enterprise Linux Scalable File System (for RHEL 6 Entitlement) (RPMs)
baseurl = https://cdn.redhat.com/content/dist/rhel/entitlement-6/releases/$releasever/$basearch/scalablefilesystem/os
enabled = 1
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify = 1
sslcacert = /etc/rhsm/ca/redhat-uep.pem
sslclientkey = /etc/pki/entitlement/key.pem
sslclientcert = /etc/pki/entitlement/11300387955690106.pem

[red-hat-enterprise-linux-scalable-file-system-for-rhel-6-entitlement-source-rpms]
name = Red Hat Enterprise Linux Scalable File System (for RHEL 6 Entitlement) (Source RPMs)
baseurl = https://cdn.redhat.com/content/dist/rhel/entitlement-6/releases/$releasever/$basearch/scalablefilesystem/source/SRPMS
enabled = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify = 1
sslcacert = /etc/rhsm/ca/redhat-uep.pem
sslclientkey = /etc/pki/entitlement/key.pem
sslclientcert = /etc/pki/entitlement/11300387955690106.pem

[red-hat-enterprise-linux-scalable-file-system-for-rhel-6-entitlement-debug-rpms]
name = Red Hat Enterprise Linux Scalable File System (for RHEL 6 Entitlement) (Debug RPMs)
baseurl = https://cdn.redhat.com/content/dist/rhel/entitlement-6/releases/$releasever/$basearch/scalablefilesystem/debug
enabled = 0
gpgcheck = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify = 1
sslcacert = /etc/rhsm/ca/redhat-uep.pem
sslclientkey = /etc/pki/entitlement/key.pem
sslclientcert = /etc/pki/entitlement/11300387955690106.pem

9.5.3. 使用 Yum 变量

您可以在 yum 命令和所有 yum 配置文件(即 /etc/yum .conf 和 /etc/yum. repos. d/ 目录中的 all.repo 文件)中使用和引用以下内置变量:

$releasever
您可以使用这个变量来引用 Red Hat Enterprise Linux 的发行版本。yum 从 /etc/yum.conf 配置文件中的 distroverpkg=value 行获取 $releasever 的值。如果 /etc/yum.conf 中没有此类行,那么 yum 会从提供 redhat-release 文件的 redhat-release产品 包中获得版本号来推断正确的值。
$arch
您可以在调用 Python 的s os.uname() 功能时,使用此变量指代系统的 CPU 架构。$arch 的有效值包括: i586i686x86_64
$basearch
您可以使用 $basearch 来引用系统基本架构。例如,i686 和 i586 机器都具有 i386 基本架构,AMD64 和 Intel 64 机器基本架构为 x86_64
$YUM0-9
这些十个变量各自替换为同名任何 shell 环境变量的值。如果其中一个变量被引用(例如在 /etc/yum.conf 中)和一个具有相同名称的 shell 环境变量不存在,则不会替换配置文件变量。

要定义自定义变量或覆盖现有变量的值,请在 /etc/yum/vars/ 目录中创建一个名称与变量相同的文件(不含 "$" 符号),并在第一行中添加所需的值。

例如,存储库描述通常包含操作系统名称。要定义名为 $osname 的新变量,请在第一行中创建一个带有"Red Enterprise Linux"的新文件,并将它保存为 /etc/yum/vars/osname:

~]# echo "Red Hat Enterprise Linux 7" > /etc/yum/vars/osname

现在,您可以在 .repo 文件中使用以下内容而不是 " Red Hat Enterprise Linux 7":

name=$osname $releasever

9.5.4. 查看当前配置

要显示全局 yum 选项(即 /etc/yum.conf 文件的 [main] 部分指定的选项)的当前值,请使用不带命令行选项的 yum-config-manager 命令执行 yum-config-manager 命令:

yum-config-manager

要列出不同配置部分或部分的内容,请使用以下格式的命令:

yum-config-manager section&hellip;

您还可以使用 glob 表达式显示所有匹配部分的配置:

yum-config-manager glob_expression&hellip;

例 9.26. 查看主部分的配置

要列出所有配置选项及其主部分对应的值,在 shell 提示符后输入以下内容:

~]$ yum-config-manager main \*
Loaded plugins: langpacks, product-id, subscription-manager
================================== main ===================================
[main]
alwaysprompt = True
assumeyes = False
bandwith = 0
bugtracker_url = https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%206&component=yum
cache = 0
[output truncated]

9.5.5. 添加、启用和禁用 Yum 存储库

第 9.5.2 节 “设置 [repository] 选项” 描述用来定义 yum 存储库的各种选项。本节介绍如何使用 yum-config-manager 命令添加、启用和禁用存储库。

重要

使用红帽订阅管理注册到基于证书 的内容交付网络 (CDN)时,Red Hat Subscription Manager 工具 用于管理 /etc/yum.repos.d/redhat.repo 文件中的存储库。

添加 Yum 存储库

要定义新存储库,您可以将 [repository] 部分 添加到 /etc/yum.conf 文件,也可以添加到 /etc/yum.repos.d/ 目录中的 a. repo 文件。此目录中带有 .repo 文件扩展名的所有文件都由 yum 读取,建议您在此处定义您的程序库,而不是在 /etc/yum.conf 中定义。

警告

从红帽 的内容交付网络 (CDN)之外的不受验证或不受信任的软件来源获取和安装软件包会带来潜在的安全风险,并可能导致安全性、稳定性、兼容性和可维护性问题。

Yum 存储库通常提供自己的 .repo 文件。要在您的系统中添加此类存储库并启用它,以 root 用户身份运行以下命令:

yum-config-manager --add-repo repository_url

repository_url 是指向 .repo 文件的链接。

例 9.27. 添加 example.repo

要添加位于 http://www.example.com/example.repo 的软件仓库,在 shell 提示符后输入以下内容:

~]# yum-config-manager --add-repo http://www.example.com/example.repo
Loaded plugins: langpacks, product-id, subscription-manager
adding repo from: http://www.example.com/example.repo
grabbing file http://www.example.com/example.repo to /etc/yum.repos.d/example.repo
example.repo                       | 413 B   00:00
repo saved to /etc/yum.repos.d/example.repo

启用 Yum 存储库

要启用特定的存储库或存储库,以 root 用户身份在 shell 提示符后输入以下内容:

yum-config-manager --enable repository&hellip;

…其中 repository 是唯一的存储库 ID(使用 yum repolist all 列出可用的存储库 ID)。或者,您可以使用 glob 表达式启用所有匹配的软件仓库:

yum-config-manager --enable glob_expression&hellip;

例 9.28. 启用 /etc/yum.conf 的自定义部分中定义的仓库.

要启用 [example]、[example -debuginfo][example-source]部分中定义的软件仓库,请输入:

~]# yum-config-manager --enable example\*
Loaded plugins: langpacks, product-id, subscription-manager
============================== repo: example ==============================
[example]
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7Server
baseurl = http://www.example.com/repo/7Server/x86_64/
cache = 0
cachedir = /var/cache/yum/x86_64/7Server/example
[output truncated]

例 9.29. 启用所有软件仓库

要启用 /etc/yum .conf 文件和 /etc/yum. repos.d/ 目录中定义的所有软件仓库,请输入:

~]# yum-config-manager --enable \*
Loaded plugins: langpacks, product-id, subscription-manager
============================== repo: example ==============================
[example]
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7Server
baseurl = http://www.example.com/repo/7Server/x86_64/
cache = 0
cachedir = /var/cache/yum/x86_64/7Server/example
[output truncated]

成功后,yum-config-manager --enable 命令显示当前的存储库配置。

禁用 Yum 存储库

要禁用 yum 存储库,以 root 用户身份运行以下命令:

yum-config-manager --disable repository&hellip;

…其中 repository 是唯一的存储库 ID(使用 yum repolist all 列出可用的存储库 ID)。与 yum-config-manager --enable 类似,您可以使用 glob 表达式同时禁用所有匹配的存储库:

yum-config-manager --disable glob_expression&hellip;

例 9.30. 禁用所有软件仓库

要禁用在 /etc/yum.conf 文件和 /etc/yum. repos.d/ 目录中定义的所有软件仓库,请输入:

~]# yum-config-manager --disable \*
Loaded plugins: langpacks, product-id, subscription-manager
============================== repo: example ==============================
[example]
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7Server
baseurl = http://www.example.com/repo/7Server/x86_64/
cache = 0
cachedir = /var/cache/yum/x86_64/7Server/example
[output truncated]

成功后,yum-config-manager --disable 命令显示当前配置。

9.5.6. 创建 Yum 存储库

设置 yum 存储库:

  1. 安装 createrepo 软件包:

    # yum install createrepo
  2. 将新存储库的所有软件包复制到一个目录中,如 /tmp/local_repo/

    cp /your/packages/*.rpm /tmp/local_repo/
  3. 创建存储库运行:

    createrepo /tmp/local_repo/

    这会为 yum 存储库创建必要的元数据,并将元数据放置在新创建的子目录 repodata 中。

    现在,该程序库可以被 yum 使用。此存储库可以通过 HTTP 或 FTP 协议共享,或者直接从本地计算机引用。有关如何配置 yum 软件仓库的详情,请查看 第 9.5.2 节 “设置 [repository] 选项” 部分。

    注意

    在构建存储库的 URL 时,请参考 /mnt/local_repo,而不是 /mnt/local_repo/repodata,因为此目录仅包含元数据。实际的 yum 软件包位于 /mnt/local_repo 中

9.5.6.1. 将软件包添加到已创建的 yum 软件仓库

将软件包添加到已创建的 yum 存储库:

  1. 将新软件包复制到您的仓库目录中,如 /tmp/local_repo/:

    cp /your/packages/*.rpm /tmp/local_repo/
  2. 要反映元数据中新添加的软件包,请运行:

    createrepo --update /tmp/local_repo/
  3. 可选:如果您已经使用任何 yum 命令用于新更新的存储库,请运行:

    yum clean expire-cache

9.5.7. 添加 Optional 和 Supplementary 存储库

可选和补充订阅频道为 Red Hat Enterprise Linux 提供了额外的软件包,包括开源许可软件(在可选频道中)和专有许可软件(在 Supplementary 频道中)。

在订阅 Optional 和 Supplementary 频道前,请查看覆盖范围详情如果您决定从这些频道安装软件包,请按照红帽客户门户网站中名为 How to access Optional 和 Supplementary 频道以及 -devel 软件包(RHSM)中的步骤进行操作

9.6. yum 插件

yum 提供扩展和增强操作的插件。默认安装某些插件。每当您调用任何 yum 命令时,yum 始终会通知您加载和活动的插件(如果有)。例如:

~]# yum info yum
Loaded plugins: langpacks, product-id, subscription-manager
[output truncated]

请注意,Loaded 插件后面的插件 名称是您可以向 --disableplugin=plugin_name 选项提供的名称。

9.6.1. 启用、配置和禁用 Yum 插件

要启用 yum 插件,请确保 /etc/yum.conf[main] 部分中存在以 plugins= 开头的行,并确保其值为 1

plugins=1

您可以通过将此行更改为 plugins=0 来禁用所有插件。

重要

不建议禁用所有插件,因为某些插件提供重要的 yum 服务。特别是 product-idsubscription-manager 插件,它们为基于证书的 内容发布网络 (CDN)提供支持。全局禁用插件作为方便选项,通常仅在诊断 yum 潜在问题时才建议使用。

每个安装的插件在 /etc/yum/pluginconf.d/ 目录中都有自己的配置文件。您可以在这些文件中设置插件特定选项。例如,以下是 aliases 插件的 aliases .conf 配置文件:

[main]
enabled=1

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

如果您通过在 /etc/yum.conf 中设置 enabled=0 来禁用所有插件,则所有插件都会禁用,无论它们的各个配置文件中是否启用了它们。

如果您只想禁用单个 yum 命令 的所有 yum 插件,请使用 --noplugins 选项。

如果要为单个 yum 命令 禁用一个或多个 yum 插件,请在该命令中添加 --disableplugin=plugin_name 选项。例如,要在更新系统时禁用 aliases 插件,请输入:

~]# yum update --disableplugin=aliases

您提供给 --disableplugin= 选项的插件名称与任何 yum 命令输出中 Loaded plugins 行后列出的名称相同。您可以通过逗号分隔多个插件。另外,您可以使用 glob 表达式匹配多个插件名称或缩短长名称:

~]# yum update --disableplugin=aliases,lang*

9.6.2. 安装额外的 Yum 插件

yum 插件通常遵循 yum-plugin-plugin_name package-naming 规则,但并不总是如此:提供 kabi 插件的软件包名为 kabi-yum-plugins。您可以像安装其他软件包一样安装 yum 插件。例如,要安装 yum-aliases 插件,在 shell 提示符后输入以下内容:

~]# yum install yum-plugin-aliases

9.6.3. 使用 Yum 插件

以下列表提供了多个有用的 yum 插件的说明和用法说明。插件按照名称列出,方括号中含有软件包的名称。

search-disabled-repos (subscription-manager)

search-disabled-repos 插件允许您临时或永久启用禁用的软件仓库,以帮助解决依赖项。启用此插件后,当 Yum 由于依赖项解析失败而无法安装软件包时,它提供 暂时启用禁用的存储库并重试。如果安装成功,Yum 也提供可永久启用已使用存储库的存储库。请注意,该插件仅适用于由 subscription-manager 管理的存储库,而不是自定义存储库。

重要

如果使用 --assumeyes-y 选项执行 yum,或者在 /etc/yum.conf 中启用了 assumeyes 指令,则插件可在不提示确认的情况下暂时和永久启用禁用的存储库。这可能会导致问题,例如启用您不想启用的软件仓库。

要配置 search-disabled-repos 插件,编辑位于 /etc/yum/pluginconf.d/search-disabled-repos.conf 中的配置文件。有关您可以在 [main] 部分中使用的指令列表,请参考下表。

表 9.3. 支持的 search-disabled-repos.conf 指令

指令描述

enabled=value

允许您启用或禁用插件。该 必须是 1 (启用)或 0 (禁用)。插件默认启用。

notify_only=value

允许您将插件的行为限制为仅通知。该 必须是 1 (仅不修改 Yum 的行为)或 0 (修改 Yum 的行为)。默认情况下,插件仅通知用户。

ignored_repos=repositories

允许您指定插件不会启用的存储库。

kabi (kabi-yum-plugins)

kabi 插件检查驱动程序更新软件包是否符合官方 Red Hat kernel Application Binary Interface( kABI)。启用此插件后,当用户尝试安装使用不在白名单中的内核符号的软件包时,会将警告消息写入系统日志。另外,将插件配置为以强制模式运行可防止安装此类软件包。

要配置 kabi 插件,请编辑位于 /etc/yum/pluginconf.d/kabi.conf 中的配置文件。下表中显示了 [main] 部分中可以使用的指令列表。

表 9.4. 支持的 kabi.conf 指令

指令描述

enabled=value

允许您启用或禁用插件。该 必须是 1 (启用)或 0 (禁用)。安装之后,插件会被默认启用。

whitelists=directory

允许您指定包含内核符号的文件所在的目录。默认情况下,kabi 插件使用 kernel-abi-whitelists 软件包(即 /usr/lib/modules/kabi-rhel70/ 目录)提供的文件。

enforce=value

允许您启用或禁用强制模式。该 必须是 1 (启用)或 0 (禁用)。默认情况下,这个选项被注释掉,kabi 插件只会显示警告消息。

product-id (subscription-manager)
product-id 插件管理从 Content Delivery Network 安装的产品的产品身份证书。product-id 插件会被默认安装。
语言包( yum-langpacks)
langpacks 插件用于为安装的每个软件包搜索所选语言的区域化软件包。langpacks 插件默认安装。
别名 (yum-plugin-aliases)
aliases 插件 添加 alias 命令行选项 该选项允许为 yum 命令配置和使用别名。
yum-changelog (yum-plugin-changelog)
yum-changelog 插件添加 --changelog 命令行选项,可启用在更新之前和之后查看软件包更改日志。
yum-tmprepo (yum-plugin-tmprepo)
yum-tmprepo 插件添加 --tmprepo 命令行选项,该选项采用存储库文件的 URL,下载并启用该存储库文件。此插件会尝试确保安全地临时使用存储库。默认情况下,它不允许禁用 gpg 检查。
yum-verify (yum-plugin-verify)
yum-verify 插件添加了 verify 、valid-rpmverify-all 命令行选项,用于查看系统上的验证数据。
yum-versionlock (yum-plugin-versionlock)
yum-versionlock 插件排除所选软件包的其他版本,这可防止软件包被新版本更新。使用 versionlock 命令行选项,您可以查看和编辑锁定的软件包列表。

9.7. 使用 Yum-cron 自动刷新软件包数据库和下载更新

yum-cron 服务会自动检查并下载软件包更新。安装后 yum-cron 服务提供的 cron 作业将立即处于活动状态。yum-cron 服务也可以自动安装下载的更新。

使用默认设置,yum-cron 服务:

  • 每小时更新 yum 缓存中的元数据。
  • 将待处理软件包更新下载至 yum 缓存每天一次。如果存储库中提供了新软件包,则会发送电子邮件。如需更多信息,请参阅第 第 9.7.2 节 “设置可选电子邮件通知” 章。

yum-cron 服务有两个配置文件:

/etc/yum/yum-cron.conf
用于日常任务。
/etc/yum/yum-cron-hourly.conf
用于每小时任务。

9.7.1. 启用自动安装更新

要启用自动安装下载的更新,请通过设置 apply_updates 选项来编辑每日安装的配置文件或每小时安装的配置文件:

apply_updates = yes

9.7.2. 设置可选电子邮件通知

默认情况下,yum-cron 服务使用 cron 来发送包含已执行命令输出的电子邮件。此电子邮件按照 cron 配置发送,通常发送到本地超级用户,并存储在 /var/spool/mail/root 文件中。

您可以使用不同于影响所有 cron 作业 的设置的特定电子邮件配置。但是,此电子邮件配置不支持 TLS,整个电子邮件内置逻辑非常基本。

启用 yum-cron 内置电子邮件通知:

  1. 打开所选 yum-cron 配置文件:

    /etc/yum/yum-cron.conf
    用于日常任务。
    /etc/yum/yum-cron-hourly.conf
    用于每小时任务。
  2. [emitters] 部分,设置以下选项:

    emit_via = email
  3. 根据需要设置 email_fromemail_toemail_host 选项

9.7.3. 启用或禁用特定存储库

yum-cron 不支持对存储库的特定配置。作为为 yum-cron 启用或禁用特定软件仓库的一个临时解决方案,但一般不要为 yum 启用或禁用以下步骤:

  1. 创建系统任意位置的空存储库配置目录。
  2. /etc/yum.repos.d/ 目录中的所有配置文件复制到此新创建的目录中。
  3. /etc/yum.repos.d/ 中的对应. repo 配置文件中, 按如下所示设置 启用 的选项:

    已启用 = 1
    启用存储库:
    已启用 = 0
    以禁用存储库。
  4. 在所选 yum-cron 配置文件的末尾添加以下选项,它指向新创建的存储库目录:

    reposdir=/path/to/new/reposdir

9.7.4. 测试 Yum-cron 设置

在不等待下一次调度 yum-cron 任务的情况下测试 yum-cron 设置:

  1. 打开所选 yum-cron 配置文件:

    /etc/yum/yum-cron.conf
    用于日常任务。
    /etc/yum/yum-cron-hourly.conf
    用于每小时任务。
  2. 在所选配置文件中设置 random_sleep 选项,如下所示:

    random_sleep = 0
  3. 运行配置文件:

    # yum-cron /etc/yum/yum-cron.conf
    # yum-cron /etc/yum/yum-cron-hourly.conf

9.7.5. 禁用 Yum-cron 消息

yum-cron 消息无法完全禁用,但只能限制为具有关键优先级的消息。限制信息:

  1. 打开所选 yum-cron 配置文件:

    /etc/yum/yum-cron.conf
    用于日常任务。
    /etc/yum/yum-cron-hourly.conf
    用于每小时任务。
  2. 在配置文件的 [base] 部分中设置以下选项:

    debuglevel = -4

9.7.6. 自动清除软件包

yum-cron 服务不支持删除与 yum clean all 命令类似的包的任何配置选项。要自动清理软件包,您可以将 cron 作业创建为可执行 shell 脚本:

  1. /etc/cron.daily/ 目录中创建一个 shell 脚本,其中包含:

    #!/bin/sh
    yum clean all
  2. 使脚本可执行:

    # chmod +x /etc/cron.daily/script-name.sh

9.8. 其它资源

有关如何在 Red Hat Enterprise Linux 中管理软件包的详情,请查看以下列出的资源。

安装的文档

  • yum(8)- yum 命令行实用程序的 man page 提供了所支持选项和命令的完整列表。
  • yumdb(8)- yumdb 命令行实用程序的 man page 文档如何使用此工具查询并根据需要更改 yum 数据库。
  • yum.conf(5)- 名为 yum.conf 的 man page 包括了可用的 yum 配置选项。
  • yum-utils(1)- 名为 yum-utils 列表的 man page,简略介绍用于管理 yum 配置、操作存储库和使用 yum 数据库的其他实用程序。

在线资源

  • yum Guides - 项目主页上的 Yum 指南 页面提供了进一步文档的链接。
  • 红帽客户门户 Labs - 红帽客户门户网站 Labs 包括"Yum Repository Configuration Helper"。

另请参阅

部分 IV. 基础架构服务

这部分提供有关如何配置服务和守护进程以及启用对 Red Hat Enterprise Linux 计算机的远程访问的信息。

第 10 章 使用 systemd 管理服务

10.1. systemd 简介

Systemd 是 Linux 操作系统的系统和服务管理器。它设计为与 SysV init 脚本向后兼容,并提供许多功能,如在引导时并行启动系统服务、按需激活后台程序或基于依赖项的服务控制逻辑。在 Red Hat Enterprise Linux 7 中,systemd 替换 Upstart 作为默认的 init 系统。

systemd 引进了 systemd 单元的概念。这些单元由位于 表 10.2 “systemd 单元文件位置” 中列出的目录中的单元配置文件来表示,并封装有关系统服务、侦听套接字以及与 init 系统相关的其他对象的信息。有关可用 systemd 单元类型的完整列表,请参阅 表 10.1 “可用的 systemd 单元类型”

表 10.1. 可用的 systemd 单元类型

单位类型文件扩展描述

服务单元

.service

系统服务。

目标单元

.target

一组 systemd 单元。

Automount 单元

.automount

文件系统自动挂载点。

设备单元

.device

内核可识别的设备文件。

挂载单位

.mount

文件系统挂载点。

路径单元

.path

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

Scope 单元

.scope

外部创建的进程。

Slice 单元

.slice

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

快照单元

.snapshot

已保存的 systemd 管理器状态。

套接字单元

.socket

进程间的通信套接字。

Swap 单元

.swap

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

计时器单元

.timer

systemd 计时器。

表 10.2. systemd 单元文件位置

目录描述

/usr/lib/systemd/system/

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

/run/systemd/system/

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

/etc/systemd/system/

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

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

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

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

DefaultTimeoutStartSec=required value

另请参阅 例 10.21 “更改超时限制”

10.1.1. 主要功能

在 Red Hat Enterprise Linux 7 中,systemd 系统和服务管理器提供以下主要功能:

  • 基于套接字的激活 - 在引导时,systemd 会为支持这类激活的所有系统服务创建侦听套接字,并在套接字启动后立即将套接字传递给这些服务。这不仅允许 systemd 并行启动服务,还使得可以在服务不可用时重新启动服务而不丢失发送到该服务的任何消息:对应的套接字可被访问,所有消息都已排队。

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

  • 基于总线激活 - 将 D-Bus 用于进程间通信的系统服务可以按需启动,当客户端应用第一次尝试与之通信时。Systemd 使用 D-Bus 服务文件进行基于总线的激活
  • 基于设备的激活 - 当特定类型的硬件插入或可用时,支持基于设备的激活的系统服务可以按需启动。Systemd 使用设备单元进行基于设备的激活
  • 基于路径激活 - 当特定文件或目录更改其状态时,支持基于路径激活的系统服务可以按需启动。Systemd 使用路径单元作为基于路径的激活
  • 挂载和自动挂载点管理 - Systemd 监控和管理挂载和自动挂载点。Systemd 使用 mount 单元作为挂载点 ,自动挂载单元用于自动挂载点
  • 积极并行化 - 由于使用了基于套接字的激活,因此所有监听套接字都就 systemd 可以并行启动系统服务。和支持按需激活的系统服务相结合,并行激活可大大减少引导系统所需的时间。
  • 事务性单元激活逻辑 - 在激活或停用单元之前,systemd 计算其依赖项,创建临时交易,并验证此事务是否一致。如果事务不一致,systemd 会自动尝试更正它并从中删除非必要作业,然后再报告错误。
  • 与 SysV init 的后向兼容性 - Systemd 支持 SysV init 脚本,如 Linux 标准基础核心规范 中所述,简化了到 systemd 服务单元的升级路径。

10.1.2. 兼容性更改

systemd 系统和服务管理器的主要设计思想是与 SysV init 和 Upstart 兼容。以下是与之前的 Red Hat Enterprise Linux 系统主发行版本相关的最显著兼容性变化:

  • Systemd 仅对运行级别提供有限支持。它提供了多个可直接映射到这些运行级别的目标单元,出于兼容性的原因,它也通过之前的 运行级别 命令进行分发。然而,并非所有 systemd 目标都可以直接映射到运行级别,因此此命令可能会返回 N 来指明未知运行级别。建议您尽可能避免使用 runlevel 命令。

    有关 systemd 目标及其与运行级别比较的详情请参考 第 10.3 节 “使用 systemd 目标”

  • systemctl 程序不支持自定义命令。除了 启动停止状态 等标准命令外,SysV init 脚本的作者还可以实施对任意命令的支持,以提供额外的功能。例如,可以使用 panic 命令执行 Red Hat Enterprise Linux 6 中 iptables 的 init 脚本,该命令会立即启用 panic 模式,再重新配置系统以开始丢弃所有传入和传出数据包。systemd 不支持,systemctl 接受记录的命令。

    有关 systemctl 工具及其与之前 的服务 工具比较的更多信息,请参阅 第 10.2 节 “管理系统服务”

  • systemctl 实用程序不会与 systemd 启动的服务通信。当 systemd 启动系统服务时,它会保存其主进程的 ID 以跟踪它。然后,systemctl 程序使用这个 PID 来查询和管理该服务。因此,如果用户直接在命令行启动某个特定的守护进程, systemctl 就无法决定其当前状态或停止它。
  • systemd 只停止运行的服务。在以前的版本中,当启动关闭序列时,Red Hat Enterprise Linux 6 及更早版本的系统使用位于 /etc/rc0.d/ 目录中的符号链接来停止所有可用系统服务,而不考虑它们的状态。使用 systemd 时,只有运行的服务才会在关闭时停止。
  • 系统服务无法从标准输入流读取。当 systemd 启动服务时,它会将其标准输入连接到 /dev/null,以防止与用户进行任何交互。
  • 系统服务不继承调用用户及其会话的任何上下文(如 HOMEPATH 环境变量)。每个服务在干净的执行上下文中运行。
  • 加载 SysV 初始化脚本时,systemd 会读取 Linux Standard Base(LSB)标头中编码的依赖信息,并在运行时对其进行解读。
  • 服务单元中的所有操作都会有默认的 5 分钟超时,以防止出现故障的服务中断。这个值在从 initscripts 生成的且无法更改的服务中是被硬编码的。但是,单独的配置文件可用于指定每个服务更长的超时值,请参阅 例 10.21 “更改超时限制”

有关 systemd 引入的兼容性更改的详细列表,请参阅红帽企业 Linux 7 的迁移规划指南

10.2. 管理系统服务

之前的 Red Hat Enterprise Linux 版本使用 SysV init 或 Upstart 分发,使用位于 /etc/rc.d/init.d/ 目录的 init 脚本。这些初始化脚本通常使用 Bash 编写,并允许系统管理员控制其系统中的服务和守护进程状态。在 Red Hat Enterprise Linux 7 中,这些初始化脚本已被服务单元替代

服务单元带有 .service 文件扩展名,其用途与初始化脚本类似。要查看、启动、停止、重启、启用或禁用系统服务,请使用 systemctl 命令,如 表 10.3 “服务实用程序与 systemctl 的比较”表 10.4 “chkconfig 实用程序与 systemctl 的比较” 及其他部分所述。在系统中仍可使用 servicechkconfig 命令,并可按预期工作。这只用于兼容性,应该尽量不使用。

表 10.3. 服务实用程序与 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

显示所有服务的状态。

表 10.4. chkconfig 实用程序与 systemctl 的比较

chkconfigsystemctl描述

chkconfig name on

systemctl enable name.service

启用服务。

chkconfig name off

systemctl disable name.service

禁用服务。

chkconfig --list name

systemctl status name.service

systemctl is-enabled name.service

检查是否启用了服务。

chkconfig --list

systemctl list-unit-files --type service

列出所有服务并检查是否启用它们。

chkconfig --list

systemctl list-dependencies --after

列出在指定单元前排序启动的服务。

chkconfig --list

systemctl list-dependencies --before

列出在指定单元之后排序启动的服务。

指定服务单元

为清楚起见,本节其余部分中的所有命令示例都使用带有 .service 文件扩展名的完整单元名称,例如:

~]# systemctl stop nfs-server.service

但是,可以省略文件扩展名,在这种情况下,system ctl 实用程序假定参数是服务单元。以下命令等同于以上命令:

~]# systemctl stop nfs-server

此外,某些单元具有别名名称。这些名称的名称比单元短,可以使用它们,而不是实际的单元名称。要查找可用于特定单元的所有别名,请使用:

~]# systemctl show nfs-server.service -p Names

systemctl 在 chroot 环境中的行为

如果您使用 chroot 命令更改根目录,大多数 systemctl 命令会拒绝执行任何操作。原因在于 systemd 进程和使用 chroot 命令的用户对 文件系统没有相同的视图。当从 kickstart 文件中调用 systemctl 时会出现这种情况。

一个例外是单元文件命令,如 systemctl enablesystemctl disable 命令。这些命令不需要运行中的系统,也不会影响正在运行的进程,但它们确实会影响单元文件。因此,即使在 chroot 环境中也可以运行这些命令。例如:要在 /srv/website1/ 目录下的系统中启用 httpd 服务:

~]# chroot /srv/website1
~]# systemctl enable httpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.

10.2.1. 列出服务

要列出所有目前载入的服务单元,在 shell 提示下键入以下内容:

systemctl list-units --type service

对于每个服务单元文件,此命令会显示其全名(UNIT),后跟一个备注,该单元文件是否已加载(LOAD)、其高级(ACTIVE)和低级(SUB)单元文件激活状态,以及简短描述(DESCRIPTION)。

默认情况下,systemctl list-units 命令只显示活跃的单位。如果您想列出所有载入的单元,无论它们的状态如何,请使用 --all-a 选项。

systemctl list-units --type service --all

您还可以列出所有可用服务单元以查看是否启用了它们。要做到这一点,请键入:

systemctl list-unit-files --type service

对于每个服务单元,此命令会显示其全名(UNIT FILE),后跟服务单元是否已启用(STATE)的信息有关如何确定独立服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”

例 10.1. 列出服务

要列出所有目前载入的服务单元,请运行以下命令:

~]$ 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
abrt-vmcore.service      loaded active exited Harvest vmcores for ABRT
abrt-xorg.service       loaded active running ABRT Xorg 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-unit-files --type service
UNIT FILE                  STATE
abrt-ccpp.service              enabled
abrt-oops.service              enabled
abrt-vmcore.service             enabled
abrt-xorg.service              enabled
abrtd.service                enabled
...
wpa_supplicant.service           disabled
ypbind.service               disabled

208 unit files listed.

10.2.2. 显示服务状态

要显示与系统服务对应的服务单元的详细信息,请在 shell 提示符后输入以下内容:

systemctl status name.service

使用您要检查的服务单元的名称替换 name(例如: gdm)。这个命令显示所选服务单元的名称,后跟其简短描述、表 10.5 “可用服务单元信息” 中描述的一个或多个字段,如果由 root 用户执行,也是最新的日志条目。

表 10.5. 可用服务单元信息

描述

Loaded

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

Active

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

Main PID

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

Status

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

Process

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

CGroup

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

要只验证某个服务单元是否正在运行,运行以下命令:

systemctl is-active name.service

要确定某个服务单元是否启用,运行:

systemctl is-enabled name.service

请注意,如果指定的服务单元正在运行或已启用,则 systemctl is-activesystemctl is-enabled 的返回退出状态为 0。有关如何列出所有当前载入的服务单元的详情请参考 第 10.2.1 节 “列出服务”

例 10.2. 显示服务状态

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.

例 10.3. 在服务前按顺序显示服务

要确定在指定服务前调度什么服务启动,在 shell 提示下键入以下内容:

~]# 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]

例 10.4. 在服务后显示被启动的服务

要确定在指定服务后调度的服务启动,在 shell 提示符后输入以下内容:

~]# 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

10.2.3. 启动服务

要启动与系统服务对应的服务单元,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl start name.service

使用您要启动的服务单元的名称替换 name(例如: gdm)。这个命令会在当前会话中启动所选服务单元。有关如何在引导时启用服务单元的详情请参考 第 10.2.6 节 “启用服务”。有关如何确定特定服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”

例 10.5. 启动服务

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

~]# systemctl start httpd.service

10.2.4. 停止服务

要停止与系统服务对应的服务单元,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl stop name.service

使用您要停止的服务单元的名称替换 name(例如: bluetooth)。该命令将在当前会话中停止所选服务单元。有关如何禁用服务单元并阻止它在引导时启动的详情请参考 第 10.2.7 节 “禁用服务”。有关如何确定特定服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”

例 10.6. 停止服务

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

~]# systemctl stop bluetooth.service

10.2.5. 重启服务

要重启与系统服务对应的服务单元,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl restart name.service

使用您要重启的服务单元的名称替换 name(例如 httpd)。这个命令可在当前会话中停止所选服务单元,并立即重新启动。最重要的是,如果所选服务单元没有运行,这个命令也会启动它。要让 systemd 仅在相应服务已在运行时重启服务单元,以 root 用户身份运行以下命令:

systemctl try-restart name.service

某些系统服务还允许您在不中断其执行的情况下重新载入其配置。要做到这一点,以 root 用户身份输入:

systemctl reload name.service

请注意,不支持这个功能的系统服务会忽略这个命令。为方便起见,systemctl 命令还支持 reload-or-restartreload-or-try-restart 命令来替代重启这些服务。有关如何确定特定服务单元状态的详情请参考 第 10.2.2 节 “显示服务状态”

例 10.7. 重启服务

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

~]# systemctl reload httpd.service

10.2.6. 启用服务

要配置与系统服务对应的服务单元,在引导时自动启动,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl enable name.service

使用您要启用的服务单元的名称替换 name(例如 httpd)。该命令读取所选服务单元的 [Install] 部分,并在 /etc/systemd/system/ 目录和其子目录中创建到 /usr/lib/systemd/system/name.service 的符号链接。但是,这个命令不会重写已经存在的链接。如果要确保重新创建符号链接,以 root 用户身份使用以下命令:

systemctl reenable name.service

该命令禁用所选服务单元,并立即再次启用。有关如何确定某个服务单元是否已启用在引导时启动的详情请参考 第 10.2.2 节 “显示服务状态”。有关如何在当前会话中启动服务的详情请参考 第 10.2.3 节 “启动服务”

例 10.8. 启用服务

要将 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.

10.2.7. 禁用服务

要防止与系统服务对应的服务单元在引导时自动启动,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl disable name.service

使用您要禁用的服务单元的名称替换 name(例如: bluetooth)。该命令读取所选服务单元的 [Install] 部分,并从 /etc/systemd/system/ 目录及其子目录中删除到 /usr/lib/systemd/system/name.service 文件的符号链接。另外,您可以屏蔽所有服务单元,以防止手动启动或者由其他服务启动。要做到这一点,以 root 运行以下命令:

systemctl mask name.service

这个命令将 /etc/systemd/system/name.service 文件替换为 /dev/null 的符号链接,从而导致 systemd 无法访问实际的单元文件。要恢复这个动作并取消掩码一个服务单元,以 root 用户身份输入:

systemctl unmask name.service

有关如何确定某个服务单元是否已启用在引导时启动的详情请参考 第 10.2.2 节 “显示服务状态”。有关如何在当前会话中停止服务的详情请参考 第 10.2.4 节 “停止服务”

例 10.9. 禁用服务

例 10.6 “停止服务” 演示如何在当前会话中停止 bluetooth.service 单元。要防止这个服务单元在引导时启动,以 root 用户身份在 shell 提示符后输入以下内容:

~]# systemctl disable bluetooth.service
Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed symlink /etc/systemd/system/dbus-org.bluez.service.

10.2.8. 启动冲突服务

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

当您试图启动新服务时,systemd 会自动解析所有依赖项。请注意,这是在没有向用户发出显式通知的情况下完成的。如果您已经运行了服务,且您试图使用负依赖项启动另一个服务,则第一个服务会自动停止。

例如,如果您运行 postfix 服务,并且尝试启动 sendmail 服务,systemd 首先会自动停止 postfix,因为这两个服务彼此冲突且无法在同一个端口上运行。

10.3. 使用 systemd 目标

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

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

Red Hat Enterprise Linux 7 发布有多个预定义目标,它们与之前系统版本中的标准运行级别集类似。出于兼容性的原因,它还为这些目标提供了别名,可将其直接映射到 SysV 运行级别。表 10.6 “SysV 运行级别与 systemd 目标比较” 提供 SysV 运行级别的完整列表及其相应的 systemd 目标。

表 10.6. 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

关闭并重启系统。

要查看、更改或配置 systemd 目标,请使用 systemctl 工具,如 表 10.7 “SysV init 命令与 systemctl 的比较” 和以下部分所述。运行级别telinit 命令仍可在系统中使用,并可按预期工作,但只出于兼容性原因被包括在内,因此应该尽量避免使用。

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

旧命令新命令描述

runlevel

systemctl list-units --type target

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

telinit runlevel

systemctl isolate name.target

更改当前目标。

10.3.1. 查看默认目标

要确定默认使用哪个目标单元,运行以下命令:

systemctl get-default

这个命令解析位于 /etc/systemd/system/default.target 的符号链接并显示结果。有关如何更改默认目标的详情请参考 第 10.3.3 节 “更改默认目标”。有关如何列出所有当前载入的目标单元的详情请参考 第 10.3.2 节 “查看当前目标”

例 10.10. 查看默认目标

要显示默认目标单元,键入:

~]$ systemctl get-default
graphical.target

10.3.2. 查看当前目标

要列出所有当前载入的目标单元,在 shell 提示下键入以下命令:

systemctl list-units --type target

对于每个目标单元,这个命令会显示其全名(UNIT),后跟一个备注,该单元是否已加载(LOAD)、其高级(ACTIVE)和低级(SUB)单元激活状态,以及简短描述(DESCRIPTION)。

默认情况下,systemctl list-units 命令只显示活跃的单位。如果您想列出所有载入的单元,无论它们的状态如何,请使用 --all-a 选项。

systemctl list-units --type target --all

有关如何显示默认目标的详情,请查看 第 10.3.1 节 “查看默认目标”。有关如何更改当前目标的详情请参考 第 10.3.4 节 “更改当前目标”

例 10.11. 查看当前目标

要列出所有当前载入的目标单元,请运行以下命令:

~]$ 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. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

10.3.3. 更改默认目标

要将系统配置为默认使用不同的目标单元,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl set-default name.target

name 替换为您要默认使用的目标单元的名称(例如: multi-user)。这个命令将 /etc/systemd/system/default.target 文件替换为指向 /usr/lib/systemd/system/name.target 符号链接,其中 name 是您要使用的目标单元的名称。有关如何更改当前目标的详情请参考 第 10.3.4 节 “更改当前目标”。有关如何列出所有当前载入的目标单元的详情请参考 第 10.3.2 节 “查看当前目标”

例 10.12. 更改默认目标

要将系统配置为默认使用 multi-user.target 单元,以 root 用户身份运行以下命令:

~]# 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'

10.3.4. 更改当前目标

要切换到当前会话中的不同目标单元,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl isolate name.target

使用您要使用的目标单元的名称替换 name(例如: multi-user)。这个命令启动名为 name 的目标单元 以及所有依赖的单元,并立即停止所有其它单元。有关如何更改默认目标的详情请参考 第 10.3.3 节 “更改默认目标”。有关如何列出所有当前载入的目标单元的详情请参考 第 10.3.2 节 “查看当前目标”

例 10.13. 更改当前目标

要关闭图形用户界面并改为当前会话中的 multi-user.target 单元,以 root 用户身份运行以下命令:

~]# systemctl isolate multi-user.target

10.3.5. 进入救援模式

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

要改变当前目标并在当前会话中进入救援模式,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl rescue

这个命令和 systemctl isolate rescue.target 类似,但它也会向所有当前登录到系统的用户发送一个信息信息。要防止 systemd 发送这个信息,使用 --no-wall 命令行选项运行这个命令:

systemctl --no-wall rescue

有关如何进入紧急模式的详情请参考 第 10.3.6 节 “进入紧急模式”

例 10.14. 进入救援模式

要在当前会话中进入救援模式,以 root 以用户身份运行以下命令:

~]# 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!

10.3.6. 进入紧急模式

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

要改变当前目标并进入紧急模式,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl emergency

这个命令和 systemctl isolate emergency.target 类似,但它也会向所有当前登录到系统的用户发送一个信息信息。要防止 systemd 发送这个信息,使用 --no-wall 命令行选项运行这个命令:

systemctl --no-wall emergency

有关如何进入救援模式的详情请参考 第 10.3.5 节 “进入救援模式”

例 10.15. 进入紧急模式

要进入紧急模式而不向目前登录到该系统的所有用户发送信息,以 root 用户身份运行以下命令:

~]# systemctl --no-wall emergency

10.4. 关闭、托管和占用系统

在 Red Hat Enterprise Linux 7 中,systemctl 工具 替换了之前版本的 Red Hat Enterprise Linux 系统中使用的很多电源管理命令。出于兼容性的原因,表 10.8 “Power Management 命令与 systemctl 的比较” 中列出的命令仍然可用,但建议您尽可能使用 systemctl

表 10.8. Power Management 命令与 systemctl 的比较

旧命令新命令描述

halt

systemctl halt

关闭系统。

poweroff

systemctl poweroff

关闭系统。

reboot

systemctl reboot

重启该系统。

pm-suspend

systemctl suspend

挂起系统。

pm-hibernate

systemctl hibernate

休眠系统。

pm-suspend-hybrid

systemctl hybrid-sleep

休眠并挂起系统。

10.4.1. 关闭系统

systemctl 实用程序提供关闭系统的命令,但也支持传统的 shutdown 命令。虽然 shutdown 命令会调用 systemctl 实用程序执行关闭,但它支持使用一个时间参数。这对预定的维护特别有用,用户可以有足够的时间响应系统已经调度关闭的警告。取消关闭的选项也很优越。

使用 systemctl 命令

要关闭系统并关闭机器,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl poweroff

要在不关闭机器的情况下关闭和停止系统,以 root 用户运行以下命令:

systemctl halt

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

systemctl --no-wall poweroff
使用 shutdown 命令

要关闭该系统并在一定时间关闭机器,以 root 用户身份使用以下格式的命令:

shutdown --poweroff hh:mm

这里的 hh:mm 是 24 小时时钟格式的时间。/run/nologin 文件会在系统关闭前 5 分钟创建,以防止新的登录。当使用时间参数时,可以选择将一个信息(wall message)附加至命令中。

要在一段延迟后关闭和停止系统,在不关闭机器的情况下,以 root 用户身份使用以下格式的命令:

shutdown --halt +m

其中 +m 是延迟时间(以分钟为单位)。now 等同于 +0

等待被关闭的系统可由 root 用户取消,如下所示:

shutdown -c

更多命令选项请查看 shutdown(8) 手册页。

10.4.2. 重启系统

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

systemctl reboot

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

systemctl --no-wall reboot

10.4.3. 挂起系统

要挂起系统,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl suspend

该命令在 RAM 中保存系统状态,除了 RAM 模块外,关闭机器中的大多数设备。当您重新打开机器时,系统会从内存中恢复其状态,而无需再次引导。由于系统状态保存在 RAM 中而不是保存在硬盘中,将系统从挂起模式恢复比从休眠状态恢复要快得多,但因此,暂停的系统状态也容易出现电源中断。

有关如何休眠系统的详情请参考 第 10.4.4 节 “休眠系统”

10.4.4. 休眠系统

要休眠系统,以 root 用户身份在 shell 提示符后输入以下内容:

systemctl hibernate

该命令在硬盘驱动器中保存系统状态,并断开机器电源。当您重新打开机器时,系统会从保存的数据中恢复其状态,而无需再次引导。由于系统状态保存在硬盘中,而不是保存在 RAM 中,因此计算机不必维护 RAM 模块的电力,但因此,将系统从休眠模式恢复比将其恢复为暂停模式要慢得多。

要让系统休眠并暂停系统,以 root 用户身份运行以下命令:

systemctl hybrid-sleep

有关如何挂起该系统的详情请参考 第 10.4.3 节 “挂起系统”

10.5. 控制远程机器上的 systemd

除了在本地控制 systemd 系统和服务管理器外,system ctl 还允许您通过 SSH 协议与远程机器上运行的 systemd 交互。如果远程机器上的 sshd 服务正在运行,您可以使用 --host-H 命令行选项运行 systemctl 命令来连接此机器:

systemctl --host user_name@host_name command

使用远程用户名称替换 user _namehost_name 替换为计算机的主机名,而 command 替换为上述任何 systemctl 命令。请注意,远程计算机必须配置为允许选定的用户通过 SSH 协议进行远程访问。有关如何配置 SSH 服务器的详情请参考 第 12 章 OpenSSH

例 10.16. 远程管理

以 root 用户身份登录名为 server-01.example.com 的远程机器 并确定 httpd.service 单元的当前状态,在 shell 提示符后输入以下内容:

~]$ systemctl -H root@server-01.example.com status httpd.service
>>>>>>> systemd unit files -- update
root@server-01.example.com's password:
httpd.service - The Apache HTTP Server
  Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
  Active: active (running) since Fri 2013-11-01 13:58:56 CET; 2h 48min ago
 Main PID: 649
  Status: "Total requests: 0; Current requests/sec: 0; Current traffic:  0 B/sec"
  CGroup: /system.slice/httpd.service

10.6. 创建和修改 systemd 单元文件

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

单元文件名的格式如下:

unit_name.type_extension

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

可通过一个目录来补充单元文件,以了解额外的配置文件。例如,要将自定义配置选项添加到 sshd.service,请创建 sshd.service.d/custom.conf 文件,并在其中插入其他指令:有关配置目录的详情请参考 第 10.6.4 节 “修改现有单元文件”

另外, sshd.service.wants/sshd.service.requires/ 目录可以被创建。这些目录包含到 sshd 服务依赖的单元文件的符号链接。符号链接会在安装过程中根据 [Install] 单元文件选项(请参阅 表 10.11 “重要 [Install] 部分选项”)或者在运行时根据 [Unit] 选项自动创建(请参阅 表 10.9 “重要 [Unit] 部分选项”)。也可以手动创建这些目录和符号链接。

可以使用名为 单元指定符 - 通配符字符串(在加载单元文件时动态替换为单元参数)来设置许多单元文件选项。这可创建通用单元文件,用作生成实例化单元的模板。详情请查看 第 10.6.5 节 “使用 Instantiation 单元”

10.6.1. 了解单元文件结构

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

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

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

选项[a] 部分,请参阅 systemd.unit(5) 手册页。]描述

描述

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

Documentation

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

[b]

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

Requires

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

期望

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

Conflicts

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

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

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

选项[a] 部分,请参阅 systemd.service(5) 手册页。]描述

Type

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

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

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

* oneshot – 这个类型与 simple 类似,但在启动相应单位前会退出。

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

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

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

ExecStart

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

ExecStop

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

ExecReload

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

Restart

启用此选项后,服务会在进程退出后重新启动,但 systemctl 命令的干净停止除外。

RemainAfterExit

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

[a] 在 [Service] 中可配置选项的完整列表

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

选项[a] 部分,请参阅 systemd.unit(5) 手册页。]描述

Alias

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

RequiredBy

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

WantedBy

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

Also

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

DefaultInstance

仅限于实例化单元,这个选项指定启用单位的默认实例。请查看 第 10.6.5 节 “使用 Instantiation 单元”

[a] 在 [Install)中可配置的完整选项列表

可用来微调单元配置的完整选项,例 10.17 “postfix.service 单元文件” 显示系统中安装的服务单元示例。另外,可以定义单元文件选项以支持动态创建单元文件,如 第 10.6.5 节 “使用 Instantiation 单元” 所述。

例 10.17. postfix.service 单元文件

以下是 /usr/lib/systemd/system/postfix.service 单元文件,当前由 postfix 软件包提供:

[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network.target
Conflicts=sendmail.service exim.service

[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
ExecStartPre=-/usr/libexec/postfix/aliasesdb
ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop

[Install]
WantedBy=multi-user.target

[Unit] 部分描述服务,指定排序依赖关系以及冲突的单元。在 [Service] 中,指定一系列自定义脚本,在单元激活、停止和重新加载期间执行。EnvironmentFile 指向服务环境变量的定义位置,PIDFile 为服务的主进程指定稳定的 PID。最后,[Install] 部分列出了依赖于该服务的单元。

10.6.2. 创建自定义单元文件

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

  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 文件并添加服务配置选项。根据您要创建的服务类型,可以使用各种选项,请参阅 第 10.6.1 节 “了解单元文件结构”。以下是网络相关服务的单元配置示例:

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

    其中:

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

    systemctl daemon-reload
    systemctl start name.service
    警告

    在创建新的单元文件或修改现有单元文件后,始终运行 systemctl daemon-reload 命令。否则,systemctl startsystemctl enable 命令可能会因为 systemd 状态和磁盘上的实际服务单元文件不匹配而失败。

    name.service 单元现在可以与任何其他系统服务一样使用 第 10.2 节 “管理系统服务” 所述的命令进行管理。

例 10.18. 创建 emacs.service 文件

当使用 Emacs 文本编辑器时,在后台运行它通常更迅速且方便,而不是在每次编辑文件时启动新实例。以下步骤演示了如何为 Emacs 创建单元文件,这样它就可以像服务一样被处理。

  1. /etc/systemd/system/ 目录中创建一个单元文件,并确定它具有正确的文件权限。以 root 用户身份执行:

    ~]# touch /etc/systemd/system/emacs.service
    ~]# chmod 664 /etc/systemd/system/emacs.service
  2. 在文件中添加以下内容:

    [Unit]
    Description=Emacs: the extensible, self-documenting text editor
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/emacs --daemon
    ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)"
    Environment=SSH_AUTH_SOCK=%t/keyring/ssh
    Restart=always
    
    [Install]
    WantedBy=default.target

    使用上述配置时,/usr/bin/emacs 可执行文件在服务启动时以守护进程模式启动。SSH_AUTH_SOCK 环境变量使用代表运行时目录的 "%t" 单元指定符进行设置。如果意外退出,服务还会重启 emacs 进程。

  3. 执行以下命令重新载入配置并启动自定义服务:

    ~]# systemctl daemon-reload
    ~]# systemctl start emacs.service

因为编辑器现在注册为 systemd 服务,您可以使用所有标准 systemctl 命令。例如:运行 systemctl status emacs 来显示编辑器的状态,或者 systemctl enable emacs 以便在系统引导时自动启动编辑器。

例 10.19. 创建 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)手册页。请确定您选择的端口没有被其他服务使用。在运行该服务前,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

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

    ~]$ ssh -p 22220 user@server

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

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

如需包含单元文件中排序和依赖项所触发的一些真实示例的其他信息,请参见以下文章: 是否存在有关编写单元文件的任何有用信息?

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

10.6.3. 将 SysV Init 脚本转换为单元文件

在花费时间将 SysV 初始化脚本转换为单元文件之前,请确保在别处尚未执行转换。Red Hat Enterprise Linux 7 中安装的所有核心服务都有默认的单元文件,许多第三方软件包也是如此。

将初始化脚本转换成单元文件需要分析脚本并从中提取所需信息。根据这个数据,您可以创建一个单元文件,如 第 10.6.2 节 “创建自定义单元文件” 所述。因为初始化脚本可能会有很大差异,具体取决于服务类型,因此您可能需要使用比本章中介绍的更多配置选项进行转换。请注意,systemd 单元不再支持 init 脚本提供的某些级别的自定义,请参阅 第 10.1.2 节 “兼容性更改”

脚本标题中提供了转换所需的大部分信息。以下示例显示了在 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)标头。如果指定,LSB 标头包含定义服务描述、依赖项和默认运行级别的指令。下面是一个分析任务概述,旨在收集新单元文件所需的数据。postfix init 脚本被用作示例,请参阅 例 10.17 “postfix.service 单元文件” 中生成的 postfix 单元文件。

查找服务描述

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

查找服务依赖项

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

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

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

Provides

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

Required-Start

包含所需服务的引导工具名称。这被转换为排序依赖关系,引导工具名称替换为相应服务或所属服务的单元文件名。例如,如果是 postfix,$network 上的 Required-Start 依赖关系被转换为 network.target 上的 After 依赖关系。

After, Before

Should-Start

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

After, Before

required-Stop, Should-Stop

组成负依赖关系。

Conflicts

查找服务的默认目标

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

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

查找服务使用的文件

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

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

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 仅支持预定义的操作,但启用了通过 ExecStart、ExecStartPre、ExecStart Post、ExecStartPost 和Exec Reload 选项执行自定义可执行文件。如果红帽企业 Linux 7 上有 postfix,则 service start 将执行 /usr/sbin/postfix 以及支持脚本。请参考 例 10.17 “postfix.service 单元文件” 上的 postfix 单元文件。

转换复杂的 init 脚本需要了解脚本中的每个语句的用途。其中一些语句特定于操作系统版本,因此您不需要转换它们。另一方面,新环境中可能需要进行一些调整,无论是在单元文件还是服务可执行文件中,还是在支持文件中。

10.6.4. 修改现有单元文件

在系统中安装的服务会附带保存在 /usr/lib/systemd/system/ 目录中的默认单元文件。系统管理员不应该直接修改这些文件,因此任何自定义都必须仅限于 /etc/systemd/system/ 目录中的配置文件。根据所需更改的程度,选择以下方法之一:

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

要返回这个单元的默认配置,请删除 /etc/systemd/system/ 中的自定义配置文件。要在不重启系统的情况下对单元文件应用更改,请执行:

systemctl daemon-reload

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

init q

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

systemctl restart name.service
重要

要修改由 SysV initscript 处理的服务的属性(如依赖项或超时),请不要修改 initscript 本身。相反,请为服务创建一个 systemd 置入配置文件,如 “扩展默认单元配置”一节“覆盖默认单元配置”一节 所述。然后,以与普通 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

扩展默认单元配置

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

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

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

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

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

使用配置文件的名称替换 config_name。这个文件遵循一般的单元文件结构,因此所有指令都必须在适当的部分指定,请参阅 第 10.6.1 节 “了解单元文件结构”

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

[Unit]
Requires=new_dependency
After=new_dependency

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

[Service]
Restart=always
RestartSec=30

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

要应用对单位所做的更改,以 root 用户身份执行:

systemctl daemon-reload
systemctl restart name.service

例 10.20. 扩展 httpd.service 配置

要修改 httpd.service 单元,以便在启动 Apache 服务时自动执行自定义 shell 脚本,请执行以下步骤。首先,创建目录和自定义配置文件:

~]# mkdir /etc/systemd/system/httpd.service.d/
~]# touch /etc/systemd/system/httpd.service.d/custom_script.conf

如果想要用 Apache 自动启动的脚本位于 /usr/local/bin/custom.sh,在 custom_script.conf 文件中插入以下文本:

[Service]
ExecStartPost=/usr/local/bin/custom.sh

要应用单元更改,请执行:

~]# systemctl daemon-reload
~]# systemctl restart httpd.service
注意

/etc/systemd/system/ 配置文件中的配置文件优先于 /usr/lib/systemd/system/ 中的单元文件。因此,如果配置文件包含只能指定一次的选项,如 DescriptionExecStart,则此选项的默认值将被覆盖。请注意,在 systemd-delta 命令的输出中,“监控覆盖单元”一节 中描述的这些单元总是被标记为 [EXTENDED],即使在 sum 中,某些选项实际上会被覆盖。

覆盖默认单元配置

要在更新提供该单元文件的软件包后保留更改,首先要将该文件复制到 /etc/systemd/system/ 目录。要做到这一点,以 root 用户身份执行以下命令:

cp /usr/lib/systemd/system/name.service /etc/systemd/system/name.service

其中 name 代表您希望修改的服务单元的名称。以上语法适用于所有单元类型。

使用文本编辑器打开复制的文件,并进行必要的修改。要应用单元更改,以 root 用户身份执行:

systemctl daemon-reload
systemctl restart name.service

例 10.21. 更改超时限制

您可以为每个服务指定一个超时值,以防止出现故障的服务中断。否则,一般服务的超时时间会被默认设置为 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] 部分指定 TimeoutStartSec 值:

    ...
    [Service]
    ...
    PrivateTmp=true
    TimeoutStartSec=10
    
    [Install]
    WantedBy=multi-user.target
    ...
  3. 重新载入 systemd 守护进程:

    systemctl daemon-reload
  4. Optional.验证新的超时值:

    systemctl show httpd -p TimeoutStartUSec
注意

要全局更改超时限制,在/etc/systemd/system.conf 中输入 DefaultTimeoutStartSec。请参阅 第 10.1 节 “systemd 简介”

监控覆盖单元

要显示覆盖或修改的单元文件概述,请使用以下命令:

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.

表 10.13 “systemd-delta 差别类型” 列出 systemd-delta 输出中可能出现的覆盖类型。请注意,如果文件被覆盖, systemd-delta 默认会显示与 diff 命令输出类似的总揽。

表 10.13. systemd-delta 差别类型

类型描述

[MASKED]

屏蔽的单元文件,请参阅 第 10.2.7 节 “禁用服务” 以了解单元屏蔽的信息。

[EQUIVALENT]

未修改的副本会覆盖原始文件,但在内容上没有变化,通常是符号链接。

[REDIRECTED]

重定向到另一个文件的文件。

[OVERRIDEN]

覆盖和更改文件。

[EXTENDED]

使用 /etc/systemd/system/ unit.d / 目录中的 .conf 文件扩展的文件。

[UNCHANGED]

只有在使用 --type=unchanged 选项时才会显示未修改的文件。

最好在系统更新后运行 systemd-delta,以检查是否对当前由自定义配置覆盖的默认单元进行了更新。也有可能将输出限制在某种差别类型。例如,要仅查看覆盖的单元,请执行:

systemd-delta --type=overridden

10.6.5. 使用 Instantiation 单元

可以在运行时使用单一模板配置文件实例化多个单元。"@"字符用于标记模板并与其关联。实例化的单元可以从另一个单元文件(使用 Requires 或者 Wants 选项)或者 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 文件,从中读取配置并启动服务。

通配符字符(称为单元指定符 )可用于任何单元配置文件中。单元指定符替换某些单元参数,并在运行时解释。表 10.14 “重要单元指定符” 列出对模板单元特别有用的单元指定符。

表 10.14. 重要单元指定符

单元指定符含义描述

%n

完整单元名称

代表完整的单元名称,包括类型后缀。%N 具有相同的含义,但也将禁止的字符替换为 ASCII 代码。

%p

前缀名称

代表删除了类型后缀的单元名称。对于实例化单元 %p 代表"@"字符前面的单元名称的一部分。

%i

实例名称

是"@"字符和类型后缀之间的实例化单元名称的一部分。%I 具有相同的含义,但也会替换 ASCII 代码的禁止字符。

%H

主机名

代表在载入单元配置时的运行系统的主机名。

%t

运行时目录

代表运行时目录,对于 root 用户是 /run,对于非特权用户是 XDG_RUNTIME_DIR 变量的值。

有关单元指定符的完整列表,请参见 systemd.unit(5) 手册页。

例如, getty@.service 模板包含以下指令:

[Unit]
Description=Getty on %I
...
[Service]
ExecStart=-/sbin/agetty --noclear %I $TERM
...

当 getty@ttyA.service 和 getty@ttyB.service 实例化为上述模板时,Description= Getty on ttyA 和 Getty on ttyB 解析Getty on ttyB

10.7. 管理服务时的其他注意事项

在正常操作过程中,systemd 维护单元抽象和系统上活动的基础进程之间的关联。

From: man systemd

Processes systemd spawns are placed in individual Linux control groups named after the unit which they belong to in the private systemd hierarchy. (see cgroups.txt[1] for more information about control groups, or short "cgroups"). systemd uses this to effectively keep track of processes. Control group information is maintained in the kernel, and is accessible via the file system hierarchy (beneath /sys/fs/cgroup/systemd/), or in tools such as ps(1) (ps xawf -eo pid,user,cgroup,args is particularly useful to list all processes and the systemd units they belong to).

cgroup 层次结构对于 systemd 的进程和服务健康状况视图至关重要。当进程分叉本身时,它将继承创建进程的 cgroup。在这种情况下,可以通过读取适用的 cgroup.procs 文件的内容来验证与给定单元关联的所有进程,例如:

~]# cat /sys/fs/cgroup/systemd/system.slice/httpd.service/cgroup.procs
11854
11855
11856
11857
11858
11859

输出与 systemctl status 单元 操作期间返回的 CGroup 信息匹配:

~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
  Active: active (running) since Wed 2019-05-29 12:08:16 EDT; 45s ago
   Docs: man:httpd(8)
      man:apachectl(8)
 Main PID: 11854 (httpd)
  Status: "Total requests: 0; Current requests/sec: 0; Current traffic:  0 B/sec"
  CGroup: /system.slice/httpd.service
      ├─11854 /usr/sbin/httpd -DFOREGROUND
      ├─11855 /usr/sbin/httpd -DFOREGROUND
      ├─11856 /usr/sbin/httpd -DFOREGROUND
      ├─11857 /usr/sbin/httpd -DFOREGROUND
      ├─11858 /usr/sbin/httpd -DFOREGROUND
      └─11859 /usr/sbin/httpd -DFOREGROUND

May 29 12:08:16 localhost systemd[1]: Starting The Apache HTTP Server...
May 29 12:08:16 localhost systemd[1]: Started The Apache HTTP Server.

要直接查看系统范围内进程的这些分组,可以使用 systemd-cgls 实用程序:

~]# systemd-cgls | head -17
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─user.slice
│ └─user-0.slice
│  └─session-168.scope
│   ├─ 3049 login -- root
│   ├─11884 -bash
│   ├─11943 systemd-cgls
│   └─11944 head -17
└─system.slice
 ├─httpd.service
 │ ├─11854 /usr/sbin/httpd -DFOREGROUND
 │ ├─11855 /usr/sbin/httpd -DFOREGROUND
 │ ├─11856 /usr/sbin/httpd -DFOREGROUND
 │ ├─11857 /usr/sbin/httpd -DFOREGROUND
 │ ├─11858 /usr/sbin/httpd -DFOREGROUND
 │ └─11859 /usr/sbin/httpd -DFOREGROUND
 ├─rhnsd.service

要使 systemd 正常工作,必须通过 systemd 系统启动或停止服务,以维护正确的进程进行单元分组。任何执行外部操作的操作都会导致不创建所需的 cgroup 结构。这是因为 systemd 不知道正在启动的进程的特殊性质。

作为上述约束的示例,停止 httpd 服务,然后直接发布 /usr/sbin/httpd 会导致以下结果:

~]# systemctl stop httpd
~]# /usr/sbin/httpd
# systemd-cgls | head -17
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─user.slice
│ └─user-0.slice
│  └─session-168.scope
│   ├─ 3049 login -- root
│   ├─11884 -bash
│   ├─11957 /usr/sbin/httpd
│   ├─11958 /usr/sbin/httpd
│   ├─11959 /usr/sbin/httpd
│   ├─11960 /usr/sbin/httpd
│   ├─11961 /usr/sbin/httpd
│   ├─11962 /usr/sbin/httpd
│   ├─11963 systemd-cgls
│   └─11964 head -17
└─system.slice
 ├─rhnsd.service
 │ └─3261 rhnsd

请注意,httpd 进程现在在 user-0.slice 和 session-168.scope 下可见。此服务被视为启动的进程,而非系统服务,后者应直接监控和管理。由于这种错误对齐可能会发生一些故障,包括但不限于:

  • 在系统关闭或重启事件期间,服务无法正确关闭。
  • 用户注销期间会发送意外信号,如 SIGHUP 和 SIGTERM。
  • 带有 Restart= 指令时,不会自动重启失败的进程
注意

非大型应用程序关闭事件可能会导致大量后续应用程序故障,如客户端故障、数据丢失和磁盘损坏。

10.8. 其它资源

有关 systemd 及其在 Red Hat Enterprise Linux 7 中使用的详情,请查看以下列出的资源。

安装的文档

  • systemctl(1)- systemctl 命令行工具的 man page 提供了支持的选项和命令的完整列表。
  • systemd(1)- systemd 系统和服务管理器的手册页面提供有关其概念和记录可用命令行选项、环境变量、支持的配置文件和目录、可识别信号和可用内核选项的更多信息。
  • systemd-delta(1)- systemd-delta 实用程序的 man page,可用于查找扩展和覆盖的配置文件。
  • systemd.unit(5)- 名为 systemd.unit 的 man page 提供关于 systemd 单元文件和记录所有可用配置选项的详细信息。
  • systemd.service(5)- 名为 systemd.service 的 man page 记录服务单元文件的格式。
  • systemd.target(5)- 名为 systemd.target 的 man page 记录了目标单元文件的格式。
  • systemd.kill(5)- 名为 systemd.kill 的 man page 记录了进程终止程序的配置。

在线文档

  • 红帽企业 Linux 7 联网指南 - 红帽企业 Linux 7 的网络指南记录了有关在此系统中配置和管理网络接口、网络和网络服务的相关信息。它介绍了 hostnamectl 实用程序,说明如何使用 在命令行中查看和设置本地和远程的主机名,并提供有关主机名称和域名选择的重要信息。
  • 红帽企业 Linux 7 桌面迁移和管理指南 - 红帽企业 Linux 7 的桌面迁移和管理指南 记录了系统上 GNOME 3 桌面的迁移规划、部署、配置和管理。它引进了 logind 服务,列举其最重要的功能,并说明如何使用 loginctl 实用程序列出活动会话并启用多椅支持。
  • Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南 介绍了 SELinux 的基本原理,并详细介绍了如何配置和使用 SELinux 与 Apache HTTP 服务器、Postfix、PostgreSQL 或 OpenShift 等服务。它解释了如何为 systemd 管理的系统服务配置 SELinux 访问权限。
  • Red Hat Enterprise Linux 7 安装指南 - Red Hat Enterprise Linux 7 安装 指南包括了如何在 AMD64 和 Intel 64 系统、64 位 IBM Power Systems 服务器和 IBM Z 中安装该系统。它还涵盖了高级安装方法,如 Kickstart 安装、PXE 安装和通过 VNC 协议安装。另外,它描述了常见的安装后任务,并解释了如何对安装问题进行故障排除,包括如何引导进入救援模式或恢复 root 密码的详细说明。
  • 红帽企业 Linux 7 安全指南 - 红帽企业 Linux 7 安全指南 帮助用户和管理员学习保护工作站和服务器免受本地和远程入侵、攻击和恶意活动的流程和实践。它还说明了如何保护关键系统服务。
  • systemd 主页 - 项目主页提供了更多关于 systemd 的信息。

另请参阅

  • 第 2 章 系统位置和键盘配置 记录如何管理系统区域设置和键盘布局。它介绍了如何使用 localectl 实用程序查看当前的区域设置,列出可用的区域设置,并在命令行中设置系统区域设置,以及查看当前的键盘布局、列出可用的键盘映射,以及在命令行中启用特定的键盘布局。
  • 第 3 章 配置日期和时间 记录如何管理系统日期和时间。它解释了实时时钟与系统时钟之间的区别,并描述了如何使用 timedatectl 实用程序显示系统时钟的当前设置、配置日期和时间、更改时区,以及将系统时钟与远程服务器同步。
  • 第 6 章 获取特权 文档如何使用 susudo 命令获得管理权限。
  • 第 12 章 OpenSSH 描述如何配置 SSH 服务器以及如何使用 sshscpsftp 客户端实用程序进行访问。
  • 第 23 章 查看和管理日志文件 介绍了 journald。它描述日志、引入 journald 服务,以及如何使用 journalctl 实用程序查看日志条目、进入实时查看模式和过滤日志条目。此外,本章介绍了如何为非 root 用户授予系统日志的访问权限,并为日志文件启用持久存储。

第 11 章 配置系统可访问性

Orca 屏幕阅读器确保了红帽企业 Linux 7 的可访问性,该屏幕读取器包含在操作系统的默认安装中。本章解释了系统管理员如何配置系统以支持具有视觉问题的用户。

orca 从屏幕读取信息,并使用以下方法与用户通信:

  • 演讲组合器,提供演讲输出
  • 程序错误显示,它提供了一个 tactile 输出

有关 Orca 设置的详情,请查看其 帮助页面

为了使 Orca的通信输出正常工作,系统管理员需要:

11.1. 配置 brltty 服务

Braille 显示使用 brltty 服务为视觉损害的用户提供 tactile 输出。

启用 brltty 服务

除非 brltty 正在运行,否则 braille 显示无法正常工作。默认情况下,brltty 被禁用。在引导时启用 brltty

~]# systemctl enable brltty.service

授权用户使用 Braille 显示

要设置有权使用损坏显示的用户,请选择以下流程之一,它们具有相同的效果。使用 /etc/brltty.conf 文件的步骤适用于无法将用户和组分配给文件的文件系统。使用 /etc/brlapi.key 文件的步骤仅适用于可以为其分配用户或组的文件系统。

使用 /etc/brltty.conf设置对 Braille 显示的访问

  1. 打开 /etc/brltty.conf 文件,并找到名为 应用程序编程接口参数 的部分。
  2. 指定用户。

    1. 要指定一个或多个单独的用户,请在以下行中列出用户:

      api-parameters Auth=user:user_1, user_2, ... 		# Allow some local user
    2. 要指定用户组,请在以下行中输入它的名称:

      api-parameters Auth=group:group		# Allow some local group

使用 /etc/brlapi.key设置对 Braille 显示的访问

  1. 创建 /etc/brlapi.key 文件。

    ~]# mcookie > /etc/brlapi.key
  2. /etc/brlapi.key 的所有权更改为特定用户或组。

    1. 指定单个用户:

      ~]# chown user_1 /etc/brlapi.key
    2. 指定组:

      ~]# chown group_1 /etc/brlapi.key
  3. 调整 /etc/brltty.conf 的内容 使其包含以下内容:

    api-parameters Auth=keyfile:/etc/brlapi.key

设置 Braille 驱动程序

/etc/brltty.conf 中的 braille-driver 指令指定用于 braille 显示的双字母驱动程序识别代码。

设置 Braille 驱动程序

  1. 确定您是否要使用自动检测来查找相应的连字符驱动程序。

    1. 如果要使用自动检测,请将 braille 驱动程序 保留为 auto,这是默认选项。

      braille-driver	auto	 # autodetect
      警告

      自动检测尝试所有驱动程序.因此,可能需要很长时间甚至失败。因此,建议设置特定的损坏驱动程序。

    2. 如果您不想使用自动检测,请在 braille -driver 指令中指定所需 braille 驱动程序的识别代码。

      /etc/brltty.conf 提供的列表中选择所需的 braille 驱动程序识别代码,例如:

      braille-driver	xw	 # XWindow

      您还可以设置多个驱动程序,用逗号分开,然后在其中执行自动检测。

设置 Braille 设备

/etc/brltty.conf 中的 braille-device 指令指定 braille 显示连接到的设备。支持以下设备类型(请参阅 表 11.1 “Braille 设备类型和 Correspoing Syntax”):

表 11.1. Braille 设备类型和 Correspoing Syntax

损坏设备类型Type 的语法

串行设备

serial:path [a]

USB 设备

[serial-number] [b]

蓝牙设备

bluetooth:address

[a] 相对路径位于 /dev
[b] 此处的括号表示可选性。

特定设备的设置示例:

braille-device	serial:ttyS0	        # First serial device
braille-device	usb:	            # First USB device matching braille driver
braille-device	usb:nnnnn	        # Specific USB device by serial number
braille-device	bluetooth:xx:xx:xx:xx:xx:xx	# Specific Bluetooth device by address

您还可以设置多个设备,用逗号分开,每个设备将被依次探测。

警告

如果设备由串行至USB 适配器连接,则将 braille-device 设置为 usb: 无法正常工作。在这种情况下,请识别内核为适配器创建的虚拟串行设备。虚拟串行设备类似如下:

serial:ttyUSB0
You can find the actual device name in the kernel messages on the device plug with the following command:
~]# dmesg | fgrep ttyUSB0

为 particular Braille Displays 设置特定参数

如果您需要为特定 braille 显示设置特定参数,请在 /etc/brltty.conf 中使用 braille-parameters 指令。braille-parameters 指令将非常规参数传递到 braille 驱动程序。从 /etc/brltty.conf 列表中的列表中选择所需的参数。

设置文本表

/etc/brltty.conf 中的 text-table 指令指定用于对符号进行编码的文本表。到文本表的相对路径位于 /etc/brltty/Text/ 目录中。

设置文本表

  1. 决定是否使用自动选择来查找相应的文本表。
    1. 如果要使用自动选择,请将 text-table 保留auto,这是默认选项。

      text-table	auto	 # locale-based autoselection

      这可确保执行基于本地的自动选择并回退到 en-nabcc

    2. 如果您不想使用 autoselection,请从 /etc/brltty.conf 中的列表中选择所需的 文本-table

      例如,使用美国英语的文本表:

      text-table	en_US	 # English (United States)

设置合同表

/etc/brltty.conf 中的 contraction -table 指令指定用于编码缩写的表。到特定 合同表的相对路径位于 /etc/brltty/Contraction/ 目录中。

/etc/brltty.conf 中的列表中选择所需的conion -table

例如,要将合同表用于美国英语,第 2 级:

contraction-table	en-us-g2	 # English (US, grade 2)
警告

如果没有指定,则不使用合同表。

11.2. switch On Always Show Universal Access Menu

要切换到 Orca 屏幕阅读器,请按 Super+Alt+S 组合键。因此,顶栏中会显示 Universal Access Menu 图标。

通用访问菜单
警告

如果用户从 Universal Access Menu 中关闭所有提供的选项,此图标将消失。缺少图标可能会导致具有视觉问题的用户遇到困难。系统管理员可以通过切换 Always Show Universal Access 菜单 来防止图标不可访问。当打开 Always Show Universal Access Menu 时,即使此菜单中的所有选项都已关闭,顶栏中也会显示此图标。

切换 Always 显示通用访问菜单

  1. 打开 Gnome settings 菜单,然后单击 Universal Access
  2. 打开 Always Show Universal Access Menu.

    始终显示取消激活访问菜单
  3. 可选:验证是否在顶栏中显示 Universal Access Menu 图标,即使此菜单中的所有选项都已关闭。

    通用访问菜单

11.3. 启用 Festival Speech Synthesis 系统

默认情况下,Organ 使用 eSpeak 发音器,但也支持 Festival Speech Synthesis 系统eSpeakFestival Speech Synthesis System( Festival)结合了不同语音。有些用户可能更喜欢使用默认的 eSpeak 组合 器。要启用 Festival,请按照以下步骤执行:

安装 Festival 并使其在引导时运行

  1. 安装 festival:

    ~]# yum install festival festival-freebsoft-utils
  2. 使 Festival 在引导时运行:

    1. 创建新的 systemd 单元文件:

      /etc/systemd/system/ 目录中创建一个文件,并使其可执行。

      ~]# touch /etc/systemd/system/festival.service
      ~]# chmod 664 /etc/systemd/system/festival.service
    2. 确保 /usr/bin/festival_server 文件中的 脚本用于运行 Festival。在 /etc/systemd/system/festival.service 文件中添加以下内容:

      [Unit]
      Description=Festival speech synthesis server
      [Service]
      ExecStart=/usr/bin/festival_server
      Type=simple
    3. 通知 systemd 存在新的 festival.service 文件:

      ~]# systemctl daemon-reload
      ~]# systemctl start festival.service
    4. 启用 festival.service

      ~]# systemctl enable festival.service

为 Festival 选择选择

Festival 提供多个语音。

要获得可用的语音,请从以下列表中安装相关软件包:

  • festvox-awb-arctic-hts
  • festvox-bdl-arctic-hts
  • festvox-clb-arctic-hts
  • festvox-kal-diphone
  • festvox-ked-diphone
  • festvox-rms-arctic-hts
  • festvox-slt-arctic-hts
  • hispavoces-pal-diphone
  • hispavoces-sfl-diphone

查看有关特定语音的详细信息:

~]# yum info package_name

要使所需语音可用,请使用这个语音安装软件包,然后重启:

~]# yum install package_name
~]# reboot

第 12 章 OpenSSH

SSH (Secure Shell)是一种协议,它使用客户端-服务器架构促进两个系统之间的安全通信,并允许用户远程登录服务器主机系统。与其他远程通信协议(如 FTPTelnet )不同,SSH 对登录会话进行加密,使得入侵者很难收集未加密的密码。

ssh 程序旨在替换用于登录远程主机(如 telnetrsh )的旧、不太安全的终端应用。名为 scp 的相关程序 取代了设计用于在主机之间复制文件的旧程序,如 rcp。由于这些较旧的应用程序不会加密客户端和服务器之间传输的密码,因此尽可能避免这些密码。使用安全方法登录远程系统可降低客户端系统和远程主机的风险。

Red Hat Enterprise Linux 包括常规 OpenSSH 软件包 openssh,以及 OpenSSH 服务器、open ssh-server 和客户端、open ssh-clients、软件包。请注意,OpenSSH 软件包需要 OpenSSL package openssl-libs,它会安装几个重要的加密库,使 OpenSSH 提供加密通信。

12.1. SSH 协议

12.1.1. 为什么使用 SSH?

潜在入侵者拥有各种工具可供他们使用,使他们能够中断、拦截和重新路由网络流量,以努力访问系统。总体而言,这些威胁可分类如下:

拦截两个系统间通信

攻击者可以位于通信方之间的网络上,复制他们之间传递的任何信息。他可以截获和保存信息,或者更改信息并将其发送给预期收件人。

此攻击通常使用数据包嗅探器来执行,这是一种比较常见的网络实用程序,可捕获通过网络流的每个数据包,并分析其内容。

模拟特定主机

攻击者的系统被配置为作为传输的预期接收者。如果此策略正常工作,用户系统仍不知道它正在与错误的主机通信。

此攻击可以通过称为 DNS 投毒或所谓的 IP 欺骗进行。在第一种情形中,入侵者使用破解的 DNS 服务器将客户端系统指向恶意重复的主机。在第二种情况下,入侵者会发送似乎来自可信主机的虚假网络数据包。

这两种技术都会截获潜在的敏感信息,如果因为恶意原因而进行拦截,结果可能会令人沮丧。如果 SSH 用于远程 shell 登录和文件复制,这些安全威胁可能会大大降低。这是因为 SSH 客户端和服务器使用数字签名来验证其身份。另外,所有客户端和服务器系统之间的沟通都是加密的。尝试欺骗通信两侧的身份无效,因为每个数据包都使用仅由本地和远程系统识别的密钥进行加密。

12.1.2. 主要功能

SSH 协议提供以下保护:

没有人可以组成预期服务器
在初始连接后,客户端可以验证它是否连接到之前连接到的同一服务器。
没有人可以捕获验证信息
客户端使用强大的 128 位加密将其身份验证信息传输到服务器。
没有人可以拦截通信
会话期间发送和接收的所有数据都使用 128 位加密进行传输,因此被拦截的传输极难解密和读取。

另外,它还提供以下选项:

它为通过网络使用图形应用程序提供了安全方法
使用名为 X11 转发的技术 ,客户端可以从服务器转发X11( X Window 系统 )应用程序。
它提供了一种保护其他不安全协议的方法
SSH 协议加密它发送和接收的所有内容。使用称为端口转发的技术,SSH 服务器可以成为保护其他不安全协议(如 POP )并提升整体系统和数据安全性的渠道。
它可以用来创建安全频道
OpenSSH 服务器和客户端可以配置为创建一个类似于虚拟专用网络的隧道,以用于服务器和客户端计算机之间的流量。
它支持 Kerberos 身份验证
可以配置 OpenSSH 服务器和客户端,以使用 Kerberos 网络身份验证协议的 GSSAPI (通用安全服务应用程序接口)实施进行身份验证。

12.1.3. 协议版本

目前存在两种 SSH 变体:版本 1 和更新版本 2。红帽企业 Linux 7 下的 OpenSSH 套件使用 SSH 版本 2,其增强的密钥交换算法不会受到版本 1 中已知漏洞的影响。在 Red Hat Enterprise Linux 7 中,OpenSSH 套件不支持版本 1 连接。

12.1.4. SSH 连接的事件序列

以下一系列事件有助于保护两个主机之间的 SSH 通信的完整性。

  1. 制作加密握手,以便客户端能够验证它是否与正确的服务器通信。
  2. 客户端和远程主机之间的连接传输层使用对称密码进行加密。
  3. 客户端向服务器验证自身。
  4. 客户端通过加密连接与远程主机交互。

12.1.4.1. 传输层

传输层的主要作用是促进两台主机之间在身份验证时以及后续通信期间的通信安全。传输层通过处理数据的加密和解密,以及在数据包发送和接收时提供完整性保护来实现此目的。传输层还提供压缩,加快信息的传输速度。

SSH 客户端联系服务器后,交换关键信息,以便两个系统能够正确构建传输层。在此交换中会执行以下步骤:

  • 交换密钥
  • 确定公钥加密算法
  • 对称加密算法确定
  • 确定消息验证算法
  • 确定哈希算法

在密钥交换期间,服务器利用唯一主机密钥向客户端识别自身。如果之前客户端从未与此特定服务器通信,则服务器的主机密钥对客户端未知且不会连接。OpenSSH 通过接受服务器的主机密钥来解决这个问题。这是在用户收到通知并且已接受并验证新主机密钥之后完成的。在后续连接中,会根据客户端中保存的版本检查服务器的主机密钥,从而确保客户端确实与预期服务器通信。如果以后主机密钥不再匹配,用户必须删除客户端的保存版本,然后才能进行连接。

警告

在初始联系期间,攻击者有可能伪装为 SSH 服务器,因为本地系统不知道预期服务器和攻击者设置的假服务器之间的区别。为帮助防止这种情况,请在第一次连接或出现主机密钥不匹配之前联系服务器管理员来验证新 SSH 服务器的完整性。

SSH 设计为使用几乎任何类型的公钥算法或编码格式。在初始密钥交换创建了用于交换的哈希值和共享 secret 值后,两个系统会立即开始计算新的密钥和算法,以保护身份验证和将来通过连接发送的数据。

使用给定密钥和算法传输一定数量的数据(具体取决于 SSH 实施)后,再进行另一个密钥交换,生成另一组哈希值和新共享 secret 值。即使攻击者能够确定哈希值和共享 secret 值,此信息仅在有限时间内有用。

12.1.4.2. Authentication

传输层构建了一个安全隧道以在两个系统之间传递信息后,服务器会告知客户端支持的不同身份验证方法,例如使用私钥编码签名或输入密码。然后,客户端尝试使用以下任一支持的方法对服务器进行身份验证。

SSH 服务器和客户端可以配置为允许不同类型的身份验证,从而互相提供最佳的控制量。服务器可以根据其安全模型决定它支持的加密方法,客户端也可以选择从可用选项尝试的身份验证方法顺序。

12.1.4.3. Channels

在 SSH 传输层成功验证后,可以通过称为多路复用的技术打开多个通道[1].这些通道各自处理不同终端会话和转发 X11 会话的通信。

客户端和服务器都可以创建新频道。然后,在连接的每个末尾为每个频道分配一个不同的数字。当客户端尝试打开新频道时,客户端会随请求一起发送频道号。此信息由服务器存储,用于直接与该通道通信。这样,不同类型的会话不会相互影响,因此当给定会话结束时,其通道可以在不中断主 SSH 连接的情况下关闭。

频道还支持 flow-control,允许它们以有序的方式发送和接收数据。这样,在客户端收到打开频道的消息前,不会通过通道发送数据。

客户端和服务器根据客户端请求的服务类型以及用户连接到网络的方式自动协商每个频道的特征。这为处理不同类型的远程连接提供了极大的灵活性,无需更改协议的基本基础架构。

12.2. 配置 OpenSSH

12.2.1. 配置文件

共有两组不同的配置文件:用于客户端程序(即 sshscp 和 s ftp)的配置文件,以及用于服务器( sshd 守护进程)的配置文件。

系统范围的 SSH 配置信息保存在 /etc/ssh/ 目录中,如 表 12.1 “系统范围的配置文件” 所述。用户特定的 SSH 配置信息保存在用户主目录中的 ~/.ssh/ 中,如 表 12.2 “用户特定配置文件” 所述。

表 12.1. 系统范围的配置文件

File描述

/etc/ssh/moduli

包含 Diffie-Hellman 组,用于 Diffie-Hellman 密钥交换,这对构建安全传输层至关重要。当在 SSH 会话开始时交换密钥时,会创建一个共享的 secret 值,它不能由任一方单独决定。该值随后用于提供主机身份验证。

/etc/ssh/ssh_config

默认的 SSH 客户端配置文件。请注意,如果 ~/.ssh/config 存在,它将被 ~/.ssh/config 覆盖。

/etc/ssh/sshd_config

sshd 守护进程的配置文件。

/etc/ssh/ssh_host_ecdsa_key

sshd 守护进程使用的 ECDSA 私钥。

/etc/ssh/ssh_host_ecdsa_key.pub

sshd 守护进程使用的 ECDSA 公钥。

/etc/ssh/ssh_host_rsa_key

sshd 守护进程用于 SSH 协议版本 2 的 RSA 私钥。

/etc/ssh/ssh_host_rsa_key.pub

sshd 守护进程用于 SSH 协议版本 2 的 RSA 公钥。

/etc/pam.d/sshd

sshd 守护进程的 PAM 配置文件。

/etc/sysconfig/sshd

sshd 服务的配置文件。

表 12.2. 用户特定配置文件

File描述

~/.ssh/authorized_keys

保存服务器的授权公钥列表。当客户端连接到服务器时,服务器通过检查存储在此文件中的签名公钥来验证客户端的身份验证。

~/.ssh/id_ecdsa

包含用户的 ECDSA 私钥。

~/.ssh/id_ecdsa.pub

用户的 ECDSA 公钥.

~/.ssh/id_rsa

ssh 用于 SSH 协议版本 2 的 RSA 私钥。

~/.ssh/id_rsa.pub

ssh 用于 SSH 协议版本 2 的 RSA 公钥。

~/.ssh/known_hosts

包含用户访问的 SSH 服务器的主机密钥。此文件对于确保 SSH 客户端连接到正确的 SSH 服务器非常重要。

警告

如果设置 SSH 服务器,请不要使用 /etc/ssh/sshd_config 文件中的 UsePrivilegeSeparation no 指令来关闭特权 隔离 功能。关闭 特权解析会禁用 许多安全功能,并会使服务器暴露于潜在的安全漏洞和目标攻击。有关 UsePrivilegeSeparation 的更多信息,请参阅 sshd_config(5)手册页,或者 /etc/ssh/sshd_config 文件中 UsePrivilegeSeparation 指令的重要性以及如何对其进行测试?红帽知识库文章.

有关 SSH 配置文件中可以使用的各种指令的详情,请查看 ssh_config(5)和 sshd_config(5)手册页。

12.2.2. 启动 OpenSSH 服务器

为了运行 OpenSSH 服务器,您必须安装 openssh-server 软件包。有关如何安装新软件包的详情请参考 第 9.2.4 节 “安装软件包”

要在当前会话中启动 sshd 守护进程,以 root 用户身份在 shell 提示符后输入以下内容:

~]# systemctl start sshd.service

要在当前会话中停止正在运行的 sshd 守护进程,以 root 用户身份运行以下命令:

~]# systemctl stop sshd.service

如果您希望守护进程在引导时自动启动,以 root 用户身份输入

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

sshd 守护进程依赖于 network.target 目标 单元,这足以用于静态配置的网络接口和默认的 ListenAddress 0.0.0.0 选项。要在 ListenAddress 指令中指定不同的地址并使用较慢的动态网络配置,请将 network-online.target 目标 单元的依赖关系添加到 sshd.service 单元文件中。要做到这一点,使用以下选项创建 /etc/systemd/system/sshd.service.d/local.conf 文件:

 [Unit]
 Wants=network-online.target
 After=network-online.target

之后,使用以下命令重新载入 systemd 管理器配置:

~]# systemctl daemon-reload

有关如何在 Red Hat Enterprise Linux 中管理系统服务的详情请参考 第 10 章 使用 systemd 管理服务

请注意,如果您重新安装系统,则会创建新的识别密钥集合。因此,在重新安装前使用任何 OpenSSH 工具连接到该系统的客户端会看到以下信息:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@: REMOTE HOST IDENTIFICATION HAS CHANGED!   @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.

要防止这种情况,您可以从 /etc/ssh/ 目录中备份相关文件。有关完整的列表,请查看 表 12.1 “系统范围的配置文件”,每当您重新安装系统时都会恢复文件。

12.2.3. 远程连接需要 SSH

要使 SSH 真正有效,应禁止使用不安全的连接协议。否则,用户的密码可能通过 SSH 对一个会话进行保护,稍后仅在使用 Telnet 登录时捕获。要禁用的一些服务包括 telnetrshrloginvsftpd

有关如何配置 vsftpd 服务的详情请参考 第 16.2 节 “FTP”。要了解如何在 Red Hat Enterprise Linux 7 中管理系统服务,请参阅 第 10 章 使用 systemd 管理服务

12.2.4. 使用基于密钥的身份验证

要进一步提高系统安全性,请生成 SSH 密钥对,然后通过禁用密码身份验证来强制进行基于密钥的身份验证。要做到这一点,在文本编辑器(如 vinano )中打开 /etc/ssh/sshd_config 配置文件,并更改 PasswordAuthentication 选项,如下所示:

PasswordAuthentication no

如果您在使用新默认安装以外的系统中,请检查 PubkeyAuthentication no 没有设置。如果远程连接,不使用控制台或带外访问,建议在禁用密码身份验证前测试基于密钥的登录过程。

要能够使用 sshscpsftp 从客户端计算机连接到服务器,请按照以下步骤生成授权密钥对:请注意,必须为每个用户单独生成密钥。

要在 NFS 挂载的主目录中使用基于密钥的身份验证,请首先启用 use_nfs_home_dirs SELinux 布尔值:

~]# setsebool -P use_nfs_home_dirs 1

Red Hat Enterprise Linux 7 默认使用 SSH 协议 2 和 RSA 密钥(详情请参阅 第 12.1.3 节 “协议版本” )。

重要

如果以 root 身份完成这些步骤,则只有 root 用户 才能使用该密钥。

注意

如果您重新安装您的系统并希望保留先前生成的密钥对,请备份 ~/.ssh/ 目录。重新安装后,将其复制到主目录中。此过程可以针对您系统上的所有用户完成,包括 root 用户

12.2.4.1. 生成密钥对

要为 SSH 协议的版本 2 生成 RSA 密钥对,请按照以下步骤执行:

  1. 通过在 shell 提示符后输入以下内容来生成 RSA 密钥对:

    ~]$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/USER/.ssh/id_rsa):
  2. Enter 键 确认新创建的密钥的默认位置 ~/.ssh/id_rsa
  3. 输入密码短语,并在系统提示时再次输入密码进行确认。为安全起见,请避免使用与登录到您的帐户相同的密码。

    之后,您将会看到类似如下的信息:

    Your identification has been saved in /home/USER/.ssh/id_rsa.
    Your public key has been saved in /home/USER/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:UNIgIT4wfhdQH/K7yqmjsbZnnyGDKiDviv492U5z78Y USER@penguin.example.com
    The key's randomart image is:
    +---[RSA 2048]----+
    |o ..==o+.    |
    |.+ . .=oo    |
    | .o. ..o     |
    | ... ..    |
    |    .S    |
    |o .   .    |
    |o+ o .o+ ..   |
    |+.++=o*.o .E   |
    |BBBo+Bo. oo   |
    +----[SHA256]-----+
    注意

    要获得之前版本中的默认指纹 MD5 密钥指纹,请使用带有 -E md5 选项的 ssh-keygen 命令。