Red Hat Training
A Red Hat training course is available for RHEL 8
配置基本系统设置
配置 Red Hat Enterprise Linux 8 中基本系统设置的指南
摘要
使开源包含更多
红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们感谢您对我们文档的反馈。让我们了解如何改进它。
对特定段落提交评论
- 查看 Multi-page HTML 格式的文档,并确保在页面完全加载后可看到右上角的 Feedback 按钮。
- 使用光标突出显示您要评论的文本部分。
- 点击在高亮文本旁的 Add Feedback 按钮。
- 添加您的反馈并点击 Submit。
通过 Bugzilla(需要帐户)提交反馈
- 登录到 Bugzilla 网站。
- 从 Version 菜单中选择正确的版本。
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您的改进建议。包括文档相关部分的链接。
- 点 Submit Bug。
第 1 章 准备控制节点和受管节点以使用 RHEL 系统角色
在您可以使用单独的 RHEL 系统角色管理服务和设置前,先准备涉及的主机。
1.1. RHEL 系统角色简介
RHEL 系统角色是 Ansible 角色和模块的集合。RHEL 系统角色提供了一个配置界面,用于远程管理多个 RHEL 系统。这个界面允许在多个 RHEL 版本间管理系统配置,以及处理新的主发行版本。
在 Red Hat Enterprise Linux 8 中,该接口目前由以下角色组成:
-
证书颁发和续订 (
证书
) -
Cockpit (
cockpit
) -
firewalld (
防火墙
) -
HA Cluster (
ha_cluster
) -
内核转储 (
kdump
) -
内核设置 (
kernel_settings
) -
日志记录 (
日志记录
) -
指标(PCP) (
指标
) -
Microsoft SQL Server (
microsoft.sql.server
) -
网络 (
网络
) -
网络绑定磁盘加密客户端和网络 Bound 磁盘加密服务器 (
nbde_client
和nbde_server
) -
Postfix (
postfix
) -
SELinux (
selinux
) -
SSH 客户端 (
ssh
) -
SSH 服务器 (
sshd
) -
存储 (
存储
) -
Terminal Session Recording (
tlog
) -
时间同步(
timesync
) -
VPN (
vpn
)
所有这些角色都由 AppStream
存储库中的 rhel-system-roles
软件包提供。
其他资源
- Red Hat Enterprise Linux (RHEL) 系统角色
-
由
rhel-system-roles
软件包提供的/usr/share/doc/rhel-system-roles/
。
1.2. RHEL 系统角色术语
您可以在本文档中找到以下术语:
- Ansible playbook
- Playbook 是 Ansible 的配置、部署和编配语言。它们可以描述您希望远程系统强制使用的策略,或者在一般的 IT 进程中选择一组步骤。
- 控制节点
- 安装了 Ansible 的任何机器。您可以从任何控制节点运行命令和 playbook,调用 /usr/bin/ansible 或 /usr/bin/ansible-playbook。您可以使用任意安装了 Python 的计算机作为控制节点 - 笔记本电脑、共享桌面和服务器都可以运行 Ansible。但是,您不能使用 Windows 机器作为控制节点。您可以拥有多个控制节点。
- 清单(Inventory)
- 受管节点列表。清单文件有时也称为"hostfile"。您的清单可以为每个受管节点指定像 IP 地址等信息。清单也可以管理受管节点,创建并嵌套组以更轻松地进行扩展。如需了解更多有关清单的信息,请参阅使用清单一 节。
- 受管节点
- 使用 Ansible 管理的网络设备、服务器或两者。受管节点有时也称为 "hosts(主机)"。Ansible 未安装到受管节点上。
1.3. 准备控制节点
RHEL 在 AppStream
存储库中包括 Ansible Core
,其支持范围有限。如果您需要额外的 Ansible 支持,请联系红帽了解有关 Ansible Automation Platform
订阅的更多信息。
在 RHEL 8.6 及更高版本中,如果您没有 Red Hat Ansible Automation Platform
订阅,请使用 Ansible Core
。不要从 ansible-2-for-rhel-8-x86_64-rpms
存储库安装 Ansible Engine
。此存储库中的软件包可能与 RHEL 8.6 及更高版本中的 Ansible 自动化内容不兼容。另外,红帽不会提供与 RHEL 相同的时间为 Ansible Engine
提供安全更新和程序错误修复。详情请参阅在 RHEL 8.6 及之后的版本中使用 Ansible。
先决条件
- 已安装 RHEL 8.6 或更高版本。
- 在客户门户网站中注册该系统。
-
向系统附加了
Red Hat Enterprise Linux 服务器订阅
。 -
如果客户门户网站帐户中可用,您可以将
Ansible Automation Platform
订阅附加到该系统。
流程
安装
rhel-system-roles
软件包:[root@control-node]# yum install rhel-system-roles
此命令将
Ansible Core
安装为依赖项。创建稍后用来管理和执行 playbook 的用户:
[root@control-node]# useradd ansible
切换到新创建的
ansible
用户:[root@control-node]# su - ansible
以这个用户身份执行其余步骤。
创建 SSH 公钥和私钥
[ansible@control-node]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ansible/.ssh/id_rsa): password ...
为密钥文件使用推荐的默认位置。
- 可选:配置 SSH 代理,以防止 Ansible 每次建立连接时提示您输入 SSH 密钥密码。
使用以下内容创建
~/.ansible.cfg
文件:[defaults] inventory = /home/ansible/inventory remote_user = ansible [privilege_escalation] become = True become_method = sudo become_user = root become_ask_pass = True
使用这些设置:
- Ansible 管理指定清单文件中的主机。
-
当 Ansible 建立与受管节点的 SSH 连接时,Ansible 使用
remote_user
参数中设置的帐户。 Ansible 使用
sudo
实用程序以root
用户身份对受管节点执行任务。为安全起见,请在受管节点上配置
sudo
以要求输入远程用户的密码,成为root
用户。通过在~/.ansible.cfg
中指定become_ask_pass=True
设置,Ansible 在执行 playbook 时提示输入此密码。
~/.ansible.cfg
文件中的设置具有更高的优先级,并覆盖全局/etc/ansible/ansible.cfg
文件中的设置。创建
~/inventory
文件。例如,以下是 INI 格式的清单文件,它有三个主机,以及一个名为US
的主机组:managed-node-01.example.com [US] managed-node-02.example.com ansible_host=192.0.2.100 managed-node-03.example.com
请注意,控制节点必须能够解析主机名。如果 DNS 服务器无法解析某些主机名,请在主机条目旁边添加
ansible_host
参数来指定其 IP 地址。
验证
1.4. 准备受管节点
Ansible 不在受管主机上使用代理。唯一的要求是 Python (默认情况下在 RHEL 上安装),以及对受管主机的 SSH 访问。
但是,以 root
用户身份直接进行 SSH 访问可能会造成安全隐患。因此,当您准备受管节点时,您可以在此节点上创建一个本地用户并配置 sudo
策略。然后,控制节点上的 Ansible 可以使用此帐户登录受管节点,并以不同的用户(如 root
)执行 playbook。
先决条件
- 您已准备好了控制节点。
流程
创建用户:
[root@managed-node-01]# useradd ansible
控制节点稍后使用这个用户建立与这个主机的 SSH 连接。
为
ansible
用户设置密码:[root@managed-node-01]# passwd ansible Changing password for user ansible. New password: password Retype new password: password passwd: all authentication tokens updated successfully.
当 Ansible 使用
sudo
以root
用户身份执行任务时,您必须输入此密码。在受管主机上安装
ansible
用户的 SSH 公钥:以
ansible
用户身份登录控制节点,并将 SSH 公钥复制到受管节点:[ansible@control-node]$ ssh-copy-id managed-node-01.example.com /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ansible/.ssh/id_rsa.pub" The authenticity of host 'managed-node-01.example.com (192.0.2.100)' can't be established. ECDSA key fingerprint is SHA256:9bZ33GJNODK3zbNhybokN/6Mq7hu3vpBXDrCxe7NAvo. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys ansible@managed-node-01.example.com's password: password Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'managed-node-01.example.com'" and check to make sure that only the key(s) you wanted were added.
在控制节点上远程执行命令以验证 SSH 连接:
[ansible@control-node]$ ssh managed-node-01.example.com whoami ansible
为
ansible
用户创建sudo
配置:使用
visudo
命令创建和编辑/etc/sudoers.d/ansible
文件:[root@managed-node-01]# visudo /etc/sudoers.d/ansible
在正常编辑器中使用
visudo
的好处是,该实用程序提供基本的健全检查和检查是否有解析错误,然后再安装该文件。在
/etc/sudoers.d/ansible
文件中输入以下内容:ansible ALL=(ALL) NOPASSWD: ALL
这些设置向
ansible
用户授予权限,以便作为此主机上的任何用户和组运行所有命令,而无需输入ansible
用户的密码。
其他资源
- 准备控制节点
-
sudoers (5)
手册页
1.5. 验证控制节点对受管节点的访问
配置控制节点并准备好受管节点后,测试 Ansible 可以连接到受管节点。
以 ansible
用户身份在控制节点上执行此步骤。
流程
使用 Ansible
ping
模块验证您可以在所有受管主机上执行命令:[ansible@control-node]$ ansible all -m ping BECOME password: password managed-node-01.example.com | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python3" }, "changed": false, "ping": "pong" } ...
硬编码的
all
主机组会动态包含清单文件中列出的所有主机。使用 Ansible
command
模块在受管主机上运行whoami
工具:[ansible@control-node]$ ansible managed-node-01.example.com -m command -a whoami BECOME password: password managed-node-01.example.com | CHANGED | rc=0 >> root
如果命令返回
root
,您会在受管节点上正确配置sudo
,特权升级可以正常工作。
第 2 章 更改基本环境设置
配置基本环境设置是安装过程的一部分。以下部分介绍了在稍后修改时的信息。环境的基本配置包括:
- 日期和时间
- 系统区域设置
- 键盘布局
- 语言
2.1. 配置日期和时间
因为以下原因,准确计时非常重要。在 Red Hat Enterprise Linux 中,时间保持是由NTP
协议来保证的,该协议由一个运行在用户空间的守护进程来实现。user-space 守护进程更新内核中运行的系统时钟。系统时钟可以通过使用不同的时钟源来维护系统的时间。
Red Hat Enterprise Linux 8 使用 chronyd
守护进程来实现 NTP
。chronyd
包括在 chrony 软件包中。如需更多信息,请参阅 使用 chrony 套件来配置 NTP。
2.1.1. 显示当前日期和时间
要显示当前日期和时间,请使用这些步骤之 一。
流程
输入
date
命令:$ date Mon Mar 30 16:02:59 CEST 2020
要查看更多详细信息,请使用
timedatectl
命令:$ timedatectl Local time: Mon 2020-03-30 16:04:42 CEST Universal time: Mon 2020-03-30 14:04:42 UTC RTC time: Mon 2020-03-30 14:04:41 Time zone: Europe/Prague (CEST, +0200) System clock synchronized: yes NTP service: active RTC in local TZ: no
其他资源
- 使用 Web 控制台配置时间设置
-
man date(1)
和man timedatectl(1)
2.2. 配置系统区域设置
系统范围的区域设置保存在 /etc/locale.conf
文件中,该文件在早期引导时由 systemd
守护进程读取。每个服务或用户都会继承在 /etc/locale.conf
中配置的 locale 设置,单独程序或个人用户可以单独覆盖它们。
这部分论述了如何管理系统区域设置。
流程
要列出系统可用区域设置,请执行以下操作:
$ localectl list-locales C.utf8 aa_DJ aa_DJ.iso88591 aa_DJ.utf8 ...
显示系统区域设置的当前状态:
$ localectl status
要设置或更改默认的系统区域设置,请使用
localectl set-locale
子命令(使用root
用户)。例如:# localectl set-locale LANG=en_US
其他资源
-
man localectl(1)
、man locale(7)
和man locale.conf(5)
2.3. 配置键盘布局
键盘布局设置控制文本控制台和图形用户界面中的布局。
流程
要列出可用的键映射:
$ localectl list-keymaps ANSI-dvorak al al-plisi amiga-de amiga-us ...
显示 keymaps 设置的当前状态:
$ localectl status ... VC Keymap: us ...
要设置或更改默认系统 keymap :例如:
# localectl set-keymap us
其他资源
-
man localectl(1)
、man locale(7)
和man locale.conf(5)
2.4. 使用桌面 GUI 更改语言
这一段讲述了如何使用桌面 GUI 改变系统语言。
先决条件
- 在您的系统中会安装所需的语言软件包
流程
在
System 菜单
中点它的图标打开GNOME Control Center
。-
在
GNOME Control Center
中,从左边栏中选择Region & Language
。 点 Language 菜单。
在菜单里选择所需地区和语言。
如果您的区域及语言没有被列出,向下滚动页面,然后点 More 选择可用的地区和语言。
- 点 Done。
点 Restart 以使更改生效。
有些应用程序不支持某些语言。没有被翻译的应用程序会使用美国英语。
其他资源
2.5. 其他资源
第 3 章 配置和管理网络
这部分描述了如何在 Red Hat Enterprise Linux 中添加以太网连接的不同选项。
3.1. 在图形安装模式中配置网络和主机名
按照以下步骤来配置您的网络和主机名。
步骤
- 在 Installation Summary 窗口中点击 Network and Host Name。
在左侧窗格的列表中选择一个接口。详情显示在右侧方框中。
注意-
有几个可用来使用持久名称识别网络设备的网络设备命名标准,例如:
em1
和wl3sp0
。有关这些标准的详情,请查看 配置和管理联网文档。
-
有几个可用来使用持久名称识别网络设备的网络设备命名标准,例如:
使用 ON/OFF 开关来启用或禁用所选接口。
注意安装程序自动检测到本地可访问的界面,您无法手动添加或删除它们。
- 点 + 添加虚拟网络接口,可以是 Team、Bond、Bridge 或 VLAN。
- 点 - 删除虚拟接口。
- 点 Configure 更改设置,如 IP 地址、DNS 服务器或者现有接口的路由配置(虚拟和物理)。
在 Host Name 字段中输入您系统的主机名。
注意-
主机名可以是完全限定域名(FQDN),格式为
hostname.domainname
,也可以是没有域的短主机名。许多网络具有动态主机配置协议(DHCP)服务,该服务自动为连接的系统提供域名。要允许 DHCP 服务为这个系统分配域名,请只指定简短主机名。 -
使用静态 IP 和主机名配置时,它取决于计划的系统用例,无论是使用短名称还是 FQDN。Red Hat Identity Management 在置备过程中配置 FQDN,但有些第三方软件产品可能需要短名称。在这两种情况下,若要确保所有情况下都可用,请在
/etc/hosts'
中为主机添加条目,格式为IP FQDN 短别名
。 -
localhost
值意味着没有为目标系统配置特定的静态主机名,安装的系统的实际主机名是在处理网络配置的过程中配置的,例如,通过使用 DHCP 或 DNS 的 NetworkManager。 -
主机名只能包含字母数字字符和
-
或。
主机名不能以-
和.
开头或结尾要兼容 DNS,FQDN 的每个部分都应等于或小于 63 个字符,以及 FQDN 总计长度(包括点数)不应超过 255 个字符。
-
主机名可以是完全限定域名(FQDN),格式为
- 单击 Apply,将主机名应用到安装程序环境。
- 或者,在 Network and Hostname 窗口中,您可以选择 Wireless 选项。单击右侧窗格中的 Select network 以选择您的 wifi 连接,如需要请输入密码,然后点击 Done。
其他资源
3.2. 使用 nmcli 配置静态以太网连接
要在命令行中配置以太网连接,请使用 nmcli
实用程序。
例如,以下步骤使用以下设置为 enp7s0
设备创建 NetworkManager 连接配置集:
-
静态 IPv4 地址 -
192.0.2.1
和/24
子网掩码 -
静态 IPv6 地址 -
2001:db8:1::1
和/64
子网掩码 -
IPv4 默认网关 -
192.0.2.254
-
IPv6 默认网关 -
2001:db8:1::fffe
-
IPv4 DNS 服务器 -
192.0.2.200
-
IPv6 DNS 服务器 -
2001:db8:1::ffbb
-
DNS 搜索域 -
example.com
流程
为以太网连接添加新的 NetworkManager 连接配置集:
# nmcli connection add con-name Example-Connection ifname enp7s0 type ethernet
可以进一步修改您创建的
Example-Connection
连接配置集。设置 IPv4 地址:
# nmcli connection modify Example-Connection ipv4.addresses 192.0.2.1/24
设置 IPv6 地址:
# nmcli connection modify Example-Connection ipv6.addresses 2001:db8:1::1/64
将 IPv4 和 IPv6 连接方法设置为
manual
:# nmcli connection modify Example-Connection ipv4.method manual # nmcli connection modify Example-Connection ipv6.method manual
设置 IPv4 和 IPv6 默认网关:
# nmcli connection modify Example-Connection ipv4.gateway 192.0.2.254 # nmcli connection modify Example-Connection ipv6.gateway 2001:db8:1::fffe
设置 IPv4 和 IPv6 DNS 服务器地址:
# nmcli connection modify Example-Connection ipv4.dns "192.0.2.200" # nmcli connection modify Example-Connection ipv6.dns "2001:db8:1::ffbb"
要设置多个 DNS 服务器,以空格分隔并用引号括起来。
为 IPv4 和 IPv6 连接设置 DNS 搜索域:
# nmcli connection modify Example-Connection ipv4.dns-search example.com # nmcli connection modify Example-Connection ipv6.dns-search example.com
激活连接配置集:
# nmcli connection up Example-Connection Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
验证步骤
显示设备和连接的状态:
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet connected Example-Connection
使用
ping
程序来验证这个主机是否可以向其它主机发送数据包:# ping host_name_or_IP_address
故障排除
- 确保网络电缆插入到主机和交换机。
- 检查链路失败是否只存在于此主机上,或者也存在于其它连接到同一交换机的主机上。
- 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。
- 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接。
其他资源
-
nm-settings(5)
手册页 -
nmcli(1)
手册页 - 配置 NetworkManager 以避免使用特定配置集提供默认网关
3.3. 使用 nmtui 配置动态以太网连接
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
在没有图形界面的主机上配置带有动态 IP 地址的以太网连接。
在 nmtui
中:
- 使用光标键导航。
- 选择按钮并按 Enter 键。
- 使用 Space 选择并取消选择复选框。
流程
如果您不知道连接中使用的网络设备名称,显示可用的设备:
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet unavailable -- ...
启动
nmtui
:# nmtui
-
选择
Edit a connection
,点 Enter。 -
按
添加
按钮。 -
从网络类型列表中选择
Ethernet
,然后按 Enter 键。 - 可选:为要创建的 NetworkManager 配置集输入一个名称。
-
在
Device
字段中输入网络设备名称。 按
OK
按钮创建并自动激活新连接。-
按
返回
按钮返回到主菜单。 -
选择
Quit
,然后按 Enter 键关闭nmtui
应用程序。
验证
显示设备和连接的状态:
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet connected Example-Connection
使用
ping
程序来验证这个主机是否可以向其它主机发送数据包:# ping host_name_or_IP_address
故障排除
- 确保网络电缆插入到主机和交换机。
- 检查链路失败是否只存在于此主机上,或者也存在于其它连接到同一交换机的主机上。
- 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。
- 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接。
3.4. 使用 nmtui 配置静态以太网连接
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
在没有图形界面的主机上配置使用静态 IP 地址的以太网连接。
在 nmtui
中:
- 使用光标键导航。
- 选择按钮并按 Enter 键。
- 使用 Space 选择并取消选择复选框。
流程
如果您不知道连接中使用的网络设备名称,显示可用的设备:
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet unavailable -- ...
启动
nmtui
:# nmtui
-
选择
Edit a connection
,点 Enter。 -
按
添加
按钮。 -
从网络类型列表中选择
Ethernet
,然后按 Enter 键。 - 可选:为要创建的 NetworkManager 配置集输入一个名称。
-
在
Device
字段中输入网络设备名称。 在
IPv4 配置
和IPv6 配置
中配置 IPv4 和 IPv6 地址设置:-
按
自动
按钮,然后从显示的列表中选择Manual
。 -
按您要配置的协议旁边的
Show
按钮,以显示其他字段。 按
Address
旁边的Add
按钮,然后在无类别域间路由(CIDR)格式输入 IP 地址和子网掩码。如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置
/32
子网掩码,并为 IPv6 地址设置/64
。- 输入默认网关的地址。
-
按
DNS 服务器
旁边的添加按钮
,并输入 DNS 服务器地址。 -
按
搜索域
旁边的添加按钮
,并输入 DNS 搜索域。
图 3.1. 使用静态 IP 地址设置的以太网连接示例
-
按
-
按
OK
按钮创建并自动激活新连接。 -
按
返回
按钮返回到主菜单。 -
选择
Quit
,然后按 Enter 键关闭nmtui
应用程序。
验证
显示设备和连接的状态:
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet connected Example-Connection
使用
ping
程序来验证这个主机是否可以向其它主机发送数据包:# ping host_name_or_IP_address
故障排除
- 确保网络电缆插入到主机和交换机。
- 检查链路失败是否只存在于此主机上,或者也存在于其它连接到同一交换机的主机上。
- 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。
- 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接。
3.5. 在 RHEL web 控制台中管理网络
在 Web 控制台中,使用 Networking 菜单可以:
- 显示当前接收并发送的数据包
- 显示可用网络接口最重要的信息
- 显示网络日志的内容。
- 添加各种网络接口类型(bond、team、bridge、VLAN)
图 3.2. 在 RHEL web 控制台中管理网络

3.6. 使用 RHEL 系统角色管理网络
您可以使用 network
角色在多目标机器上配置网络连接。
network
角色可以配置以下类型的接口:
- Ethernet
- Bridge
- Bonded
- VLAN
- MacVLAN
- InfiniBand
每个主机所需的网络连接都作为 network_connections
变量中的列表提供。
network
角色更新或者创建目标系统中的所有连接配置集,与在 network_connections
变量中指定的方法完全相同。因此,如果选项只在系统中出现而没有出现在 network_connections
变量中,network
角色会从指定的配置集中删除选项。
以下示例演示了如何应用 network
角色来确保存在与所需参数的以太网连接:
应用网络角色的 playbook 示例,以设置使用所需参数的以太网连接
# SPDX-License-Identifier: BSD-3-Clause
---
- hosts: managed-node-01.example.com
vars:
network_connections:
# Create one Ethernet profile and activate it.
# The profile uses automatic IP addressing
# and is tied to the interface by MAC address.
- name: prod1
state: up
type: ethernet
autoconnect: yes
mac: "00:00:5e:00:53:00"
mtu: 1450
roles:
- rhel-system-roles.network
3.7. 其他资源
第 4 章 注册系统并管理订阅
订阅涵盖了安装在 Red Hat Enterprise Linux 上的产品,包括操作系统本身。
您可以使用 Red Hat Content Delivery Network 订阅来跟踪:
- 注册的系统
- 在您的系统中安装的产品
- 附加到安装产品的订阅
4.1. 安装后注册系统
如果您在安装过程中还没有注册系统,请使用以下步骤注册您的系统。
先决条件
- 红帽客户门户网站中的一个有效的用户帐户。
- 请参阅 创建红帽登录 页面。
- RHEL 系统的有效订阅。
- 有关安装过程的更多信息,请参阅 执行标准的 RHEL 8 安装。
流程
注册并自动订阅您的系统。
# subscription-manager register --username <username> --password <password> --auto-attach Registering to: subscription.rhsm.redhat.com:443/subscription The system has been registered with ID: 37to907c-ece6-49ea-9174-20b87ajk9ee7 The registered system name is: client1.idm.example.com Installed Product Current Status: Product Name: Red Hat Enterprise Linux for x86_64 Status: Subscribed
该命令提示您输入您的红帽客户门户网站用户名和密码。
如果注册过程失败,您可以使用一个特定的池来注册您的系统。有关如何操作的指南,请执行以下步骤:
确定您需要的订阅池 ID:
# subscription-manager list --available
这个命令会显示您的红帽账户中的所有可用订阅。对于每个订阅,会显示各种相关信息,包括池 ID。
通过使用上一步中决定的池 ID 替换 pool_id 来为您的系统附加适当的订阅:
# subscription-manager attach --pool=pool_id
要将系统注册到 Red Hat Insights,您可以使用 rhc connect
工具。请参阅 设置红帽连接器。
4.2. 在 web 控制台中使用凭证注册订阅
使用以下步骤通过 RHEL web 控制台使用帐户凭证注册新安装的 Red Hat Enterprise Linux。
先决条件
红帽客户门户网站中的有效用户帐户。
请参阅 创建红帽登录 页面。
- RHEL 系统的有效订阅。
流程
- 登录到 RHEL web 控制台。详情请参阅 Web 控制台的日志记录。
在 Overview 页面中的 Health 字段中,点击 Not registered 警告,或者点击主菜单中的 Subscriptions 进入到具有您订阅信息的页面。
.
在 Overview 字段中,点击 Register。
在 Register system 对话框中,选择您要使用您的帐户凭证进行注册的系统。
- 输入您的用户名。
- 输入您的密码。
(可选)输入您的机构名称或 ID。
如果您的帐户属于红帽客户门户网站中的多个机构,您必须添加机构名称或机构 ID。要获得机构 ID,请联系您的红帽相关人员。
- 如果您不想将您的系统连接到 Red Hat Insights,请清除 Insights 复选框。
- 点击 Register 按钮。
此时您的 Red Hat Enterprise Linux Enterprise Linux 系统已被成功注册。
4.3. 在 GNOME 中使用红帽帐户注册系统
按照以下步骤将您的系统注册到您的红帽帐户中。
先决条件
红帽客户门户网站中的有效帐户。
对于新用户注册的详情,请参阅创建红帽登陆页。
流程
- 打开 系统菜单,该菜单可从右上角访问,然后单击 Settings 图标。
- 在 Details → About 部分,点 Register。
- 选择 Registration Server。
- 如果没有使用红帽服务器,在 URL 项中输入服务器地址。
- 在 Registration Type 菜单中选 Red Hat Account。
在 Registration Details 中:
- 在 Login 字段中输入您的红帽帐户用户名。
- 在 Password 字段中输入您的红帽帐户密码。
- 在 Organization 项中输入您的机构名称。
- 点 Register。
4.4. 在 GNOME 中使用激活码注册系统
按照以下步骤,使用激活码注册您的系统。您可从您的机构管理员获得激活码。
先决条件
激活码。
有关生成新激活键的详情,查看 Activation Keys 页。
流程
- 打开 系统菜单,该菜单可从右上角访问,然后单击 Settings 图标。
- 在 Details → About 部分,点 Register。
- 选择 Registration Server。
- 如果没有使用红帽服务器,在 URL 项中输入服务器地址。
- 在 Registration Type 菜单中选 Activation Keys。
在 Registration Details 中:
在 Activation Keys 字段中输入您的激活码。
以逗号 (
,
) 分隔您的激活码。- 在 Organization 字段中输入您的机构名称或者 ID。
- 点 Register。
4.5. 使用安装程序 GUI 注册 RHEL 8
使用以下步骤使用 RHEL 安装程序 GUI 注册新安装的 Red Hat Enterprise Linux 8。
先决条件
红帽客户门户网站中的有效用户帐户。请参阅 创建一个红帽登录页面。
如果用户帐户具有合适的权利(或者帐户在简单内容访问模式下操作),则只能使用用户名和密码进行注册,而无需提供激活密钥。
- 有效的激活密钥和组织 id
流程
使用 帐户或 激活密码 选项验证您的红帽帐户。
选择 Set System Purpose 字段,并在下拉菜单中选择 Role、SLA 和 Usage for the RHEL 8 installation。
此时您的 Red Hat Enterprise Linux 8 系统已被成功注册。
第 5 章 在引导时启动 systemd 服务
作为系统管理员,您可以确定服务如何启动系统上的服务。要管理服务,您可以使用 systemctl
命令行工具来控制 systemd
系统和服务管理器,也可以使用 RHEL web 控制台。
5.1. 启用或禁用服务
作为系统管理员,您可以启用或禁用要在引导时启动的服务,这些更改将在下次重启时应用。如果您希望服务在引导时自动启动,您必须启用此服务。如果您禁用某个服务,它不会在引导时启动,但可以手动启动。您还可以屏蔽服务,使其无法手动启动。屏蔽是一种禁用服务的方法,使该服务能够永久不可用,直到再次屏蔽该服务。
先决条件
- 您必须有对该系统的根权限。
您需要启用的服务不能被屏蔽。如果您有一个屏蔽的服务,您必须首先取消屏蔽它:
# systemctl unmask service_name
流程
在引导时启用服务:
# systemctl enable service_name
用您要启用的服务替换 service_name。
您还可以使用一个命令启用并启动服务:
# systemctl enable --now service_name
禁用要在引导时启动的服务:
# systemctl disable service_name
使用您要禁用的服务替换 service_name。
如果您想使服务永久不可用,请屏蔽该服务:
# systemctl mask service_name
5.2. 在 RHEL web 控制台中管理服务
您可以使用 RHEL web 控制台在引导时启用或禁用服务。在 web 控制台中,您还可以检查服务状态、启动或停止服务或者屏蔽它们。
先决条件
- 您必须有对该系统的根权限。
- 已安装并启用了 Web 控制台。
流程
-
在您喜欢的 web 浏览器中打开
localhost:9090
。 - 使用您系统中的 root 凭证登录到 web 控制台。
要显示 Web 控制台面板,请单击窗口右上角的
Host
图标。在菜单中点击 Services。
您可以管理 systemd 目标、服务、套接字、计时器和路径。
例如,要管理服务 NFS 客户端服务:
- 点 Targets。
- 选择服务 NFS 客户端服务。
- 要启用或禁用该服务,点 Toogle 按钮。
要停止该服务,请点击 ⫶ 按钮,并选择选项 Stop 。
第 6 章 配置系统安全性
计算机安全性涉及到对硬件、软件、信息和服务的保护。计算机安全性是一项非常关键的任务,特别是对于那些处理敏感数据并处理商业事务的企业。
这部分只论述安装操作系统后您可以配置的基本安全功能。
6.1. 启用 firewalld 服务
防火墙是一个网络安全系统,它可根据配置的安全规则监控并控制进入和离开的网络流量。防火墙通常在可信内部网络和其它网络间建立一个屏障。
在安装过程中,Red Hat Enterprise Linux 中提供防火墙的 firewalld
服务会自动启用。
要启用 firewalld
服务,请按照以下步骤执行。
流程
显示
firewalld
的当前状态:$ systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) ...
如果没有启用并运行
firewalld
,切换到root
用户,启动firewalld
服务并在系统重启后自动启动它:# systemctl enable --now firewalld
验证步骤
检查
firewalld
已在运行并启用:$ systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) ...
其他资源
- 使用和配置 firewalld
-
man firewalld(1)
6.2. 在 rhel 8 web 控制台中管理防火墙
要在 web 控制台中配置 firewalld
服务,请导航至 Networking → Firewall。
默认情况下 firewalld
服务是启用的。
流程
要在 web 控制台中启用或禁用
firewalld
,请切换 Firewall 切换按钮。
另外,您可以使用 Add services… 按钮、通过防火墙定义更精细的访问。
6.3. 管理基本 SELinux 设置
Security-Enhanced Linux(SELinux)是系统安全性的额外层,可决定哪些进程可访问哪些文件、目录和端口。这些权限在 SELinux 策略中定义。策略是一组指导 SELinux 安全引擎的规则。
SELinux 有两个可能的状态:
- Disabled
- Enabled
启用 SELinux 时,它以以下模式之一运行:
Enabled
- Enforcing
- Permissive
在 enforcing 模式 中,SELinux 强制执行载入的策略。SELinux 会基于 SELinux 策略规则来拒绝访问,只有明确指定允许的操作才可以被接受。Enforcing 模式是最安全的 SELinux 模式,它是安装后的默认模式。
在 permissive 模式 中,SELinux 不强制执行载入的策略。SELinux 不会拒绝访问,但会在 /var/log/audit/audit.log
日志中报告违反了规则的操作。Permissive 模式是安装过程中的默认模式。在一些特殊情况下,permissive 模式也很有用,如进行故障排除时。
其他资源
6.4. 确保所需的 selinux 状态
默认情况下,SELinux 在 enforcing 模式下运行。然而,在特定情况下,您可以将 SELinux 设置为 permissive 模式,甚至可以禁用 SELinux。
红帽建议使您的系统保持在 enforcing 模式下。为了进行调试,您可以将 SELinux 设置为 permissive 模式。
按照以下步骤更改系统中 SELinux 的状态和模式。
流程
显示当前的 SELinux 模式:
$ getenforce
临时设置 SELinux:
Enforcing 模式:
# setenforce Enforcing
Permissive 模式:
# setenforce Permissive
注意重启后,SELinux 模式被设置为在
/etc/selinux/config
配置文件中指定的值。
要将 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 ...
警告禁用 SELinux 会降低您的系统安全性。避免在
/etc/selinux/config
文件中使用SELINUX=disabled
选项禁用 SELinux,因为这会导致内存泄漏和引发内核 panic 的竞争条件。相反,通过在内核命令行中添加selinux=0
参数来禁用 SELinux。如需更多信息,请参阅 在引导时更改 SELinux 模式。
其他资源
6.5. 在 RHEL 8 web 控制台中切换 SELinux 模式
您可以在 SELinux 菜单项中通过 RHEL 8 web 控制台设置 SELinux 模式。
默认情况下,web 控制台中的 SELinux enforcing 策略是 on,SELinux 在 enforcing 模式下运行。关闭 SELinux 后,您需要将 SELinux 切换到 permissive 模式。请注意,此选择会在下次引导时自动恢复到 /etc/sysconfig/selinux
文件中定义的配置。
流程
在 web 控制台中,使用 SELinux 菜单项中的 Enforce policy 切换按钮打开或关闭 SELinux 强制策略。
6.6. 其他资源
第 7 章 管理用户帐户入门
Red Hat Enterprise Linux 是一个多用户操作系统,可使不同计算机上的多个用户访问安装在一台计算机上的一个系统。每个用户都在自己的帐户下操作,因此管理用户帐户代表 Red Hat Enterprise Linux 系统管理的一个核心元素。
以下是不同类型的用户帐户:
普通用户帐户:
为特定系统用户创建普通帐户。这些帐户可以在正常的系统管理过程中添加、删除和修改。
系统用户帐户:
系统用户帐户代表系统中的特定应用程序标识符。此类帐户通常仅在软件安装时添加或操作,且不会在以后进行修改。
警告系统帐户假定在一个系统中本地可用。如果这些帐户是远程配置和提供的,如 LDAP 配置的实例中,则可能会出现系统中断和服务启动故障。
对于系统帐户,1000 以下的用户 ID 被保留。对于普通帐户,使用从 1000 开始的 ID。但推荐做法是使用从 5000 开始的 ID。有关分配 ID 的信息,请查看
/etc/login.defs
文件。组:
组是出于共同目的将多个用户帐户连接在一起的实体,例如对特定文件授予访问权限。
7.1. 使用命令行工具管理帐户和组
这部分论述了管理用户帐户和组群的基本命令行工具。
显示用户和组群 ID:
$ id uid=1000(example.user) gid=1000(example.user) groups=1000(example.user),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
要创建新用户帐户,请执行以下操作:
# useradd example.user
为 example.user 所属用户帐户分配新密码:
# passwd example.user
将用户添加到组中:
# usermod -a -G example.group example.user
其他资源
-
man useradd(8)
、man passwd(1)
和man usermod(8)
7.2. Web 控制台中管理的系统用户帐户
您可在 RHEL web 控制台中显示用户帐户:
- 在访问系统时验证用户。
- 设置系统的访问权限。
RHEL web 控制台显示系统中的所有用户帐户。因此,在首次登录 web 控制台后,至少可以看到一个可用的用户帐户。
登录到 RHEL web 控制台后,您可以执行以下操作:
- 创建新用户帐户。
- 更改其参数。
- 锁定帐户。
- 终止用户会话。
7.3. 使用 Web 控制台添加新帐户
使用以下步骤将用户帐户添加到系统,并通过 RHEL web 控制台为帐户设置管理权限。
先决条件
- 必须安装并可以访问 RHEL web 控制台。详情请参阅安装 Web 控制台。
流程
- 登录到 RHEL web 控制台。
- 点 Account。
- 点 Create New Account。
在 Full Name 字段中输入用户全名。
RHEL web 控制台会自动在全名中推荐用户名并在 User Name 字段中填充该用户名。如果您不想使用原始命名规则(由名的第一个字母和完整的姓组成),对它进行更新。
在 Password/Confirm 字段中输入密码并重新输入该密码以便验证您的密码是否正确。
下面的颜色栏显示您输入密码的安全级别,这不允许您创建使用弱密码的用户。
- 点 Create 保存设置并关闭对话框。
- 选择新创建的帐户。
在 Roles 项中选择 Server Administrator。
现在,您可以在 Accounts 设置中看到新帐户,您可以使用其凭证连接到该系统。
第 8 章 转储崩溃的内核以便稍后进行分析
要分析系统崩溃的原因,可以使用 kdump
服务保存系统内存内容,以便稍后进行分析。本节概述了 kdump
以及使用 RHEL web 控制台或使用对应的 RHEL 系统角色配置 kdump
的信息。
8.1. kdump
kdump
是一个提供崩溃转储机制的服务。该服务可让您保存系统内存内容以进行分析。kdump
使用 kexec
系统调用在不重启的情况下引导至第二个内核(一个捕获 内核),然后捕获崩溃内核的内存(崩溃转储 或 vmcore),并将其保存到一个文件中。这个第二个内核位于系统内存保留的一部分。
内核崩溃转储可能会是系统失败时唯一可用的信息(关键错误)。因此,在关键任务环境中操作 kdump
是非常重要的。红帽建议系统管理员在正常内核更新周期内定期更新和测试 kexec-tools
。这在部署了新内核功能时尤为重要。
您可以为机器上所有安装的内核或者只为指定的内核启用 kdump
。当在机器上使用多个内核时,这非常有用,有些内核足够稳定,不必担心它们会崩溃。
安装 kdump
时,会创建一个默认的 /etc/kdump.conf
文件。文件包含默认的最小 kdump
配置。您可以编辑此文件来自定义 kdump
配置,但这不是必须的。
8.2. 在 web 控制台中配置 kdump 内存用量和目标位置
下面的流程显示如何使用 RHEL web 控制台界面中的 内核转储
选项卡来为 kdump
内核配置保留的内存量。此流程还描述了如何指定 vmcore
转储文件的目标位置,以及如何测试您的配置。
步骤
-
打开
Kernel Dump
选项卡,启动kdump
服务。 -
使用命令行配置
kdump
内存用量。 点击
Crash dump location
选项旁边的链接。从下拉菜单中选择
Local Filesystem
选项,并指定要保存转储的目录。或者,从下拉菜单中选择
Remote over SSH
选项,使用 SSH 协议将该 vmcore 发送到远程机器。在
Server
、ssh key
和Directory
项中提供远程机器的地址、ssh 密钥位置和目的地目录。另一种选择是从下拉菜单中选择
Remote over NFS
选项,并填写Mount
字段,以使用 NFS 协议将 vmcore 发送到远程计算机。注意选择
Compression
复选框来缩小 vmcore 文件的大小。
崩溃内核以测试您的配置。
-
单击
Test configuration
。 在 Test kdump settings 字段中,点
Crash system
。警告这一步会破坏内核的执行,并导致系统崩溃和数据丢失。
-
单击
8.3. 使用 RHEL 系统角色的 kdump
RHEL 系统角色是 Ansible 角色和模块的集合,可为远程管理多个 RHEL 系统提供一致的配置界面。kdump
角色可让您在多个系统中设置基本内核转储参数。
通过替换 /etc/kdump.conf
文件,kdump
角色完全取代了受管主机的 kdump
配置。另外,如果应用了 kdump
角色,则之前的所有 kdump
设置也会被替换,即使它们没有被角色变量指定,也可以替换 /etc/sysconfig/kdump
文件。
以下示例 playbook 演示了如何应用 kdump
系统角色来设置崩溃转储文件的位置:
--- - hosts: kdump-test vars: kdump_path: /var/crash roles: - rhel-system-roles.kdump
有关 kdump
角色变量的详情,请安装 rhel-system-roles
软件包,并参阅 /usr/share/doc/rhel-system-roles/kdump
目录中的 README.md
或者README.html
文件。
其他资源
8.4. 其他资源
第 9 章 恢复系统
要使用现有备份恢复系统,Red Hat Enterprise Linux 提供了 Relax-and-Recover(ReaR)工具。
您可以使用这个工具作为灾难恢复解决方案,也用于系统迁移。
该工具可让您执行以下任务:
- 生成可引导镜像,并使用镜像从现有备份中恢复系统。
- 复制原始存储布局。
- 恢复用户和系统文件。
- 将系统还原到不同的硬件中。
另外,对于灾难恢复,您还可以将某些备份软件与 ReaR 集成。
设置 ReaR 涉及以下高级别的操作:
- 安装 ReaR。
- 修改 ReaR 配置文件以添加备份方法详情。
- 创建救援系统。
- 生成备份文件。
9.1. 设置 ReaR
使用以下步骤,使用 Relax-and-Recover(ReaR)工具安装软件包,来创建一个救援系统,配置并生成一个备份。
先决条件
根据备份恢复计划完成必要的配置。
请注意: 您可以使用
NETFS
备份方法,该方法是 ReaR 完全整合的、内置的方法。
流程
运行以下命令来安装 ReaR 工具:
# yum install rear
在您选择的编辑器中修改 ReaR 配置文件,例如:
# vi /etc/rear/local.conf
在
/etc/rear/local.conf
中添加备份设置详情。例如,在使用NETFS
备份方法时添加以下行:BACKUP=NETFS BACKUP_URL=backup.location
使用备份位置的 URL 替换 backup.location。
要将 ReaR 配置为在创建新归档时保留之前的备份归档,还需要将以下行添加到配置文件中:
NETFS_KEEP_OLD_BACKUP_COPY=y
要让递增形式进行备份,在每个运行中只备份修改了的文件,添加以下行:
BACKUP_TYPE=incremental
创建一个救援系统:
# rear mkrescue
根据恢复计划进行备份。例如,在使用
NETFS
备份方法时运行以下命令:# rear mkbackuponly
另外,您可以通过运行以下命令来在一个步骤中创建救援系统和备份:
# rear mkbackup
该命令将
rear mkrescue
和rear mkbackuponly
的功能组合在一起。
9.2. 在 64 位 IBM Z 构架上使用 ReaR 救援镜像
现在,基本的 Relax 和 Recover(ReaR)功能在 64 位 IBM Z 构架上作为技术预览提供。您只能在 z/VM 环境中的 IBM Z 上创建 ReaR 救援镜像。备份和恢复逻辑分区(LPAR)还没有进行测试。
64 位 IBM Z 构架上的 ReaR 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的详情,请参考 https://access.redhat.com/support/offerings/techpreview/。
当前唯一可用的输出方法是 Initial Program Load(IPL)。IPL 生成一个内核和一个初始 ramdisk(initrd),可与 zIPL
引导装载程序一起使用。
先决条件
ReaR 已安装。
-
要安装 ReaR,请运行
yum install rear
命令
-
要安装 ReaR,请运行
流程
将以下变量添加到 /etc/rear/local.conf
中来配置 ReaR,以便在 64 位 IBM Z 构架上生成救援镜像:
-
要配置
IPL
输出方法,请添加OUTPUT=IPL
。 要配置备份方法和目的地,请添加
BACKUP
和BACKUP_URL
变量。例如:BACKUP=NETFS BACKUP_URL=nfs://<nfsserver name>/<share path>
重要目前在 64 位 IBM Z 构架上不支持本地备份存储。
-
另外,您还可以配置
OUTPUT_URL
变量来保存内核和initrd
文件。默认情况下,OUTPUT_URL
与BACKUP_URL
保持一致。 要执行备份和救援镜像创建:
rear mkbackup
-
这会在
BACKUP_URL
或OUTPUT_URL
(如果设置了)变量指定的位置创建内核和 initrd 文件,并使用指定的备份方法进行备份。 -
要恢复系统,请使用第 3 步中创建的 ReaR 内核和 initrd 文件,并从与
zipl
引导装载程序、内核和initrd
一起准备的直接附加存储设备(DASD)或者附加光纤通道协议(FCP)的 SCSI 设备启动。如需更多信息,请参阅使用准备的 DASD。 -
当救援内核和
initrd
引导时,它会启动 ReaR 救援环境。继续系统恢复。
目前,救援过程会重新格式化连接到系统的所有 DASD(直接附加存储设备)。如果系统存储设备中存在任何有价值的数据,则不要尝试系统恢复。这还包括与 zipl bootloader、ReaR 内核以及用来引导到救援环境的 initrd 一起准备的设备。确保保留一份副本。
其他资源
第 10 章 使用日志文件进行故障排除
日志文件包含有关系统的消息,包括内核、服务及其上运行的应用。这些信息可帮助故障排除问题或监控系统功能。Red Hat Enterprise Linux 中的日志记录系统是基于内置的 syslog
协议的。特定的程序使用这个系统记录事件并将其整理到日志文件中,这些文件在审核操作系统和故障排除各种问题时非常有用。
10.1. 处理 syslog 信息的服务
以下两个服务处理 syslog
信息:
-
systemd-journald
守护进程 -
Rsyslog
服务
systemd-journald
守护进程收集来自各种来源的信息并将其转发到 Rsyslog
以便进一步处理。systemd-journald
守护进程从以下来源收集信息:
- 内核
- 引导过程的早期阶段
- 启动并运行守护进程的标准和错误输出
-
Syslog
Rsyslog
服务根据类型和优先权对 syslog
信息进行排序,并将其写入 /var/log
目录下的文件中。/var/log
目录会永久保存日志信息。
10.2. 存储 syslog 信息的子目录
/var/log
下的以下子目录保存了 syslog
信息。
-
/var/log/messages
- 除以下外的所有syslog
信息 -
/var/log/secure
- 与安全和验证相关的信息和错误 -
/var/log/maillog
- 与邮件服务器相关的信息和错误 -
/var/log/cron
- 与定期执行的任务相关的日志文件 -
/var/log/boot.log
- 与系统启动相关的日志文件
10.3. 使用 Web 控制台检查日志文件
按照此流程中的步骤,使用 RHEL web 控制台来检查日志文件。
流程
- 登录到 RHEL web 控制台。详情请参阅 登录到 Web 控制台。
- 点 Logs。
图 10.1. 在 RHEL 8 web 控制台中检查日志文件

10.4. 使用命令行查看日志
Journal 是 systemd 的一个组件,可帮助查看和管理日志文件。它解决了与传统日志记录相关的问题,与系统的其余部分紧密集成,并且支持各种日志记录技术以及日志文件的访问管理。
您可以通过命令行,使用 journalctl
命令查看系统日志中的信息,例如:
$ journalctl -b | grep kvm
May 15 11:31:41 localhost.localdomain kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00
May 15 11:31:41 localhost.localdomain kernel: kvm-clock: cpu 0, msr 76401001, primary cpu clock
...
表 10.1. 查看系统信息
命令 | 描述 |
---|---|
| 显示所有收集的日志条目。 |
|
显示与特定文件相关的日志。例如: |
| 显示当前引导的日志。 |
| 显示当前引导的内核日志。 |
表 10.2. 查看特定服务的信息
命令 | 描述 |
---|---|
|
过滤日志以查看与 "foo" |
|
合并匹配。例如: 这个命令显示与 |
|
分隔符"+"将两个表达式组合成一个逻辑 OR 。例如,此命令显示来自进程为 |
|
此命令显示与引用同一字段的任一表达式匹配的所有条目。在这里,这个命令会显示与 systemd-unit |
表 10.3. 查看与特定引导相关的日志
命令 | 描述 |
---|---|
| 显示引导号、其 ID 以及与引导相关的第一条和最后一个消息的时间戳列表。您可以在下一个命令中使用 ID 来查看详细信息。 |
| 显示有关指定的引导 ID 的信息。 |
10.5. 其他资源
-
man journalctl(1)
- 配置远程日志记录解决方案
第 11 章 获得红帽支持
本节介绍了如何使用红帽支持有效解决问题以及 sosreport
。
要获得红帽支持,请使用 红帽客户门户网站,它提供对您订阅所有可用资源的访问。
11.1. 通过红帽客户门户网站获得红帽支持
下面的部分论述了如何使用红帽客户门户网站获得帮助。
先决条件
- 红帽客户门户网站中的有效用户帐户。请参阅 创建红帽登录帐号。
- RHEL 系统的有效订阅。
流程
访问 红帽支持:
- 创建新的支持问题单。
- 与红帽支持专家启动实时聊天。
- 通过致电或发送电子邮件与红帽专家联系。
11.2. 使用 sosreport 进行故障排除
sosreport
命令收集 Red Hat Enterprise Linux 系统的配置详情、系统信息和诊断信息。
以下小节论述了如何使用 sosreport
命令为您的支持问题单生成报告。
先决条件
- 红帽客户门户网站中的有效用户帐户。请参阅 创建红帽登录帐号。
- RHEL 系统的有效订阅。
- 支持问题单号。
流程
安装
sos
软件包:# yum install sos
注意Red Hat Enterprise Linux 的默认最小安装不包括
sos
软件包,该软件包提供sosreport
命令。生成一个报告:
# sosreport
将报告附加到您的支持问题单中。
请参阅 如何将文件附加到红帽支持问题单?更多信息请参阅红帽知识库文章。
请注意,在附加报告时会提示您输入相关问题单的号码。
第 12 章 管理软件包
12.1. RHEL 8 中的软件管理工具
在 RHEL 8 中,软件安装是通过新版本的 YUM 工具(YUM v4)启用的,该工具基于 DNF 技术。
上游文档将此技术称为 DNF,这个工具在上游社区被称为 DNF。因此,RHEL 8 中新的 YUM 工具返回的一些输出中会包括 DNF。
尽管 RHEL 8 中使用的 YUM v4 是基于 DNF的,但它与 RHEL 7 中使用的 YUM v3 兼容。对于软件安装,yum
命令及其大多数选项在 RHEL 8 中的工作方式与 RHEL 7 中相同。
所选的 yum 插件和工具已移植到新的 DNF 后端,并可以安装在 RHEL 7 中相同的名称下。软件包也提供兼容性符号链接,因此可在通常的位置找到 二进制文件、配置文件和目录。
请注意,YUM v3 提供的旧版本的 Python API 不再可用。您可以将插件和脚本迁移到 YUM v4 提供的新 API 中(DNF Python API),该 API 稳定且完全被支持。如需更多信息,请参阅 DNF API 参考。
12.2. 应用程序流
RHEL 8 引入了应用程序流的概念。现在,用户空间组件的多个版本的发布和更新频率会比核心操作系统的发布和更新频率快。应用程序流为用户提供了,在不影响底层平台或特定部署的稳定性的情况下,对 Red Hat Enterprise Linux 进行定制的更大的灵活性。
作为应用程序流提供的组件可以打包为模块或 RPM 软件包,并通过 RHEL 8 中的 AppStream 存储库交付。每个 Application Stream 都有一个生命周期,它与 RHEL 8 的生命周期相同或更短。Red Hat Enterprise Linux 8 应用程序流生命周期 页中列出了生命周期较短的应用程序流。
模块是代表逻辑单元的软件包集合: 应用程序、语言堆栈、数据库或一组工具。这些软件包被一同构建、测试并发布。
模块流代表 Application Stream 组件的版本。例如,PostgreSQL 数据库服务器的两个流(版本)位于 postgresql 模块中: PostgreSQL 10(默认流)和 PostgreSQL 9.6。在系统中只能安装 一 个模块流。不同的容器可以使用不同的版本。
详细的模块命令,请参考 安装、管理和删除用户空间组件文档。有关 AppStream 中可用的模块列表,请查看 软件包清单。
12.3. 搜索软件包
yum 允许您使用软件包执行一组完整的操作。
下面的部分描述了如何使用 yum:
- 搜索软件包。
- 列出软件包。
- 列出软件仓库。
- 显示软件包信息。
- 列出软件包组。
- 在 yum 输入中指定全局表达式。
12.3.1. 使用 YUM 搜索软件包
使用以下流程查找提供特定应用程序或其他内容的软件包。
流程
要搜索软件包,使用:
# yum search term
使用与该软件包相关的术语替换 term。
请注意,
yum search
命令返回与软件包名称和概述中的术语匹配。这样可加快搜索速度,您可以搜索您不知道名称但您了解相关术语的软件包。要在软件包描述中包含匹配名,请使用:
# yum search --all term
用您要在软件包名称、概述或描述中搜索的术语替换 term。
请注意
yum search --all
可进行更详细但更慢的搜索。
12.3.2. 使用 YUM 列出软件包
使用以下流程列出已安装和可用的软件包。
流程
要列出所有安装以及可用软件包的信息,请使用:
# yum list --all
要列出安装在您的系统中的所有软件包,请使用:
# yum list --installed
要列出所有启用的存储库中可以安装的软件包,请使用:
# yum list --available
请注意,您可以通过将全局表达式附加为参数来过滤结果。如需了解更多详细信息,请参阅 在 yum 输入中指定全局表达式。
12.3.3. 使用 YUM 列出存储库
使用以下流程列出启用和禁用的存储库。
流程
要列出您系统中所有启用的库,请使用:
# yum repolist
要列出系统中所有禁用的软件仓库,请使用:
# yum repolist --disabled
要列出启用和禁用的存储库,请使用:
# yum repolist --all
要列出有关存储库的附加信息,请使用:
# yum repoinfo
请注意,您可以通过传递 ID 或库名称作为参数或者附加全局表达式来过滤结果。如需了解更多详细信息,请参阅 在 yum 输入中指定全局表达式。
12.3.4. 使用 YUM 显示软件包信息
您可以使用 YUM 显示软件包的各种信息,如版本、发行、大小、载入的插件等。
流程
要显示一个或多个软件包的信息,请使用:
# yum info package-name
使用软件包名称替换 package-name。
请注意,您可以通过将全局表达式附加为参数来过滤结果。如需了解更多详细信息,请参阅 在 yum 输入中指定全局表达式。
12.3.5. 使用 YUM 列出软件包组
使用 yum
查看已安装的软件包组,并过滤列出的结果。
流程
要查看已安装的和可用组的数量,请使用:
# yum group summary
要列出所有安装的和可用的组,请使用:
# yum group list
请注意,您可以通过为
yum group list
命令添加命令行选项(--hidden
,--available
)过滤结果。更多可用选项请查看 man page。要列出特定组群中包含的强制和可选软件包,请使用:
# yum group info group-name
用组群的名称替换 group-name。
请注意,您可以通过将全局表达式附加为参数来过滤结果。如需了解更多详细信息,请参阅 在 yum 输入中指定全局表达式。
12.3.6. 在 YUM 输入中指定全局表达式
yum
命令允许您将一个或多个 glob 表达式 作为参数过滤。当将全局表达式作为参数传递给 yum
命令时,您必须退出全局表达式。
流程
要确定将全局表达式传递给 yum
,请使用以下方法之一 :
使用双引号或单引号包括整个全局表达式。
# yum provides "*/file-name"
用文件名替换 file-name。
在它们前面使用反斜杠(
\
)符号转义通配符字符。# yum provides \*/file-name
用文件名替换 file-name。
12.4. 安装软件包
下面的部分描述了如何使用 yum:
- 安装软件包。
- 安装软件包组。
- 在 yum 输入中指定软件包名称。
12.4.1. 使用 YUM 安装软件包
要安装软件包以及所有软件包的依赖软件包,请使用:
# yum install package-name
使用软件包名称替换 package-name。
要同时安装多个软件包及其依赖软件包,请使用:
# yum install package-name-1 package-name-2
使用软件包名称替换 package-name-1 和 package-name-2。
当在一个 multilib 系统(AMD64、Intel 64 机器)中安装软件包时,您可以指定软件包的构架,方法是将其附加到软件包名称中:
# yum install package-name.arch
使用软件包的名称和构架替换 package-name.arch。
如果您知道要安装的二进制代码的名称,但不知道软件包名,则可以使用到这个二进制代码的路径作为一个参数:
# yum install /usr/sbin/binary-file
使用二进制文件路径替换
/usr/sbin/binary-file
。yum 搜索软件包列表,找到提供
/usr/sbin/binary-file
的软件包,并提示您是否安装该软件包。要从本地目录中安装之前下载的软件包,请使用:
# yum install /path/
使用到该软件包的路径替换 /path/。
请注意,您可以通过显式定义如何解析参数来优化软件包搜索。详情请查看 第 12.4.3 节 “在 YUM 输入中指定软件包名称”。
12.4.2. 使用 YUM 安装软件包组
下面的流程描述了如何使用 yum
根据组群名称或 groupID 安装软件包组。
流程
要根据组名称安装软件包组,请使用:
# yum group install group-name
或者
# yum install @group-name
使用组群或者环境组群的完整名称替换 group-name。
要根据 groupID 安装软件包组,请使用:
# yum group install groupID
使用组 ID 替换 groupID。
12.4.3. 在 YUM 输入中指定软件包名称
要优化安装和删除过程,您可以在 yum install
和 yum remove
命令中附加 -n
、-na
或 -nevra
后缀以明确定义如何解析参数:
要使用其确切的名称安装软件包,请使用:
# yum install-n name
使用具体软件包名称替换 name。
要使用其确切的名称和构架安装软件包,请使用:
# yum install-na name.architecture
使用软件包的实际名称和构架替换 name 和 architecture。
要使用其确切的名称、epoch、版本、发行版和架构安装软件包,请使用:
# yum install-nevra name-epoch:version-release.architecture
用软件包的名称、epoch、版本、发行和架构替换 name、epoch、version、release和 architecture
12.5. 更新软件包
yum 允许您检查您的系统是否有待处理的更新。您可以列出需要更新的软件包,并选择更新单个软件包、多个软件包或者所有软件包。如果您选择更新的软件包有依赖项,它们也会被更新。
下面的部分描述了如何使用 yum:
- 检查更新。
- 更新单个软件包。
- 更新软件包组。
- 更新所有软件包及其依赖项。
- 应用安全更新。
- 自动软件更新。
12.5.1. 使用 YUM 检查更新
以下流程描述了如何使用 yum
检查系统上安装的软件包的可用更新。
流程
要查看您系统中安装的软件包是否有可用的更新,请使用:
# yum check-update
输出返回有可用更新的软件包及其依赖项列表。
12.5.2. 使用 YUM 更新单个软件包
使用以下流程通过 yum
更新单个软件包及其依赖项。
要更新软件包,请使用:
# yum update package-name
使用软件包名称替换 package-name。
在对内核应用更新时,yum 总会安装一个新内核,无论是否使用了 yum update
或 yum install
命令。
12.5.3. 使用 YUM 更新软件包组
使用以下流程通过 yum
更新一组软件包及其依赖项。
流程
要更新软件包组,请使用:
# yum group update group-name
使用软件包组的名称替换 group-name。
12.5.4. 使用 YUM 更新所有软件包及其依赖项
使用以下流程通过 yum
更新所有软件包及其依赖项。
流程
要更新所有软件包及其依赖项,请使用:
# yum update
12.5.5. 使用 YUM 更新与安全相关的软件包
使用以下流程,使用 yum
更新具有安全勘误的软件包。
流程
要升级到有安全勘误的最新可用软件包,请使用:
# yum update --security
要升级到最后一个安全勘误软件包,请使用:
# yum update-minimal --security
12.5.6. 自动化软件更新
要自动并定期检查和下载软件包更新,您可以使用 dnf-automatic
软件包提供的 DNF Automatic 工具。
DNF Automatic 是 yum 的替代命令行界面,它适用于使用 systemd 计时器、cron 任务和其它此类工具自动和常规执行。
DNF Automatic 根据需要同步软件包元数据,然后检查可用更新。之后,该工具可以根据其配置的方式来执行以下操作之一:
- 退出
- 下载更新的软件包
- 下载并应用更新
然后,通过选定的机制(如标准输出或电子邮件)报告操作的结果。
12.5.6.1. 安装 DNF Automatic
以下流程描述了如何安装 DNF Automatic 工具。
流程
要安装
dnf-automatic
软件包,请使用:# yum install dnf-automatic
验证步骤
要验证安装是否成功,请运行以下命令来确认
dnf-automatic
软件包是否存在:# rpm -qi dnf-automatic
12.5.6.2. DNF Automatic 配置文件
默认情况下,DNF Automatic 使用 /etc/dnf/automatic.conf
作为其配置文件来定义其行为。
配置文件被分隔为以下主题部分:
[commands]
部分设置 DNF Automatic 的操作模式。
[emitters]
部分定义如何报告 DNF Automatic 的结果。
[command_email]
部分为用来发送电子邮件的外部命令提供电子邮件发布程序配置。
[email]
部分提供电子邮件发布程序配置。
[base]
部分覆盖 yum 主配置文件中的设置。
使用 /etc/dnf/automatic.conf
文件的默认设置,DNF Automatic 会检查可用的更新,下载这些更新,并以标准输出的形式报告结果。
[commands]
部分中操作模式的设置会被所有计时器单元的 systemd 定时器单元覆盖,dnf-automatic.timer
除外。
其他资源
- 如需具体部分的详情,请参阅 DNF Automatic 文档。
-
有关 systemd 计时器单元的详情,请查看
man dnf-automatic
手册页。 -
有关
dnf-automatic 软件包
中包含的 systemd 计时器单元的概述,请参阅 dnf-automatic 软件包中所含的 systemd 计时器单元的概述 章节 dnf-automatic 软件包中所含的 systemd 计时器单元的概述
12.5.6.3. 启用 DNF Automatic
要运行 DNF Automatic,您始终需要启用并启动特定的 systemd 计时器单元。您可以使用 dnf-automatic
软件包中提供的计时器单元,或者您可以根据需要编写您自己的计时器单元。
下面的部分论述了如何启用 DNF Automatic。
先决条件
-
您可以通过修改
/etc/dnf/automatic.conf
配置文件来指定 DNF Automatic 的行为。
有关 DNF Automatic 配置文件的更多信息,请参阅 section 2.5.6.2 "DNF Automatic 配置文件"。
流程
选择、启用并启动一个符合您需要的 systemd 计时器单元:
# systemctl enable --now <unit>
其中
<unit>
是以下计时器之一:-
dnf-automatic-download.timer
-
dnf-automatic-install.timer
-
dnf-automatic-notifyonly.timer
-
dnf-automatic.timer
-
对于 下载 可用的更新,请使用:
# systemctl enable dnf-automatic-download.timer
# systemctl start dnf-automatic-download.timer
对于 下载并安装 可用的更新,请使用:
# systemctl enable dnf-automatic-install.timer
# systemctl start dnf-automatic-install.timer
对于 报告 可用的更新,请使用:
# systemctl enable dnf-automatic-notifyonly.timer
# systemctl start dnf-automatic-notifyonly.timer
另外,您可以使用:
# systemctl enable dnf-automatic.timer
# systemctl start dnf-automatic.timer
就下载和应用更新而言,这个计时器单元的行为取决于 /etc/dnf/automatic.conf
配置文件中的设置。默认行为与 dnf-automatic-download.timer
类似:它会下载更新的软件包,但不安装它们。
或者,您还可以从命令行或从自定义脚本,通过直接执行 /usr/bin/dnf-automatic
文件来运行 DNF Automatic。
验证步骤
要验证是否启用了计时器,请运行以下命令:
# systemctl status <systemd timer unit>
其他资源
-
有关 dnf-automatic 计时器的详情,请参考
man dnf-automatic
手册页。 -
有关
dnf-automatic
软件包中所含的 systemd 计时器单元的概述,请参阅 dnf-automatic 软件包中所含的 systemd 计时器单元的概述 部分
12.5.6.4. dnf-automatic 软件包中包含的 systemd 计时器单元的概述
systemd 定时器单元优先并覆盖 /etc/dnf/automatic.conf
配置文件中有关下载和应用更新的设置。
例如,如果您在 /etc/dnf/automatic.conf
配置文件中设置了以下选项,但已激活了 dnf-automatic-notifyonly.timer
单元,则软件包将不会被下载:
download_updates = yes
dnf-automatic
软件包包括以下 systemd 计时器单元:
计时器单元 | 功能 | 覆盖 /etc/dnf/automatic.conf 文件中的设置? |
---|---|---|
| 下载软件包以便进行更新。
注: 这个计时器单元没有安装更新的软件包。要执行安装,您必须执行 | 是 |
| 下载并安装更新的软件包。 | 是 |
| 仅下载存储库数据,以保持存储库缓存最新,并通知您有关可用的更新。 注: 这个计时器单元不下载或安装更新的软件包 | 是 |
|
此计时器有关下载和应用更新的行为由
默认行为与 | 否 |
其他资源
-
有关
dnf-automatic
计时器的详情,请参考man dnf-automatic
手册页。 -
有关
/etc/dnf/automatic.conf
配置文件的更多信息,请参阅 DNF Automatic 配置文件
12.6. 卸载软件包
下面的部分描述了如何使用 yum:
- 删除软件包。
- 删除软件包组。
- 在 yum 输入中指定软件包名称。
12.6.1. 使用 YUM 删除软件包
使用以下流程,根据组名或 groupID 删除软件包。
流程
要删除某个软件包以及所有相依性软件包,请使用:
# yum remove package-name
使用软件包名称替换 package-name。
要同时删除多个软件包及其依赖项,请使用:
# yum remove package-name-1 package-name-2
使用软件包名称替换 package-name-1 和 package-name-2。
在删除其依赖软件包前。yum 无法删除软件包。
请注意,您可以通过显式定义如何解析参数来优化软件包搜索。如需了解更多详细信息,请参阅 在 yum 输入中指定软件包名称。
12.6.2. 使用 YUM 删除软件包组
使用以下流程,根据组名或 groupID 删除软件包。
流程
要根据组群名称删除软件包组,请使用:
# yum group remove group-name
或者
# yum remove @group-name
使用组群的全名替换 group-name。
要通过 groupID 删除软件包组,请使用:
# yum group remove groupID
使用组 ID 替换 groupID。
12.6.3. 在 YUM 输入中指定软件包名称
要优化安装和删除过程,您可以在 yum install
和 yum remove
命令中附加 -n
、-na
或 -nevra
后缀以明确定义如何解析参数:
要使用其确切的名称安装软件包,请使用:
# yum install-n name
使用具体软件包名称替换 name。
要使用其确切的名称和构架安装软件包,请使用:
# yum install-na name.architecture
使用软件包的实际名称和构架替换 name 和 architecture。
要使用其确切的名称、epoch、版本、发行版和架构安装软件包,请使用:
# yum install-nevra name-epoch:version-release.architecture
用软件包的名称、epoch、版本、发行和架构替换 name、epoch、version、release和 architecture
12.7. 管理软件包组
软件包组是用于共同目的的软件包集合(System Tools、Sound and Video)。安装软件包组会拉取一组依赖软件包,这可节省大量时间。
下面的部分描述了如何使用 yum:
- 列出软件包组。
- 安装软件包组。
- 删除软件包组。
- 在 yum 输入中指定全局表达式。
12.7.1. 使用 YUM 列出软件包组
使用 yum
查看已安装的软件包组,并过滤列出的结果。
流程
要查看已安装的和可用组的数量,请使用:
# yum group summary
要列出所有安装的和可用的组,请使用:
# yum group list
请注意,您可以通过为
yum group list
命令添加命令行选项(--hidden
,--available
)过滤结果。更多可用选项请查看 man page。要列出特定组群中包含的强制和可选软件包,请使用:
# yum group info group-name
用组群的名称替换 group-name。
请注意,您可以通过将全局表达式附加为参数来过滤结果。如需了解更多详细信息,请参阅 在 yum 输入中指定全局表达式。
12.7.2. 使用 YUM 安装软件包组
下面的流程描述了如何使用 yum
根据组群名称或 groupID 安装软件包组。
流程
要根据组名称安装软件包组,请使用:
# yum group install group-name
或者
# yum install @group-name
使用组群或者环境组群的完整名称替换 group-name。
要根据 groupID 安装软件包组,请使用:
# yum group install groupID
使用组 ID 替换 groupID。
12.7.3. 使用 YUM 删除软件包组
使用以下流程,根据组名或 groupID 删除软件包。
流程
要根据组群名称删除软件包组,请使用:
# yum group remove group-name
或者
# yum remove @group-name
使用组群的全名替换 group-name。
要通过 groupID 删除软件包组,请使用:
# yum group remove groupID
使用组 ID 替换 groupID。
12.7.4. 在 YUM 输入中指定全局表达式
yum
命令允许您将一个或多个 glob 表达式 作为参数过滤。当将全局表达式作为参数传递给 yum
命令时,您必须退出全局表达式。
流程
要确定将全局表达式传递给 yum
,请使用以下方法之一 :
使用双引号或单引号包括整个全局表达式。
# yum provides "*/file-name"
用文件名替换 file-name。
在它们前面使用反斜杠(
\
)符号转义通配符字符。# yum provides \*/file-name
用文件名替换 file-name。
12.8. 处理软件包管理历史记录
yum history
命令允许您查看有关 yum 事务的时间线、所发生的日期和时间、受影响的软件包数量、这些事务是成功还是被中止,以及是否在事务间更改了 RPM 数据库的信息。yum history
命令也可用于撤销或重做事务。
下面的部分描述了如何使用 yum:
- 列出事务。
- 恢复事务。
- 重复事务。
- 在 yum 输入中指定全局表达式。
12.8.1. 使用 YUM 列出事务
使用以下流程列出最新的事务、对所选软件包的最新操作以及特定事务的详情。
流程
要显示所有最新的 yum 事务列表,请使用:
# yum history
要显示所选软件包的最新操作列表,请使用:
# yum history list package-name
使用软件包名称替换 package-name。您可以通过附加全局表达式来过滤命令输出。如需了解更多详细信息,请参阅 在 yum 输入中指定全局表达式。
要检查特定的事务,请使用:
# yum history info transactionID
用事务的 ID 替换 transactionID。
12.8.2. 使用 YUM 恢复事务
以下流程描述了如何使用 yum
恢复所选事务或最后一个事务。
流程
要恢复特定的事务,请使用:
# yum history undo transactionID
用事务的 ID 替换 transactionID。
要恢复到最后的事务,请使用:
# yum history undo last
请注意,yum history undo
命令只恢复事务期间执行的操作步骤。如果事务安装了一个新的软件包,yum history undo
命令会卸载它。如果事务卸载了一个软件包,则 yum history undo
命令会重新安装它。yum history undo
还会尝试将所有更新的软件包降级到它们之前的版本(如果旧包仍然可用)。
12.8.3. 使用 YUM 重复事务
使用以下流程,通过 yum
重复所选事务或最后的事务。
流程
要重复特定的事务,请使用:
# yum history redo transactionID
用事务的 ID 替换 transactionID。
要重复最后的事务,请使用:
# yum history redo last
请注意, yum history redo
命令只重复事务期间执行的步骤。
12.8.4. 在 YUM 输入中指定全局表达式
yum
命令允许您将一个或多个 glob 表达式 作为参数过滤。当将全局表达式作为参数传递给 yum
命令时,您必须退出全局表达式。
流程
要确定将全局表达式传递给 yum
,请使用以下方法之一 :
使用双引号或单引号包括整个全局表达式。
# yum provides "*/file-name"
用文件名替换 file-name。
在它们前面使用反斜杠(
\
)符号转义通配符字符。# yum provides \*/file-name
用文件名替换 file-name。
12.9. 管理软件存储库
yum 及相关工具的配置信息保存在 /etc/yum.conf
文件中。此文件包含一个或多个 [repository]
部分,用于设置特定存储库选项。
建议您在 /etc/yum.repos.d/
目录的新的或现有 .repo
文件中定义单独的库。
请注意:您在 /etc/yum.conf
文件的单独 [repository]
部分定义的值会覆盖 [main]
部分中设置的值。
下面的部分描述了如何:
-
设置
[repository]
选项。 - 添加 yum 软件仓库。
- 启用 yum 软件仓库。
- 禁用 yum 软件仓库。
12.9.1. 设置 YUM 存储库选项
/etc/yum.conf
配置文件包含 [repository]
部分,其中 repository 是唯一的软件仓库 ID。[repository]
项可以用来定义独立的 yum 软件仓库。
不要给出红帽软件仓库使用的自定义软件仓库名称以避免冲突。
有关可用 [存储库] 选项
的完整列表,请查看 yum.conf(5)手册页中的 [repositor] OPTIONS
部分。
12.9.2. 添加一个 YUM 存储库
流程
要定义新软件仓库,您可以:
-
在
/etc/yum.conf
文件中添加[repository]
部分。 在
/etc/yum.repos.d/
目录中的.repo
文件中添加[repository]
部分。+
yum repositories 通常提供它们自己的 .repo
文件。
建议您在 .repo
文件中而不是 /etc/yum.conf
中定义您的程序仓库,因为在这个目录中的所有带有 .repo
文件扩展名的文件都被 yum 读取。
要在您的系统中添加库并启用该程序,请使用:
# yum-config-manager --add-repo repository_URL
使用指向库的 URL 替换 repository_url。
从未验证或不受信任的源而不是基于红帽证书的 内容交付网络
(CDN)来获取和安装软件包构成了潜在的安全风险,并可能导致安全性、稳定性、兼容性和可维护性问题。
12.9.3. 启用一个 YUM 存储库
在您的系统中添加了一个 'yum' 存储库后,启用它以确保安装和更新。
流程
要启用存储库,请使用:
# yum-config-manager --enable repositoryID
使用唯一的存储库 ID 替换 repositoryID。
要列出可用存储库的 ID,请参阅 使用 yum 列出软件包。
12.9.4. 禁用一个 YUM 存储库
禁用特定的 YUM 存储库,以防止安装或更新特定的软件包。
流程
要禁用 yum 软件仓库,请使用:
# yum-config-manager --disable repositoryID
使用唯一的存储库 ID 替换 repositoryID。
要列出可用存储库的 ID,请参阅 使用 yum 列出软件包。
12.10. 配置 YUM
yum 及相关工具的配置信息保存在 /etc/yum.conf
文件中。这个文件包含一个必须的 [main]
部分,它可让您设置具有全局效果的 yum 选项。
下面的部分描述了如何:
- 查看当前的 yum 配置。
- 设置 yum [main] options。
- 使用 yum 插件。
12.10.1. 查看当前的 YUM 配置
使用以下流程查看当前的 yum
配置。
流程
要显示
/etc/yum.conf
文件中[main]
部分指定的全局 yum 选项的当前值,请使用:# yum config-manager --dump
12.10.2. 设置 YUM 主要选项
/etc/yum.conf
配置文件包含一个 [main]
部分。本节中的键值对会影响 yum 如何运行并处理存储库。
您可以在 /etc/yum.conf
文件 [main]
部分标题下添加附加选项。
有关可用的 [main]
选项的完整列表,请查看 yum.conf(5)手册页中的 [main] OPTIONS
部分。
12.10.3. 使用 YUM 插件
yum 提供扩展和增强操作的插件。默认安装某些插件。
下面的部分论述了如何启用、配置和禁用 yum 插件。
12.10.3.1. 管理 YUM 插件
流程
插件配置文件始终包含一个 [main]
部分,其中 enabled=
选项控制在运行 yum
命令时插件是否启用。如果缺少这个选项,您可以手动将其添加到该文件中。
每个安装的插件在 /etc/dnf/plugins/
目录中都有自己的配置文件。您可以在这些文件中启用或禁用特定插件选项。
12.10.3.2. 启用 YUM 插件
以下流程描述了如何禁用或启用所有 YUM 插件,为特定的命令禁用所有插件,或为单个命令禁用某些 YUM 插件。
+
流程
启用所有 yum 插件:
-
请确定在
/etc/yum.conf
文件的[main]
部分有以plugins=
开头的行。 将
plugins=
的值设置为1
。plugins=1
-
请确定在
12.10.3.3. 禁用 YUM 插件
禁用所有 yum 插件:
-
请确定在
/etc/yum.conf
文件的[main]
部分有以plugins=
开头的行。 将
plugins=
的值设置为0
。plugins=0
重要不建议禁用所有插件。某些插件提供重要的 yum 服务。特别是 product-id 和 subscription-manager 插件,它们为基于证书的
内容发布网络
(CDN)提供支持。全局禁用插件是作为一个方便选项提供的,仅在使用 yum 诊断潜在的问题时才建议使用。
-
请确定在
要禁用特定命令的所有 yum 插件,请在该命令中附加
--noplugins
选项。# yum --noplugins update
要在一个命令中禁用特定的 yum 插件,请在命令中附加
--disableplugin=plugin-name
选项。# yum update --disableplugin=plugin-name
使用插件的名称替换 plugin-name。
第 13 章 systemd 简介
作为系统管理员,您需要与 systemd
进行交互,即 Linux 操作系统的系统和服务管理器。systemd
软件套件提供控制和报告系统状态的工具和服务,以便在启动期间启动期间初始化您的系统。从 Red Hat Enterprise Linux 7 开始,systemd
是 Upstart 作为默认 init 系统的替代,并与 SysV init 脚本向后兼容。systemd
软件套件提供很多功能,例如:
- 系统服务并行启动,
- 按需激活守护进程,
- 基于依赖性的服务控制逻辑。
作为系统资源和服务表示,systemd
引进了 systemd 单元的概念。执行或控制特定任务的 systemd 单元是 systemd 管理的基本对象。请参阅以下各种 systemd 单元类型示例:
- service,
- target,
- device,
- mount,
- timer,
- 与 init 系统相关的其他类型。
如果要显示所有可用的单元类型,请使用:
# systemctl -t help
systemd 单元由一个名称、类型和配置文件组成,该文件定义这个单元的任务。单元配置文件位于下表中列出的目录中之一:
表 13.1. systemd 单元文件位置
目录 | 描述 |
---|---|
| 与安装的 RPM 软件包一起分发的 systemd 单元文件。 |
| 在运行时创建的 systemd 单元文件。该目录优先于安装了的服务单元文件的目录。 |
|
由 |
systemd
的默认配置在编译过程中定义,您可以在 /etc/systemd/system.conf
文件中找到配置。如果您想与那些默认值分离,并全局覆盖所选的 systemd 单元默认值,请使用这个文件。
例如,若要覆盖设为 90 秒的超时限制的默认值,可使用 DefaultTimeoutStartSec
参数输入所需的值(以秒为单位)。
DefaultTimeoutStartSec=required value
13.1. 其他资源
- Red Hat Enterprise Linux 7 的 迁移规划指南
第 14 章 使用 systemctl 管理系统服务
作为系统管理员,您要管理系统服务并执行与不同服务相关的不同任务,如启动、停止、重启、启用和禁用服务、列出服务以及显示系统服务状态等。要与 systemd
系统和服务管理器交互,请使用 systemctl
实用程序。
14.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 abrtd.service loaded active running ABRT Automated Bug Reporting Tool ---- systemd-vconsole-setup.service loaded active exited Setup Virtual Console tog-pegasus.service loaded active running OpenPegasus CIM Server LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 46 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'
默认情况下,
systemctl list-units
命令只显示活跃的单位。对于每个服务单元文件,命令会显示:-
UNIT
:其全名 -
LOAD
:是否单元文件已被载入的信息 -
ACTIVE
或SUB
:它的高级别和低级单元文件激活状态 -
DESCRIPTION
: 简短描述
-
要列出 所有载入的单元,而不管它们的状态 ,请输入以下命令及
--all
或-a
命令行选项:$ systemctl list-units --type service --all
要列出所有可用服务单元的状态(启用的或禁用的),请输入:
$ systemctl list-unit-files --type service UNIT FILE STATE abrt-ccpp.service enabled abrt-oops.service enabled abrtd.service enabled ... wpa_supplicant.service disabled ypbind.service disabled 208 unit files listed.
对于每个服务单元,这个命令会显示:
-
UNIT FILE
:其全名 -
STATE
:是否服务单元已启用或禁用的信息
-
其他资源
14.2. 显示系统服务状态
您可以检查任何服务单元以获取其详细信息,并验证服务的状态是启用还是正在运行。您还可以查看在特定的服务单元之后或之前启动的服务。
流程
要显示对应于系统服务的服务单元的详细信息,请输入:
$ systemctl status <name>.service
将 <name> 替换为您要检查的服务单元的名称(例如:
gdm
)。此命令显示所选服务单元的名称,后跟其简短描述,一个或多个在 可用的服务单元信息 中描述的字段(如果其通过
root
用户执行),以及最新的日志条目。表 14.1. 可用的服务单元信息
项 描述 Loaded
是否载入了服务单元、到这个单元文件的绝对路径,以及是否启用该单位的信息。
Active
服务单元是否在运行的信息,后面有一个时间戳。
Main PID
对应系统服务的 PID 及其名称。
Status
相关系统服务的额外信息。
Process
有关相关进程的附加信息。
CGroup
有关相关的控制组(
cgroups)
的其他信息。例 14.1. 显示服务状态
GNOME 显示管理器的服务单元名为
gdm.service
。要确定这个服务单元的当前状态,在 shell 提示下键入以下内容:# systemctl status gdm.service gdm.service - GNOME Display Manager Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled) Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago Main PID: 1029 (gdm) CGroup: /system.slice/gdm.service ├─1029 /usr/sbin/gdm ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno... └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r... Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.
要只验证特定的服务单元是否正在运行,请输入:
$ systemctl is-active <name>.service
要确定是否一个特定的服务单元已启用,请输入:
$ systemctl is-enabled <name>.service
注意如果指定的服务单元正在运行或已启用,则
systemctl is-active
和systemctl is-enabled
都会返回一个状态为0
的退出状态。要确定在指定的服务单元之前启动哪些服务,请输入:
# systemctl list-dependencies --after <name>.service
在命令中将 <name> 替换为服务的名称。
例如,要查看在
gdm
之前启动的服务的列表,请输入:# systemctl list-dependencies --after gdm.service gdm.service ├─dbus.socket ├─getty@tty1.service ├─livesys.service ├─plymouth-quit.service ├─system.slice ├─systemd-journald.socket ├─systemd-user-sessions.service └─basic.target [output truncated]
要确定在指定的服务单元之后排序启动哪些服务,请输入:
# systemctl list-dependencies --before <name>.service
在命令中将 <name> 替换为服务的名称。
例如,要查看在
gdm
之后要启动的服务的列表,请输入:# systemctl list-dependencies --before gdm.service gdm.service ├─dracut-shutdown.service ├─graphical.target │ ├─systemd-readahead-done.service │ ├─systemd-readahead-done.timer │ └─systemd-update-utmp-runlevel.service └─shutdown.target ├─systemd-reboot.service └─final.target └─systemd-reboot.service
其他资源
14.3. 启动一个系统服务
您可以使用 start
命令在当前会话中启动系统服务。
先决条件
- 您必须有对该系统的根权限。
流程
要启动一个所选的对应于系统服务的服务单元,情以
root
用户身份输入以下命令:# systemctl start <name>.service
将 <name> 替换为您要启动的服务单元的名称(例如
httpd.service
)。例 14.2. 启动 httpd.service
Apache HTTP 服务器的服务单元名为
httpd.service
。要激活这个服务单元并在当前会话中启动httpd
守护进程,请以root
用户身份输入以下命令:# systemctl start httpd.service
注意在
systemd
中,服务之间存在正和负的依赖项。启动一个特定的服务可能需要启动一个或多个其他服务(正依赖项)或停止一个或多个服务(负依赖项)。当您尝试启动一个新服务时,
systemd
会自动解析所有依赖项,而不明确通知用户。这意味着,如果您已运行了一个服务,并且您尝试使用负依赖项启动另一个服务,则第一个服务会自动停止。例如,如果您运行
postfix
服务,并且您尝试启动sendmail
服务,则systemd
会首先自动停止postfix
,因为这两个服务有冲突,且无法在同一个端口上运行。
14.4. 停止一个系统服务
如果要在当前会话中停止系统服务,请使用 stop
命令。
先决条件
- 您必须有对该系统的根权限。
流程
要停止对应于系统服务的服务单元,请以
root
用户身份输入以下命令:# systemctl stop <name>.service
将 <name> 替换为您要停止的服务单元的名称(例如:
bluetooth
)。例 14.3. 停止 bluetoothd.service
bluetoothd
守护进程的服务单元名为bluetooth.service
。要停用这个服务单元,并在当前会话中停止bluetoothd
守护进程,请以root
用户身份输入以下命令:# systemctl stop bluetooth.service
14.5. 重启一个系统服务
您可以使用 restart
命令在当前会话中重启系统服务。
这个流程描述了如何:
- 在当前会话中停止所选的服务单元,并立即重新启动它
- 如果相应服务已在运行,仅重启服务单元
- 重新加载系统服务的配置,而不中断其执行
先决条件
- 您必须有对该系统的根权限。
流程
重启与系统服务对应的服务单元:
# systemctl restart <name>.service
将 <name> 替换为您要重启的服务单元的名称(例如
httpd
)。注意如果所选服务单元没有运行,这个命令也会启动它。
或者,只有在对应的服务已在运行时,重启服务单元:
# systemctl try-restart <name>.service
或者,在不中断服务执行的情况下重新载入配置:
# systemctl reload <name>.service
注意不支持此功能的系统服务忽略此命令。要重新启动这些服务,请改为使用
reload-or-restart
和reload-or-try-restart
命令。例 14.4. 重新加载 httpd.service
为了防止用户遇到不必要的错误消息或部分渲染的 Web 页面,Apache HTTP 服务器允许您编辑和重新加载其配置,而无需重新启动它并中断主动处理的请求。要做到这一点,请使用以下命令:
# systemctl reload httpd.service
其他资源
14.6. 启用一个系统服务
您可以将服务配置为在系统引导时自动启动。enable
命令读取所选服务单元的 [Install]
部分,并创建指向 /etc/systemd/system/
目录及其子目录中 /usr/lib/systemd/system/name.service
文件的合适的符号链接。但是,它不会重写已经存在的链接。
先决条件
- 您必须有对该系统的根权限。
流程
配置与系统服务对应的服务单元,在引导时自动启动:
# systemctl enable <name>.service
将 <name> 替换为您要启用的服务单元的名称(例如
httpd
)。或者,如果您想要确保重新创建符号链接,请重新启用系统单元:
# systemctl reenable <name>.service
该命令禁用所选服务单元,并立即再次启用。
例 14.5. 启用 httpd.service
要将 Apache HTTP 服务器配置为在引导时自动启动,请使用以下命令:
# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
14.7. 禁用一个系统服务
您可以防止服务单元在引导时自动启动。disable
命令读取所选服务单元的 [Install]
部分,并从 etc/systemd/system/
目录及其子目录中删除到 /usr/lib/systemd/system/name.service
文件的合适的符号链接。
先决条件
- 您必须有对该系统的根权限。
流程
要将对应于系统服务的服务单元配置为在引导时不自动启动,请以
root
用户身份输入以下命令:# systemctl disable <name>.service
将 <name> 替换为您要禁用的服务单元的名称(例如:
bluetooth
)。例 14.6. 禁用 bluetoothd.service
bluetoothd
守护进程的服务单元命名为bluetooth.service
。要防止这个服务单元在引导时启动,请以root
用户身份输入以下命令:# systemctl disable bluetooth.service Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service. Removed symlink /etc/systemd/system/dbus-org.bluez.service.
或者,您可以屏蔽任何服务单元,并阻止手动启动或者由其他服务启动:
# systemctl mask <name>.service
这个命令将
/etc/systemd/system/name.service
文件替换为到/dev/null
的符号链接,从而导致systemd
无法访问实际的单元文件。要恢复这个动作,并显示一个服务单元,请输入:
# systemctl unmask <name>.service
第 15 章 使用 systemd 目标
systemd
中的目标在系统开始期间作为同步点。目标单元文件以 .target
文件扩展名结尾,代表 systemd
目标。目标单元的目的是通过一组依赖项将各种 systemd
单元分组到一起。
请考虑以下示例:
-
用于启动图形会话的
graphical.target 单元
启动系统服务,如 GNOME 显示管理器(gdm.service
)或 Accounts Service (accounts-daemon.service
),同时还激活multi-user.target 单元
。 -
同样,
multi-user.target
单元启动其他基本系统服务,如 NetworkManager (NetworkManager.service
) 或 D-Bus (dbus.service
),并激活另一个名为basic.target
的目标单元。
在使用 systemd
目标时,您可以查看默认目标,更改它或更改当前目标。
15.1. 查看默认对象
您可以使用 systemctl
命令显示默认目标,或检查 /etc/systemd/system/default.target
文件,该文件代表默认目标单元。
流程
确定默认使用哪个目标单元:
$ systemctl get-default graphical.target
使用符号链接确定默认目标:
$ ls -l /usr/lib/systemd/system/default.target
15.2. 查看目标单元
您可以显示所有单元类型,或将搜索限制为当前载入的目标单元。默认情况下,systemctl list-units
命令只显示活跃的单元。
流程
列出所有载入的单元,而不考虑它们的状态:
$ systemctl list-units --type target --all
或者,列出所有当前载入的目标单元:
$ systemctl list-units --type target UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network.target loaded active active Network paths.target loaded active active Paths remote-fs.target loaded active active Remote File Systems sockets.target loaded active active Sockets sound.target loaded active active Sound Card spice-vdagentd.target loaded active active Agent daemon for Spice guests swap.target loaded active active Swap sysinit.target loaded active active System Initialization time-sync.target loaded active active System Time Synchronized timers.target loaded active active Timers LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 17 loaded units listed.
15.3. 更改默认对象
默认目标单元由 /etc/systemd/system/default.target
文件表示。以下流程描述了如何使用 systemctl 命令更改默认目标:
流程
要确定默认目标单元:
# systemctl get-default
将系统配置为默认使用不同的目标单元:
# systemctl set-default multi-user.target rm /etc/systemd/system/default.target ln -s /usr/lib/systemd/system/multi-user.target /etc/systemd/system/default.target
这个命令将
/etc/systemd/system/default.target
文件替换为指向/usr/lib/systemd/system/name.target
的符号链接,其中 name 是您要使用的目标单元的名称。使用您要默认使用的目标单元的名称替换 multi-user。表 15.1.
set-default
命令的通用目标基本的
涵盖基本引导的单元目标
rescue
在基本系统中拉取的单元目标,并生成一个救援 shell
多用户
用于设置多用户系统的单元目标
图形化
用于设置图形登录屏幕的单元目标
紧急
在主控制台上启动紧急 shell 的单元目标
sysinit
在系统初始化所需的服务中拉取的单元目标
重启
# reboot
其他资源
-
systemd.special
man page -
bootup
手册页
15.4. 使用符号链接更改默认对象
您可以通过创建一个到您想要的目标的符号链接来更改默认目标。
流程
确定默认的目标单元:
# ls -l /etc/systemd/system/default.target
请注意,在某些情况下,
/etc/systemd/system/default.target
链接可能不存在,systemd 会在/usr
中查找默认的目标单元。在这种情况下,使用以下命令确定默认的目标单元:# ls -l /usr/lib/systemd/system/default.target
删除
/etc/systemd/system/default.target
链接:# rm /etc/systemd/system/default.target
创建一个符号链接:
# ln -sf /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
重启系统:
# reboot
验证步骤
验证新创建的
default.target
:$ systemctl get-default multi-user.target
15.5. 更改当前目标
当您设置默认目标单元时,当前目标将保持不变,直到下次重启为止。如果要在不重启的情况下更改当前会话中的目标单元,请使用 systemctl isolate
命令。
流程
在当前会话中切换到不同的目标单元:
# systemctl isolate multi-user.target
这个命令启动名为 multi-user 以及所有依赖的单元的目标单元,并立即停止所有其他单元。
使用您要默认使用的目标单元的名称替换 multi-user。
验证步骤
验证新创建的 default.target:
$ systemctl get-default multi-user.target
15.6. 引导至救援模式
救援模式提供了一个方便的单用户环境,它可让您在无法完成常规引导过程时修复您的系统。在救援模式中,系统会尝试挂载所有本地文件系统并启动某些重要的系统服务,但它不会激活网络接口或者同时允许更多的用户登录到该系统。
流程
要进入救援模式,在当前会话中更改当前目标:
# systemctl rescue Broadcast message from root@localhost on pts/0 (Fri 2013-10-25 18:23:15 CEST): The system is going down to rescue mode NOW!
注意这个命令与
systemctl isolate rescue.target
类似,但它也会向当前登录到该系统的所有用户发送信息性消息。要防止
systemd
发送信息,使用--no-wall
命令行选项运行以下命令:# systemctl --no-wall rescue
15.7. 引导至紧急模式
紧急模式 提供最小的环境,并可在系统无法进入救援模式的情况下修复您的系统。在紧急模式下,系统仅挂载用于读取的 root 文件系统,不会尝试挂载任何其他本地文件系统,不激活网络接口,并且仅启动几个必要的服务。
流程
要进入紧急模式,请更改当前目标:
# systemctl emergency
注意这个命令与
systemctl isolate emergency.target
类似,但它也会向当前登录到系统的所有用户发送信息性消息。要防止 systemd 发送这个信息,使用
--no-wall
命令行选项运行以下命令:# systemctl --no-wall emergency
第 16 章 关闭、挂起和休眠系统
本节包含了有关关闭、暂停或休眠您的操作系统的说明。
16.1. 系统关闭
要关闭系统,您可以直接使用 systemctl
工具,或者通过 shutdown
命令来调用这个工具。
使用 shutdown
命令的好处是:
支持时间参数
这对于计划的维护特别有用。此外,用户还有更多时间来对计划的系统关闭的警告做出反应。
- 取消关闭的选项
16.2. 使用 shutdown 命令来关闭系统
按照以下流程,您可以使用 shutdown
命令来执行各种操作。您可以关闭系统,并在某个时间关闭机器的电源,或者在不关闭机器电源的情况下关闭和停止系统,或者取消等待的关闭。
先决条件
-
切换到
root
用户
流程
要关闭系统,并在某个时间关闭机器的电源,请使用以下格式的命令:
shutdown --poweroff hh:mm
这里的 hh:mm 是 24 小时时钟格式的时间。
/run/nologin
文件会在系统关闭前 5 分钟创建,以防止新的登录。当使用时间参数时,可以在命令中附加可选的壁纸消息。
另外,要在一段延迟后关闭和停止系统,而不关闭机器的电源,请使用:
shutdown --halt +m
其中 +m 是延迟时间(以分钟为单位)。
now
等同于+0
。要取消等待的关闭,请使用:
shutdown -c
其他资源
-
shutdown(8)
手册页 - 使用 systemctl 命令来关闭系统
16.3. 使用 systemctl 命令来关闭系统
按照以下流程,您可以使用 systemctl
命令来执行各种操作。您可以关闭系统并关闭机器的电源,或者关闭和停止系统而不关闭机器的电源。
先决条件
-
切换到
root
用户
流程
要关闭系统并关闭机器的电源,请使用以下格式的命令:
systemctl poweroff
另外,要关闭和停止系统而不关闭机器的电源,请使用:
systemctl halt
默认情况下,运行其中任何一个命令都会导致 systemd 向当前登录到该系统的所有用户发送一条信息性消息。要防止 systemd 发送此消息,请运行所选的带有 --no-wall
命令行选项的命令。
其他资源
16.4. 重启系统
您可以按照这个流程重启系统。
先决条件
-
切换到
root
用户
流程
要重启该系统,请运行以下命令:
systemctl reboot
默认情况下,这个命令会让 systemd 向当前登录到该系统的所有用户发送一条信息性消息。要防止 systemd 发送此消息,请运行带有 --no-wall
命令行选项的这个命令。
16.5. 挂起系统
您可以按照这个流程挂起系统。
先决条件
-
切换到
root
用户。
流程
要挂起该系统,请运行以下命令:
systemctl suspend
该命令在 RAM 中保存系统状态,除了 RAM 模块外,关闭机器中的大多数设备。当您重新打开机器时,系统会从内存中恢复其状态,而无需再次引导。
由于系统状态保存在 RAM 中,而不是保存在硬盘上,因此,从挂起模式恢复系统比从休眠模式恢复要快得多。但是,请注意,暂停的系统状态也容易受到断电的影响。
其他资源
16.6. 休眠系统
通过遵循此流程,您可以休眠系统,或者休眠并挂起系统。
先决条件
-
切换到
root
用户。
流程
要休眠系统,请运行以下命令:
systemctl hibernate
该命令在硬盘驱动器中保存系统状态,并断开机器电源。当您重新打开机器时,系统会从保存的数据中恢复其状态,而无需再次引导。
由于系统状态保存在硬盘上,而不是保存在 RAM 中,因此机器不必保持对 RAM 模块的供电。但是,因此,从休眠模式恢复系统要比将其恢复为挂起模式恢复要慢得多。
另外,要休眠并挂起系统,请运行以下命令:
systemctl hybrid-sleep
其他资源
16.7. systemctl 的电源管理命令的概述
您可以使用以下 systemctl
命令列表来控制系统的电源管理。
表 16.1. systemctl 电源管理命令的概述
systemctl 命令 | 描述 |
---|---|
| 关闭系统。 |
| 关闭系统。 |
| 重启该系统。 |
| 挂起系统。 |
| 休眠系统。 |
| 休眠并挂起系统。 |
第 17 章 使用 systemd 单元文件
本章包括 systemd 单元文件的描述。以下部分介绍了如何进行:
- 创建自定义单元文件
- 将 SysV init 脚本转换为单元文件
- 修改现有单元文件
- 使用实例化单元
17.1. 单元文件简介
单元文件包含描述这个单元并定义其行为的配置指令。几个 systemctl
命令在后台与单元文件一起工作。要进行更细的调整,系统管理员必须手动编辑或创建单元文件。systemd 单元文件位置 列出了在系统上存储单元文件的三个主要目录,/etc/systemd/system/
目录为系统管理员创建的或自定义的单元文件而保留。
单元文件名的格式如下:
unit_name.type_extension
这里的 unit_name 代表单元名称,type_extension 标识单元类型。有关单元类型的完整列表,请参阅 systemd 单元文件
例如,系统通常会有 sshd.service
和 sshd.socket
单元。
可通过一个目录来补充单元文件,以了解额外的配置文件。例如,要将自定义配置选项添加到 sshd.service
中,请创建 sshd.service.d/custom.conf
文件,并在其中插入额外的指令:有关配置目录的更多信息,请参阅 修改现有的单元文件。
另外, sshd.service.wants/
和 sshd.service.requires/
目录可以被创建。这些目录包含到 sshd
服务依赖的单元文件的符号链接。符号链接会在安装过程中根据 [Install] 单元文件选项自动创建,或者根据 [Unit] 选项在运行时自动创建。也可以手动创建这些目录和符号链接。有关 [Install] 和 [Unit] 选项的详情请参考下表。
可以使用所谓的 单元指定符 来设置许多单元文件选项 - 在加载单元文件时,通配符字符串被动态地替换为单元参数。这可创建通用单元文件,来用作生成实例化单元的模板。请参阅 使用实例化单元。
17.2. 单元文件结构
单元文件通常由三个部分组成:
-
[Unit]
部分 - 包含不依赖于该单元类型的通用选项。这些选项提供了单元描述,指定了单元的行为,并设置了其他单元的依赖项。有关最常用的 [Unit] 选项的列表,请参阅 重要 [单元] 部分选项。 -
[Unit type]
部分 - 如果单元具有特定于类型的指令,则这些指令分组在以单元类型命名的部分下。例如,服务单元文件包含[Service]
部分。 -
[Install]
部分 - 包含systemctl enable
和disable
命令使用的单元安装信息。有关[Install]
部分的选项列表,请参阅 重要 [Install] 部分选项。
17.3. 重要 [Unit] 部分选项
下表列出了 [Unit] 部分的重要选项。
表 17.1. 重要 [Unit] 部分选项
选项 [a] | 描述 |
---|---|
|
单元的有意义的描述。这个文本显示在 |
| 提供单元参考文档的 URI 列表。 |
|
定义启动单位的顺序。这个单元仅在 |
|
配置其它单元上的依赖关系。 |
|
配置比 |
|
配置负的依赖关系,与 |
[a]
有关 [Unit] 部分中可配置的选项的完整列表,请查看 systemd.unit(5) 手册页。
[b]
在大多数情况下,只需要 After 和 Before 单元文件选项设置顺序依赖关系就足够了。如果还使用 Wants (推荐)或 Requires 设置了需要的依赖关系,仍需要指定依赖关系顺序。这是因为排序和要求依赖关系可以独立地工作。
|
17.4. 重要 [Service] 部分选项
下表列出了 [Service] 部分的重要选项。
表 17.2. 重要 [Service] 部分选项
选项 [a] | 描述 |
---|---|
|
配置影响
*
*
*
*
*
* |
|
指定在启动该单元时要执行的命令或脚本。 |
| 指定在该单元停止时要执行的命令或脚本。 |
| 指定重新载入该单元时要执行的命令或脚本。 |
|
启用此选项后,服务会在进程退出后重新启动,但 |
|
如果设置为 True,即使所有进程都退出了,该服务也被视为活动状态。默认值为 False。这个选项在配置了 |
[a]
有关 [Service] 部分中可配置的选项的完整列表,请参阅 systemd.service(5) 手册页。
|
17.5. 重要 [Install] 部分选项
下表列出了 [Install] 部分的重要选项。
表 17.3. 重要 [Install] 部分选项
选项 [a] | 描述 |
---|---|
|
为这个单元提供空格分开的额外名称列表。除 |
|
依赖于这个单元的单元列表。当启用此单元时,在 |
|
依赖于这个单元的单位列表。当启用这个单元时,在 |
| 指定要随这个单元一起安装或卸载的单元列表。 |
| 仅限于实例化单元,这个选项指定启用单位的默认实例。请参阅 使用实例化单元。 |
[a]
有关 [Install] 部分中可配置的选项的完整列表,请查看 systemd.unit(5) 手册页。
|
17.6. 创建自定义单元文件
从头开始创建单元文件有几个用例:您可以运行一个自定义的守护进程,创建现有服务的第二个实例,如 如使用 sshd 服务的第二个实例来创建一个自定义单元文件 中所述
另一方面,如果您只想修改或扩展现有单元的行为,请使用 修改单元文件 中的说明。
流程
以下流程描述了创建自定义服务的一般过程:
-
使用自定义服务准备可执行文件。这可以是自定义创建的脚本,也可以是软件供应商提供的可执行文件。如果需要,准备 PID 文件来保存自定义服务主要进程的恒定 PID。也可以包含环境文件来存储该服务的 shell 变量。确保源脚本是可执行的(通过执行
chmod a+x
)且不是交互的。 在
/etc/systemd/system/
目录中创建一个单元文件,并确定它有正确的文件权限。以root
用户身份执行:touch /etc/systemd/system/name.service
chmod 664 /etc/systemd/system/name.service
使用要创建的服务的名称替换 name。请注意,该文件不需要可执行。
打开上一步中创建的
name.service
文件并添加服务配置选项。根据您要创建的服务类型,有多种选项可以使用,请查看 单元文件结构。以下是网络相关服务的单元配置示例:
[Unit] Description=service_description After=network.target [Service] ExecStart=path_to_executable Type=forking PIDFile=path_to_pidfile [Install] WantedBy=default.target
其中:
-
service_description 是一个信息性描述,显示在 journal 日志文件和
systemctl status
命令的输出中。 -
After
设置确保服务仅在网络运行后启动。添加一个空格分隔的其他相关服务或目标的列表。 - path_to_executable 代表到实际可执行服务的路径。
-
Type=forking
用于进行 fork 系统调用的守护进程。该服务的主要进程使用 path_to_pidfile 中指定的 PID 创建。在 重要 [Service] 部分选项中查找其他启动类型。 -
WantedBy
指出服务应在其下启动的目标。将这些目标视为旧的运行级别概念的替代品。
-
service_description 是一个信息性描述,显示在 journal 日志文件和
以
root
用户身份执行以下命令来通知 systemd 是否存在一个新 的name.service
文件:systemctl daemon-reload
systemctl start name.service
警告在创建新单元文件或修改现有单元文件后,总是要运行
systemctl daemon-reload
命令。否则,systemctl start
或systemctl enable
命令可能会因为 systemd 和磁盘上的实际服务单元文件的状态不匹配而失败。请注意,对于有大量单元的系统来说,这需要很长时间,因为每个单元的状态必须在重新载入的过程中被序列化,然后再进行反序列化。
17.7. 使用 sshd 服务的第二个实例创建一个自定义单元文件
系统管理员通常需要配置并运行多个服务实例。这可以通过创建原始服务配置文件的副本并修改某些参数来避免与服务的主实例冲突。以下流程演示了如何创建 sshd
服务第二个实例。
流程
创建第二个守护进程将使用的
sshd_config
文件副本:# cp /etc/ssh/sshd{,-second}_config
编辑上一步中创建的
sshd-second_config
文件,为第二个守护进程分配不同的端口号和 PID 文件:Port 22220 PidFile /var/run/sshd-second.pid
有关
Port
和PidFile
选项的详情,请查看sshd_config
(5)手册页。请确定您选择的端口没有被其他服务使用。在运行该服务前,PID 文件不一定存在,它会在服务启动时自动生成。为
sshd
服务创建 systemd 单元文件副本:# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshd-second.service
按如下方式更改上一步中创建的
sshd-second.service
:修改
Description
选项:Description=OpenSSH server second instance daemon
将 sshd.service 添加到
After
选项中指定的服务,因此第二实例仅在第一个实例启动后启动:After=syslog.target network.target auditd.service sshd.service
- sshd 的第一个实例包括密钥生成,因此删除 ExecStartPre=/usr/sbin/sshd-keygen 行。
为
sshd
命令添加-f /etc/ssh/sshd-second_config
参数,以便使用其它配置文件:ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
在进行以上修改后,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
如果使用 SELinux,请将第二个 sshd 实例的端口添加到 SSH 端口中,否则 sshd 的第二个实例将被拒绝绑定到端口:
# semanage port -a -t ssh_port_t -p tcp 22220
启用 sshd-second.service,以便在引导时自动启动:
# systemctl enable sshd-second.service
-
使用
systemctl status
命令验证 sshd-second.service 是否在运行。 通过连接到该服务来验证是否正确启用了端口:
$
ssh -p 22220 user@server
如果使用防火墙,请确定正确配置了防火墙以便允许到第二个 sshd 实例的连接。
17.8. 将 SysV init 脚本转换为单元文件
在花费时间将 SysV 初始化脚本转换为单元文件之前,请确保在别处尚未执行转换。Red Hat Enterprise Linux 上安装的所有核心服务都有默认的单元文件,这同样适用于许多第三方软件包。
将初始化脚本转换成单元文件需要分析脚本并从中提取所需信息。基于这个数据,您可以创建一个单元文件。因为初始化脚本可能会随服务类型有很大的变化,因此您可能需要使用比本章中所介绍的更多的配置选项来进行转换。请注意,systemd 单元不再支持 init 脚本提供某种级别的定制。
转换所需的大部分信息是在脚本标头中提供的。以下示例显示了用于在 Red Hat Enterprise Linux 6 上启动 postfix
服务的初始化脚本的开头部分:
#!/bin/bash # postfix Postfix Mail Transfer Agent # chkconfig: 2345 80 30 # description: Postfix is a Mail Transport Agent, which is the program that moves mail from one machine to another. # processname: master # pidfile: /var/spool/postfix/pid/master.pid # config: /etc/postfix/main.cf # config: /etc/postfix/master.cf ### BEGIN INIT INFO # Provides: postfix MTA # Required-Start: $local_fs $network $remote_fs # Required-Stop: $local_fs $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop postfix # Description: Postfix is a Mail Transport Agent, which is the program that moves mail from one machine to another. ### END INIT INFO
在上面的例子中,只有以 # chkconfig 和 # description 开头的行是强制的,因此您可能不会在不同的 init 文件中找到其他行。BEGIN INIT INFO 和 END INIT INFO 行之间连接的文本名为 Linux Standard Base (LSB) header。如果指定了,LSB 标头包含定义服务描述、依赖项和默认运行级别的指令。下面是一个分析任务概述,旨在收集新单元文件所需的数据。postfix 初始化脚本被用作一个示例。
17.9. 查找 systemd 服务描述
您可以在以 #description 开头的行中找到有关脚本的描述性信息。将此描述与单元文件的 [Unit] 部分中的 Description
选项中的服务名称一同使用。LSB 标头可能在 #Short-Description 和 #Description 行中包含类似的数据。
17.10. 查找 systemd 服务的依赖项
LSB 标头可能包含一些在服务间组成相依性指令。大多数可以转换为 systemd 单元选项,请查看下表:
表 17.4. LSB 标头中的依赖项选项
LSB 选项 | 描述 | 单元文件的对等 |
---|---|---|
| 指定服务的引导工具名称,可在其他初始化脚本中引用(使用"$"前缀)。因为单元文件根据文件名指向其他单元,所以不再需要这个操作。 | – |
|
包含所需服务的引导工具名称。这被转换为一个排序依赖关系,引导工具名被替换为其所属的相应服务或目标的单元文件名。例如,如果是 |
|
| 比 Required-Start 更弱的依赖项。Should-Start 依赖项失败不会影响服务的启动。 |
|
| 组成负依赖关系。 |
|
17.11. 查找服务的默认目标
以 #chkconfig 开始的行包含三个数字值。最重要的是第一个代表启动该服务的默认运行级别的数字。将这些运行级别映射到等同的 systemd 目标。然后在单元文件的 [Install] 部分中的 WantedBy
选项中列出这些目标。例如: postfix
之前在运行级别 2、3、4 和 5 中启动,它们转换为 multi-user.target 和 graphical.target。请注意,graphical.target 依赖于 multiuser.target,因此不需要指定它们。您可能会在 LSB 标头的 #Default-Start 和 #Default-Stop 行中找到默认和禁用运行级别的信息。
#chkconfig 行里指定的其他两个值代表初始化脚本的启动和关闭优先级。如果 systemd 加载了初始化脚本,则这些值由 systemd 解释,但没有等效的单元文件。
17.12. 查找该服务使用的文件
初始化脚本需要从专用目录中载入功能库,并允许导入配置、环境和 PID 文件。环境变量在初始化脚本标头中以 #config 开头的行中指定,它转换为 EnvironmentFile
单元文件选项。#pidfile 初始化脚本行中指定的 PID 文件使用 PIDFile
选项导入到单元文件中。
未包含在初始化脚本标头中的关键信息是该服务可执行文件的路径,以及该服务可能需要的一些其他文件。在之前的 Red Hat Enterprise Linux 版本中,初始化脚本使用 Bash case 语句来定义服务对默认操作的行为,如 startstop、或 restart,以及自定义定义的操作。以下摘录自 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 }
初始化脚本的可扩展性允许指定两个自定义函数,start()
函数块调用的 conf_check()
和 make_aliasesdb()
。然后,上面的代码中提到几个外部文件和目录:主服务可执行文件 /usr/sbin/postfix
、/etc/postfix/
和 /var/spool/postfix/
配置目录,以及 /usr/sbin/postconf/
目录。
systemd 只支持预定义的操作,但可以执行带有 ExecStart
、ExecStartPre
、ExecStartPost
、ExecStop
和 ExecReload
选项的自定义的可执行文件。在 service start 中执行 /usr/sbin/postfix
以及支持脚本。转换复杂的初始化脚本需要了解脚本中每个语句的用途。其中一些语句特定于操作系统版本,因此您不需要转换它们。另一方面,在新环境中可能需要在单元文件、以及服务可执行文件和支持文件中进行一些调整,。
17.13. 修改现有单元文件
在系统中安装的服务会附带保存在 /usr/lib/systemd/system/
目录中的默认单元文件。系统管理员不应该直接修改这些文件,因此任何自定义都必须仅限于 /etc/systemd/system/
目录中的配置文件。
流程
根据所需更改的程度,选择以下方法之一:
-
要返回单元的默认配置,请删除
/etc/systemd/system/
中自定义的配置文件。 要在不重启系统的情况下对单元文件应用更改,请执行:
systemctl daemon-reload
daemon-reload
选项重新加载所有单元文件,并重新创建依赖项树,这需要立即将任何更改应用到单元文件中。另外,您可以使用以下命令得到同样的结果,该命令必须以root
用户执行: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
17.14. 扩展默认单元配置
这部分描述了如何使用额外的配置选项扩展默认的单元文件。
流程
要使用额外的配置选项扩展默认的单元文件,请首先在
/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。此文件遵循通常的单元文件结构,因此必须在合适的部分中指定所有的指令,请参阅 单元文件结构。
例如,要添加自定义依赖项,请使用以下内容创建配置文件:
[Unit] Requires=new_dependency After=new_dependency
这里的 new_dependency 代表这个单元被标记为依赖项。另一个例子是主进程退出后重新启动服务的配置文件,延迟 30 秒:
[Service] Restart=always RestartSec=30
建议您创建仅关注一项任务的小配置文件。这些文件可轻松地移动或者链接到其他服务的配置目录。
要应用对单位所做的更改,以
root
用户身份执行:systemctl daemon-reload
systemctl restart name.service
例 17.1. 扩展 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/
中的单元文件。因此,如果配置文件包含一个只能指定一次的选项,如 Description
或 ExecStart
,则此选项的默认值可被覆盖。请注意,在 systemd-delta
命令的输出中,如 监控覆盖单元 中所述,这些单元总是被标记为 [EXTENDED],即使在总和中,某些选项实际上也会被覆盖。
17.15. 覆盖默认单元配置
这部分描述了如何覆盖默认的单元配置。
流程
要在更新提供该单元文件的软件包后保留更改,首先要将该文件复制到
/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
17.16. 更改超时限制
您可以为每个服务指定一个超时值,以防止出现故障的服务中断。否则,一般服务的超时时间会被默认设置为 90 秒,SysV 兼容的服务会被设置为 300 秒。
例如:要为 httpd
服务扩展超时限制:
流程
将
httpd
单元文件复制到/etc/systemd/system/
目录中:cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/httpd.service
打开文件
/etc/systemd/system/httpd.service
,并在[Service]
部分指定TimeoutStartUSec
值:… [Service] … PrivateTmp=true TimeoutStartSec=10 [Install] WantedBy=multi-user.target …
重新载入
systemd
守护进程:systemctl daemon-reload
Optional.验证新的超时值:
systemctl show httpd -p TimeoutStartUSec
注意要全局更改超时限制,在
/etc/systemd/system.conf
中输入DefaultTimeoutStartSec
。
17.17. 监控覆盖的单元
这部分描述了如何显示覆盖或修改的单元文件的概述。
流程
要显示覆盖或修改的单元文件概述,请使用以下命令:
systemd-delta
例如,以上命令的输出结果如下:
[EQUIVALENT] /etc/systemd/system/default.target → /usr/lib/systemd/system/default.target [OVERRIDDEN] /etc/systemd/system/autofs.service → /usr/lib/systemd/system/autofs.service --- /usr/lib/systemd/system/autofs.service 2014-10-16 21:30:39.000000000 -0400 + /etc/systemd/system/autofs.service 2014-11-21 10:00:58.513568275 -0500 @@ -8,7 +8,8 @@ EnvironmentFile=-/etc/sysconfig/autofs ExecStart=/usr/sbin/automount $OPTIONS --pid-file /run/autofs.pid ExecReload=/usr/bin/kill -HUP $MAINPID -TimeoutSec=180 +TimeoutSec=240 +Restart=Always [Install] WantedBy=multi-user.target [MASKED] /etc/systemd/system/cups.service → /usr/lib/systemd/system/cups.service [EXTENDED] /usr/lib/systemd/system/sssd.service → /etc/systemd/system/sssd.service.d/journal.conf 4 overridden configuration files found.
17.18. 使用实例化单元
可以在运行时使用单一模板配置文件实例化多个单元。"@"字符用于标记模板并与其关联。实例化的单元可以从另一个单元文件(使用 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
文件,从中读取配置并启动服务。
例如, 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。
17.19. 重要单元指定符
可在任何单元配置文件中使用通配符字符(称为 单元指定符)。单元指定符替换某些单元参数,并在运行时被解释。下表列出了对模板单元特别有用的单元指定符。
表 17.5. 重要单元指定符
单元指定符 | 含义 | 描述 |
---|---|---|
| 完整单元名称 |
代表完整的单元名称,包括类型后缀。 |
| 前缀名称 | 代表删除了类型后缀的单元名称。对于实例化单元,%p 代表"@"字符前的单元名称的部分。 |
| 实例名称 |
是"@"字符和类型后缀之间的实例化单元名称的一部分。 |
| 主机名 | 代表在载入单元配置时的运行系统的主机名。 |
| 运行时目录 |
代表运行时目录,对于 |
有关单元指定符的完整列表,请参见 systemd.unit(5)
手册页。
17.20. 其他资源
第 18 章 优化 systemd 以缩短引导时间
有一组默认启用的 systemd 单元文件列表。由这些单元文件定义的系统服务会在引导时自动运行,这会影响引导时间。
本节描述:
- 检查系统引导性能的工具。
- 默认启用 systemd 单元以及您可以安全禁用 systemd 单元以便缩短引导时间的情况。
18.1. 检查系统引导性能
要检查系统引导性能,您可以使用 systemd-analyze 命令
。这个命令有很多可用选项。然而,本节只涵盖所选对 systemd 调整很重要以便缩短引导时间的选择。
有关所有选项的完整列表和详细描述请查看 systemd-analyze
man page。
先决条件
- 在开始检查 systemd 以调整引导时间之前,您可能需要列出所有启用的服务:
流程
$ systemctl list-unit-files --state=enabled
分析整个引导时间
流程
- 有关最后一次成功引导时间的总体信息,请使用:
$ systemd-analyze
分析单元初始化时间
流程
- 有关每个 systemd 单元初始化时间的信息,请使用:
$ systemd-analyze blame
输出会根据在上一次成功引导过程中初始化的时间以降序列出。
识别关键单元
流程
- 要识别在最后一次引导成功时需要花费最多时间的单元,请使用:
$ systemd-analyze critical-chain
输出突出显示使用红色的引导速度非常慢的单元。
图 18.1. systemd-analyze critical-chain 命令的输出

18.2. 为选择可安全禁用的服务提供指导信息
如果系统的引导时间较长,您可以通过禁用引导时启用的一些服务来缩短这个时间。
要列出这些服务,请运行:
$ systemctl list-unit-files --state=enabled
要禁用某个服务,请运行:
# systemctl disable service_name
然而,某些服务必须启用才能确保操作系统安全,并使其可以正常工作。
您可以使用下面的表格来选择可安全禁用的服务。表列出了在 Red Hat Enterprise Linux 最小安装中默认启用的所有服务,对于每个服务,它指出是否可以安全地禁用此服务。
表还提供了有关在何种情况下可以禁用服务的更多信息,或者您不应禁用该服务的原因。
表 18.1. 在 RHEL 的最小安装中默认启用的服务
服务名称 | 它可用被禁用吗? | 更多信息 |
---|---|---|
auditd.service | 是 |
仅在不需要内核提供审核信息时禁用 |
autovt@.service | 否 | 这个服务只在真正需要时才运行,因此不需要禁用它。 |
crond.service | 是 | 请注意,如果您禁用 crond.service,则不会运行 crontab 中的项目。 |
dbus-org.fedoraproject.FirewallD1.service | 是 |
到 |
dbus-org.freedesktop.NetworkManager.service | 是 |
到 |
dbus-org.freedesktop.nm-dispatcher.service | 是 |
到 |
firewalld.service | 是 |
仅在不需要防火墙时禁用 |
getty@.service | 否 | 这个服务只在真正需要时才运行,因此不需要禁用它。 |
import-state.service | 是 |
仅在不需要从网络存储引导时才禁用 |
irqbalance.service | 是 |
仅在只有一个 CPU 时禁用 |
kdump.service | 是 |
仅在不需要内核崩溃报告时禁用 |
loadmodules.service | 是 |
除非 |
lvm2-monitor.service | 是 |
仅在不使用逻辑卷管理器(LVM)时禁用 |
microcode.service | 否 | 不要禁用该服务,因为它在 CPU 中提供了 microcode 软件的更新。 |
NetworkManager-dispatcher.service | 是 |
只在不需要在网络配置更改时通知时才禁用 |
NetworkManager-wait-online.service | 是 |
只有在引导后不需要工作网络连接时才禁用 |
NetworkManager.service | 是 |
仅在不需要连接到网络时禁用 |
nis-domainname.service | 是 |
仅在不使用网络信息服务(NIS)时禁用 |
rhsmcertd.service | 否 | |
rngd.service | 是 |
只在您的系统不需要很多熵或者没有任何硬件生成器时禁用 |
rsyslog.service | 是 |
仅在不需要持久性日志,或把 |
selinux-autorelabel-mark.service | 是 |
仅在不使用 SELinux 时禁用 |
sshd.service | 是 |
仅在不需要 OpenSSH 服务器远程登录时禁用 |
sssd.service | 是 |
仅在没有通过网络登录系统的用户(例如,使用 LDAP 或 Kerberos)时禁用 |
syslog.service | 是 |
|
tuned.service | 是 |
仅在需要使用性能调整时禁用 |
lvm2-lvmpolld.socket | 是 |
仅在您不使用逻辑卷管理器(LVM)时禁用 |
dnf-makecache.timer | 是 |
仅在不需要自动更新软件包元数据时禁用 |
unbound-anchor.timer | 是 |
仅在不需要每日更新 DNS 安全扩展(DNSSEC)的根信任锚时禁用 |
要查找有关服务的更多信息,您可以运行以下命令之一:
$ systemctl cat <service_name>
$ systemctl help <service_name>
systemctl cat
命令提供位于 /usr/lib/systemd/system/<service>
下的服务文件的内容,以及所有适用的覆盖。可用的覆盖包括 /etc/systemd/system/<service>
文件中的单元文件覆盖,或者来自对应的 unit.type.d
目录中的单元文件覆盖。
有关置入文件的详情,请参考 systemd.unit
手册页。
systemctl help
命令显示特定服务的手册页。
18.3. 其他资源
-
systemctl
(1)手册页 -
systemd
(1)手册页 -
systemd-delta
(1)手册页 -
systemd.directives
(7)手册页 -
systemd.unit
(5)手册页 -
systemd.service
(5)手册页 -
systemd.target
(5)手册页 -
systemd.kill
(5)手册页 - systemd 主页
第 19 章 管理用户和组帐户简介
用户和组群的控制是 Red Hat Enterprise Linux(RHEL)系统管理的核心元素。每个 RHEL 用户都有不同的登录凭证,并可分配给不同的组以自定义其系统权限。
19.1. 用户和组介绍
创建文件的用户是该文件的拥有者以及该文件的组所有者。这个文件会单独为拥有者、组和组以外的成员分配读、写和执行权限。文件所有者只能由 root
用户更改。root
用户和文件拥有者都可以更改对该文件的访问权限。常规用户可以将他们拥有的文件的组群所有权改为他们所属的组。
每个用户都与一个唯一数字身份号关联,称为 user ID (UID)。每个组都与一个 group ID (GID)关联。组群中的用户共享相同的读取、写入和执行该组所拥有的文件的权限。
19.2. 配置保留的用户和组群 ID
RHEL 为系统用户和组保留在 1000 以下的用户和组群 ID。您可以在 setup
软件包中找到保留的用户和组群 ID。要查看保留的用户和组群 ID,请使用:
cat /usr/share/doc/setup*/uidgid
建议从 5000 开始将 ID 分配给新用户和组,因为保留范围将来可能会增加。
要使分配给新用户的 ID 默认从 5000 开始,修改 /etc/login.defs
文件中的 UID_MIN
和 GID_MIN
参数。
流程
要修改并使 ID 默认分配给从 5000 开始的新用户:
-
在您选择的编辑器中打开
/etc/login.defs
文件。 找到为自动 UID 选择定义最小值的行。
# Min/max values for automatic uid selection in useradd # UID_MIN 1000
修改
UID_MIN
值从 5000 开始。# Min/max values for automatic uid selection in useradd # UID_MIN 5000
找到自动选择 GID 最小值的行。
# Min/max values for automatic gid selection in groupadd # GID_MIN 1000
修改
GID_MIN
值,以从 5000 开始。# Min/max values for automatic gid selection in groupadd # GID_MIN 5000
常规用户动态分配的 UID 和 GID 现在从 5000 开始。
注意在更改 UID_MIN 和 GID_MIN 值之前创建的用户和组的 UID 和 GID 不会更改。
这将允许新用户的组拥有与 UID 和 GID 相同的 5000+ ID。
警告不要通过更改
SYS_UID_MAX
来提高系统 1000 以上保留的 ID,以避免与保留 1000 限制的系统冲突。
19.3. 用户私人组群
RHEL 使用 用户私人组群(UPG)系统配置,这可让 UNIX 组更容易管理。无论何时在系统中添加新用户,都会创建一个用户私人组群。用户私人组群的名称与为其创建的用户的名称相同,该用户是该用户私人组群中的唯一成员。
UPG 简化了多个用户之间在项目上的协作。此外,UPG 系统配置可以安全地为新创建的文件或目录设置默认权限,因为它允许该用户和此用户所属的组对文件或目录进行修改。
所有组群列表都保存在 /etc/group
配置文件中。
第 20 章 在 Web 控制台中管理用户帐户
RHEL web 控制台提供了一个图形界面,可让您执行各种管理任务,而无需直接访问终端。例如,您可以添加、编辑或删除系统用户帐户。
在阅读这个部分后,您将了解:
- 现有帐户来自哪里。
- 如何添加新帐户。
- 如何设置密码过期。
- 如何和何时终止用户会话。
先决条件
- 设置 RHEL web 控制台。详情请参阅 开始使用 RHEL web 控制台。
- 使用分配了管理员权限的帐户登录到 RHEL web 控制台。详情请参阅 登录到 RHEL web 控制台。
20.1. Web 控制台中管理的系统用户帐户
您可在 RHEL web 控制台中显示用户帐户:
- 在访问系统时验证用户。
- 设置系统的访问权限。
RHEL web 控制台显示系统中的所有用户帐户。因此,在首次登录 web 控制台后,至少可以看到一个可用的用户帐户。
登录到 RHEL web 控制台后,您可以执行以下操作:
- 创建新用户帐户。
- 更改其参数。
- 锁定帐户。
- 终止用户会话。
20.2. 使用 Web 控制台添加新帐户
使用以下步骤将用户帐户添加到系统,并通过 RHEL web 控制台为帐户设置管理权限。
先决条件
- 必须安装并可以访问 RHEL web 控制台。详情请参阅安装 Web 控制台。
流程
- 登录到 RHEL web 控制台。
- 点 Account。
- 点 Create New Account。
在 Full Name 字段中输入用户全名。
RHEL web 控制台会自动在全名中推荐用户名并在 User Name 字段中填充该用户名。如果您不想使用原始命名规则(由名的第一个字母和完整的姓组成),对它进行更新。
在 Password/Confirm 字段中输入密码并重新输入该密码以便验证您的密码是否正确。
下面的颜色栏显示您输入密码的安全级别,这不允许您创建使用弱密码的用户。
- 点 Create 保存设置并关闭对话框。
- 选择新创建的帐户。
在 Roles 项中选择 Server Administrator。
现在,您可以在 Accounts 设置中看到新帐户,您可以使用其凭证连接到该系统。
20.3. 在 web 控制台中强制密码过期
默认情况下,用户帐户将密码设定为永远不会过期。您可以设置系统密码在指定的天数后过期。当密码过期时,下次登录尝试会提示密码更改。
流程
- 登录到 RHEL 8 web 控制台。
- 点 Account。
- 选择要强制密码过期的用户帐户。
- 在用户帐户设置中,单击第二个 edit。
- 在 Password Expiration 对话框中,选择 Require password change every … days,并输入一个正整数,代表密码过期的天数。
- 点 Change。
验证步骤
要验证是否设定了密码过期时间,打开帐户设置。
RHEL 8 web 控制台显示与过期日期的链接。
20.4. 在 web 控制台中终止用户会话
用户在登录系统时创建用户会话。终止用户会话意味着从系统中注销用户。如果您需要执行对配置更改敏感的管理任务,比如升级系统,这非常有用。
在 RHEL 8web 控制台中的每个用户帐户中,您可以终止该帐户的所有会话,但您当前使用的 web 控制台会话除外。这可防止您失去对系统的访问。
流程
- 登录到 RHEL 8 web 控制台。
- 点 Account。
- 点击要终止会话的用户帐户。
点 Terminate Session。
如果 Terminate Session 按钮不可用,这个用户就不能登录到系统。
RHEL web 控制台会终止会话。
第 21 章 从命令行管理用户
您可以使用命令行界面(CLI)来管理用户和组。这可让您在 Red Hat Enterprise Linux 环境中添加、删除和修改用户和用户组。
21.1. 使用命令行添加新用户
这部分描述了如何使用 useradd
工具来添加新用户。
先决条件
-
根
访问权限
流程
要添加新用户,请使用:
# useradd options username
使用
useradd
命令的选项替换 options,并使用用户名称替换 username。例 21.1. 添加新用户
添加用户 ID 为
5000
的用户sarah
,使用:+
# useradd -u 5000 sarah
验证步骤
要验证新用户是否已添加,使用
id
工具程序。# id sarah
输出返回:
uid=5000(sarah) gid=5000(sarah) groups=5000(sarah)
其他资源
-
useradd
手册页
21.2. 使用命令行添加新组
这部分描述了如何使用 groupadd
工具来添加新组。
先决条件
-
根
访问权限
流程
要添加新组,请使用:
# groupadd options group-name
使用
groupadd
命令的命令行选项替换 options,并使用 group-name 替换 group-name。例 21.2. 添加新组
要添加组 ID 为
5000
的组sysadmins
,请使用:+
# groupadd -g 5000 sysadmins
验证步骤
要验证新组是否已添加,使用
tail
实用程序。# tail /etc/group
输出返回:
sysadmins:x:5000:
其他资源
-
groupadd
手册页
21.3. 从命令行将用户添加到补充组中
您可以将用户添加到补充组中,以管理权限或启用对特定文件或设备的访问权限。
先决条件
-
root
访问权限
流程
要在用户的附加组中添加一个组,请使用:
# usermod --append -G group-name username
使用组群名称替换 group- name,并将 group-name 替换为组的名称。
例 21.3. 将用户添加到补充组中
要将用户
sysadmin
添加到system-administrators
组中,请使用:# usermod --append -G system-administrators sysadmin
验证步骤
要验证新的组被添加到用户
sysadmin
的附加组中,请使用:# groups sysadmin
输出显示:
sysadmin : sysadmin system-administrators
21.4. 创建组目录
在 UPG 系统配置下,您可以将 set-group 身份权限 (setgid 位)应用到目录。setgid
位使得管理共享目录的组项目变得更加简单。当您将 setgid
位应用到某个目录中时,在该目录中创建的文件会自动分配给拥有该目录的组群。在此组中具有写和执行权限的任何用户现在可以在目录中创建、修改和删除文件。
下面的部分论述了如何创建组目录。
先决条件
-
根
访问权限
流程
创建目录:
# mkdir directory-name
使用目录名替换 directory-name。
创建组:
# groupadd group-name
用组群的名称替换 group-name。
向组中添加用户:
# usermod --append -G group-name username
使用组群名称替换 group- name,并将 group-name 替换为组的名称。
将目录的用户和组群所有权与 group-name 组关联:
# chown :group-name directory-name
用组群名称替换 group-name,并用 目录名替换 directory-name。
设置写入权限,允许用户创建和修改文件和目录,并设置
setgid
位使其在 directory-name 目录中应用这个权限:# chmod g+rwxs directory-name
使用目录名替换 directory-name。
现在,
group-name
组的所有成员都可以在directory-name
目录中创建并编辑文件。新创建的文件保留group-name
组的组群所有权。
验证步骤
要验证设置权限的正确性,请使用:
# ls -ld directory-name
使用目录名替换 directory-name。
输出会返回:
drwxrwsr-x. 2 root group-name 6 Nov 25 08:45 directory-name
第 22 章 使用命令行编辑用户组
用户属于某个组集合,允许用户的逻辑组集合对文件和文件夹具有类似的访问权限。您可以从命令行编辑主和补充用户组,以更改用户的权限。
22.1. 主和补充用户组
组是出于共同目的将多个用户帐户连接在一起的实体,例如对特定文件授予访问权限。
在 Linux 上,用户组可以充当主或补充组。主和补充组具有以下属性:
- 主组
- 每个用户始终只有一个主组。
- 您可以更改用户的主组。
- 补充组
- 您可以将现有用户添加到现有的补充组中,以使用相同的安全和访问权限管理组中的用户。
- 用户可以是零个或多个补充组的成员。
22.2. 列出用户的主和补充组
您可以列出用户的组,以查看他们所属的主和补充组。
流程
显示用户的主组以及任何补充组的名称:
$ groups user-name
使用用户名称替换 user-name。如果不提供用户名,则命令将显示当前用户的组成员身份。第一个组是主组,后跟可选的补充组。
例 22.1. 列出用户 sarah 的组:
$ groups sarah
输出显示:
sarah : sarah wheel developer
用户
arah
有一个主组sarah
,它是补充组wheel
和developer
的成员。例 22.2. 列出用户 marc 的组:
$ groups marc
输出显示:
marc : marc
用户
marc
仅有一个主组marc
,没有补充组。
22.3. 更改用户的主组
您可以将现有用户的主组更改为一个新组。
先决条件:
-
root
访问权限 - 新组必须存在
流程
更改用户的主组:
# usermod -g group-name user-name
使用新主组的名称替换 group-name,并使用用户名替换 user-name。
注意更改用户的主组时,命令还会将用户主目录中所有文件的组所有权自动更改为新的主组。您必须手动修复用户主目录外文件的组所有权。
例 22.3. 更改用户的主组的示例:
如果用户
arah
属于主组sarah1
,且您想将用户的主组更改为sarah2
,请使用:# usermod -g sarah2 sarah
验证步骤
验证您是否更改了用户的主组:
$ groups sarah
输出显示:
sarah : sarah2
22.4. 从命令行将用户添加到补充组中
您可以将用户添加到补充组中,以管理权限或启用对特定文件或设备的访问权限。
先决条件
-
root
访问权限
流程
要在用户的附加组中添加一个组,请使用:
# usermod --append -G group-name username
使用组群名称替换 group- name,并将 group-name 替换为组的名称。
例 22.4. 将用户添加到补充组中
要将用户
sysadmin
添加到system-administrators
组中,请使用:# usermod --append -G system-administrators sysadmin
验证步骤
要验证新的组被添加到用户
sysadmin
的附加组中,请使用:# groups sysadmin
输出显示:
sysadmin : sysadmin system-administrators
22.5. 从补充组中删除用户
您可以从补充组中删除现有的用户,以限制他们对文件和设备的权限或访问。
先决条件
-
root
访问权限
流程
从补充组中删除用户:
# gpasswd -d user-name group-name
使用用户名替换 user-name,并使用补充组的名称替换 group-name。
例 22.5. 从补充组中删除用户
如果用户 sarah 有一个主组
sarah2
,并且属于次要组wheel
和developers
,并且您想从组developers
中删除该用户,请使用:# gpasswd -d sarah developers
验证步骤
验证您是否从次要组 developers 中删除了用户 sarah:
$ groups sarah
输出显示:
sarah : sarah2 wheel
22.6. 更改用户的所有补充组
您可以覆盖您希望用户保留其成员的补充组的列表。
先决条件
-
root
访问权限 - 补充组必须存在
流程
覆盖用户的补充组的列表:
# usermod -G group-names username
使用一个或多个补充组的名称替换 group-names。要将用户一次添加到多个补充组中,请使用逗号分隔组名称,并且没有插入空格。例如:
wheel,developer
。使用用户名称替换 user-name。
重要如果用户是当前您未指定的组的成员,则该命令会从组中删除该用户。
例 22.6. 更改用户的补充组的列表
如果用户
sarah
有一个主组sarah2
,并且属于补充组wheel
,您希望用户属于多个补充组developer
、sysadmin
和security
,请使用:# usermod -G wheel,developer,sysadmin,security sarah
验证步骤
验证您是否正确设置了补充组列表:
# groups sarah
输出显示:
sarah : sarah2 wheel developer sysadmin security
第 23 章 管理 sudo 访问
系统管理员可以授予 sudo
权限,以允许非 root 用户执行通常为 root
用户保留的管理命令。因此,非 root 用户可以在不登录 root
用户帐户的情况下输入这样的命令。
23.1. sudoers 中的用户授权
/etc/sudoers
文件指定哪些用户可以使用 sudo
命令运行哪些命令。规则可应用到单个用户和用户组。您还可以使用别名简化为主机组、命令甚至用户定义的规则。默认别名定义在 /etc/sudoers
文件的第一部分中。
当用户尝试使用 sudo
特权来运行 /etc/sudoers
文件中不允许的命令时,系统会在日志中记录一条消息,其中包含 username : user not in sudoers
。
默认的 /etc/sudoers
文件提供授权信息和示例。您可以通过删除行开头的 #
注释字符来激活特定的示例规则。与用户相关的授权部分标有以下介绍:
## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems).
您可以使用以下格式来创建新的 sudoers
授权,并修改现有的授权:
username hostname=path/to/command
其中:
-
username 是用户或组的名称,如
user1
或%group1
。 - hostname 是应用该规则的主机的名称。
- path/to/command 是命令的完整的绝对路径。您还可以通过在命令路径后面添加这些选项,将用户限制为仅使用特定的选项和参数执行命令。如果没有指定任何选项,用户可以使用带有所有选项的命令。
您可以将任何这些变量替换为 ALL
,以将规则应用到所有用户、主机或命令。
规则过于宽松(如 ALL ALL=(ALL)ALL)
,所有用户都可以以所有主机上的所有用户的身份运行所有的命令。这可能导致安全风险。
您可以使用 !
操作符,来用否定的方式指定参数。例如,使用 !root
来指定除 root
用户以外的所有用户。请注意,使用允许列表来允许特定的用户、组和命令比使用阻止列表来禁止特定的用户、组和命令更安全。通过使用允许列表,您还可以阻止新的未授权的用户或组。
避免使用命令的负规则,因为用户可以通过使用 alias
命令重命名命令来克服此类规则。
系统会从头到尾读取 /etc/sudoers
文件。因此,如果文件中包含用户的多个条目,则按顺序应用条目。如果值冲突,系统将使用最后匹配的项,即使它不是最具体的匹配。
向 sudoers
中添加新规则的首选方法是在 /etc/sudoers.d/
目录中创建一个新文件,而不是将规则直接输入到 /etc/sudoers
文件中。这是因为此目录的内容在系统更新期间被保留了。此外,修复单独文件中的任何错误要比修复 /etc/sudoers
文件中的错误更容易。当系统在 /etc/sudoers
文件中达到以下行时,会读取 /etc/sudoers.d
目录中的文件:
#includedir /etc/sudoers.d
请注意,此行开头的数字符号 #
是语法的一部分,并不意味着该行是一个注释。该目录中文件的名称不得包含句点 .
,且不得以波形符 ~
结尾。
其他资源
-
sudo (8)
和sudoers (5)
手册页
23.2. 为用户授予 sudo 访问权限
系统管理员可以授予 sudo
访问权限来允许非 root 用户执行管理命令。sudo
命令在不使用 root
用户密码的情况下为用户提供管理访问。
当用户需要执行管理命令时,您可以在使用 sudo
命令前执行该命令。然后会像 root
用户一样执行该命令。
请注意以下限制:
-
只有
/etc/sudoers
配置文件中列出的用户才能使用sudo
命令。 -
该命令在用户的 shell 中执行,而不是在
root
shell 中执行。
先决条件
-
root
访问权限
流程
以 root 身份,打开
/etc/sudoers
文件。# visudo
/etc/sudoers
文件定义sudo
命令应用的策略。在
/etc/sudoers
文件中,找到为wheel
管理组中用户授予sudo
访问权限的行。## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
-
确保以
%wheel
开头的行前面没有#
注释符。 - 保存所有更改并退出编辑器。
将您要授予
sudo
访问权限的用户添加到wheel
管理组中。# usermod --append -G wheel <username>
将 <username > 替换为用户的名称。
验证步骤
验证该用户是否已被添加到
wheel
管理组中:# id <username> uid=5000(<username>) gid=5000(<username>) groups=5000(<username>),10(wheel)
其他资源
-
sudo (
8)、visudo (8)
和sudoers (5)
手册页
23.3. 使非特权用户运行某些命令
作为管理员,您可以通过在 /etc/sudoers.d/
目录中配置策略来允许非特权用户在特定工作站上输入某些命令。
例如,您可以使用 dnf
命令以及 sudo
特权来允许用户在 <example.user> host.example.com
工作站上安装程序。
先决条件
-
您必须有系统的
root
访问权限。
流程
以
root
用户身份,在/etc/
下创建一个新的sudoers.d
目录:# mkdir -p /etc/sudoers.d/
在
/etc/sudoers.d
目录中创建一个新文件:# visudo -f /etc/sudoers.d/<example.user>
文件会自动打开。
在
/etc/sudoers.d/<example.user>
文件中添加以下行:<example.user> <host.example.com> = /usr/bin/dnf
要在一行中在同一主机上允许两个或多个命令,您可以用逗号分隔来列出这些命令
,
后跟一个空格。可选: 要在用户每次 <example.user> 尝试使用
sudo
权限时收到电子邮件通知,请在文件中添加以下行:Defaults mail_always Defaults mailto="<email@example.com>"
- 保存更改,再退出编辑器。
验证
要验证用户是否 <example.user> 可以使用
sudo
权限运行dnf
命令,请切换帐户:# su <example.user> -
输入
sudo dnf
命令:$ sudo dnf [sudo] password for <example.user>:
输入用户 <example.user> 的
sudo
密码。系统显示
dnf
命令和选项列表:... usage: dnf [options] COMMAND ...
如果系统返回
<example.user> 不在 sudoers 文件中。将报告此事件
错误信息,您没有 <example.user> 在/etc/sudoers.d/
中创建文件。如果您收到,
<example.user> 不允许在 < host.example.com>
错误消息上运行 sudo,则您尚未正确完成配置。确保您已以root
身份登录,并且您遵循了这些步骤。
其他资源
-
sudo (
8)、visudo (8)
和sudoers (5)
手册页
第 24 章 更改和重置根密码
如果需要更改现有的根密码,可以以 root
用户或一个非 root 用户重置它。
24.1. 作为 root 用户更改 root 密码
本小节论述了如何使用 passwd
命令以 root
用户更改 root
密码。
先决条件
-
根
访问权限
流程
要更改
root
密码,使用:# passwd
在修改前,会提示您输入您当前的密码。
24.2. 以非 root 用户的身份更改或重置根密码
本小节论述了如何以非 root 用户使用 passwd
命令更改或重置 root
密码。
先决条件
- 您可以以非 root 用户身份登录。
-
您是管理
wheel
组的成员。
流程
以
wheel
组中的非 root 用户身份修改或重置root
密码,请使用:$ sudo passwd root
此时会提示您输入当前的非 root 密码,然后才能更改
root
密码。
24.3. 在引导时重置 root 密码
如果您无法以非 root 用户身份登录或者不属于管理 wheel
组,则可以通过切换到一个特殊的 chroot jail
环境在引导时重置 root 密码。
流程
重启系统,在 GRUB 2 引导屏幕上按 e 键中断引导过程。
此时会出现内核引导参数。
load_video set gfx_payload=keep insmod gzio linux ($root)/vmlinuz-4.18.0-80.e18.x86_64 root=/dev/mapper/rhel-root ro crash\ kernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv/swap rhgb quiet initrd ($root)/initramfs-4.18.0-80.e18.x86_64.img $tuned_initrd
进入以 linux 开头的行的末尾。
linux ($root)/vmlinuz-4.18.0-80.e18.x86_64 root=/dev/mapper/rhel-root ro crash\ kernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv/swap rhgb quiet
按 Ctrl+e 键跳到这一行的末尾。
在以
linux
开头的行的最后添加rd.break
。linux ($root)/vmlinuz-4.18.0-80.e18.x86_64 root=/dev/mapper/rhel-root ro crash\ kernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv/swap rhgb quiet rd.break
按 Ctrl+x 使用更改的参数启动系统。
此时会出现
switch_root
提示符。将文件系统重新挂载为可写:
mount -o remount,rw /sysroot
文件系统以只读模式挂载到
/sysroot
目录中。将文件系统重新挂载为可写才可以更改密码。进入
chroot
环境:chroot /sysroot
此时会出现
sh-4.4#
提示符。重置
root
密码:passwd
按照命令行中的步骤完成
root
密码的更改。在下次系统引导时启用 SELinux 重新标记进程:
touch /.autorelabel
退出
chroot
环境:exit
退出
switch_root
提示符:exit
- 等待 SELinux 重新标记过程完成。请注意,重新标记一个大磁盘可能需要很长时间。系统会在这个过程完成后自动重启。
验证步骤
-
要验证
root
密码是否已成功更改,请以普通用户身份登录并打开 Terminal。 以 root 用户身份运行交互式 shell:
$ su
-
输入新的
root
密码。 显示与当前有效用户 ID 关联的用户名:
whoami
输出会返回:
root
第 25 章 管理文件权限
文件权限控制用户和组帐户查看、修改、访问和执行文件和目录内容的能力。
每个文件或目录都有三个级别的所有权:
- 用户所有者(u)。
- 组所有者(g)。
- 其他(o)。
可为每个级别的所有权分配以下权限:
- 读(r)。
- 写(w)。
- 执行(x)。
请注意,文件的执行权限允许执行该文件。目录的执行权限允许访问目录中的内容,但不执行它。
创建新文件或目录时,会自动为其分配默认权限集。文件或目录的默认权限基于两个因素:
- 基本权限。
- user file-creation mode mask(umask)。
25.1. 基本文件权限
每当创建新文件或目录时,会自动为其分配基本权限。文件或目录的基本权限可以使用符号或者数值表示。
权限 | 符号 | 数值 |
无权限 | --- | 0 |
执行 | --x | 1 |
写 | -w- | 2 |
写和执行 | -wx | 3 |
读 | r-- | 4 |
读和执行 | r-x | 5 |
读写 | rw- | 6 |
读、写、执行 | rwx | 7 |
目录的基本权限是 777
(drwxrwxrwxrwx
),它为任何人都授予读、写和执行的权限。这意味着目录所有者、组和其它可以列出目录的内容,并可以在该目录下(以及其子目录)中创建、删除和编辑项。
请注意,一个目录中的单个文件可以有它们自己的权限,例如可以阻止用户您编辑它们,即使用户对该目录有非受限的访问权限。
文件的基本权限为 666
(-rw-rw-rw-
),它为所有人都授予读取和写入的权限。这意味着文件所有者、组和其它用户都可以读和编辑该文件。
例 25.1. 文件的权限
如果文件有以下权限:
$ ls -l
-rwxrw----. 1 sysadmins sysadmins 2 Mar 2 08:43 file
-
-
表示它是文件。 -
rwx
表示文件所有者有读、写和执行文件的权限。 -
rw-
表示组有读写权限,但不能执行文件。 -
---
表示其他用户没有读、写或执行文件的权限。 -
.
表示为该文件设定了 SELinux 安全上下文。
例 25.2. 目录的权限
如果一个目录有以下权限:
$ ls -dl directory drwxr-----. 1 sysadmins sysadmins 2 Mar 2 08:43 directory
-
d
表示它是一个目录。 rwx
表示目录所有者有读、写和访问目录内容的权限。作为目录所有者,您可以列出目录中的项目(文件、子目录),访问这些项目的内容并进行修改。
r--
表示组有读取权限,但没有写或者访问目录的内容。作为拥有该目录的组的成员,您可以列出目录中的项目。您无法访问目录中项目的信息或修改它们。
---
表示其他用户没有权限读取、写入或者访问该目录的内容。作为不是用户拥有者或该目录的组所有者的用户,您无法列出目录中的项目、关于这些项目的访问信息或修改它们。
-
.
表示为该目录设定了 SELinux 安全性上下文。
自动分配给某个文件或者目录的基本权限不是文件或目录最终的默认权限。当您创建文件或目录时,基本权限会被 umask 更改。基本权限和 umask 的组合会为文件和目录创建默认权限。
25.2. 用户文件创建模式掩码
用户文件创建模式掩码(umask)是一个变量,用于控制如何为新创建的文件和目录设置文件权限。umask 会自动从基本权限值中删除权限,以提高 Linux 系统的整体安全性。umask 可以用符号 或 八进制 值表示。
权限 | 符号 | 数值 |
读、写和执行 | rwx | 0 |
读写 | rw- | 1 |
读和执行 | r-x | 2 |
读 | r-- | 3 |
写和执行 | -wx | 4 |
写 | -w- | 5 |
执行 | --x | 6 |
无权限 | --- | 7 |
标准用户的默认 umask 是 0002
。root
用户的默认 umask 为 0022
。
umask 的第一个数字代表特殊权限(sticky 位)。umask 的最后三位数字分别代表从用户拥有者(u)、组群所有者(g)和其它(o)中删除的权限。
例 25.3. 在创建文件时应用 umask
下面的例子演示了,对一个基本权限为 777
的文件应用值为 0137
的 umask,使在创建该文件时其默认权限变为 640
。

25.3. 默认的文件权限
为所有新创建的文件和目录自动设置默认权限。默认权限的值通过将 umask 应用到基本权限来确定。
例 25.4. 标准用户创建的目录的默认权限
当 标准用户 创建了一个新 目录 时,umask 被设为 002
(rwxrwxr-x
),目录的基本权限被设为 777
(rwxrwxrwx
)。这会使默认权限为 775(
drwxrwxr-x
)。
符号 | 数值 | |
基本权限 | rwxrwxrwx | 777 |
Umask | rwxrwxr-x | 002 |
默认权限 | rwxrwxr-x | 775 |
这意味着目录所有者、组和其它可以列出目录的内容,并可以在该目录下(以及其子目录)中创建、删除和编辑项。其他用户只能列出该目录的内容并将其下移到其中。
例 25.5. 由标准用户创建的文件的默认权限
当 标准用户 创建一个新 文件 时,umask 被设为 002
(rwxrwxr-x
),文件的基本权限被设为 666
(rw-rw-rw-
)。这会使默认权限为 664(
-rw-rw-r--
)。
符号 | 数值 | |
基本权限 | rw-rw-rw- | 666 |
Umask | rwxrwxr-x | 002 |
默认权限 | rw-rw-r-- | 664 |
这意味着,文件拥有者和组群可以读取和编辑该文件,而其他用户只能读取该文件。
例 25.6. root 用户创建的目录的默认权限
当 root 用户 创建了一个新 目录 时,umask 被设为 022
(rwxr-xr-x
),目录的基本权限被设为 777
(rwxrwxrwx
)。这会使默认权限为 755
(rwxr-xr-x
)。
符号 | 数值 | |
基本权限 | rwxrwxrwx | 777 |
Umask | rwxr-xr-x | 022 |
默认权限 | rwxr-xr-x | 755 |
这意味着目录所有者可以列出目录的内容,并可以在该目录下(以及其子目录)中创建、删除和编辑项。这个组群和其它只能列出该目录的内容并将其下移。
例 25.7. 由 root 用户创建的文件的默认权限
当 root 用户 创建了一个新 文件 时,umask 被设为 022
(rwxr-xr-x
),文件的基本权限被设为 666
(rw-rw-rw-
)。这会使默认权限为 644(
-rw-r-r--
)。
符号 | 数值 | |
基本权限 | rw-rw-rw- | 666 |
Umask | rwxr-xr-x | 022 |
默认权限 | rw-r—r-- | 644 |
这意味着,文件所有者可以读取和编辑文件,而组和其它用户只能读取该文件。
出于安全考虑,常规文件默认没有执行权限,即使 umask 设为 000
(rwxrwxrwx
)。但是,创建的目录可以具有执行权限。
25.4. 使用符号值更改文件权限
您可以使用带有符号值(字母和符号的组合)的 chmod
工具来更改文件或目录的文件权限。
您可以分配以下 权限 :
- 读(r)
- 写(w)
- 执行(x)
权限可分配给以下 所有权级别 :
- 用户所有者 (u)
- 组所有者(g)
- 其他 (o)
- 所有 (a)
要添加或删除权限,您可以使用以下 符号 :
-
+
在现有权限之上添加权限 -
-
从现有权限中删除权限 -
=
删除现有权限,并明确定义新权限
流程
验证步骤
要查看特定文件的权限,请使用:
$ ls -l file-name
用文件名替换 file-name。
要查看特定目录的权限,请使用:
$ ls -dl directory-name
使用目录名替换 directory-name。
要查看特定目录中所有文件的权限,请使用:
$ ls -l directory-name
使用目录名替换 directory-name。
例 25.8. 更改文件和目录的权限
要将
my-file.txt
的文件权限从-rw-rw-r--
改为-rw------
,请使用:显示
my-file.txt
的当前权限:$ ls -l my-file.txt -rw-rw-r--. 1 username username 0 Feb 24 17:56 my-file.txt
从组所有者(
g
)和其他用户(o
)删除读、写和执行(rwx
)文件的权限:$ chmod go= my-file.txt
请注意,任何在等号(
=
)之后没有被指定的权限都会被自动禁止。验证
my-file.txt
的权限是否设置正确:$ ls -l my-file.txt -rw-------. 1 username username 0 Feb 24 17:56 my-file.txt
要将
my-directory
的文件权限从drwxrwx---
改为drwxrwxr-x
,请使用:显示
my-directory
的当前权限:$ ls -dl my-directory drwxrwx---. 2 username username 4096 Feb 24 18:12 my-directory
为所有用户(
a
) 添加读和执行(r-x
)权限:$ chmod o+rx my-directory
验证
my-directory
及其内容的权限是否设置正确:$ ls -dl my-directory drwxrwxr-x. 2 username username 4096 Feb 24 18:12 my-directory
25.5. 使用数值更改文件权限
您可以使用带有八进制(数字)的 chmod
工具来更改文件或目录的文件权限。
流程
要为现有文件或者目录更改文件权限,请使用:
$ chmod octal_value file-name
用文件或目录的名称替换 file-name。使用数值替换 octal_value。如需了解更多详细信息,请参阅 基本文件权限。
第 26 章 管理 umask
您可以使用 umask
工具显示、设置或更改 umask 的当前或默认值。
26.1. 显示 umask 的当前值
您可以使用 umask
工具以符号或数值模式显示 umask 的当前值。
流程
要在符号模式下显示 umask 的当前值,请使用:
$ umask -S
要在八进制模式下显示 umask 的当前值,请使用:
$ umask
注意以八进制模式显示 umask 时,您可以注意到它显示了四位数字(
0002
或0022
)。umask 的第一个数字代表一个特殊的位(spicky 位、SGID 位或 SUID 位)。如果第一个数字设定为0
,则代表没有设置特殊位。
26.2. 显示默认 bash umask
您可以使用不同的 shell,如 bash
、ksh
、zsh
和 tcsh
。这些 shell 可以是登录或非登录 shell。您可以通过打开一个原生或 GUI 终端来调用登录 shell。
要判断您是在登录 shell 还是非登录 shell 中执行某个命令,请使用 echo $0
命令。
例 26.1. 确定您在登录或非登录 bash shell 下工作
如果
echo $0
命令的输出返回bash
,则您在非登录 shell 下执行命令。$ echo $0 bash
非登录 shell 的默认 umask 在
/etc/bashrc
配置文件中设置。如果
echo $0
命令的输出返回-bash
,则您在登录 shell 下执行命令。# echo $0 -bash
登录 shell 的默认 umask 在
/etc/profile
配置文件中设置。
流程
要显示非登录 shell 的默认
bash
umask,请使用:$ grep umask /etc/bashrc
输出返回:
# By default, we want umask to get set. This sets it for non-login shell. umask 002 umask 022
要显示登录 shell 的默认
bash
umask,请使用:$ grep umask /etc/profile
输出返回:
# By default, we want umask to get set. This sets it for login shell umask 002 umask 022
26.3. 使用符号值设置 umask
您可以使用 umask
工具及符号值(字母和符号组合)来为当前的 shell 会话设置 umask
您可以分配以下 权限 :
- 读(r)
- 写(w)
- 执行(x)
权限可分配给以下 所有权级别 :
- 用户所有者 (u)
- 组所有者(g)
- 其他 (o)
- 所有 (a)
要添加或删除权限,您可以使用以下 符号 :
-
+
在现有权限之上添加权限 -
-
从现有权限中删除权限 =
删除现有权限,并明确定义新权限注意任何在等号(
=
)后未指定的权限都将被自动禁止。
26.4. 使用数值设置 umask
您可以使用 umask
工具和八进制值(数字)来为当前 shell 会话设置 umask。
流程
要为当前的 shell 会话设置 umask,请使用:
$ umask octal_value
使用数值替换 octal_value。如需了解更多详细信息,请参阅 用户文件创建模式掩码。
注意umask 仅对当前 shell 会话有效。
26.5. 更改非登录 shell 的默认 umask
您可以通过修改 /etc/bashrc
文件来更改标准用户的默认 bash
umask。
先决条件
-
root
访问权限
流程
-
以
root
用户身份,在编辑器中打开/etc/bashrc
文件。 修改以下部分以设置新的默认
bash
umask :if [ $UID -gt 199 ] && [ “id -gn” = “id -un” ]; then umask 002 else umask 022 fi
将 umask 的默认值(
002
)替换为另一个数值。如需了解更多详细信息,请参阅 用户文件创建模式掩码。- 保存更改并退出编辑器。
26.6. 更改登录 shell 的默认 umask
您可以通过修改 /etc/profile
文件来更改 root
用户的默认 bash
umask。
先决条件
-
root
访问权限
流程
-
以
root
用户身份,在编辑器中打开/etc/profile
文件。 修改以下部分以设置新的默认
bash
umask :if [ $UID -gt 199 ] && [ “/usr/bin/id -gn” = “/usr/bin/id -un” ]; then umask 002 else umask 022 fi
将 umask 的数值(
022
)替换为另一个数值。如需了解更多详细信息,请参阅 用户文件创建模式掩码。- 保存更改并退出编辑器。
26.7. 更改特定用户的默认 umask
您可以通过修改用户的 .bashrc
来更改特定用户的默认 umask。
流程
将指定 umask 的八进制值的行追加到特定用户的
.bashrc
文件中。$ echo 'umask octal_value' >> /home/username/.bashrc
使用数值替换 octal_value,并使用用户名替换 username。如需了解更多详细信息,请参阅 用户文件创建模式掩码。
26.8. 为新创建的主目录设置默认权限
您可以通过修改 /etc/login.defs
文件来更改新创建的用户的主目录的权限模式。
流程
-
以
root
用户身份,在编辑器中打开/etc/login.defs
文件。 修改以下部分来设置新的默认 HOME_MODE :
# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new # home directories. # If HOME_MODE is not set, the value of UMASK is used to create the mode. HOME_MODE 0700
将默认的八进制值(
0700
)替换为另一个八进制值。所选模式将用于为主目录创建权限。- 如果设置了 HOME_MODE,请保存更改并退出编辑器。
如果没有设置 HOME_MODE,请修改 UMASK 来为新创建的主目录设置模式:
# Default initial "umask" value used by login(1) on non-PAM enabled systems. # Default "umask" value for pam_umask(8) on PAM enabled systems. # UMASK is also used by useradd(8) and newusers(8) to set the mode for new # home directories if HOME_MODE is not set. # 022 is the default value, but 027, or even 077, could be considered # for increased privacy. There is no One True Answer here: each sysadmin # must make up their mind. UMASK 022
将默认的八进制值(
022
)替换为另一个八进制值。如需了解更多详细信息,请参阅 用户文件创建模式掩码。- 保存更改并退出编辑器。
第 27 章 在 RHEL 中使用 dnstap
dnstap
工具提供了一种高级的方法来监控和记录传入的名称查询的详细信息。它记录了从 named
服务发出的消息。本节解释了如何使用 dnstap
记录 DNS 查询。
27.1. 在 RHEL 中使用 dnstap 记录 DNS 查询
网络管理员可以记录 DNS 查询,以收集网站或 IP 地址信息以及域健康的信息。
先决条件
-
将
BIND
软件包升级到bind-9.11.26-2
或更高版本。
如果您已安装并运行了 BIND
版本,添加新版本的 BIND
将覆盖现有的版本。
流程
以下是记录 DNS 查询的步骤:
编辑
/etc/named.conf
文件中的options
块来启用dnstap
和目标文件:options { # … dnstap { all; }; # Configure filter dnstap-output file “/var/named/data/dnstap.bin”; # … }; # end of options
( all | auth | client | forwarder | resolver | update ) [ ( query | response ) ];
dnstap
过滤器包含多个在dnstap {}
块中以;
分隔的定义。以下是每个规则的语法:
-
auth
- 权威区域响应或回答。 -
client
- 内部客户端查询或回答。 -
forwarder
- 转发的查询或来自它的响应。 -
resolver
- 迭代的解析查询或响应。 -
update
- 动态区域更新请求。 -
all
- 以上选项中的任何一个。 query
|response
- 如果没有指定查询或响应关键字,则两者都会被记录。以下示例仅请求
auth
响应,客户端查询
以及动态更新
的查询和响应:
Example: dnstap {auth response; client query; update;};
-
为活跃日志配置定期推出。
在以下示例中,用户编辑的脚本的内容由
cron
每天运行一次。数字 3 表示备份日志文件限制为该数字。由于文件已被删除,因此该文件永远不会达到.2
后缀。Example: sudoedit /etc/cron.daily/dnstap #!/bin/sh rndc dnstap -roll 3 mv /var/named/data/dnstap.bin.1 \ /var/log/named/dnstap/dnstap-$(date -I).bin # use dnstap-read to analyze saved logs sudo chmod a+x /etc/cron.daily/dnstap
使用
dnstap-read
工具以人类可读的格式处理和分析日志。在以下示例中,详细的 dnstap 输出以
YAML
文件格式显示。Example: dnstap-read -y [file-name]
第 28 章 管理访问控制列表
每个文件和目录同时只能有一个用户所有者和一个组所有者。如果您要授予用户权限访问属于不同用户或组的特定文件或目录,同时保持其他文件和目录私有,则您可以使用 Linux 访问控制列表(ACL)。
28.1. 显示当前的访问控制列表
您可以使用 getfacl
工具来显示当前 ACL。
流程
要显示特定文件或目录的当前 ACL,请使用:
$ getfacl file-name
用文件或目录的名称替换 file-name。
28.2. 设置访问控制列表
您可以使用 setfacl
工具为文件或目录设置 ACL。
先决条件
-
root
访问权限。
流程
- 要为文件或目录设置 ACL,请使用:
# setfacl -m u:username:symbolic_value file-name
使用用户名替换 username,使用符号值替换 symbolic_value,使用文件或目录的名称替换 file-name。详情请查看 setfacl
man page。
例 28.1. 修改组项目的权限
以下示例描述了如何修改属于 root
组的 root
用户拥有的 group-project
文件的权限, 以便使该文件:
- 不能被任何人执行。
-
用户
andrew
有rw-
权限。 -
用户
susan
有---
权限。 -
其他用户有
r--
权限。
流程
# setfacl -m u:andrew:rw- group-project # setfacl -m u:susan:--- group-project
验证步骤
要验证用户
andrew
有rw-
权限,用户susan
有---
权限,其他用户有r--
权限,使用:$ getfacl group-project
输出会返回:
# file: group-project # owner: root # group: root user:andrew:rw- user:susan:--- group::r-- mask::rw- other::r--
第 29 章 使用 Chrony 套件配置 NTP
因为许多原因,系统准确计时非常重要。例如在网络中,需要准确的数据包和日志的时间戳。在 Linux 系统中,NTP
协议是由在用户空间运行的守护进程实现的。
用户空间守护进程更新内核中运行的系统时钟。系统时钟可以通过使用不同的时钟源来维护系统的时间。通常, 使用 时间戳计数器(TSC)。TSC 是一个 CPU 寄存器,它计算从上次重置的循环数。它非常快,分辨率很高,且不会被中断。
从 Red Hat Enterprise Linux 8 开始,NTP
协议由 chronyd
守护进程实现,它可从 chrony
软件包中的存储库中获得。
以下章节描述了如何使用 chrony 套件来配置 NTP。
29.1. chrony 套件介绍
chrony 是 网络时间协议(NTP)
的一种实现。您可以使用 chrony:
-
将系统时钟与
NTP
服务器同步 - 将系统时钟与参考时钟同步,如 GPS 接收器
- 将系统时钟与手动时间输入同步
-
作为
NTPv4(RFC 5905)
服务器或对等服务器,为网络中的其他计算机提供时间服务
在多数条件下,chrony 都会表现良好,包括时断时续的网络连接、有大量网络数据的网络、温度不稳定(普通计算机时钟对温度敏感)以及不持续运行或在虚拟机上运行的系统。
通过互联网镜像同步的两天机器之间的准确性通常在几毫秒之内,而对于 LAN 中的机器则为几十微秒。硬件时间戳或硬件参考时钟可以将两台计算机之间的准确性提高到子微秒级。
chrony 包括 chronyd
(一个在用户空间运行的守护进程)和 chronyc(可用来监控 chronyd
性能并在运行时更改各种操作参数的命令行程序)。
chrony 守护进程(chronyd
) 可以由命令行工具 chronyc 监控和控制。这个工具提供了一个命令提示,允许输入大量命令来查询 chronyd
的当前状态并修改其配置。在默认情况下,chronyd
只接受来自本地 chronyc 实例的命令,但它也可以被配置为接受来自远程主机的监控命令。应该限制远程访问。
29.2. 使用 chronyc 来控制 chronyd
本节描述了如何使用 chronyc 命令行工具控制 chronyd
。
流程
要在互动模式中使用命令行工具 chronyc 来更改本地
chronyd
实例,以根
用户身份输入以下命令:# chronyc
如果要使用某些受限命令,chronyc 需要以
root
运行。chronyc 命令提示符如下所示:
chronyc>
-
要列出所有的命令,请输入
help
。 或者,如果与以下命令一同调用,该工具也可以在非交互命令模式下调用:
chronyc command
使用 chronyc 所做的更改不具有持久性,它们会在 chronyd
重启后丢失。要使更改有持久性,修改 /etc/chrony.conf
。
29.3. 迁移到 chrony
在 Red Hat Enterprise Linux 7 中,用户可以在 ntp 和 chrony 之间进行选择,以确保准确计时。有关 ntp 和 chrony、ntpd
和 chronyd
之间的区别,请参阅 ntpd 和 chronyd 之间的差别。
从 Red Hat Enterprise Linux 8 开始,不再支持 ntp。chrony 默认启用。因此,您可能需要从 ntp 迁移到 chrony。
在大多数情况下,从 ntp 迁移到 chrony 是非常直接的。程序、配置文件和服务的相应名称为:
表 29.1. 从 ntp 迁移到 chrony 时的程序、配置文件和服务对应的名称
ntp 名称 | chrony 名称 |
---|---|
/etc/ntp.conf | /etc/chrony.conf |
/etc/ntp/keys | /etc/chrony.keys |
ntpd | chronyd |
ntpq | chronyc |
ntpd.service | chronyd.service |
ntp-wait.service | chrony-wait.service |
通过使用 -q
选项或 -t
选项,chronyd
可以替代 ntpdate 和 sntp 程序(包含在 ntp
发布中)。可在命令行中指定配置以避免读取 /etc/chrony.conf
。例如:如下所示运行 chronyd
可以替代运行 ntpdate ntp.example.com
:
# chronyd -q 'server ntp.example.com iburst' 2018-05-18T12:37:43Z chronyd version 3.3 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG) 2018-05-18T12:37:43Z Initial frequency -2.630 ppm 2018-05-18T12:37:48Z System clock wrong by 0.003159 seconds (step) 2018-05-18T12:37:48Z chronyd exiting
ntpstat 工具程序之前包含在 ntp
软件包中,且只支持 ntpd
。现在它支持 ntpd
和 chronyd
。它现在包括在 ntpstat
软件包中。
29.3.1. 迁移脚本
名为 ntp2chrony.py
的 Python 脚本包含在 chrony
软件包文档中(/usr/share/doc/chrony
)。这个脚本会自动将现有的 ntp
配置转换为 chrony
。它支持 ntp.conf
文件中最常用的指令和选项。所有在转换中忽略的行都会作为注释包含在生成的 chrony.conf
文件中以便用户进行核查。在 ntp
密钥文件中指定但未在 ntp.conf
中被标记为可信密钥的密钥会作为注释出现在生成的 chrony.keys
文件中。
默认情况下,该脚本不会覆盖任何文件。如果 /etc/chrony.conf
或 /etc/chrony.keys
已经存在,使用 -b
选项可以重新命名文件以作为备份。这个脚本支持其他选项。--help
选项输出所有支持选项。
在 ntp
软件包中提供了一个默认 ntp.conf
调用脚本示例:
# python3 /usr/share/doc/chrony/ntp2chrony.py -b -v Reading /etc/ntp.conf Reading /etc/ntp/crypto/pw Reading /etc/ntp/keys Writing /etc/chrony.conf Writing /etc/chrony.keys
本例中唯一忽略的指令是 disable monitor
,它在 noclientlog
指令中有一个等同的 chrony 项。它包括在默认 ntp.conf
中只是用于缓解一个安全工具。
生成的 chrony.conf
文件通常包含大量与 ntp.conf
中限制行对应的 allow
指令。如果您不想使用 chronyd
作为 NTP
服务器,从 chrony.conf
中删除所有 allow
指令。
第 30 章 使用 Chrony
以下章节介绍了如何安装、启动和停止 chronyd
,以及如何检查 chrony
是否同步。这些章节还介绍了如何手动调整系统时钟。
30.1. 管理 chrony
以下流程描述了如何安装、启动、停止和检查 chronyd
的状态。
流程
默认在 Red Hat Enterprise Linux 上安装 chrony 套件。以
root
用户运行以下命令进行验证:# yum install chrony
chrony 守护进程的默认位置为
/usr/sbin/chronyd
。命令行工具将安装到/usr/bin/chronyc
。运行以下命令检查
chronyd
的状态:$
systemctl status chronyd
chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled) Active: active (running) since Wed 2013-06-12 22:23:16 CEST; 11h ago要启动
chronyd
,使用root
用户身份运行以下命令:# systemctl start chronyd
要确保
chronyd
在系统启动时自动启动,以root
身份运行以下命令:# systemctl enable chronyd
要停止
chronyd
,以root
身份运行以下命令:# systemctl stop chronyd
要防止
chronyd
在系统启动时自动启动,以root
身份运行以下命令:# systemctl disable chronyd
30.2. 检查是否同步 chrony
以下流程描述了如何检查 chrony 是否与 tracking
、sources
和 sourcestats
命令的使用同步。
流程
运行以下命令检查 chrony 跟踪:
$
chronyc tracking
Reference ID : CB00710F (foo.example.net) Stratum : 3 Ref time (UTC) : Fri Jan 27 09:49:17 2017 System time : 0.000006523 seconds slow of NTP time Last offset : -0.000006747 seconds RMS offset : 0.000035822 seconds Frequency : 3.225 ppm slow Residual freq : 0.000 ppm Skew : 0.129 ppm Root delay : 0.013639022 seconds Root dispersion : 0.001100737 seconds Update interval : 64.2 seconds Leap status : Normalsources 命令显示
chronyd
正在访问的当前时间源的信息。要检查 chrony 源,请运行以下命令:$ chronyc sources 210 Number of sources = 3 MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== #* GPS0 0 4 377 11 -479ns[ -621ns] /- 134ns ^? a.b.c 2 6 377 23 -923us[ -924us] +/- 43ms ^ d.e.f 1 6 377 21 -2629us[-2619us] +/- 86ms
可以使用可选参数 -v 来包括详细信息。在这种情况下,会输出额外的标头行显示字段含义的信息。
sourcestats
命令显示目前被chronyd
检查的每个源的偏移率和误差估算过程的信息。要检查 chrony 源的统计信息,请运行以下命令:$
chronyc sourcestats
210 Number of sources = 1 Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev =============================================================================== abc.def.ghi 11 5 46m -0.001 0.045 1us 25us可以使用可选参数
-v
来包括详细信息。在这种情况下,会输出额外的标头行显示字段含义的信息。
其他资源
-
chronyc(1)
手册页
30.3. 手动调整系统时钟
下面的流程描述了如何手动调整系统时钟。
流程
要立即调整系统时钟,绕过单机进行的任何调整,以
root
身份运行以下命令:# chronyc makestep
如果使用了 rtcfile
指令,则不应该手动调整实时时钟。随机调整会影响 chrony 测量实时时钟漂移速率的需要。
30.4. 在隔离的网络中为系统设定 chrony
对于从来不连接到互联网的网络来说,一台计算机被选为主计时服务器。其他计算机要么是主计算机的直接客户端,要么是客户端的客户端。在 master 上,必须使用系统时钟的平均偏移率手动设置 drift 文件。如果 master 被重启,它将从周围的系统获得时间并计算设定系统时钟的平均值。之后它会恢复基于 drift 文件的调整。当使用 settime 命令时会自动更新 drift
文件。
以下流程描述了如何为隔离网络中的系统设置 chrony。
流程
在选为 master 的系统上,以
root
用户身份运行一个文本编辑器来编辑/etc/chrony.conf
,如下所示:driftfile /var/lib/chrony/drift commandkey 1 keyfile /etc/chrony.keys initstepslew 10 client1 client3 client6 local stratum 8 manual allow 192.0.2.0
其中
192.0.2.0
是允许客户端连接的网络或者子网地址。在选择为 master 客户端的系统上,以
root
用户身份运行一个文本编辑器来编辑/etc/chrony.conf
,如下所示:server master driftfile /var/lib/chrony/drift logdir /var/log/chrony log measurements statistics tracking keyfile /etc/chrony.keys commandkey 24 local stratum 10 initstepslew 20 master allow 192.0.2.123
其中
192.0.2.123
是 master 的地址,master
是 master 的主机名。带有此配置的客户端如果重启 master 将重新同步。
在不是 master 客户端的客户端系统中,/etc/chrony.conf
文件应该是相同的,除了应该省略 local
和 allow
指令。
在隔离的网络中,您还可以使用 local
指令来启用本地参考模式。该模式可允许 chronyd
作为 NTP
服务器实时显示同步,即使它从未同步或者最后一次更新时钟早前发生。
要允许网络中的多个服务器使用相同的本地配置并相互同步,而不让客户端轮询多个服务器,请使用 local
指令的 orphan
选项启用孤立模式。每一个服务器都需要配置为使用 local
轮询所有其他服务器。这样可确保只有最小参考 ID 的服务器具有本地参考活跃状态,其他服务器与之同步。当服务器出现故障时,另一台服务器将接管。
30.5. 配置远程监控访问
chronyc 可以通过两种方式访问 chronyd
:
- 互联网协议、IPv4 或者 IPv6。
-
UNIX 域套接字,由
root
用户或chrony
用户从本地进行访问。
默认情况下,chronyc 连接到 Unix 域套接字。默认路径为 /var/run/chrony/chronyd.sock
。如果这个连接失败,比如,当 chronyc 在非 root 用户下运行时会发生,chronyc 会尝试连接到 127.0.0.1,然后 ::1。
网络中只允许以下监控命令,它们不会影响 chronyd
的行为:
- activity
- manual list
- rtcdata
- smoothing
- sources
- sourcestats
- tracking
- waitsync
chronyd
接受这些命令的主机集合可以使用 chronyd
配置文件中的 cmdallow
指令,或者在 chronyc 中使用 cmdallow
命令配置。默认情况下,仅接受来自 localhost(127.0.0.1 或 ::1)的命令。
所有其他命令只能通过 Unix 域套接字进行。当通过网络发送时,chronyd
会返回 Notauthorized
错误,即使它来自 localhost。
以下流程描述了如何使用 chronyc 远程访问 chronyd。
流程
在
/etc/chrony.conf
文件中添加以下内容来允许 IPv4 和 IPv6 地址的访问:bindcmdaddress 0.0.0.0
或者
bindcmdaddress ::
使用
cmdallow
指令允许来自远程 IP 地址、网络或者子网的命令。在
/etc/chrony.conf
文件中添加以下内容:cmdallow 192.168.1.0/24
在防火墙中打开端口 323 以从远程系统连接:
# firewall-cmd --zone=public --add-port=323/udp
另外,您可以使用
--permanent
选项永久打开端口 323:# firewall-cmd --permanent --zone=public --add-port=323/udp
如果您永久打开了端口 323,请重新载入防火墙配置:
firewall-cmd --reload
其他资源
-
chrony.conf(5)
手册页
30.6. 使用 RHEL 系统角色管理时间同步
您可以使用 timesync
角色在多个目标机器上管理时间同步。timesync
角色安装并配置 NTP 或 PTP 实现来作为 NTP 客户端或 PTP slave 操作,以便将系统时钟与 PTP 域中的 NTP 服务器或 grandmasters 同步。
请注意,使用 timesync
角色还可帮助 迁移到 chrony,因为您可以在从 RHEL 6 开始的所有 Red Hat Enterprise Linux 版本上使用相同的 playbook,而无论系统是否使用了 ntp 或 chrony 来实现 NTP 协议。
timesync 角色
替换了受管主机上给定或检测到的供应商服务的配置。之前的设置即使没有在角色变量中指定,也会丢失。如果没有定义 timesync_ntp_provider
变量,唯一保留的设置就是供应商选择。
以下示例演示了如何在只有一个服务器池的情况下应用 timesync
角色。
例 30.1. 为单一服务器池应用 timesync 角色的 playbook 示例
--- - hosts: timesync-test vars: timesync_ntp_servers: - hostname: 2.rhel.pool.ntp.org pool: yes iburst: yes roles: - rhel-system-roles.timesync
有关 timesync
角色变量的详细参考,请安装 rhel-system-roles
软件包,并参阅 /usr/share/doc/rhel-system-roles/timesync
目录中的 README.md
或 README.html
文件。
30.7. 其他资源
-
chronyc(1)
手册页 -
chronyd(8)
手册页 - 常见问题解答
第 31 章 带有 HW 时间戳的 Chrony
硬件时间戳是在一些网络接口控制器(NIC)中支持的一种功能,它提供传入和传出数据包的准确的时间戳。NTP
时间戳通常由内核及使用系统时钟的 chronyd 创建。但是,当启用了 HW 时间戳时,NIC 使用自己的时钟在数据包进入或离开链路层或物理层时生成时间戳。与 NTP
一起使用时,硬件时间戳可以显著提高同步的准确性。为了获得最佳准确性,NTP
服务器和 NTP
客户端都需要使用硬件时间戳。在理想条件下,可达到次微秒级的准确性。
另一个用于使用硬件时间戳进行时间同步的协议是 PTP
与 NTP
不同,PTP
依赖于网络交换机和路由器。如果您想要达到同步的最佳准确性,请在带有 PTP
支持的网络中使用 PTP
,在使用不支持这个协议的交换机和路由器的网络上选择 NTP
。
以下小节描述了如何进行:
- 验证是否支持硬件时间戳
- 启用硬件时间戳
- 配置客户端轮询间隔
- 启用交错模式
- 为大量客户端配置服务器
- 验证硬件时间戳
- 配置 PTP-NTP 网桥
31.1. 验证硬件时间戳支持
要验证接口是否支持使用 NTP
的硬件时间戳,请使用 ethtool -T
命令。如果 ethtool
列出了 SOF_TIMESTAMPING_TX_HARDWARE
和 SOF_TIMESTAMPING_TX_SOFTWARE
模式,以及 HWTSTAMP_FILTER_ ALL
过滤器模式,则可以使用硬件时间戳的 NTP
。
例 31.1. 在特定接口中验证硬件时间戳支持
# ethtool -T eth0
输出:
Timestamping parameters for eth0: Capabilities: hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE) software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE) hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE) software-receive (SOF_TIMESTAMPING_RX_SOFTWARE) software-system-clock (SOF_TIMESTAMPING_SOFTWARE) hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE) PTP Hardware Clock: 0 Hardware Transmit Timestamp Modes: off (HWTSTAMP_TX_OFF) on (HWTSTAMP_TX_ON) Hardware Receive Filter Modes: none (HWTSTAMP_FILTER_NONE) all (HWTSTAMP_FILTER_ALL) ptpv1-l4-sync (HWTSTAMP_FILTER_PTP_V1_L4_SYNC) ptpv1-l4-delay-req (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) ptpv2-l4-sync (HWTSTAMP_FILTER_PTP_V2_L4_SYNC) ptpv2-l4-delay-req (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) ptpv2-l2-sync (HWTSTAMP_FILTER_PTP_V2_L2_SYNC) ptpv2-l2-delay-req (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ) ptpv2-event (HWTSTAMP_FILTER_PTP_V2_EVENT) ptpv2-sync (HWTSTAMP_FILTER_PTP_V2_SYNC) ptpv2-delay-req (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)
31.2. 启用硬件时间戳
要启用硬件时间戳,请使用 /etc/chrony.conf
文件中的 hwtimestamp
指令。该指令可指定单一接口,也可以指定通配符字符来启用所有支持接口的硬件时间戳。在没有其他应用程序(如 linuxptp
软件包中的 ptp4l 在接口上使用硬件时间戳)的情况下,请使用通配符规范。在 chrony 配置文件中允许使用多个 hwtimestamp
指令。
例 31.2. 使用 hwtimestamp 指令启用硬件时间戳
hwtimestamp eth0 hwtimestamp eth1 hwtimestamp *
31.3. 配置客户端轮询间隔
建议为互联网中的服务器使用默认的轮询间隔范围(64-1024秒)。对于本地服务器和硬件时间戳,需要配置一个较短的轮询间隔,以便最小化系统时钟偏差。
/etc/chrony.conf
中的以下指令指定了使用一秒轮询间隔的本地 NTP
服务器:
server ntp.local minpoll 0 maxpoll 0
31.4. 启用交错模式
NTP
服务器不是硬件的 NTP
设备,而是运行软件 NTP
实现的通用计算机,如 chrony ,将在发送数据包后才会获得硬件传输时间戳。此行为可防止服务器在其对应的数据包中保存时间戳。为了使 NTP
客户端接收传输后生成的传输时间戳,请将客户端配置为使用 NTP
交错模式,方法是在 /etc/chrony.conf
的 server 指令中添加 xleave
选项:
server ntp.local minpoll 0 maxpoll 0 xleave
31.5. 为大量客户端配置服务器
默认服务器配置允许最多几千个客户端同时使用交错模式。要为更多的客户端配置服务器,增大 /etc/chrony.conf
中的 clientloglimit
指令。这个指令指定了为服务器上客户端访问的日志分配的最大内存大小:
clientloglimit 100000000
31.6. 验证硬件时间戳
要校验该接口是否已成功启用了硬件时间戳,请检查系统日志。这个日志应该包含来自 chronyd
的每个接口的消息,并成功启用硬件时间戳。
例 31.3. 为启用硬件时间戳的接口记录日志信息
chronyd[4081]: Enabled HW timestamping on eth0 chronyd[4081]: Enabled HW timestamping on eth1
当 chronyd
被配置为 NTP
客户端或对等的客户端时,您可以使用 chronyc ntpdata
命令为每个 NTP
源报告传输和接收时间戳模式以及交错模式:
例 31.4. 报告每个 NTP 源的传输、接收时间戳以及交集模式
# chronyc ntpdata
输出:
Remote address : 203.0.113.15 (CB00710F) Remote port : 123 Local address : 203.0.113.74 (CB00714A) Leap status : Normal Version : 4 Mode : Server Stratum : 1 Poll interval : 0 (1 seconds) Precision : -24 (0.000000060 seconds) Root delay : 0.000015 seconds Root dispersion : 0.000015 seconds Reference ID : 47505300 (GPS) Reference time : Wed May 03 13:47:45 2017 Offset : -0.000000134 seconds Peer delay : 0.000005396 seconds Peer dispersion : 0.000002329 seconds Response time : 0.000152073 seconds Jitter asymmetry: +0.00 NTP tests : 111 111 1111 Interleaved : Yes Authenticated : No TX timestamping : Hardware RX timestamping : Hardware Total TX : 27 Total RX : 27 Total valid RX : 27
例 31.5. 报告 NTP 测量的稳定性
# chronyc sourcestats
启用硬件时间戳后,正常负载下,NTP
测量的稳定性应该以十秒或数百纳秒为单位。此稳定性会在 chronyc sourcestats
命令的输出结果中的 Std Dev
列中报告:
输出:
210 Number of sources = 1 Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev ntp.local 12 7 11 +0.000 0.019 +0ns 49ns
31.7. 配置 PTP-NTP 桥接
如果网络中存在一个高度准确的 Precision Time Protocol (PTP
) grandmaster,但没有支持 PTP
支持的交换机或路由器,则一个计算机会可能会被指定专门用于作为 PTP
slave 和一个 stratum-1 NTP
服务器。此类计算机需要具有两个或更多个网络接口,并且接近 grandmaster 或与它建立直接连接。这样可保证高度准确的网络同步。
从 linuxptp
软件包中配置 ptp4l 和 phc2sys 程序,以使用 PTP
来同步系统时钟。
将 chronyd
配置为使用其他接口提供系统时间:
例 31.6. 将 chronyd 配置为使用其他接口提供系统时间
bindaddress 203.0.113.74 hwtimestamp eth1 local stratum 1
第 32 章 在 chrony 中启用一些之前由 NTP 支持的设置
chrony 不支持在以前由 ntp 支持的 Red Hat Enterprise Linux 主版本中的某些设置。以下小节列出了此类设置,并描述了在具有 chrony 的系统中实现它们的方法。
32.1. 使用 ntpq 和 ntpdc 进行监控
chronyd
无法被由 ntp 提供的 ntpq 和 ntpdc 监控,因为 chrony 不支持 NTP
模式 6 和 7。它支持不同的协议,chronyc 是一个客户端的实现。如需更多信息,请参阅 chronyc (1)
man page。
要监控使用 chronyd
的系统时钟的状态,您可以:
- 使用 tracking 命令
-
使用支持 chrony 的 ntpstat 工具,它提供和
ntpd
类似的输出。
例 32.1. 使用跟踪命令
$ chronyc -n tracking Reference ID : 0A051B0A (10.5.27.10) Stratum : 2 Ref time (UTC) : Thu Mar 08 15:46:20 2018 System time : 0.000000338 seconds slow of NTP time Last offset : +0.000339408 seconds RMS offset : 0.000339408 seconds Frequency : 2.968 ppm slow Residual freq : +0.001 ppm Skew : 3.336 ppm Root delay : 0.157559142 seconds Root dispersion : 0.001339232 seconds Update interval : 64.5 seconds Leap status : Normal
例 32.2. 使用 ntpstat 程序
$ ntpstat synchronised to NTP server (10.5.27.10) at stratum 2 time correct to within 80 ms polling server every 64 s
32.2. 使用基于公钥加密的认证机制
在 Red Hat Enterprise Linux 7 中,ntp 支持的 Autokey,它是一个基于公钥加密的验证机制。
在 Red Hat Enterprise Linux 8 中,chronyd
支持 Network Time Security (NTS),它是一个现代安全身份验证机制,而不是 Autokey。如需更多信息,请参阅 chrony 中的网络时间协议(NTS)概述。
32.3. 使用临时对称关联
在 Red Hat Enterprise Linux 7 中,ntpd
支持的临时对称关联(可以通过未在 ntp.conf
配置文件中指定的 peer)来移动化。在 Red Hat Enterprise Linux 8 中,chronyd
需要在 chrony.conf
中指定所有对等点。不支持临时对称关联。
请注意,使用通过 server
或 pool
指令启用的客户端/服务器模式和通过 peer
指令启用的对称模式相比,更为安全。
32.4. 多播/广播客户端
Red Hat Enterprise Linux 7 支持广播/多播 NTP
模式,该模式简化了客户端配置。使用这个模式,客户端可以配置为仅侦听发送到多播/广播地址的数据包,而不是侦听各个服务器的特定名称或地址,这可能会随时间变化。
在 Red Hat Enterprise Linux 8 中,chronyd
不支持广播/多播模式。主要的原因是它比一般的客户端/服务器以及对称模式的准确性较低且安全性较低。
从 NTP
广播/多播设置中迁移有几个选项:
将 DNS 配置为将单个名称(如 ntp.example.com)转换为不同服务器的多个地址。
客户端只能使用单一池指令来与多个服务器同步进行静态配置。如果池中的服务器变得不可访问,或者不适合同步,客户端会自动将其替换为池中的另一台服务器。
通过 DHCP 分配
NTP
服务器列表当 NetworkManager 从 DHCP 服务器获得
NTP
服务器列表时,chronyd
会自动配置来使用它们。把PEERNTP=no
添加到/etc/sysconfig/network
文件可以禁用这个功能。使用
精确时间协议 (PTP)
这个选项主要适用于服务器经常更改的环境,或者大量的客户端需要在没有指定服务器的情况下相互同步。
PTP
是为多播消息设计的,它的工作方式与NTP
广播模式相似。linuxptp
软件包中包括了一个PTP
实现。PTP
通常需要硬件时间戳并支持网络开关执行正常。但是,即使软件时间戳没有支持网络交换机,PTP
也应该比广播模式中的NTP
更好地工作。当网络在一个通信路径中有大量
PTP
从服务器时,建议使用hybrid_e2e
选项配置PTP
从服务器,以减少从卷生成的网络流量。您可以将运行chronyd
的计算机配置为NTP
客户端或NTP
服务器,也可以作为PTP
grandmaster 将同步时间分发到使用多播消息传递的大量计算机中。
第 33 章 chrony 中的网络时间安全概述(NTS)
Network Time Security(NTS)是用于网络时间协议(NTP)的身份验证机制,旨在扩展大量客户端。它将验证从服务器计算机接收的数据包在移到客户端机器时是否被取消处理。Network Time Security(NTS)包含 Key Establishment(NTS-KE)协议,该协议会自动创建在服务器及其客户端中使用的加密密钥。
33.1. 在客户端配置文件中启用网络时间协议(NTS)
默认情况下不启用 Network Time Security(NTS)。您可以在 /etc/chrony.conf
中启用 NTS。为此,请执行以下步骤:
先决条件
- 带有 NTS 支持的服务器
流程
在客户端配置文件中:
除推荐的
iburst
选项外,使用nts
选项指定服务器。For example: server time.example.com iburst nts server nts.netnod.se iburst nts server ptbtime1.ptb.de iburst nts
要避免在系统引导时重复 Network Time Security-Key Establishment(NTS-KE)会话,请在
chrony.conf
中添加以下行(如果不存在):ntsdumpdir /var/lib/chrony
将以下行添加到
/etc/sysconfig/network
以禁用与DHCP
提供的网络时间协议(NTP)服务器的同步:PEERNTP=no
- 保存您的更改。
重启
chronyd
服务:systemctl restart chronyd
验证
验证
NTS
密钥是否已成功建立:# chronyc -N authdata Name/IP address Mode KeyID Type KLen Last Atmp NAK Cook CLen ================================================================ time.example.com NTS 1 15 256 33m 0 0 8 100 nts.sth1.ntp.se NTS 1 15 256 33m 0 0 8 100 nts.sth2.ntp.se NTS 1 15 256 33m 0 0 8 100
KeyID
、Type
和KLen
应带有非零值。如果该值为零,请检查系统日志中来自chronyd
的错误消息。验证客户端是否正在进行 NTP 测量:
# chronyc -N sources MS Name/IP address Stratum Poll Reach LastRx Last sample ========================================================= time.example.com 3 6 377 45 +355us[ +375us] +/- 11ms nts.sth1.ntp.se 1 6 377 44 +237us[ +237us] +/- 23ms nts.sth2.ntp.se 1 6 377 44 -170us[ -170us] +/- 22ms
Reach
列中应具有非零值;理想情况是 377。如果值很少为 377 或永远不是 377,这表示 NTP 请求或响应在网络中丢失。
其他资源
-
chrony.conf(5)
手册页
33.2. 在服务器上启用网络时间安全性(NTS)
如果您运行自己的网络时间协议(NTP)服务器,您可以启用服务器网络时间协议(NTS)支持来促进其客户端安全地同步。
如果 NTP 服务器是其它服务器的客户端,即它不是 Stratum 1 服务器,它应使用 NTS 或对称密钥进行同步。
先决条件
-
以
PEM
格式的服务器私钥 -
带有
PEM
格式的所需中间证书的服务器证书
流程
在
chrony.conf
中指定私钥和证书文件For example: ntsserverkey /etc/pki/tls/private/foo.example.net.key ntsservercert /etc/pki/tls/certs/foo.example.net.crt
通过设置组所有权,确保 chrony 系统用户可读密钥和证书文件。
For example: chown :chrony /etc/pki/tls/*/foo.example.net.*
-
确保
chrony.conf
中存在ntsdumpdir /var/lib/chrony
指令。 重启
chronyd
服务:systemctl restart chronyd
重要如果服务器具有防火墙,则需要允许 NTP 和 Network Time Security-Key Establishment(NTS-KE)的
UDP 123
和TCP 4460
端口。
验证
使用以下命令从客户端机器执行快速测试:
$ chronyd -Q -t 3 'server foo.example.net iburst nts maxsamples 1' 2021-09-15T13:45:26Z chronyd version 4.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +NTS +SECHASH +IPV6 +DEBUG) 2021-09-15T13:45:26Z Disabled control of system clock 2021-09-15T13:45:28Z System clock wrong by 0.002205 seconds (ignored) 2021-09-15T13:45:28Z chronyd exiting
System clock wrong
消息指示 NTP 服务器接受 NTS-KE 连接并使用 NTS 保护的 NTP 消息进行响应。验证 NTS-KE 连接并验证服务器中观察的 NTP 数据包:
# chronyc serverstats NTP packets received : 7 NTP packets dropped : 0 Command packets received : 22 Command packets dropped : 0 Client log records dropped : 0 NTS-KE connections accepted: 1 NTS-KE connections dropped : 0 Authenticated NTP packets: 7
如果
NTS-KE connections accepted
和Authenticated NTP packets
项带有一个非零值,这意味着至少有一个客户端能够连接到 NTS-KE 端口并发送经过身份验证的 NTP 请求。
第 34 章 使用 OpenSSH 的两个系统间使用安全通讯
SSH(Secure Shell)是一种协议,它使用客户端-服务器架构在两个系统之间提供安全通信,并允许用户远程登录到服务器主机系统。和其它远程沟通协议,如 FTP 或 Telnet 不同,SSH 会加密登录会话,它会阻止入侵者从连接中收集未加密的密码。
Red Hat Enterprise Linux 包括基本的 OpenSSH
软件包:常规 openssh
软件包、openssh-server
软件包和 openssh-clients
软件包。请注意,OpenSSH
软件包需要 OpenSSL
软件包 openssl-libs
,它会安装几个重要的加密库来启用 OpenSSH
对通讯进行加密。
34.1. SSH 和 OpenSSH
SSH(安全 Shell)是一个登录远程机器并在该机器上执行命令的程序。SSH 协议通过不安全的网络在两个不可信主机间提供安全加密的通讯。您还可以通过安全频道转发 X11 连接和任意 TCP/IP 端口。
当使用 SSH 协议进行远程 shell 登录或文件复制时,SSH 协议可以缓解威胁,例如,拦截两个系统之间的通信和模拟特定主机。这是因为 SSH 客户端和服务器使用数字签名来验证其身份。另外,所有客户端和服务器系统之间的沟通都是加密的。
主机密钥验证使用 SSH 协议的主机。当首次安装 OpenSSH 或主机第一次引导时,主机密钥是自动生成的加密密钥。
OpenSSH 是 Linux、UNIX 和类似操作系统支持的 SSH 协议的实现。它包括 OpenSSH 客户端和服务器需要的核心文件。OpenSSH 组件由以下用户空间工具组成:
-
ssh
是一个远程登录程序(SSH 客户端). -
sshd
是一个 OpenSSH SSH 守护进程。 -
scp
是一个安全的远程文件复制程序。 -
sftp
是一个安全的文件传输程序。 -
ssh-agent
是用于缓存私钥的身份验证代理。 -
ssh-add
为ssh-agent
添加私钥身份。 -
ssh-keygen
生成、管理并转换ssh
验证密钥。 -
ssh-copy-id
是一个将本地公钥添加到远程 SSH 服务器上的authorized_keys
文件中的脚本。 -
ssh-keyscan
可以收集 SSH 公共主机密钥。
现有两个 SSH 版本: 版本 1 和较新的版本 2。RHEL 中的 OpenSSH 套件仅支持 SSH 版本 2。它有一个增强的密钥更改算法,它不会受到已知在版本 1 中存在的安全漏洞的影响。
OpenSSH 作为 RHEL 的核心加密子系统之一,使用系统范围的加密策略。这样可确保在默认配置中禁用弱密码套件和加密算法。要修改策略,管理员必须使用 update-crypto-policies
命令来调整设置,或者手动选择不使用系统范围的加密策略。
OpenSSH 套件使用两组配置文件:一个用于客户端程序(即 ssh
、scp
和 sftp
),另一个用于服务器( sshd
守护进程)。
系统范围的 SSH 配置信息保存在 /etc/ssh/
目录中。用户特定的 SSH 配置信息保存在用户主目录中的 ~/.ssh/
中。有关 OpenSSH 配置文件的详细列表,请查看 sshd(8)
man page 中的 FILES
部分。
其他资源
-
使用
man -k ssh
命令显示 man page - 使用系统范围的加密策略
34.2. 配置并启动 OpenSSH 服务器
使用以下步骤执行您的环境以及启动 OpenSSH 服务器所需的基本配置。请注意,在默认 RHEL 安装后,sshd
守护进程已经启动,服务器主机密钥会自动被创建。
先决条件
-
已安装
openssh-server
软件包。
流程
在当前会话中启动
sshd
守护进程,并在引导时自动启动:# systemctl start sshd # systemctl enable sshd
要为
/etc/ssh/sshd_config
配置文件中的ListenAddress
指令指定默认地址0.0.0.0
(IPv4)或::
(IPv6),并使用较慢的动态网络配置,将network-online.target
目标单元的依赖关系添加到sshd.service
单元文件中。要做到这一点,使用以下内容创建/etc/systemd/system/sshd.service.d/local.conf
文件:[Unit] Wants=network-online.target After=network-online.target
-
查看
/etc/ssh/sshd_config
配置文件中的 OpenSSH 服务器设置是否满足您的情况要求。 另外,还可通过编辑
/etc/issue
文件来更改您的 OpenSSH 服务器在客户端验证前显示的欢迎信息,例如:Welcome to ssh-server.example.com Warning: By accessing this server, you agree to the referenced terms and conditions.
确保
/etc/ssh/sshd_config
中未注释掉Banner
选项,并且其值包含/etc/issue
:# less /etc/ssh/sshd_config | grep Banner Banner /etc/issue
请注意:要在成功登录后改变显示的信息,您必须编辑服务器上的
/etc/motd
文件。详情请查看pam_motd
man page。重新载入
systemd
配置,并重启sshd
以应用修改:# systemctl daemon-reload # systemctl restart sshd
验证
检查
sshd
守护进程是否正在运行:# systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-11-18 14:59:58 CET; 6min ago Docs: man:sshd(8) man:sshd_config(5) Main PID: 1149 (sshd) Tasks: 1 (limit: 11491) Memory: 1.9M CGroup: /system.slice/sshd.service └─1149 /usr/sbin/sshd -D -oCiphers=aes128-ctr,aes256-ctr,aes128-cbc,aes256-cbc -oMACs=hmac-sha2-256,> Nov 18 14:59:58 ssh-server-example.com systemd[1]: Starting OpenSSH server daemon... Nov 18 14:59:58 ssh-server-example.com sshd[1149]: Server listening on 0.0.0.0 port 22. Nov 18 14:59:58 ssh-server-example.com sshd[1149]: Server listening on :: port 22. Nov 18 14:59:58 ssh-server-example.com systemd[1]: Started OpenSSH server daemon.
使用 SSH 客户端连接到 SSH 服务器。
# ssh user@ssh-server-example.com ECDSA key fingerprint is SHA256:dXbaS0RG/UzlTTku8GtXSz0S1++lPegSy31v3L/FAEc. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'ssh-server-example.com' (ECDSA) to the list of known hosts. user@ssh-server-example.com's password:
其他资源
-
sshd(8)
和sshd_config(5)
手册页。
34.3. 为基于密钥的身份验证设置 OpenSSH 服务器
要提高系统安全性,通过在 OpenSSH 服务器上禁用密码身份验证来强制进行基于密钥的身份验证。
先决条件
-
已安装
openssh-server
软件包。 -
sshd
守护进程正在服务器中运行。
流程
在文本编辑器中打开
/etc/ssh/sshd_config
配置,例如:# vi /etc/ssh/sshd_config
将
PasswordAuthentication
选项改为no
:PasswordAuthentication no
在新默认安装以外的系统中,检查
PubkeyAuthentication
没有被设置,并且将ChallengeResponseAuthentication
指令设为no
。如果您要进行远程连接,而不使用控制台或带外访问,在禁用密码验证前测试基于密钥的登录过程。要在 NFS 挂载的主目录中使用基于密钥的验证,启用
use_nfs_home_dirs
SELinux 布尔值:# setsebool -P use_nfs_home_dirs 1
重新载入
sshd
守护进程以应用更改:# systemctl reload sshd
其他资源
-
sshd(8)
,sshd_config(5)
和setsebool(8)
手册页。
34.4. 生成 SSH 密钥对
使用这个流程在本地系统中生成 SSH 密钥对,并将生成的公钥复制到 OpenSSH 服务器中。如果正确配置了服务器,您可以在不提供任何密码的情况下登录到 OpenSSH 服务器。
如果以 root
用户身份完成以下步骤,则只有 root
用户可以使用密钥。
流程
为 SSH 协议的版本 2 生成 ECDSA 密钥对:
$ ssh-keygen -t ecdsa Generating public/private ecdsa key pair. Enter file in which to save the key (/home/joesec/.ssh/id_ecdsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/joesec/.ssh/id_ecdsa. Your public key has been saved in /home/joesec/.ssh/id_ecdsa.pub. The key fingerprint is: SHA256:Q/x+qms4j7PCQ0qFd09iZEFHA+SqwBKRNaU72oZfaCI joesec@localhost.example.com The key's randomart image is: +---[ECDSA 256]---+ |.oo..o=++ | |.. o .oo . | |. .. o. o | |....o.+... | |o.oo.o +S . | |.=.+. .o | |E.*+. . . . | |.=..+ +.. o | | . oo*+o. | +----[SHA256]-----+
您还可以通过输入
ssh-keygen -t ed25519
命令,在ssh-keygen
命令或 Ed25519 密钥对中使用-t rsa
选项生成 RSA 密钥对。要将公钥复制到远程机器中:
$ ssh-copy-id joesec@ssh-server-example.com /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed joesec@ssh-server-example.com's password: ... Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'joesec@ssh-server-example.com'" and check to make sure that only the key(s) you wanted were added.
如果您没有在会话中使用
ssh-agent
程序,上一个命令会复制最新修改的~/.ssh/id*.pub
公钥。要指定另一个公钥文件,或在ssh-agent
内存中缓存的密钥优先选择文件中的密钥,使用带有-i
选项的ssh-copy-id
命令。
如果重新安装您的系统并希望保留之前生成的密钥对,备份 ~/.ssh/
目录。重新安装后,将其复制到主目录中。您可以为系统中的所有用户(包括 root
用户)进行此操作。
验证
在不提供任何密码的情况下登录到 OpenSSH 服务器:
$ ssh joesec@ssh-server-example.com Welcome message. ... Last login: Mon Nov 18 18:28:42 2019 from ::1
其他资源
-
ssh-keygen(1)
和ssh-copy-id(1)
手册页。
34.5. 使用保存在智能卡中的 SSH 密钥
Red Hat Enterprise Linux 可让您使用保存在 OpenSSH 客户端智能卡中的 RSA 和 ECDSA 密钥。使用这个步骤使用智能卡而不是使用密码启用验证。
先决条件
-
在客户端中安装了
opensc
软件包,pcscd
服务正在运行。
流程
列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到 key.pub 文件:
$ ssh-keygen -D pkcs11: > keys.pub $ ssh-keygen -D pkcs11: ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
要使用远程服务器上的智能卡(example.com)启用验证,将公钥传送到远程服务器。使用带有上一步中创建的 key.pub 的
ssh-copy-id
命令:$ ssh-copy-id -f -i keys.pub username@example.com
要使用在第 1 步的
ssh-keygen -D
命令输出中的 ECDSA 密钥连接到 example.com,您只能使用 URI 中的一个子集,它是您的密钥的唯一参考,例如:$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com Enter PIN for 'SSH key': [example.com] $
您可以使用
~/.ssh/config
文件中的同一 URI 字符串使配置持久:$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh example.com Enter PIN for 'SSH key': [example.com] $
因为 OpenSSH 使用
p11-kit-proxy
包装器,并且 OpenSC PKCS #11 模块是注册到 PKCS#11 Kit 的,所以您可以简化前面的命令:$ ssh -i "pkcs11:id=%01" example.com Enter PIN for 'SSH key': [example.com] $
如果您跳过 PKCS #11 URI 的 id=
部分,则 OpenSSH 会加载代理模块中可用的所有密钥。这可减少输入所需的数量:
$ ssh -i pkcs11: example.com
Enter PIN for 'SSH key':
[example.com] $
其它资源
- Fedora 28:在 OpenSSH 中提供更强大的智能卡
-
p11-kit(8)
、opensc.conf(5)
、pcscd(8)
、ssh(1)
和ssh-keygen(1)
手册页
34.6. 使 OpenSSH 更安全
以下提示可帮助您在使用 OpenSSH 时提高安全性。请注意,/etc/ssh/sshd_config
OpenSSH 配置文件的更改需要重新载入 sshd
守护进程才能生效:
# systemctl reload sshd
大多数安全强化配置更改会降低与不支持最新算法或密码套件的客户端的兼容性。
禁用不安全的连接协议
- 要使 SSH 生效,防止使用由 OpenSSH 套件替代的不安全连接协议。否则,用户的密码可能只会在一个会话中被 SSH 保护,可能会在以后使用 Telnet 登录时被捕获。因此,请考虑禁用不安全的协议,如 telnet、rsh、rlogin 和 ftp。
启用基于密钥的身份验证并禁用基于密码的身份验证
禁用密码验证并只允许密钥对可减少安全攻击面,还可节省用户的时间。在客户端中,使用
ssh-keygen
工具生成密钥对,并使用ssh-copy-id
工具从 OpenSSH 服务器的客户端复制公钥。要在 OpenSSH 服务器中禁用基于密码的验证,请编辑/etc/ssh/sshd_config
,并将PasswordAuthentication
选项改为no
:PasswordAuthentication no
密钥类型
虽然
ssh-keygen
命令会默认生成一组 RSA 密钥,但您可以使用-t
选项指定它生成 ECDSA 或者 Ed25519 密钥。ECDSA(Elliptic Curve Digital Signature Algorithm)能够在同等的对称密钥强度下,提供比 RSA 更好的性能。它还会生成较短的密钥。Ed25519 公钥算法是 一种变形的 Edwards 曲线的实现,其比 RSA、DSA 和 ECDSA 更安全,也更快。如果没有这些密钥,OpenSSH 会自动创建 RSA、ECDSA 和 Ed25519 服务器主机密钥。要在 RHEL 中配置主机密钥创建,请使用
sshd-keygen@.service
实例化服务。例如,禁用自动创建 RSA 密钥类型:# systemctl mask sshd-keygen@rsa.service
注意在启用了
cloud-init
的镜像中,ssh-keygen
单元会自动禁用。这是因为ssh-keygen 模板
服务可能会干扰cloud-init
工具,并导致主机密钥生成问题。要防止这些问题etc/systemd/system/sshd-keygen@.service.d/disable-sshd-keygen-if-cloud-init-active.conf
drop-in 配置文件禁用ssh-keygen
单元(如果cloud-init
正在运行)。要排除 SSH 连接的特定密钥类型,注释
/etc/ssh/sshd_config
中的相关行,并重新载入sshd
服务。例如,只允许 Ed25519 主机密钥:# HostKey /etc/ssh/ssh_host_rsa_key # HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
非默认端口
默认情况下,
sshd
守护进程侦听 TCP 端口 22。更改端口可降低系统因自动网络扫描而受到攻击的风险,从而提高安全性。您可以使用/etc/ssh/sshd_config
配置文件中的Port
指令指定端口。您还必须更新默认 SELinux 策略以允许使用非默认端口。要做到这一点,使用
policycoreutils-python-utils
软件包中的semanage
工具:# semanage port -a -t ssh_port_t -p tcp port_number
另外,更新
firewalld
配置:# firewall-cmd --add-port port_number/tcp # firewall-cmd --runtime-to-permanent
在前面的命令中,将 port_number 替换为使用
Port
指令指定的新端口号。
没有 root 登录
如果您的特定用例不需要作为 root 用户登录,应该考虑在
/etc/ssh/sshd_config
文件中将PermitRootLogin
配置指令设置为no
。通过禁止以 root 用户身份登录,管理员可以审核哪些用户在以普通用户身份登录后运行了哪些特权命令,然后获得了 root 权限。或者,将
PermitRootLogin
设置为prohibit-password
:PermitRootLogin prohibit-password
这强制使用基于密钥的身份验证,而不是使用密码以 root 身份登录,并通过防止暴力攻击来降低风险。
使用 X 安全性扩展
Red Hat Enterprise Linux 客户端中的 X 服务器不提供 X 安全性扩展。因此,当连接到带有 X11 转发的不可信 SSH 服务器时,客户端无法请求另一个安全层。大多数应用程序都无法在启用此扩展时运行。
默认情况下,
/etc/ssh/ssh_config.d/05-redhat.conf
文件中的ForwardX 11Trusted
选项被设置为yes
,且ssh -X remote_machine
(不信任主机)和ssh -Y remote_machine
(可信主机)命令之间没有区别。如果您的场景根本不需要 X11 转发功能,请将
/etc/ssh/sshd_config
配置文件中的X11Forwarding
指令设置为no
。
限制对特定用户、组群或者域的访问
/etc/ssh/sshd_config
配置文件服务器中的AllowUsers
和AllowGroups
指令可让您只允许某些用户、域或组连接到您的 OpenSSH 服务器。您可以组合AllowUsers
和Allow Groups
来更准确地限制访问,例如:AllowUsers *@192.168.1.*,*@10.0.0.*,!*@192.168.1.2 AllowGroups example-group
以上配置行接受来自 192.168.1.* 和 10.0.0.* 子网中所有用户的连接,但 192.168.1.2 地址的系统除外。所有用户都必须在
example-group
组中。OpenSSH 服务器拒绝所有其他连接。请注意,使用允许列表(以 Allow 开头的指令)比使用阻止列表(以 Deny 开始的选项)更安全,因为允许列表也会阻止新的未授权的用户或组。
更改系统范围的加密策略
OpenSSH 使用 RHEL 系统范围的加密策略,默认的系统范围的加密策略级别为当前威胁模型提供了安全设置。要使您的加密设置更严格,请更改当前的策略级别:
# update-crypto-policies --set FUTURE Setting system policy to FUTURE
-
要为您的 OpenSSH 服务器选择不使用系统范围内的加密策略,请对
/etc/sysconfig/sshd
文件中的CRYPTO_POLICY=
变量这一行取消注释。更改后,您在/etc/ssh/sshd_config
文件中的Ciphers
、MAC
、KexAlgoritms
和GSSAPIKexAlgorithms
部分指定的值不会被覆盖。请注意,此任务需要在配置加密选项方面具有深厚的专业知识。 - 如需更多信息,请参阅安全强化中的使用系统范围的加密策略。
其他资源
-
sshd_config(5)
、ssh-keygen(1)
、crypto-policies(7)
和update-crypto-policies(8)
手册页。
34.7. 使用 SSH 跳过主机连接到远程服务器
使用这个步骤通过中间服务器(也称为跳过主机)将本地系统连接到远程服务器。
先决条件
- 跳过主机接受来自本地系统的 SSH 连接。
- 远程服务器只接受来自跳过主机的 SSH 连接。
流程
通过编辑本地系统中的
~/.ssh/config
文件来定义跳板主机,例如:Host jump-server1 HostName jump1.example.com
-
Host
参数定义您可以在ssh
命令中使用的主机的名称或别名。该值可以匹配真实的主机名,但也可以是任意字符串。 -
HostName
参数设置跳过主机的实际主机名或 IP 地址。
-
使用
ProxyJump
指令将远程服务器跳板配置添加到本地系统上的~/.ssh/config
文件中,例如:Host remote-server HostName remote1.example.com ProxyJump jump-server1
使用您的本地系统通过跳过服务器连接到远程服务器:
$ ssh remote-server
如果省略了配置步骤 1 和 2,则上一命令等同于
ssh -J skip-server1 remote-server
命令。
您可以指定更多的跳板服务器,您也可以在提供其完整主机名时跳过在配置文件中添加主机定义,例如:
$ ssh -J jump1.example.com,jump2.example.com,jump3.example.com remote1.example.com
如果跳板服务器上的用户名或 SSH 端口与远程服务器上的用户名和端口不同,请只修改上一命令中的主机名表示法,例如:
$ ssh -J johndoe@jump1.example.com:75,johndoe@jump2.example.com:75,johndoe@jump3.example.com:75 joesec@remote1.example.com:220
其他资源
-
ssh_config(5)
和ssh(1)
手册页.
34.8. 通过 ssh-agent ,使用 SSH 密钥连接到远程机器
为了避免在每次发起 SSH 连接时输入密语,您可以使用 ssh-agent
工具缓存 SSH 私钥。确保私钥和密语安全。
先决条件
- 您有一个运行 SSH 守护进程的远程主机,并且可通过网络访问。
- 您知道登录到远程主机的 IP 地址或者主机名以及凭证。
- 您已用密码生成了 SSH 密钥对,并将公钥传送到远程机器。
如需更多信息,请参阅 生成 SSH 密钥对。
流程
可选:验证您是否可以使用密钥来对远程主机进行身份验证:
使用 SSH 连接到远程主机:
$ ssh example.user1@198.51.100.1 hostname
输入您在创建密钥时设定的密码短语以授予对私钥的访问权限。
$ ssh example.user1@198.51.100.1 hostname host.example.com
启动
ssh-agent
。$ eval $(ssh-agent) Agent pid 20062
将密钥添加到
ssh-agent
。$ ssh-add ~/.ssh/id_rsa Enter passphrase for ~/.ssh/id_rsa: Identity added: ~/.ssh/id_rsa (example.user0@198.51.100.12)
验证
可选:使用 SSH 登录到主机机器。
$ ssh example.user1@198.51.100.1 Last login: Mon Sep 14 12:56:37 2020
请注意您不必输入密码短语。
34.9. 其他资源
-
sshd(8)
、ssh(1)
、scp(1)
、sftp(1)
、ssh-keygen(1)
、ssh-copy-id(1)
、ssh_config(5)
、ssh_config(5)
、update-crypto-policies(8)
和crypto-policies(7)
手册页 - OpenSSH 主页
- 为使用非标准配置的应用程序和服务配置 SELinux
- 使用 firewalld 控制网络流量
第 35 章 配置远程日志记录解决方案
要确保在日志记录服务器中集中记录来自环境中各种机器的日志,您可以将 Rsyslog 应用程序配置为将适合客户端系统中特定条件的日志记录到服务器。
35.1. Rsyslog 日志记录服务
Rsyslog 应用程序与 systemd-journald
服务相结合,在 Red Hat Enterprise Linux 中提供了本地和远程记录支持。rsyslogd
守护进程会持续读取 systemd-journald
服务从 Journal 接收的 syslog
消息。然后 rsyslogd
会过滤并处理这些 syslog
事件,并将它们记录到 rsyslog
日志文件,或者根据自己的配置将它们转发到其他服务。
rsyslogd
守护进程还提供扩展的过滤、加密受保护的转发消息、输入和输出模块,并支持使用 TCP 和 UDP 协议进行传输。
在 /etc/rsyslog.conf
中,是 rsyslog
的主要配置文件,您可以根据 rsyslogd
处理消息来指定规则。通常,您可以通过其来源和主题(设施)和紧急情况(优先级)对消息进行分类,然后分配在消息适合这些条件时应执行的操作。
在 /etc/rsyslog.conf
中,您还可以看到 rsyslogd
维护的日志文件列表。大多数日志文件位于 /var/log/
目录中。httpd
和 samba
等一些应用将其日志文件存储在 /var/log/
中的子目录中。
其他资源
-
rsyslogd (8)
和rsyslog.conf (5)
man page。 -
在
/usr/share/doc/rsyslog/html/index.html
文件中通过rsyslog-doc
软件包安装的文档。
35.2. 安装 Rsyslog 文档
Rsyslog 应用程序在 https://www.rsyslog.com/doc/ 上提供了广泛的在线文档,但您也可以在本地安装 rsyslog-doc
文档软件包。
先决条件
-
您已在系统中激活了
AppStream
软件仓库。 -
您有权使用
sudo
安装新软件包。
流程
安装
rsyslog-doc
软件包:# yum install rsyslog-doc
验证
在您选择的浏览器中打开
/usr/share/doc/rsyslog/html/index.html
文件,例如:$ firefox /usr/share/doc/rsyslog/html/index.html &
35.3. 通过 TCP 配置服务器进行远程记录
Rsyslog 应用程序可让您运行日志服务器并配置各个系统将其日志文件发送到日志记录服务器。要通过 TCP 使用远程日志,请同时配置服务器和客户端。服务器收集和分析由一个或多个客户端系统发送的日志。
使用 Rsyslog 应用程序,您可以维护一个集中的日志系统,该系统可通过网络将日志消息转发到服务器。为了避免服务器不可用时消息丢失,您可以为转发操作配置操作队列。这样,无法发送的消息将存储在本地,直到服务器再次可访问为止。请注意,此类队列无法针对使用 UDP 协议的连接配置。
omfwd
插件通过 UDP 或 TCP 提供转发。默认协议是 UDP。由于插件内置在内,因此不必加载它。
默认情况下,rsyslog
使用端口 514
上的 TCP。
先决条件
- rsyslog 已安装在服务器系统上。
-
您以
root
身份登录到服务器中。 -
使用
semanage
命令,为可选步骤安装policycoreutils-python-utils
软件包。 -
firewalld
服务在运行。
流程
可选: 要为
rsyslog
流量使用不同的端口,请将syslogd_port_t
SELinux 类型添加到端口。例如,启用端口30514
:# semanage port -a -t syslogd_port_t -p tcp 30514
可选: 要为
rsyslog
流量使用不同的端口,请将firewalld
配置为允许该端口上传入的rsyslog
流量。例如,允许端口30514
上的 TCP 流量:# firewall-cmd --zone=<zone-name> --permanent --add-port=30514/tcp success # firewall-cmd --reload
在
/etc/rsyslog.d/
目录中创建一个新文件(例如,remotelog.conf
),并插入以下内容:# Define templates before the rules that use them # Per-Host templates for remote systems template(name="TmplAuthpriv" type="list") { constant(value="/var/log/remote/auth/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } template(name="TmplMsg" type="list") { constant(value="/var/log/remote/msg/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } # Provides TCP syslog reception module(load="imtcp") # Adding this ruleset to process remote messages ruleset(name="remote1"){ authpriv.* action(type="omfile" DynaFile="TmplAuthpriv") *.info;mail.none;authpriv.none;cron.none action(type="omfile" DynaFile="TmplMsg") } input(type="imtcp" port="30514" ruleset="remote1")
-
将更改保存到
/etc/rsyslog.d/remotelog.conf
文件。 测试
/etc/rsyslog.conf
文件的语法:# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run... rsyslogd: End of config validation run. Bye.
确保
rsyslog
服务在日志记录服务器中运行并启用:# systemctl status rsyslog
重新启动
rsyslog
服务。# systemctl restart rsyslog
可选: 如果没有启用
rsyslog
,请确保rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
您的日志服务器现在已配置为从您环境中的其他系统接收和存储日志文件。
其他资源
-
rsyslogd(8)
,rsyslog.conf(5)
,semanage(8)
, 和firewall-cmd(1)
man pages. -
在
/usr/share/doc/rsyslog/html/index.html
文件中通过rsyslog-doc
软件包安装的文档。
35.4. 通过 TCP 配置远程日志记录到服务器
按照以下步骤配置通过 TCP 协议将日志消息转发到服务器。omfwd
插件通过 UDP 或 TCP 提供转发。默认协议是 UDP。因为插件内置在内,所以不必加载它。
先决条件
-
rsyslog
软件包安装在应该向服务器报告的客户端系统上。 - 您已为远程日志记录配置了服务器。
- 在 SELinux 中允许指定的端口并在防火墙中打开。
-
系统包含
policycoreutils-python-utils
软件包,它为 SELinux 配置中添加非标准端口提供semanage
命令。
流程
在
/etc/rsyslog.d/
目录中创建一个名为 的新文件,如10-remotelog.conf
,并插入以下内容:*.* action(type="omfwd" queue.type="linkedlist" queue.filename="example_fwd" action.resumeRetryCount="-1" queue.saveOnShutdown="on" target="example.com" port="30514" protocol="tcp" )
其中:
-
queue.type="linkedlist"
启用一个 LinkedList in-memory 队列。 -
queue.filename
定义磁盘存储。备份文件使用之前全局workDirectory
指令指定的工作目录中的example_fwd
前缀创建, -
action.resumeRetryCount -1
设置可防止rsyslog
在重试时丢弃消息(如果服务器不响应时), -
启用
queue.saveOnShutdown="on"
会在rsyslog
关闭是保存 in-memory 数据。 最后一行将所有收到的消息转发到日志记录服务器,端口规格是可选的。
使用这个配置,
rsyslog
会向服务器发送消息,但如果远程服务器无法访问,则会将消息保留在内存中。只有rsyslog
耗尽配置的内存队列空间或需要关闭时,才能创建磁盘上的文件,从而让系统性能受益。
注意rsyslog 按照一般顺序处理配置文件
/etc/rsyslog.d/
。-
重新启动
rsyslog
服务。# systemctl restart rsyslog
验证
要验证客户端系统向服务器发送信息,请按照以下步骤执行:
在客户端系统中发送测试信息:
# logger test
在服务器系统上,查看
/var/log/messages
日志,例如:# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
其中 hostname 是客户端系统的主机名。请注意,日志包含输入
logger
命令的用户的用户名,本例中为root
。
其他资源
-
rsyslogd(8)
和rsyslog.conf(5)
手册页。 -
在
/usr/share/doc/rsyslog/html/index.html
文件中通过rsyslog-doc
软件包安装的文档。
35.5. 配置 TLS 加密的远程日志记录
默认情况下,Rsyslog 以纯文本格式发送 remote-logging 通信。如果您的场景需要保护这个通信频道,您可以使用 TLS 加密它。
要通过 TLS 使用加密传输,请同时配置服务器和客户端。服务器收集和分析由一个或多个客户端系统发送的日志。
您可以使用 ossl
网络流驱动程序(OpenSSL)或 gtls
流驱动程序(GnuTLS)。
如果您的系统具有更高的安全性,例如,没有连接到任何网络或有严格授权的系统,请使用独立的系统作为认证授权(CA)。
先决条件
-
有对客户端和服务器系统的
root
访问权限。 -
rsyslog
和rsyslog-openssl
软件包安装在服务器和客户端系统中。 -
如果您使用
gtls
网络流驱动程序,请安装rsyslog-gnutls
软件包,而不是rsyslog-openssl
。 -
如果使用
certtool
命令生成证书,请安装gnutls-utils
软件包。 在您的日志服务器中,以下证书位于
/etc/pki/ca-trust/source/anchors/
目录中,并使用update-ca-trust
命令更新您的系统配置:-
ca-cert.pem
- 一个 CA 证书,它可以在日志记录服务器和客户端上验证密钥和证书。 -
server-cert.pem
- 日志记录服务器的公钥。 -
server-key.pem
- 日志记录服务器的私钥。
-
在您的日志记录客户端中,以下证书位于
/etc/pki/ca-trust/source/anchors/
目录中,并使用update-ca-trust
来更新您的系统配置:-
ca-cert.pem
- 一个 CA 证书,它可以在日志记录服务器和客户端上验证密钥和证书。 -
client-cert.pem
- 客户端的公钥。 -
client-key.pem
- 客户端的私钥。
-
流程
配置服务器以从您的客户端系统接收加密日志:
-
在
/etc/rsyslog.d/
目录中创建一个新文件,例如securelogser.conf
。 要加密通信,配置文件必须包含指向服务器的证书文件的路径、所选身份验证方法,以及支持 TLS 加密的流驱动程序。在
/etc/rsyslog.d/securelogser.conf
文件中添加以下行:# Set certificate files global( DefaultNetstreamDriverCAFile="/etc/pki/ca-trust/source/anchors/ca-cert.pem" DefaultNetstreamDriverCertFile="/etc/pki/ca-trust/source/anchors/server-cert.pem" DefaultNetstreamDriverKeyFile="/etc/pki/ca-trust/source/anchors/server-key.pem" ) # TCP listener module( load="imtcp" PermittedPeer=["client1.example.com", "client2.example.com"] StreamDriver.AuthMode="x509/name" StreamDriver.Mode="1" StreamDriver.Name="ossl" ) # Start up listener at port 514 input( type="imtcp" port="514" )
注意如果您更喜欢 GnuTLS 驱动程序,请使用
StreamDriver.Name="gtls"
配置选项。有关比x509/name
严格性低的验证模式的更多信息,请参阅使用rsyslog-doc
软件包安装的文档。-
将更改保存到
/etc/rsyslog.d/securelogser.conf
文件。 验证
/etc/rsyslog.conf
文件的语法以及/etc/rsyslog.d/
目录中的任何文件:# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run (level 1)... rsyslogd: End of config validation run. Bye.
确保
rsyslog
服务在日志记录服务器中运行并启用:# systemctl status rsyslog
重启
rsyslog
服务:# systemctl restart rsyslog
可选: 如果没有启用 Rsyslog,请确保
rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
-
在
配置客户端以将加密日志发送到服务器:
-
在客户端系统上,在
/etc/rsyslog.d/
目录中创建一个名为 的新文件,如securelogcli.conf
。 在
/etc/rsyslog.d/securelogcli.conf
文件中添加以下行:# Set certificate files global( DefaultNetstreamDriverCAFile="/etc/pki/ca-trust/source/anchors/ca-cert.pem" DefaultNetstreamDriverCertFile="/etc/pki/ca-trust/source/anchors/client-cert.pem" DefaultNetstreamDriverKeyFile="/etc/pki/ca-trust/source/anchors/client-key.pem" ) # Set up the action for all messages *.* action( type="omfwd" StreamDriver="ossl" StreamDriverMode="1" StreamDriverPermittedPeers="server.example.com" StreamDriverAuthMode="x509/name" target="server.example.com" port="514" protocol="tcp" )
注意如果您更喜欢 GnuTLS 驱动程序,请使用
StreamDriver.Name="gtls"
配置选项。-
将更改保存到
/etc/rsyslog.d/securelogser.conf
文件。 验证
/etc/rsyslog.d/
目录中的'/etc/rsyslog.conf
文件的语法和其他文件:# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run (level 1)... rsyslogd: End of config validation run. Bye.
确保
rsyslog
服务在日志记录服务器中运行并启用:# systemctl status rsyslog
重启
rsyslog
服务:# systemctl restart rsyslog
可选: 如果没有启用 Rsyslog,请确保
rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
-
在客户端系统上,在
验证
要验证客户端系统向服务器发送信息,请按照以下步骤执行:
在客户端系统中发送测试信息:
# logger test
在服务器系统上,查看
/var/log/messages
日志,例如:# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
其中
hostname
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
其他资源
-
certtool(1)
,openssl(1)
,update-ca-trust(8)
,rsyslogd(8)
, 和rsyslog.conf(5)
man page。 -
在
/usr/share/doc/rsyslog/html/index.html
上安装了rsyslog-doc
软件包的文档。 - 使用日志记录系统角色文章。
35.6. 配置服务器以通过 UDP 接收远程日志信息
Rsyslog 应用程序可让您将系统配置为从远程系统接收日志信息。要通过 UDP 使用远程日志记录,请同时配置服务器和客户端。接收服务器收集并分析一个或多个客户端系统发送的日志。默认情况下,rsyslog
使用端口 514
上的 UDP 从远程系统接收日志信息。
按照以下步骤配置服务器,以通过 UDP 协议收集和分析一个或多个客户端系统发送的日志。
先决条件
- rsyslog 已安装在服务器系统上。
-
您以
root
身份登录到服务器中。 -
使用
semanage
命令,为可选步骤安装policycoreutils-python-utils
软件包。 -
firewalld
服务在运行。
流程
可选:要将不同的端口用于
rsyslog
流量,而不是默认端口514
:将
syslogd_port_t
SELinux 类型添加到 SELinux 策略配置中,使用您要rsyslog
的端口号替换portno
:# semanage port -a -t syslogd_port_t -p udp portno
配置
firewalld
以允许传入的rsyslog
流量,使用您要rsyslog
使用的端口替换portno
,区替换zone
:# firewall-cmd --zone=zone --permanent --add-port=portno/udp success # firewall-cmd --reload
重新载入防火墙规则:
# firewall-cmd --reload
在
/etc/rsyslog.d/
目录中创建一个新的.conf
文件,如remotelogserv.conf
,并插入以下内容:# Define templates before the rules that use them # Per-Host templates for remote systems template(name="TmplAuthpriv" type="list") { constant(value="/var/log/remote/auth/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } template(name="TmplMsg" type="list") { constant(value="/var/log/remote/msg/") property(name="hostname") constant(value="/") property(name="programname" SecurePath="replace") constant(value=".log") } # Provides UDP syslog reception module(load="imudp") # This ruleset processes remote messages ruleset(name="remote1"){ authpriv.* action(type="omfile" DynaFile="TmplAuthpriv") *.info;mail.none;authpriv.none;cron.none action(type="omfile" DynaFile="TmplMsg") } input(type="imudp" port="514" ruleset="remote1")
其中
514
是rsyslog
默认使用的端口号。您可以指定不同的端口。验证
/etc/rsyslog.conf
文件以及/etc/rsyslog.d/
目录中的所有.conf
文件的语法:# rsyslogd -N 1 rsyslogd: version 8.1911.0-2.el8, config validation run...
重新启动
rsyslog
服务。# systemctl restart rsyslog
可选: 如果没有启用
rsyslog
,请确保rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
其他资源
-
rsyslogd(8)
,rsyslog.conf(5)
,semanage(8)
, 和firewall-cmd(1)
man page。 -
在
/usr/share/doc/rsyslog/html/index.html
文件中通过rsyslog-doc
软件包安装的文档。
35.7. 通过 UDP 配置远程日志记录到服务器
按照以下步骤配置通过 UDP 协议将日志消息转发到服务器。omfwd
插件通过 UDP 或 TCP 提供转发。默认协议是 UDP。因为插件内置在内,所以不必加载它。
先决条件
-
rsyslog
软件包安装在应该向服务器报告的客户端系统上。 - 您已为远程日志记录配置了服务器,如配置服务器 以通过 UDP 接收远程日志信息。
流程
在
/etc/rsyslog.d/
目录中创建一个新的.conf
文件,如10-remotelogcli.conf
,并插入以下内容:*.* action(type="omfwd" queue.type="linkedlist" queue.filename="example_fwd" action.resumeRetryCount="-1" queue.saveOnShutdown="on" target="example.com" port="portno" protocol="udp" )
其中:
-
queue.type="linkedlist"
启用一个 LinkedList in-memory 队列。 -
queue.filename
定义磁盘存储。备份文件使用之前全局workDirectory
指令指定的工作目录中的example_fwd
前缀创建。 -
action.resumeRetryCount -1
设置可防止rsyslog
在重试时丢弃消息(如果服务器没有响应)。 -
如果
rsyslog
关闭,enabled queue.saveOnShutdown="on"
会保存内存数据。 -
portno
是您要rsyslog
使用的端口号。默认值为514
。 最后一行将所有收到的消息转发到日志记录服务器,端口规格是可选的。
使用这个配置,
rsyslog
会向服务器发送消息,但如果远程服务器无法访问,则会将消息保留在内存中。只有rsyslog
耗尽配置的内存队列空间或需要关闭时,才能创建磁盘上的文件,从而让系统性能受益。
注意rsyslog 按照一般顺序处理配置文件
/etc/rsyslog.d/
。-
重新启动
rsyslog
服务。# systemctl restart rsyslog
可选: 如果没有启用
rsyslog
,请确保rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
验证
要验证客户端系统向服务器发送信息,请按照以下步骤执行:
在客户端系统中发送测试信息:
# logger test
在服务器系统中,查看
/var/log/remote/msg/hostname/root.log
日志,例如:# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
其中
hostname
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
其他资源
-
rsyslogd(8)
和rsyslog.conf(5)
手册页。 -
在
/usr/share/doc/rsyslog/html/index.html
上安装了rsyslog-doc
软件包的文档。
35.8. Rsyslog 中的负载均衡帮助程序
RebindInterval
设置指定当前连接中断的时间间隔,并被重新建立。此设置适用于 TCP、UDP 和 RELP 流量。负载平衡器将信息作为新连接,并将消息转发到另一个物理目标系统。
当目标系统更改其 IP 地址时,RebindInterval
设置非常有用。Rsyslog 应用程序在连接建立时缓存 IP 地址,因此信息会发送到同一服务器。如果 IP 地址更改,UDP 数据包将会丢失,直到 Rsyslog 服务重启为止。重新建立连接将确保 DNS 再次解析 IP。
action(type=”omfwd” protocol=”tcp” RebindInterval=”250” target=”example.com” port=”514” …) action(type=”omfwd” protocol=”udp” RebindInterval=”250” target=”example.com” port=”514” …) action(type=”omrelp” RebindInterval=”250” target=”example.com” port=”6514” …)
35.9. 配置可靠的远程日志记录
通过可靠的事件日志记录协议(RELP),您可以降低消息丢失的风险通过 TCP 发送和接收 syslog
消息。RELP 提供可靠的事件消息交付,这对于无法接受消息丢失的环境中非常有用。要使用 RELP,请配置服务器上运行的 imrelp
输入模块并接收日志,以及在客户端上运行的 omrelp
输出模块,并将日志发送到日志记录服务器。
先决条件
-
您已在服务器和客户端系统中安装了
rsyslog
、librelp
和rsyslog-relp
软件包。 - 在 SELinux 中允许指定的端口并在防火墙中打开。
流程
配置客户端系统以可靠远程记录:
在客户端系统上,在
/etc/rsyslog.d/
目录中创建一个新的.conf
文件,例如relpclient.conf
,并插入以下内容:module(load="omrelp") *.* action(type="omrelp" target="_target_IP_" port="_target_port_")
其中:
-
target_IP
是日志记录服务器的 IP 地址。 -
target_port
是日志记录服务器的端口。
-
-
保存对
/etc/rsyslog.d/relpclient.conf
文件的更改。 重新启动
rsyslog
服务。# systemctl restart rsyslog
可选: 如果没有启用
rsyslog
,请确保rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
配置服务器系统以可靠远程记录:
在服务器系统中,在
/etc/rsyslog.d/
目录中创建一个新的.conf
文件,例如reserv.conf
,并插入以下内容:ruleset(name="relp"){ *.* action(type="omfile" file="_log_path_") } module(load="imrelp") input(type="imrelp" port="_target_port_" ruleset="relp")
其中:
-
log_path
指定存储消息的路径。 -
target_port
是日志记录服务器的端口。使用与客户端配置文件中相同的值。
-
-
保存对
/etc/rsyslog.d/relpserv.conf
文件的更改。 重新启动
rsyslog
服务。# systemctl restart rsyslog
可选: 如果没有启用
rsyslog
,请确保rsyslog
服务在重启后自动启动:# systemctl enable rsyslog
验证
要验证客户端系统向服务器发送信息,请按照以下步骤执行:
在客户端系统中发送测试信息:
# logger test
在服务器系统中,查看指定
log_path
的日志,例如:# cat /var/log/remote/msg/hostname/root.log Feb 25 03:53:17 hostname root[6064]: test
其中
hostname
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
其他资源
-
rsyslogd(8)
和rsyslog.conf(5)
手册页。 -
在
/usr/share/doc/rsyslog/html/index.html
文件中通过rsyslog-doc
软件包安装的文档。
35.10. 支持的 Rsyslog 模块
要扩展 Rsyslog 应用程序的功能,您可以使用特定的模块。模块提供额外的输入(Input 模块)、输出(输出模块)和其他功能。模块也可以提供在加载模块后可用的其他配置指令。
您可以输入以下命令列出您系统中安装的输入和输出模块:
# ls /usr/lib64/rsyslog/{i,o}m*
在安装了 rsyslog-doc
软件包后,您可以在 /usr/share/doc/rsyslog/html/configuration/modules/idx_output.html
文件中查看所有可用的 rsyslog
模块。
35.11. 配置 netconsole 服务为将内核信息记录到远程主机
当无法登录到磁盘或使用串行控制台时,您可以使用 netconsole
内核模块和同名服务将内核消息通过网络记录到远程 rsyslog
服务。
先决条件
-
远程主机上已安装系统日志服务,如
rsyslog
。 - 远程系统日志服务被配置为接收来自此主机的日志条目。
流程
安装
netconsole-service
软件包:# yum install netconsole-service
编辑
/etc/sysconfig/netconsole
文件,并将SYSLOGADDR
参数设为远程主机的 IP 地址:# SYSLOGADDR=192.0.2.1
启用并启动
netconsole
服务:# systemctl enable --now netconsole
验证步骤
-
在远程系统日志服务器上显示
/var/log/messages
文件。
其他资源
35.12. 其他资源
-
在
/usr/share/doc/rsyslog/html/index.html
文件中安装有rsyslog-doc
软件包的文档 -
rsyslog.conf (5)
和rsyslogd (8)
man page - 在不使用 journald 或最小化 journald 的情况下配置系统日志记录知识库文章。
- RHEL 默认日志设置对性能的负面影响及其缓解措施
- 使用日志记录系统角色 一章
第 36 章 使用日志记录系统角色
作为系统管理员,您可以使用 logging
系统角色将 RHEL 主机配置为日志服务器,从很多客户端系统收集日志。
36.1. 日志记录系统角色
使用日志记录系统角色
,您可以在本地和远程主机上部署日志配置。
要在一个或多个系统中应用 logging
系统角色,您可以在 playbook 中定义日志配置。playbook 是一个或多个 play 的列表。playbook 是人类可读的,它们采用 YAML 格式编写。如需有关 playbook 的更多信息,请参阅 Ansible 文档中的 使用 playbook。
您要根据 playbook 配置的系统集合在 清单文件中 定义。如需有关创建和使用清单的更多信息,请参阅 Ansible 文档中的如何构建您的清单。
日志记录解决方案提供多种读取日志和多个日志记录输出的方法。
例如,日志记录系统可接受以下输入:
- 本地文件、
-
systemd/journal
, - 网络中的另一个日志记录系统。
另外,日志记录系统还可有以下输出:
-
日志存储在
/var/log
目录中的本地文件中, - 日志被发送到 Elasticsearch ,
- 日志被转发到另一个日志系统。
使用 logging
系统角色,您可以组合输入和输出以适合您的场景。例如,您可以配置一个日志解决方案,将来自 日志
的输入存储在本地文件中,而从文件读取的输入则被转发到另一个日志系统,并存储在本地日志文件中。
36.2. logging
系统角色参数
在 logging
系统角色 playbook 中,您可以在 logging_inputs
参数中定义输入,在 logging_outputs
参数中定义输出,以及在 logging_flows
参数中定义输入和输出之间的关系。logging
系统角色使用附加选项处理这些变量来配置日志记录系统。您还可以启用加密。
目前,logging
系统角色中唯一可用的日志记录系统是 Rsyslog。
logging_inputs
:日志记录解决方案的输入列表。-
名称
:输入的唯一名称。用于logging_flows
: 输入列表以及生成的config
文件名称的一部分。 类型
:输入元素的类型。type 指定与roles/rsyslog/{tasks,vars}/inputs/
中的目录名称相对应的任务类型。基本
:配置systemd
日志或unix
套接字输入。-
kernel_message
:如果设为true
,则加载imklog
。默认值为false
。 -
使用_imuxsock
:使用imuxsock
而不是imjournal
。默认值为false
。 -
ratelimit_burst
:可在ratelimit_interval
内发送的最大消息数。如果use_imuxsock
为 false,则默认为20000
。如果use_imuxsock
为 true,则默认为200
。 -
ratelimit_interval
: 用于评估ratelimit_burst
的间隔。如果use_imuxsock
为 false,则默认为 600 秒。如果use_imuxsock
为 true,则默认为 0。0 表示关闭速率限制。 -
persist_state_interval
: Journal 状态保留每个值
的消息。默认为10
。仅在use_imuxsock
为 false 时有效。
-
-
文件
:输入配置本地文件输入。 -
远程
:输入通过网络配置来自其他日志记录系统的输入。
-
state
:配置文件的状态。present
或absent
。默认为present
。
-
logging_outputs
:日志记录解决方案的输出列表。-
文件
:输出将输出配置为本地文件。 -
转发
: 输出配置输出到另一个日志记录系统。 -
remote_files
:输出将输出配置为另一个日志记录系统到本地文件。
-
logging_flows
:定义logging_inputs
和logging_outputs
之间关系的流列表。logging_flows
变量具有以下键:-
名称
:流的唯一名称 -
输入
:logging_inputs
名称值列表 -
输出
:logging_outputs
名称值列表。
-
其他资源
-
与
rhel-system-roles
软件包一起安装的文档在/usr/share/ansible/roles/rhel-system-roles.logging/README.html
36.3. 应用 本地
日志记录系统角色
准备和应用 Ansible playbook,以便在一组独立的机器上配置日志记录解决方案。每台机器在本地记录日志。
先决条件
-
对一个或多个 受管节点 的访问和权限,这些节点是您要使用
logging
系统角色配置的系统。 对 控制节点 的访问和权限,这是 Red Hat Ansible Core 配置其他系统的系统。
在控制节点上:
-
ansible-core
和rhel-system-roles
软件包已安装 。
-
RHEL 8.0-8.5 提供对基于 Ansible 的自动化需要 Ansible Engine 2.9 的独立 Ansible 存储库的访问权限。Ansible Engine 包含命令行实用程序,如 ansible
、ansible-playbook
、连接器(如 docker
和 podman
)以及许多插件和模块。有关如何获取并安装 Ansible Engine 的详情,请参考如何下载并安装 Red Hat Ansible Engine 知识库文章。
RHEL 8.6 和 9.0 引入了 Ansible Core(作为 ansible-core
软件包提供),其中包含 Ansible 命令行工具、命令以及小型内置 Ansible 插件。RHEL 通过 AppStream 软件仓库提供此软件包,它有一个有限的支持范围。如需更多信息,请参阅 RHEL 9 和 RHEL 8.6 及更新的 AppStream 软件仓库文档中的 Ansible Core 软件包的支持范围。
- 列出受管节点的清单文件。
您不必安装 rsyslog
软件包,因为系统管理员在部署时会安装 rsyslog
。
流程
创建定义所需角色的 playbook:
创建新 YAML 文件,并在文本编辑器中打开,例如:
# vi logging-playbook.yml
插入以下内容:
--- - name: Deploying basics input and implicit files output hosts: all roles: - rhel-system-roles.logging vars: logging_inputs: - name: system_input type: basics logging_outputs: - name: files_output type: files logging_flows: - name: flow1 inputs: [system_input] outputs: [files_output]
对特定清单运行 playbook:
# ansible-playbook -i inventory-file /path/to/file/logging-playbook.yml
其中:
-
inventory-file
是清单文件。 -
logging-playbook.yml
是您使用的 playbook。
-
验证
测试
/etc/rsyslog.conf
文件的语法:# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run... rsyslogd: End of config validation run. Bye.
验证系统是否向日志发送信息:
发送测试信息:
# logger test
查看
/var/log/messages
日志,例如:# cat /var/log/messages Aug 5 13:48:31 hostname root[6778]: test
其中 'hostname' 是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为
root
。
36.4. 过滤本地日志记录系统角色中的 logging
您可以部署一个日志解决方案,该方案基于 rsyslog
属性的过滤器过滤日志。
先决条件
-
对一个或多个 受管节点 的访问和权限,这些节点是您要使用
logging
系统角色配置的系统。 对 控制节点 的访问和权限,这是 Red Hat Ansible Core 配置其他系统的系统。
在控制节点上:
- 安装了 Red Hat Ansible Core
-
rhel-system-roles
软件包已安装 - 列出受管节点的清单文件。
您不必安装 rsyslog
软件包,因为系统管理员在部署时会安装 rsyslog
。
流程
使用以下内容创建一个新的
playbook.yml
文件:--- - name: Deploying files input and configured files output hosts: all roles: - linux-system-roles.logging vars: logging_inputs: - name: files_input type: basics logging_outputs: - name: files_output0 type: files property: msg property_op: contains property_value: error path: /var/log/errors.log - name: files_output1 type: files property: msg property_op: "!contains" property_value: error path: /var/log/others.log logging_flows: - name: flow0 inputs: [files_input] outputs: [files_output0, files_output1]
使用这个配置,包含
error
字符串的所有消息都会记录在/var/log/errors.log
中,所有其他消息都记录在/var/log/others.log
中。您可以将
error
属性值替换为您要过滤的字符串。您可以根据您的偏好修改变量。
可选:验证 playbook 语法。
# ansible-playbook --syntax-check playbook.yml
在清单文件上运行 playbook:
# ansible-playbook -i inventory_file /path/to/file/playbook.yml
验证
测试
/etc/rsyslog.conf
文件的语法:# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run... rsyslogd: End of config validation run. Bye.
验证系统是否向日志发送包含
error
字符串的信息:发送测试信息:
# logger error
查看
/var/log/errors.log
日志,例如:# cat /var/log/errors.log Aug 5 13:48:31 hostname root[6778]: error
其中
hostname
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
其他资源
-
与
rhel-system-roles
软件包一起安装的文档在/usr/share/ansible/roles/rhel-system-roles.logging/README.html
36.5. 使用 logging
系统角色应用远程日志解决方案
按照以下步骤准备并应用 Red Hat Ansible Core playbook 来配置远程日志记录解决方案。在本 playbook 中,一个或多个客户端从 systemd-journal
获取日志,并将它们转发到远程服务器。服务器从 remote_rsyslog
和 remote_files
接收远程输入,并将日志输出到由远程主机名命名的目录中的本地文件。
先决条件
-
对一个或多个 受管节点 的访问和权限,这些节点是您要使用
logging
系统角色配置的系统。 对 控制节点 的访问和权限,这是 Red Hat Ansible Core 配置其他系统的系统。
在控制节点上:
-
ansible-core
和rhel-system-roles
软件包已安装 。 - 列出受管节点的清单文件。
-
您不必安装 rsyslog
软件包,因为系统管理员在部署时会安装 rsyslog
。
流程
创建定义所需角色的 playbook:
创建新 YAML 文件,并在文本编辑器中打开,例如:
# vi logging-playbook.yml
将以下内容插入到文件中:
--- - name: Deploying remote input and remote_files output hosts: server roles: - rhel-system-roles.logging vars: logging_inputs: - name: remote_udp_input type: remote udp_ports: [ 601 ] - name: remote_tcp_input type: remote tcp_ports: [ 601 ] logging_outputs: - name: remote_files_output type: remote_files logging_flows: - name: flow_0 inputs: [remote_udp_input, remote_tcp_input] outputs: [remote_files_output] - name: Deploying basics input and forwards output hosts: clients roles: - rhel-system-roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: forward_output0 type: forwards severity: info target: _host1.example.com_ udp_port: 601 - name: forward_output1 type: forwards facility: mail target: _host1.example.com_ tcp_port: 601 logging_flows: - name: flows0 inputs: [basic_input] outputs: [forward_output0, forward_output1] [basic_input] [forward_output0, forward_output1]
其中
host1.example.com
是日志服务器。注意您可以修改 playbook 中的参数以符合您的需要。
警告日志解决方案只适用于在服务器或者客户端系统的 SELinux 策略中定义的端口并在防火墙中打开。默认 SELinux 策略包括端口 601、514、6514、10514 和 20514。要使用其他端口,请修改客户端和服务器系统上的 SELinux 策略。目前还不支持通过系统角色配置防火墙。
创建列出您的服务器和客户端的清单文件:
创建新文件并在文本编辑器中打开该文件,例如:
# vi inventory.ini
将以下内容插入到清单文件中:
[servers] server ansible_host=host1.example.com [clients] client ansible_host=host2.example.com
其中:
-
host1.example.com
是日志服务器。 -
host2.example.com
是日志客户端。
-
对清单运行 playbook。
# ansible-playbook -i /path/to/file/inventory.ini /path/to/file/_logging-playbook.yml
其中:
-
inventory.ini
是清单文件。 -
logging-playbook.yml
是您创建的 playbook。
-
验证
在客户端和服务器系统上测试
/etc/rsyslog.conf
文件的语法:# rsyslogd -N 1 rsyslogd: version 8.1911.0-6.el8, config validation run (level 1), master config /etc/rsyslog.conf rsyslogd: End of config validation run. Bye.
验证客户端系统向服务器发送信息:
在客户端系统中发送测试信息:
# logger test
在服务器系统上,查看
/var/log/messages
日志,例如:# cat /var/log/messages Aug 5 13:48:31 host2.example.com root[6778]: test
其中
host2.example.com
是客户端系统的主机名。请注意,该日志包含输入 logger 命令的用户的用户名,本例中为root
。
其他资源
- 准备控制节点和受管节点以使用 RHEL 系统角色
-
与
rhel-system-roles
软件包一起安装的文档在/usr/share/ansible/roles/rhel-system-roles.logging/README.html
- RHEL 系统角色 知识库文章
36.6. 使用带有 TLS 的 logging
系统角色
传输层安全性(TLS)是一种加密协议,旨在在计算机网络上安全地进行通信。
作为管理员,您可以使用 logging
RHEL 系统角色使用红帽 Ansible Automation Platform 配置日志的安全传输。
36.6.1. 配置带有 TLS 的客户端日志
您可以使用 logging
系统角色在 RHEL 系统上配置日志,这些日志记录在本地计算机上,并通过运行 Ansible playbook 将日志转发到带有 TLS 的远程日志系统。
此流程对 Ansible 清单中所有客户端组中的主机配置 TLS。TLS 对信息的传输进行加密,确保日志在网络安全传输。
先决条件
- 您有在要配置 TLS 的受管节点上运行 playbook 的权限。
- 受管节点列在控制节点上的清单文件中。
-
ansible
和rhel-system-roles
软件包已安装在控制节点上。
流程
使用以下内容创建一个
playbook.yml
文件:--- - name: Deploying files input and forwards output with certs hosts: clients roles: - rhel-system-roles.logging vars: logging_pki_files: - ca_cert_src: /local/path/to/ca_cert.pem cert_src: /local/path/to/cert.pem private_key_src: /local/path/to/key.pem logging_inputs: - name: input_name type: files input_log_path: /var/log/containers/*.log logging_outputs: - name: output_name type: forwards target: your_target_host tcp_port: 514 tls: true pki_authmode: x509/name permitted_server: 'server.example.com' logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
playbook 使用以下参数:
logging_pki_files
-
使用这个参数您可以配置 TLS,并且必须传递
ca_cert_src
、cert_src
和private_key_src
参数。 ca_cert
-
表示 CA 证书的路径。默认路径为
/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 cert
-
表示证书的路径。默认路径为
/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 private_key
-
表示私钥的路径。默认路径为
/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 ca_cert_src
-
代表复制到目标主机的本地 CA 证书文件路径。如果指定了
ca_cert
,则会将其复制到该位置。 cert_src
-
代表复制到目标主机的本地证书文件路径。如果指定了
cert
,则会将其复制到该位置。 private_key_src
-
表示复制到目标主机的本地密钥文件的路径。如果指定了
private_key
,则会将其复制到该位置。 tls
-
使用此参数可确保在网络上安全地传输日志。如果不想要安全包装程序,您可设置
tls: true
。
验证 playbook 语法:
# ansible-playbook --syntax-check playbook.yml
在清单文件上运行 playbook:
# ansible-playbook -i inventory_file playbook.yml
36.6.2. 配置带有 TLS 的服务器日志
您可以使用 logging
系统角色在 RHEL 系统中将日志配置为服务器,并通过运行 Ansible playbook 从带有 TLS 的远程日志系统接收日志。
此流程对 Ansible 清单中主机组中的所有主机配置 TLS。
先决条件
- 您有在要配置 TLS 的受管节点上运行 playbook 的权限。
- 受管节点列在控制节点上的清单文件中。
-
ansible
和rhel-system-roles
软件包已安装在控制节点上。
流程
使用以下内容创建一个
playbook.yml
文件:--- - name: Deploying remote input and remote_files output with certs hosts: server roles: - rhel-system-roles.logging vars: logging_pki_files: - ca_cert_src: /local/path/to/ca_cert.pem cert_src: /local/path/to/cert.pem private_key_src: /local/path/to/key.pem logging_inputs: - name: input_name type: remote tcp_ports: 514 tls: true permitted_clients: ['clients.example.com'] logging_outputs: - name: output_name type: remote_files remote_log_path: /var/log/remote/%FROMHOST%/%PROGRAMNAME:::secpath-replace%.log async_writing: true client_count: 20 io_buffer_size: 8192 logging_flows: - name: flow_name inputs: [input_name] outputs: [output_name]
playbook 使用以下参数:
logging_pki_files
-
使用这个参数您可以配置 TLS,并且必须传递
ca_cert_src
、cert_src
和private_key_src
参数。 ca_cert
-
表示 CA 证书的路径。默认路径为
/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 cert
-
表示证书的路径。默认路径为
/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 private_key
-
表示私钥的路径。默认路径为
/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 ca_cert_src
-
代表复制到目标主机的本地 CA 证书文件路径。如果指定了
ca_cert
,则会将其复制到该位置。 cert_src
-
代表复制到目标主机的本地证书文件路径。如果指定了
cert
,则会将其复制到该位置。 private_key_src
-
表示复制到目标主机的本地密钥文件的路径。如果指定了
private_key
,则会将其复制到该位置。 tls
-
使用此参数可确保在网络上安全地传输日志。如果不想要安全包装程序,您可设置
tls: true
。
验证 playbook 语法:
# ansible-playbook --syntax-check playbook.yml
在清单文件上运行 playbook:
# ansible-playbook -i inventory_file playbook.yml
36.7. 使用带有 RELP 的 logging
系统角色
可靠的事件日志协议(RELP)是一种通过 TCP 网络记录数据和消息的网络协议。它确保了事件消息的可靠传递,您可以在不容许任何消息丢失的环境中使用它。
RELP 发送者以命令的形式传输日志条目,接收者在处理后确认这些条目。为确保一致性,RELP 将事务数保存到传输的命令中,以便进行任何类型的消息恢复。
您可以考虑在 RELP 客户端和 RELP Server 间的远程日志系统。RELP 客户端将日志传送给远程日志系统,RELP 服务器接收由远程日志系统发送的所有日志。
管理员可以使用 logging
系统角色将日志系统配置为可靠地发送和接收日志条目。
36.7.1. 配置带有 RELP 的客户端日志
您可以使用 logging
系统角色在 RHEL 系统中配置日志,这些日志记录在本地机器上,并通过运行 Ansible playbook 来将日志传送到带有 RELP 的远程日志系统。
此流程对 Ansible 清单中 客户端
组中的所有主机配置 RELP。RELP 配置使用传输层安全(TLS)来加密消息传输,保证日志在网络上安全传输。
先决条件
- 您有在要配置 RELP 的受管节点上运行 playbook 的权限。
- 受管节点列在控制节点上的清单文件中。
-
ansible
和rhel-system-roles
软件包已安装在控制节点上。
流程
使用以下内容创建一个
playbook.yml
文件:--- - name: Deploying basic input and relp output hosts: clients roles: - rhel-system-roles.logging vars: logging_inputs: - name: basic_input type: basics logging_outputs: - name: relp_client type: relp target: _logging.server.com_ port: 20514 tls: true ca_cert: _/etc/pki/tls/certs/ca.pem_ cert: _/etc/pki/tls/certs/client-cert.pem_ private_key: _/etc/pki/tls/private/client-key.pem_ pki_authmode: name permitted_servers: - '*.server.example.com' logging_flows: - name: _example_flow_ inputs: [basic_input] outputs: [relp_client]
playbook 使用以下设置:
-
target
: 这是一个必需的参数,用于指定运行远程日志系统的主机名。 -
端口
:显示远程日志记录系统正在侦听的端口号。 TLS
:确保通过网络安全地传输日志。如果您不想要安全打包程序,可以将tls
变量设置为false
。在与 RELP 工作时,默认的tls
参数被设置为 true,且需要密钥/证书和 triplets {ca_cert
、cert
、private_key
} 和/或 {ca_cert_src
,cert_src
,private_key_src
}。-
如果设置了 {
ca_cert_src
,cert_src
,private_key_src
} triplet ,默认位置/etc/pki/tls/certs
和/etc/pki/tls/private
被用作受管节点上的目的地,来从控制节点传输文件。在这种情况下,文件名与 triplet 中的原始名称相同 -
如果设置了 {
ca_cert
,cert
,private_key
} triplet,则在日志配置之前,文件应位于默认路径上。 - 如果同时设置了 triplet,则会将文件从本地路径从控制节点传输到受管节点的特定路径。
-
如果设置了 {
-
ca_cert
:代表 CA 证书的路径。默认路径为/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 -
认证
:代表证书的路径。默认路径为/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 -
private_key
:代表私钥的路径。默认路径为/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 -
ca_cert_src
:代表本地 CA 证书文件路径,该文件路径被复制到目标主机。如果指定了 ca_cert,则会将其复制到该位置。 -
cert_src
: 代表复制到目标主机的本地证书文件路径。如果指定了 cert ,则会将其复制到该位置。 -
private_key_src
: 代表复制到目标主机的本地密钥文件路径。如果指定了 private_key,则会将其复制到该位置。 -
pki_authmode
:接受身份验证模式作为名称
或指纹
。 -
permitted_servers
:日志客户端允许通过 TLS 连接和发送日志的服务器列表。 -
输入
:日志记录输入字典列表。 -
输出
:日志输出字典列表。
-
可选:验证 playbook 语法。
# ansible-playbook --syntax-check playbook.yml
运行 playbook:
# ansible-playbook -i inventory_file playbook.yml
36.7.2. 配置带有 RELP 的服务器日志
您可以使用 logging
系统角色将 RHEL 系统中的日志配置为服务器,并通过运行 Ansible playbook 从带有 RELP 的远程日志系统接收日志。
此流程对 Ansible 清单中 服务器
组中的所有主机配置 RELP。RELP 配置使用 TLS 加密消息传输,以保证在网络上安全地传输日志。
先决条件
- 您有在要配置 RELP 的受管节点上运行 playbook 的权限。
- 受管节点列在控制节点上的清单文件中。
-
ansible
和rhel-system-roles
软件包已安装在控制节点上。
流程
使用以下内容创建一个
playbook.yml
文件:--- - name: Deploying remote input and remote_files output hosts: server roles: - rhel-system-roles.logging vars: logging_inputs: - name: relp_server type: relp port: 20514 tls: true ca_cert: _/etc/pki/tls/certs/ca.pem_ cert: _/etc/pki/tls/certs/server-cert.pem_ private_key: _/etc/pki/tls/private/server-key.pem_ pki_authmode: name permitted_clients: - '_*example.client.com_' logging_outputs: - name: _remote_files_output_ type: _remote_files_ logging_flows: - name: _example_flow_ inputs: _relp_server_ outputs: _remote_files_output_
playbook 使用以下设置:
-
端口
:显示远程日志记录系统正在侦听的端口号。 TLS
:确保通过网络安全地传输日志。如果您不想要安全打包程序,可以将tls
变量设置为false
。在与 RELP 工作时,默认的tls
参数被设置为 true,且需要密钥/证书和 triplets {ca_cert
、cert
、private_key
} 和/或 {ca_cert_src
,cert_src
,private_key_src
}。-
如果设置了 {
ca_cert_src
,cert_src
,private_key_src
} triplet ,默认位置/etc/pki/tls/certs
和/etc/pki/tls/private
被用作受管节点上的目的地,来从控制节点传输文件。在这种情况下,文件名与 triplet 中的原始名称相同 -
如果设置了 {
ca_cert
,cert
,private_key
} triplet,则在日志配置之前,文件应位于默认路径上。 - 如果同时设置了 triplet,则会将文件从本地路径从控制节点传输到受管节点的特定路径。
-
如果设置了 {
-
ca_cert
:代表 CA 证书的路径。默认路径为/etc/pki/tls/certs/ca.pem
,文件名由用户设置。 -
认证
:代表证书的路径。默认路径为/etc/pki/tls/certs/server-cert.pem
,文件名由用户设置。 -
private_key
:代表私钥的路径。默认路径为/etc/pki/tls/private/server-key.pem
,文件名由用户设置。 -
ca_cert_src
:代表本地 CA 证书文件路径,该文件路径被复制到目标主机。如果指定了 ca_cert,则会将其复制到该位置。 -
cert_src
: 代表复制到目标主机的本地证书文件路径。如果指定了 cert ,则会将其复制到该位置。 -
private_key_src
: 代表复制到目标主机的本地密钥文件路径。如果指定了 private_key,则会将其复制到该位置。 -
pki_authmode
:接受身份验证模式作为名称
或指纹
。 -
permitted_clients
:日志记录服务器允许通过 TLS 连接和发送日志的客户端列表。 -
输入
:日志记录输入字典列表。 -
输出
:日志输出字典列表。
-
可选:验证 playbook 语法。
# ansible-playbook --syntax-check playbook.yml
运行 playbook:
# ansible-playbook -i inventory_file playbook.yml
36.8. 其他资源
- 准备控制节点和受管节点以使用 RHEL 系统角色
-
随
rhel-system-roles
软件包安装在/usr/share/ansible/roles/rhel-system-roles.logging/README.html
中的文档。 - RHEL 系统角色
-
ansible-playbook(1)
手册页。
第 37 章 Python 简介
Python 是一种高级编程语言,支持多种编程模式,如面向对象、所需功能以及程序式范式。Python 具有动态语义,可用于通用编程。
使用 Red Hat Enterprise Linux 时,系统中安装的许多软件包(如提供系统工具、数据分析工具或 Web 应用程序的软件包)会使用 Python 编写。要使用这些软件包,您必须安装 python*
软件包。
37.1. Python 版本
两个不兼容的 Python 版本被广泛使用,即 Python 2.x 和 Python 3.x。RHEL 8 提供以下 Python 版本。
表 37.1. RHEL 8 中的 Python 版本
版本 | 要安装的软件包 | 命令示例 | 此后提供 | 生命周期 |
---|---|---|---|---|
Python 3.6 |
|
| RHEL 8.0 | 完整的 RHEL 8 |
Python 2.7 |
|
| RHEL 8.0 | 较短 |
Python 3.8 |
|
| RHEL 8.2 | 较短 |
Python 3.9 |
|
| RHEL 8.4 | 较短 |
有关支持时间的详细信息,请参阅 Red Hat Enterprise Linux 生命周期和 Red Hat Enterprise Linux 8 应用程序流生命周期。
每个 Python 版本都在一个单独的模块中发布,设计您可以在同一系统中并行安装多个模块。
python38
和 python39
模块不包含与 python36
模块提供的系统工具(RPM、DNF、SELinux 等)相同的绑定。因此,在需要与基础操作系统或二进制兼容性的情况下,使用 python36
。在将系统绑定与各种 Python 模块的更新版本一起需要绑定的唯一实例中,请使用 python36
模块和通过 pip
安装到 Python 的 venv
或 virtualenv
环境中安装的第三方上游 Python 模块。
在安装、调用或与之交互时,始终指定 Python 版本。例如,在软件包和命令名称中使用 python3
而不是 python
。所有与 Python 相关的命令还应包含版本,例如 pip3
, pip2
, pip3.8
, 或 pip3.9
。
RHEL 8 中默认不提供未指定版本的 python
命令(/usr/bin/python
)。您可以使用 alternatives
命令进行配置;有关的说明,请参阅配置未指定版本的 Python。任何对 /usr/bin/python
的手动更改(除使用 alternatives
命令所做的更改外),在更新时可能会覆盖。
作为系统管理员,使用 Python 3 的原因如下:
- Python 3 代表 Python 项目的主要开发方向。
- 2020 年终止了对上游社区中的 Python 2 的支持。
- 流行的 Python 库在上游社区支持 Python 2 支持。
-
Red Hat Enterprise Linux 8 中的 Python 2 的生命周期比较短,旨在方便客户过渡到
Python 3
。
对于开发人员,Python 3 与 Python 2 相比有以下优点:
- Python 3 可让您更轻松地编写表达、可维护且正确的代码。
- 使用 Python 3 编写的代码将具有更大的灵活性。
-
Python 3 具有新功能,包括
asyncio
、f-strings、高级解包、仅关键字的参数和链的例外。
但是,传统的软件可能需要将 /usr/bin/python
配置为 Python 2。因此,Red Hat Enterprise Linux 8 没有提供默认 python
软件包,您可以选择使用 Python 2 和 3 作为 /usr/bin/python
,如 配置未指定版本的 Python 所述。
Red Hat Enterprise Linux 8 中的系统工具使用由内部 platform-python
软件包提供的 Python 版本 3.6。红帽建议客户使用 python36
软件包。
第 38 章 安装和使用 Python
在 Red Hat Enterprise Linux 8 中,Python 3 在 3.6、3.8 和 3.9 版本中分发,由 AppStream 存储库中的 python36
、python38
和 python39
模块提供。
默认情况下,使用未指定版本的 python
命令安装或运行 Python 无法正常工作,因为不确定。始终指定 Python 的版本,或使用 alternatives
命令配置系统默认版本。
38.1. 安装 Python 3
按照设计,您可以并行安装 RHEL 8 模块,包括 python27
、python36
、python38
和 python39
模块。请注意,在单个模块中的多个流不支持并行安装。
您可以安装 Python 3.8 和 Python 3.9,包括为任一版本构建的软件包,在同一系统上与 Python 3.6 并行构建,但 mod_wsgi
模块除外。由于 Apache HTTP 服务器有限制,因此只能安装一个 python3-mod_wsgi
、python38-mod_wsgi
或 python39-mod_wsgi
软件包。
流程
要从
python36
模块安装 Python 3.6,请使用:# yum install python3
python36:3.6
模块流会自动启用。要从
python38
模块安装 Python 3.8,请使用:# yum install python38
python38:3.8
模块流会自动启用。要从
python39
模块安装 Python 3.9,请使用:# yum install python39
python39:3.9
模块流会自动启用。
验证步骤
要验证您系统中安装的 Python 版本,请使用
--version
选项以及特定于您所需版本的 Python 命令的python
命令。对于 Python 3.6:
$ python3 --version
对于 Python 3.8:
$ python3.8 --version
对于 Python 3.9:
$ python3.9 --version
其他资源
38.2. 安装其他 Python 3 软件包
Python 3.6 的附加模块的软件包通常使用 python3-
前缀,Python 3.8 的软件包包括 python38-
前缀,而 Python 3.9 的软件包包括 python39-
前缀。安装其他 Python 软件包时始终包含前缀,如下例所示。
流程
要为 Python 3.6 安装
Requests
模块,请使用:# yum install python3-requests
要为 Python 3.8 安装
Cython
扩展,请使用:# yum install python38-Cython
要从 Python 3.9 安装
pip
软件包安装程序,请使用:# yum install python39-pip
38.3. 为开发人员安装其他 Python 3 工具
开发人员的额外 Python 工具通过相应的 python3x-devel
模块中的 CodeReady Linux Builder 存储库发布。
python38-devel
模块包含 python38-pytest
软件包及其依赖项:pyparsing
, atomicwrites
, attrs
, packaging
, py
, more-itertools
, pluggy
, 和 wcwidth
。
python39-devel
模块包含 python39-pytest
软件包及其依赖项:pyparsing
, attrs
, packaging
, py
, more-itertools
, pluggy
, wcwidth
, iniconfig
, 和 pybind11
。python39-devel
模块还包含 python39-debug
和 python39-Cython
软件包。
红帽不支持 CodeReady Linux Builder 存储库及其内容。
要从 python39-devel
模块安装软件包,请使用以下步骤。
流程
启用 CodeReady Linux Builder 存储库:
# subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms
启用
python39-devel
模块:# yum module enable python39-devel
安装
python39-pytest
软件包:# yum install python39-pytest
要从 python38-devel
模块安装软件包,请在上述命令中将 python39- 替换为 python38。
38.4. 安装 Python 2
有些应用程序和脚本还没有完全移植到 Python 3,并需要 Python 2 运行。Red Hat Enterprise Linux 8 允许并行安装 Python 3 和 Python 2。如果您需要 Python 2 功能,请安装 python27
模块,该模块可在 AppStream 存储库中获得。
请注意,Python 3 是 Python 项目的主要开发方向。对 Python 2 的支持正在分阶段阶段。python27
模块的支持周期比 Red Hat Enterprise Linux 8 短。
流程
要从
python27
模块安装 Python 2.7,请使用:# yum install python2
python27:2.7
模块流会自动启用。
Python 2 附加模块的软件包通常使用 python2-
前缀。安装其他 Python 软件包时始终包含前缀,如下例所示。
要为 Python 2 安装
Requests
模块,请使用:# yum install python2-requests
要为 Python 2 安装
Cython
扩展,请使用:# yum install python2-Cython
验证步骤
要验证安装在您的系统中的 Python 版本,请使用:
$ python2 --version
按照设计,您可以并行安装 RHEL 8 模块,包括 python27
、python36
、python38
和 python39
模块。
38.5. 从 Python 2 迁移到 Python 3
作为开发者,您可能想要将之前使用 Python 2 编写的代码迁移到 Python 3。
有关如何将大型代码库迁移到 Python 3 的更多信息,请参阅 Storageative Python 3 Porting Guide。
请注意,在迁移后,原始 Python 2 代码就可以被 Python 3 解释器解释,也可以被 Python 2 解释器解析。
38.6. 使用 Python
在运行 Python 解释器或 Python 相关的命令时,请始终指定版本。
先决条件
- 确定安装了所需的 Python 版本。
流程
要运行 Python 3.6 解释器或相关命令,请使用:
$ python3 $ python3 -m cython --help $ pip3 install package
要运行 Python 3.8 解释器或相关命令,请使用:
$ python3.8 $ python3.8 -m cython --help $ pip3.8 install package
要运行 Python 3.9 解释器或相关命令,请使用:
$ python3.9 $ python3.9 -m pip --help $ pip3.9 install package
要运行 Python 2 解释器或相关命令,请使用:
$ python2 $ python2 -m cython --help $ pip2 install package
第 39 章 配置未指定版本的 Python
系统管理员可以使用 alternatives
命令配置位于 /usr/bin/python
的被指定版本的 python
命令。请注意,必须先安装所需的软件包 python3、
python38
、python39
或 python2
,然后才能将未指定版本的命令配置为对应的版本。
/usr/bin/python
执行文件由 alternatives
系统控制。更新时可能会覆盖任何手动更改。
其他 Python 相关命令(如 pip3)
没有可配置的未指定版本的变体。
39.1. 直接配置未指定版本的 python 命令
您可以将未指定版本的 python
命令直接配置为所选 Python 版本。
先决条件
- 确定安装了所需的 Python 版本。
流程
要将未指定版本的
python
命令配置为 Python 3.6,请使用:# alternatives --set python /usr/bin/python3
要将未指定版本的
python
命令配置为 Python 3.8,请使用:# alternatives --set python /usr/bin/python3.8
要将未指定版本的
python
命令配置为 Python 3.9,请使用:# alternatives --set python /usr/bin/python3.9
要将未指定版本的
python
命令配置为 Python 2,请使用:# alternatives --set python /usr/bin/python2
39.2. 以互动方式将未指定版本的 python 命令配置为所需的 Python 版本
您可以以互动方式将未指定版本的 python
命令配置为所需的 Python 版本。
先决条件
- 确定安装了所需的 Python 版本。
流程
要以互动方式配置未指定版本的
python
命令,请使用:# alternatives --config python
- 从提供的列表中选择所需版本。
要重置此配置并删除未指定版本的
python
命令,请使用:# alternatives --auto python
39.3. 其他资源
-
alternatives (8)
和unversioned-python (1)
man page
第 40 章 打包 Python 3 RPM
大多数 Python 项目使用 Setuptools 进行打包,并在 setup.py
文件中定义软件包信息。有关 Setuptools 打包的更多信息,请参阅 Setuptools 文档。
您还可以将 Python 项目打包成 RPM 软件包,与 Setuptools 打包相比有以下优点:
- 在其他 RPM (即使非 Python)上依赖关系软件包的规格
加密签名
通过加密签名,可以使用其余操作系统验证、集成和测试 RPM 软件包的内容。
40.1. SPEC 文件是 Python 软件包的描述
SPEC 文件包含 rpmbuild
实用程序用于构建 RPM 的指令。这些指令包含在不同的部分。SPEC 文件有两个主要部分用于定义构建指令:
- Preamble(包含一系列在 Body 中使用的元数据项)
- Body(包含指令的主要部分)
与非 Python RPM SPEC 文件相比,Python 项目的 RPM SPEC 文件有一些特定信息。最值得注意的是,Python 库的任何 RPM 软件包的名称必须总是包括确定版本的前缀,例如: Python 3.6 的 python3
,Python 3.8 的 python38
或 Python 3.9 的 python39
。
其他具体信息显示在 python3-detox
软件包的以下 SPEC 文件示例 中。有关此类特定描述,请查看示例中的备注。
%global modname detox 1 Name: python3-detox 2 Version: 0.12 Release: 4%{?dist} Summary: Distributing activities of the tox tool License: MIT URL: https://pypi.io/project/detox Source0: https://pypi.io/packages/source/d/%{modname}/%{modname}-%{version}.tar.gz BuildArch: noarch BuildRequires: python36-devel 3 BuildRequires: python3-setuptools BuildRequires: python36-rpm-macros BuildRequires: python3-six BuildRequires: python3-tox BuildRequires: python3-py BuildRequires: python3-eventlet %?python_enable_dependency_generator 4 %description Detox is the distributed version of the tox python testing tool. It makes efficient use of multiple CPUs by running all possible activities in parallel. Detox has the same options and configuration that tox has, so after installation you can run it in the same way and with the same options that you use for tox. $ detox %prep %autosetup -n %{modname}-%{version} %build %py3_build 5 %install %py3_install %check %{__python3} setup.py test 6 %files -n python3-%{modname} %doc CHANGELOG %license LICENSE %{_bindir}/detox %{python3_sitelib}/%{modname}/ %{python3_sitelib}/%{modname}-%{version}* %changelog ...
- 1
- modname 宏包含 Python 项目的名称。在这个示例中,它是
detox
。 - 2
- 将 Python 项目打包成 RPM 时,
python3
前缀始终需要添加到项目的原始名称中。此处的原始名称为detox
,RPM 名称为python3-detox
。 - 3
- BuildRequires 指定了构建和测试此软件包所需的软件包。在 BuildRequires 中,始终包括提供构建 Python 软件包所需的工具:
python36-devel
和python3-setuptools
。需要python36-rpm-macros
软件包,以便具有/usr/bin/python3
解释器指令的文件会自动改为/usr/bin/python3.6
。 - 4
- 每个 Python 软件包都需要其他软件包才能正常工作。此类软件包还需要在 SPEC 文件中指定。要指定依赖项,您可以使用 %python_enable_dependency_generator 宏自动使用
setup.py
文件中定义的依赖项。如果软件包的依赖软件包没有使用 Setuptools 指定,请在附加Requires
指令中指定它们。 - 5
- %py3_build 和 %py3_install 宏会分别运行
setup.py build
和setup.py install
命令,使用附加参数来指定安装位置、要使用的解释器以及其他详情。 - 6
- check 部分提供了一个宏,它运行正确的 Python 版本。%{__python3} 宏包含 Python 3 解释器的路径,例如
/usr/bin/python3
。我们建议您使用宏而不是字面路径。
40.2. Python 3 RPM 的常见宏
在 SPEC 文件中,使用用于 Python 3 RPM 的宏表中的内容来使用宏而不是使用硬编码。
在宏名称中,始终使用 python3
或 python2
,而不是未指定版本的 python
。在 SPEC 文件的 BuildRequires
中,将特定的 Python 3 版本配置为 python36-rpm-macros
、python38-rpm-macros
或 python39-rpm-macros
。
表 40.1. Python 3 RPM 宏
Macro | 常规定义 | 描述 |
---|---|---|
%{__python3} | /usr/bin/python3 | Python 3 解释器 |
%{python3_version} | 3.6 | Python 3 解释器的完整版本。 |
%{python3_sitelib} | /usr/lib/python3.6/site-packages | 其中安装了纯 Python 模块。 |
%{python3_sitearch} | /usr/lib64/python3.6/site-packages | 安装了包含特定于架构扩展的模块。 |
%py3_build |
使用适合系统软件包的参数运行 | |
%py3_install |
使用适合系统软件包的参数运行 |
40.3. 自动为 Python RPM 提供
在打包 Python 项目时,请确保以下目录包含在生成的 RPM 中(如果这些目录存在):
-
.dist-info
-
.egg-info
-
.egg-link
从这些目录中,RPM 构建流程自动生成虚拟 pythonX.Ydist
提供,如 python3.6dist (detox)
。这些虚拟提供由 %python_enable_dependency_generator 宏指定的软件包使用。
第 41 章 在 Python 脚本中处理解释器指令
在 Red Hat Enterprise Linux 8 中,可执行 Python 脚本应该使用解析程序指令(也称为 hashbangs 或 shebangs),至少指定主 Python 版本。例如:
#!/usr/bin/python3 #!/usr/bin/python3.6 #!/usr/bin/python2
在构建任何 RPM 软件包时,/usr/lib/rpm/redhat/brp-mangle-shebangs
buildroot 策略 (BRP) 脚本会自动运行,并尝试在所有可执行文件中更正解释器指令。
当遇到带有模糊的解释解释器指令的 Python 脚本时,BRP 脚本会生成错误,例如:
#!/usr/bin/python
或者
#!/usr/bin/env python
41.1. 修改 Python 脚本中的解释器指令
修改 Python 脚本中的解释器指令,该指令在 RPM 构建时导致构建错误。
先决条件
- Python 脚本中的一些解释器指令会导致构建错误。
流程
要修改解释器指令,请完成以下任务之一:
从
platform-python-devel
软件包中应用pathfix.py
脚本:# pathfix.py -pn -i %{__python3} PATH …
请注意,可以指定多个
PATH
。如果PATH
是一个目录,则pathfix.py
会递归扫描与模式^[a-zA-Z0-9_]+\.py$
匹配的 Python 脚本,而不仅仅是具有模糊的解释器指令。在%prep
部分或%install
部分的末尾添加这个命令。-
修改打包的 Python 脚本,以便它们符合预期格式。因此,
pathfix.py
也可以在 RPM 构建过程之外使用。当在 RPM 构建之外运行pathfix.py
时,请使用解释器指令的路径替换%{__python3}
,如/usr/bin/python3
。
如果打包的 Python 脚本需要 Python 3.6 以外的版本,请调整前面的命令以包含所需的版本。
41.2. 更改自定义软件包中的 /usr/bin/python3 解释器指令
默认情况下,/usr/bin/python3
格式的解释器指令被替换为指向 platform-python
软件包中的 Python 解释器指令,该指令用于 Red Hat Enterprise Linux 的系统工具。您可以更改自定义软件包中的 /usr/bin/python3
解释器指令,以指向从 AppStream 存储库安装的 Python 的特定版本。
流程
要为特定版本的 Python 构建软件包,请将相应
python
软件包的python*-rpm-macros
子软件包添加到 SPEC 文件的 BuildRequires 部分。例如,对于 Python 3.6,请包含以下行:BuildRequires: python36-rpm-macros
因此,自定义软件包中的
/usr/bin/python3
解释器指令会自动转换为/usr/bin/python3.6
。
要防止 BRP 脚本检查和修改解释器指令,请使用以下 RPM 指令:
%undefine __brp_mangle_shebangs
第 42 章 使用 PHP 脚本语言
超文本 Preprocessor(PHP)是主要用于服务器端脚本的通用脚本语言,可让您使用 Web 服务器运行 PHP 代码。
在 RHEL 8 中,PHP 脚本语言由 php
模块提供,该模块可在多个流(版本)中可用。
根据您的用例,您可以安装所选模块流的特定配置集:
-
common
- 使用 Web 服务器进行服务器端脚本的默认配置文件。它包括多个广泛使用的扩展。 -
minimal
- 此配置集只安装命令行界面以用于使用 PHP 编写脚本,而无需使用 Web 服务器。 -
devel
- 此配置集包含来自common
配置集的软件包以及用于开发用途的其他软件包。
42.1. 安装 PHP 脚本语言
本节论述了如何安装 php
模块的所选版本。
流程
要使用默认配置集安装
php
模块流,请使用:# yum module install php:stream
使用您要安装的 PHP 版本替换 stream。
例如,要安装 PHP 8.0:
# yum module install php:8.0
默认
common
配置集安装php-fpm
软件包,并预配置 PHP 以用于Apache HTTP 服务器
或nginx
。要安装
php
模块流的特定配置集,请使用:# yum module install php:stream/profile
使用您要安装的 配置集 的名称替换 stream。
例如,要安装 PHP 8.0 以供不使用 Web 服务器:
# yum module install php:8.0/minimal
其他资源
- 如果要从 RHEL 8 中可用的 PHP 版本升级,请参阅切换到更新的流。
- 有关管理 RHEL 8 模块和流的更多信息 ,请参阅安装、管理和删除用户空间组件。
42.2. 通过 Web 服务器使用 PHP 脚本语言
42.2.1. 在 Apache HTTP 服务器中使用 PHP
在 Red Hat Enterprise Linux 8 中,Apache HTTP 服务器
可让您将 PHP 作为 FastCGI 进程服务器运行。FastCGI Process Manager(FPM)是一种替代 PHP FastCGI 守护进程,它允许网站管理高负载。PHP 在 RHEL 8 中使用 FastCGI 流程管理器。
本节论述了如何使用 FastCGI 进程服务器运行 PHP 代码。
先决条件
在您的系统上安装 PHP 脚本语言。
请参阅安装 PHP 脚本语言。
流程
安装
httpd
模块:# yum module install httpd:2.4
启动
Apache HTTP 服务器
:# systemctl start httpd
或者,如果
Apache HTTP
服务器已在您的系统中运行,请在安装 PHP 后重启httpd
服务:# systemctl restart httpd
启动
php-fpm
服务:# systemctl start php-fpm
可选: 在引导时启用这两个服务:
# systemctl enable php-fpm httpd
要获取有关 PHP 设置的信息,请在
/var/www/html/
目录中创建带有以下内容的index.php
文件:echo '<?php phpinfo(); ?>' > /var/www/html/index.php
要运行
index.php
文件,请将浏览器指向:http://<hostname>/
可选:如果您有具体要求,请调整配置:
-
/etc/httpd/conf/httpd.conf
- 一般的httpd
配置 -
/etc/httpd/conf.d/php.conf
-httpd
特定 PHP 配置 -
/usr/lib/systemd/system/httpd.service.d/php-fpm.conf
- 默认情况下,php-fpm
服务会与httpd
一起启动 -
/etc/php-fpm.conf
- FPM 主配置 -
/etc/php-fpm.d/www.conf
- 默认www
池配置
-
例 42.1. 运行"Hello, World!" 使用 Apache HTTP 服务器的 PHP 脚本
在
/var/www/html/
目录中为您的项目创建一个hello
目录:# mkdir hello
在
/var/www/html/hello/
目录中创建hello.php
文件,其内容如下:# <!DOCTYPE html> <html> <head> <title>Hello, World! Page</title> </head> <body> <?php echo 'Hello, World!'; ?> </body> </html>
启动
Apache HTTP 服务器
:# systemctl start httpd
要运行
hello.php
文件,请将浏览器指向:http://<hostname>/hello/hello.php
因此,会显示带有 "Hello, World!" 文本的网页。
42.2.2. 使用带有 nginx web 服务器的 PHP
本节论述了如何通过 nginx
web 服务器运行 PHP 代码。
先决条件
在您的系统上安装 PHP 脚本语言。
请参阅安装 PHP 脚本语言。
流程
安装
nginx
模块流:# yum module install nginx:stream
使用要安装的
nginx
版本替换 stream。例如,要安装
nginx
版本 1.18::# yum module install nginx:1.18
启动
nginx
服务器:# systemctl start nginx
或者,如果
nginx
服务器已在您的系统中运行,请在安装 PHP 后重启nginx
服务:# systemctl restart nginx
启动
php-fpm
服务:# systemctl start php-fpm
可选: 在引导时启用这两个服务:
# systemctl enable php-fpm nginx
要获取 PHP 设置的信息,请在
/usr/share/nginx/html/
目录中使用以下内容创建index.php
文件:echo '<?php phpinfo(); ?>' > /usr/share/nginx/html/index.php
要运行
index.php
文件,请将浏览器指向:http://<hostname>/
可选:如果您有具体要求,请调整配置:
-
/etc/nginx/nginx.conf
-nginx
主配置 -
/etc/nginx/conf.d/php-fpm.conf
- FPM 配置nginx
-
/etc/php-fpm.conf
- FPM 主配置 -
/etc/php-fpm.d/www.conf
- 默认www
池配置
-
例 42.2. 运行"Hello, World!" 使用 nginx 服务器的 PHP 脚本
在
/usr/share/nginx/html/
目录中为您的项目创建一个hello
目录:# mkdir hello
在
/usr/share/nginx/html/hello/
目录中创建一个包含以下内容的hello.php
文件:# <!DOCTYPE html> <html> <head> <title>Hello, World! Page</title> </head> <body> <?php echo 'Hello, World!'; ?> </body> </html>
启动
nginx
服务器:# systemctl start nginx
要运行
hello.php
文件,请将浏览器指向:http://<hostname>/hello/hello.php
因此,会显示带有 "Hello, World!" 文本的网页。
其他资源
42.3. 使用命令行界面运行 PHP 脚本
PHP 脚本通常使用 Web 服务器运行,但也可以使用 命令行界面来运行。
如果只使用命令行运行 php
脚本,请安装 php
模块流的 minimal
配置集。
请参阅安装 PHP 脚本语言。
先决条件
在您的系统上安装 PHP 脚本语言。
请参阅安装 PHP 脚本语言。
流程
在文本编辑器中,创建一个
filename.php
文件将 filename 替换为您的文件名称。
从命令行执行创建
filename.php
文件:# php filename.php
例 42.3. 运行"Hello, World!" 使用命令行界面 PHP 脚本
使用文本编辑器,创建包含以下内容的
hello.php
文件:<?php echo 'Hello, World!'; ?>
从命令行执行
hello.php
文件:# php hello.php
结果会输出 "Hello, World!"。
42.4. 其它资源
-
httpd (8)
-httpd
服务的手册页,包含其命令行选项的完整列表。 -
httpd.conf(5)
-httpd
配置的 man page,描述httpd
配置文件的结构和位置。 -
nginx(8)
-nginx
web 服务器的 man page,其中包含其命令行选项的完整列表和信号列表。 -
php-fpm(8)
- PHP FPM 的 man page 描述其命令行选项和配置文件的完整列表。
第 43 章 使用 langpacks
为系统的每个软件包安装额外附加软件包(包含翻译、字典和本地化内容)的元数据软件包被称之为 Langpacks。
在 Red Hat Enterprise Linux 8 系统中,langpacks 的安装基于 langpacks-<langcode>
语言元数据软件包和 RPM 弱依赖项(Supplements tag)。
对于所选语言,有两个先决条件可以使用 langpacks。如果满足这些先决条件,则语言 meta-packages 会在事务集中自动拉取所选语言的 langpack。
先决条件
系统中已安装了所选语言的
langpacks-<langcode>
语言 meta-package。在 Red Hat Enterprise Linux 8 中,langpacks meta 软件包会自动安装,使用 Anaconda 安装程序的操作系统的初始安装,因为这些软件包在 Application Stream 存储库中可用。
如需更多信息,请参阅检查提供 langpacks 的语言。
- 您用来搜索区域设置软件包的基本软件包已安装在系统上。
43.1. 检查提供 langpacks 的语言
按照以下步骤检查哪些语言提供语言包。
流程
执行以下命令:
# yum list langpacks-*
43.2. 使用 RPM 较弱依赖项的 langpacks
本节介绍了在查询基于 RPM 弱依赖项的语言、安装或删除语言支持时可能需要执行的多个操作。
43.2.1. 列出已安装的语言支持
要列出已安装的语言支持,请使用此流程。
流程
执行以下命令:
# yum list installed langpacks*
43.2.2. 检查语言支持的可用性
要检查语言支持是否有适用于任何语言,请使用以下步骤。
流程
- 执行以下命令:
# yum list available langpacks*
43.2.3. 列出为语言安装的软件包
要列出为任何语言安装的软件包,请使用以下步骤:
流程
执行以下命令:
# yum repoquery --whatsupplements langpacks-<locale_code>
43.2.4. 安装语言支持
要添加新的语言支持,请使用以下步骤。
流程
执行以下命令:
# yum install langpacks-<locale_code>
43.2.5. 删除语言支持
要删除任何安装的语言支持,请使用以下步骤。
流程
执行以下命令:
# yum remove langpacks-<locale_code>
43.3. 使用 glibc-langpack-<locale_code> 保存磁盘空间
目前,所有区域都存储在 /usr/lib/locale/locale-archive
文件中,该文件需要很多磁盘空间。
在磁盘空间是一个关键问题的系统中,如容器和云镜像,或者只需要几个区域,您可以使用 glibc 语言 langpack 软件包 (glibc-langpack-<locale_code>
)。
要单独安装区域设置,从而获得较小的软件包安装空间,请使用以下步骤。
流程
执行以下命令:
# yum install glibc-langpack-<locale_code>
当使用 Anaconda 安装操作系统时,会在安装过程中使用的语言安装 glibc-langpack-<locale_code>
,并用于您选择的语言。请注意, glibc-all-langpacks
(包含所有区域设置)会被默认安装,因此某些区域设置会被重复。如果您为一个或多个选择的语言安装 glibc-langpack-<locale_code>
,您可以在安装后删除 glibc-all-langpacks
来保存磁盘空间。
请注意,只安装所选 glibc-langpack-<locale_code>
软件包而不是 glibc-all-langpacks
会对运行时性能造成影响。
如果磁盘空间不是问题,请使用 glibc-all-langpacks
软件包安装所有区域。
第 44 章 Tcl/Tk 入门
44.1. Tcl/Tk 简介
工具命令语言(Tcl) 是一种动态编程语言。这个语言的解释器和 C 库一同由 tcl
软件包提供。
一起使用 Tcl 和 Tk (Tcl/Tk) 启用创建跨平台 GUI 应用程序。TK 由 tk
软件包提供。
请注意,Tk 可以引用以下任意一种:
- 用于多种语言的编程工具包
- Tk C 库绑定可用于多种语言,如 C、Ruby、Perl 和 Python
- 一个需要解释器来实例化 Tk 控制台
- 为特定 Tcl 解释器添加多个新命令的 Tk 扩展
有关 Tcl/Tk 的更多信息,请参阅 Tcl/Tk manual 或 Tcl/Tk 文档网页。
44.2. Tcl/Tk 8.6 中的显著变化
Red Hat Enterprise Linux 7 使用 Tcl/Tk 8.5。Red Hat Enterprise Linux 8 中提供了 Tcl/Tk 版本 8.6。
与 Tcl/Tk 8.5 相比,Tcl/Tk 8.6 的主要更改 有:
- 基于对象的编程支持
- 无堆栈评估实施
- 增强的例外处理
- 使用 Tcl 构建并安装的第三方软件包集合
- 启用多线程操作
- 对 SQL 数据库增强脚本的支持
- IPv6 网络支持
- 内置 Zlib 压缩
列表处理
提供了两个新命令,即
lmap
和dict map
,它允许通过 Tcl 容器进行转换。按脚本堆叠频道
有两个新命令
chan push
和chan pop
可用,允许向 I/O 频道添加或删除转换。
Tk 的主要更改包括:
- 内置 PNG 镜像支持
忙碌窗口
新的命令
tk busy
可用,它禁用对窗口或小部件的用户交互,并显示忙碌的光标。- 新的字体选择对话框接口
- Angled 文本支持
- 在 canvas 上移动支持
有关 Tcl 8.5 和 Tcl 8.6 之间的更改的详细列表,请参阅 Tcl/Tk 8.6 中的更改。
44.3. 迁移到 Tcl/Tk 8.6
Red Hat Enterprise Linux 7 使用 Tcl/Tk 8.5。Red Hat Enterprise Linux 8 中提供了 Tcl/Tk 版本 8.6。
本节论述了到 Tcl/Tk 8.6 的迁移路径:
- 开发人员编写 Tcl 扩展或将 Tcl 解释器嵌入到其应用程序中
- 用户使用 Tcl/Tk编写任务
44.3.1. Tcl 扩展开发人员迁移路径
要使您的代码与 Tcl 8.6 兼容,请使用以下步骤。
流程
重写代码以使用
interp
结构。例如,如果您的代码读取interp→errorline
,将其重写为使用以下功能:Tcl_GetErrorLine(interp)
这是必要的,因为 Tcl 8.6 限制对
interp
结构成员的直接访问。要使您的代码与 Tcl 8.5 和 Tcl 8.6 兼容,请在包含 Tcl 库的头文件中使用以下代码片段:
# include <tcl.h> # if !defined(Tcl_GetErrorLine) # define Tcl_GetErrorLine(interp) (interp→errorLine) # endif
44.3.2. 用户通过 Tcl/Tk 编写任务的迁移路径
在 Tcl 8.6 中,大多数脚本的工作方式与之前的 Tcl 版本相同。
要将代码迁移到 Tcl 8.6,请使用此流程。
流程
在编写可移植代码时,请确保不使用 Tk 8.6 中不再支持的命令:
tkIconList_Arrange tkIconList_AutoScan tkIconList_Btn1 tkIconList_Config tkIconList_Create tkIconList_CtrlBtn1 tkIconList_Curselection tkIconList_DeleteAll tkIconList_Double1 tkIconList_DrawSelection tkIconList_FocusIn tkIconList_FocusOut tkIconList_Get tkIconList_Goto tkIconList_Index tkIconList_Invoke tkIconList_KeyPress tkIconList_Leave1 tkIconList_LeftRight tkIconList_Motion1 tkIconList_Reset tkIconList_ReturnKey tkIconList_See tkIconList_Select tkIconList_Selection tkIconList_ShiftBtn1 tkIconList_UpDown
请注意,您还可以检查
/usr/share/tk8.6/unsupported.tcl
文件中不支持的命令列表。