CentOS8-精要-全-

CentOS8 精要(全)

原文:annas-archive.org/md5/5dfd5830ea466e4e9b07114ebf9d569f

译者:飞龙

协议:CC BY-NC-SA 4.0

1. 介绍

《CentOS 8 Essentials》旨在提供有关安装、使用和管理该发行版的详细信息。对于初学者,本书涵盖了操作系统安装、GNOME 桌面环境基础、配置电子邮件和 Web 服务器、以及使用 App Streams 安装软件包和系统更新等主题。此外,还讲解了双重启动 Microsoft Windows 等安装主题,并涉及了所有重要的安全主题,如配置防火墙以及用户和组管理。

对于有经验的用户,本书详细讲解了远程桌面访问、Cockpit web 界面、逻辑卷管理(LVM)、磁盘分区、交换空间管理、KVM 虚拟化、Secure Shell(SSH)、Linux 容器以及使用 Samba 和 NFS 共享文件等主题,提供了对这一企业级操作系统的全面概述。

1.1 超级用户约定

CentOS 8,与一般的 Linux 系统一样,拥有两种类型的用户帐户,一种是标准用户帐户,其访问操作系统中许多管理文件和功能受到限制,另一种是具有提升权限的超级用户(root)帐户。通常,用户可以通过以 root 用户身份登录,或者使用 su -命令并输入 root 密码来获取 root 权限。在以下示例中,用户通过 su -命令获取 root 权限:

[neil@centos8-demo ~]$ su -

密码:

[root@centos8-demo ~]#

请注意,普通用户的命令提示符以$符号结尾,而 root 用户的命令提示符以#符号结尾。在使用命令行时,这是判断是否正在以 root 用户身份执行命令的一个有用标志。

或者,非 root 用户可以通过 sudo 命令执行单个需要 root 权限的命令。考虑以下尝试更新操作系统并安装最新补丁和软件包的示例:

[neil@centos8-demo ~]$ dnf update

不是 root 用户,订阅管理库未更新

错误:此命令必须以 root 用户身份运行。

可选地,用户帐户可以配置为具有 root 级别的权限。无需使用 su -命令首先获得 root 权限,具有管理权限的用户帐户可以使用 sudo 运行其他受限命令。

[neil@centos8-demo]$ sudo dnf update

我们相信您已接受过本地系统管理员的常规讲解。

系统管理员。通常,归结为这三点:

1) 尊重他人隐私。

2) 输入前先思考。

3) 拥有强大权限意味着承担巨大的责任。

[sudo] 请输入 neil 的密码:

更新订阅管理库。

.

.

在书中早期提出此问题的原因是,本书中许多命令行示例将需要 root 权限。为了避免在每个命令行示例前重复加上以 root 用户身份运行命令的指示,我们将在行首使用命令提示符来指示该命令是否需要以 root 身份执行。如果命令可以作为普通用户运行,命令前将会加上 $ 提示符,如下所示:

$ date

如果命令需要 root 权限,则命令前将会有 # 提示符:

第一章:dnf install openssh

1.2 反馈

我们希望您对购买本书感到满意。如果您在书中发现任何错误,或者有任何意见、问题或疑虑,请通过以下邮箱与我们联系:feedback@ebookfrenzy.com。

1.3 勘误

虽然我们尽力确保本书内容的准确性,但由于本书涉及的主题范围广泛且复杂,难免会包含一些错误和疏漏。任何已知的书籍问题将会在以下网址中列出,并提供解决方案:

www.ebookfrenzy.com/errata/centos8.html

如果您发现了未在勘误表中列出的错误,请通过电子邮件将问题反馈给我们的技术支持团队:feedback@ebookfrenzy.com。他们将帮助您并努力解决您可能遇到的任何问题。

第二章

  1. Linux 简史

CentOS 是 Linux 操作系统的众多变种之一(也称为发行版)。它基于由美国公司 Red Hat, Inc. 开发的 Red Hat 企业版 Linux 发行版的源代码,总部位于北卡罗来纳州的罗利市。该公司成立于 1990 年代中期,由当时由 Marc Ewing 和 Bob Young 拥有的两家公司合并而成。然而,Linux 的起源更为悠久。本章将概述 Linux 操作系统和 Red Hat, Inc. 的历史,然后解释 CentOS 如何融入这一背景。

2.1 Linux 究竟是什么?

Linux 是一种操作系统,就像 Windows 是操作系统一样(Linux 和 Windows 之间的相似之处到此为止)。操作系统这个术语用于描述充当计算机硬件和我们每天使用的应用程序之间的层的软件。当程序员编写应用程序时,他们通过操作系统接口来执行诸如将文件写入硬盘驱动器、在屏幕上显示信息等任务。如果没有操作系统,每个程序员都必须编写代码直接访问系统的硬件。此外,程序员还必须支持每一个曾经创造的硬件,以确保应用程序能够在所有可能的硬件配置上运行。由于操作系统处理了所有这些硬件复杂性,应用程序开发变得容易得多。Linux 只是当今可用的多种操作系统之一。

2.2 UNIX 的起源

要了解 Linux 的历史,我们首先需要回到 1960 年代末的 AT&T 贝尔实验室。那时,AT&T 停止了参与名为 Multics 的新操作系统的开发。两位 AT&T 工程师 Ken Thompson 和 Dennis Ritchie 决定将他们从 Multics 项目中学到的知识应用于创建一个新的操作系统,名为 UNIX,并迅速在企业和学术机构中获得了广泛的认可和采用。

各种专有的 UNIX 实现最终进入了市场,包括 IBM(AIX)、惠普(HP-UX)和 Sun Microsystems(SunOS 和 Solaris)等公司创建的版本。此外,一种名为 MINIX 的类 UNIX 操作系统由 Andrew S. Tanenbaum 创建,旨在用于教育用途,并向大学提供源代码访问。

2.3 谁创造了 Linux?

Linux 的起源可以追溯到两个人的工作和理念。Linux 操作系统的核心是所谓的内核。内核是操作系统功能所需的核心功能集合。它管理系统资源并处理硬件与应用程序之间的通信。Linux 内核由 Linus Torvalds 开发,Linus 对 MS-DOS 不感兴趣,并且由于 Intel 80386 微处理器的 MINIX 版本迟迟未发布,他决定编写自己的类似 UNIX 的内核。当他完成内核的第一个版本时,他将其以开源许可证发布,允许任何人下载源代码并自由使用和修改,而无需支付 Linus 任何费用。

大约在同一时期,Free Software Foundation 的 Richard Stallman,这位强烈支持自由和开源软件的人,正在开发自己的开源操作系统。然而,Stallman 并未一开始就专注于内核,而是决定从开发所有必要的 UNIX 工具、实用程序和编译器的开源版本开始,用于使用和维护操作系统。当他完成了这些基础设施的开发后,似乎最明显的解决方案是将他的工作与 Linus 编写的内核结合,创建一个完整的操作系统。这个组合被称为 GNU/Linux。纯粹主义者坚持认为 Linux 应该始终被称为 GNU/Linux(事实上,一度 Richard Stallman 拒绝接受任何没有将 Linux 称为 GNU/Linux 的媒体采访)。考虑到 GNU 工具是由 Free Software Foundation 开发的,且它们构成了 GNU/Linux 的重要和必要部分,这种立场并非不合理。不幸的是,大多数人和媒体仅称其为 Linux,这种情况可能会一直持续下去。

2.4 红帽的早期历史

1993 年,Bob Young 创建了一家公司,名为 ACC Corporation,按照 Young 的说法,他是从“妻子的缝纫室”里经营这家公司。ACC 这个名字本来是为了代表一个目录业务,但也同时是他妻子经营的一家小型企业的缩写,名为“康涅狄格州的古董和收藏品”。在 ACC 目录业务中销售的物品包括 Linux CD 和相关的开源软件。

大约在同一时期,Marc Ewing 创建了自己的 Linux 发行版公司,并将其命名为 Red Hat Linux(因为他在卡内基梅隆大学时习惯戴红色棒球帽)。

1995 年,ACC 收购了 Red Hat,并采用了 Red Hat, Inc. 的名称,经历了快速和显著的增长。Bob Young 在公司于 1999 年 8 月上市后不久辞去了 CEO 职位,之后投身于多个商业和慈善事业,包括一家名为 Lulu 的按需印刷图书出版公司和拥有两支加拿大职业体育队的股份。2018 年,IBM 宣布计划以 340 亿美元收购 Red Hat, Inc.

2.5 红帽支持

Red Hat Linux 的早期版本通过软盘和光盘发货给客户(这当然是在宽带互联网普及之前)。当用户遇到软件问题时,他们只能通过电子邮件联系 Red Hat。事实上,Bob Young 常常开玩笑说,这种方式有效地限制了支持请求,因为当客户意识到需要帮助时,他们的计算机通常已经无法使用,因此无法通过电子邮件向 Red Hat 支持团队寻求帮助。后来,Red Hat 提供了更好的支持服务,配套有付费订阅,并且现在提供了多种支持等级,从“自助帮助”(无支持)到高级支持不等。

2.6 开源

Red Hat Enterprise Linux 8 是 Red Hat 目前的商业产品,主要面向企业和关键任务的安装。它也是 Red Hat 不断扩展的产品和服务生态系统的基石。RHEL 是一个开源产品,您可以免费下载源代码并自行构建软件(这项任务不可小觑)。然而,如果您希望下载一个预构建的、可安装的二进制版本(无论是否有支持),则需要付费。

2.7 Fedora 项目

Red Hat 还赞助了 Fedora 项目,其目标是提供一个免费的 Linux 操作系统(包括源代码和二进制发行版),即 Fedora Linux。Fedora Linux 还作为许多新功能的试验场,这些功能最终会被纳入 Red Hat 企业 Linux 操作系统家族。例如,CentOS 8.0 在很大程度上基于 Fedora 29。

2.8 CentOS - 免费的替代品

对于那些无法负担 Red Hat Enterprise Linux 订阅的用户,CentOS 操作系统提供了另一种选择。CentOS 项目最初是一个社区驱动的项目,但现在已与 Red Hat 合作,它将 Red Hat Enterprise Linux 的源代码去除 Red Hat 品牌和订阅要求,进行编译并提供下载。虽然 CentOS 在许多方面提供了与 RHEL 完全相同的操作系统,但它不包括 Red Hat 的技术支持。

2.9 总结

Linux 操作系统的起源可以追溯到 Linus Torvalds 和 Richard Stallman 的工作,他们结合了 Linux 内核和 GNU 项目所构建的工具及编译器。

多年来,Linux 的开源特性促使了各种不同 Linux 发行版的发布。其中一个发行版是 Red Hat Enterprise Linux,由 Bob Young 和 Mark Ewing 创立的公司 Red Hat, Inc.创建。Red Hat 专注于提供企业级 Linux 软件解决方案,并结合广泛的技术支持服务。CentOS 本质上是基于与 Red Hat Enterprise Linux 相同的源代码构建的,但去除了 Red Hat 的品牌标识。

  1. 安装 CentOS 8 到全新硬盘

现在,部署 CentOS 8 系统有两种方式。一种方法是购买新硬件或重新利用现有的计算机系统来安装和运行操作系统。另一种选择是使用 Amazon AWS、Google Cloud 或 Microsoft Azure 等服务创建基于云的操作系统实例(仅举几例)。由于基于云的实例通常通过选择一个已经为云平台优化、预配置且可运行的操作系统镜像来创建,并以此为基础构建 CentOS 系统,因此在这种情况下无需手动进行操作系统安装。

另一方面,如果你计划在自己的硬件上安装 CentOS 8,那么了解 CentOS 8 的第一步就是安装操作系统。

CentOS 可以在干净的硬盘环境中安装(即将整个硬盘上的现有分区清除,并完全用于 CentOS),也可以在双重启动环境中安装,其中 CentOS 与另一个操作系统(通常是 Microsoft Windows 系列操作系统)共存。

本章将介绍从本地或远程安装介质进行清空硬盘安装的方法。与 Windows 10 系统的双重启动安装将在“与 Windows 双重启动 CentOS 8”中讨论。

3.1 获取 CentOS 安装介质

CentOS 发行版可以通过以下 URL 从 CentOS 项目网站下载:

www.centos.org/download/

安装介质以 DVD ISO 镜像的形式提供,并有以下几种形式:

•CentOS Linux DVD ISO - 包含从 RHEL 8 源代码构建的 CentOS 版本的安装镜像。

•CentOS Stream DVD ISO - 包含一个持续发展的 CentOS 版本,最终将成为下一个版本的 RHEL 和 CentOS。

本书所需的 CentOS Linux DVD ISO 镜像,下载时请使用 DVD ISO 镜像格式。该镜像包含安装 CentOS 系统所需的所有软件包,命名格式如下:

CentOS-<版本>-<架构>-dvd.iso

例如,针对 64 位 Intel 系统的 CentOS 8 DVD 镜像命名如下:

CentOS-8-x86_64-1905-dvd1.iso

下载镜像后,可以将其刻录到光盘上,或者使用下一节中的步骤将介质写入 USB 驱动器,配置你的虚拟化环境将其视为 DVD 驱动器,或者使用本章稍后提到的步骤通过网络连接访问安装镜像。

3.2 将 ISO 安装镜像写入 USB 驱动器

现在,操作系统安装更可能是通过 USB 驱动器进行,而非 DVD。下载了 CentOS 8 的 ISO 安装镜像后,将该镜像写入 USB 驱动器的步骤会根据驱动器是连接到 Linux、macOS 还是 Windows 系统而有所不同。本节后续内容假设 USB 驱动器是新的,或者已被重新格式化以删除任何现有数据或分区:

3.2.1 Linux

在 Linux 上将 ISO 镜像写入 USB 驱动器的第一步是识别设备名称。在插入 USB 驱动器之前,通过列出 /dev 中已检测到的存储设备来识别系统中已有的设备,方法如下:

第三章:ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2

将 USB 驱动器连接到 Linux 系统,并运行 dmesg 命令获取最近的系统消息,其中之一将报告 USB 驱动器已被检测到,类似于以下内容:

[445597.988045] sd 6:0:0:0: [sdb] 附加 SCSI 可移动磁盘

该输出告诉我们,设备名称应包含“sdb”,我们可以通过再次列出 /dev 中的设备名称来确认:

ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2 /dev/sdb

从这个输出我们可以看出,USB 驱动器已被分配到 /dev/sdb。写入 ISO 镜像到设备之前的下一步是运行 findmnt 命令,确保它没有被自动挂载:

findmnt /dev/sdb

目标 源 文件系统类型 选项

/run/media/neil/d6bf9574-7e31-4f54-88b1 /dev/sdb ext3 rw,nosuid,no

如果 findmnt 命令显示 USB 驱动器已被挂载,请在继续之前先卸载它:

umount /run/media/neil/d6bf9574-7e31-4f54-88b1

文件系统卸载后,使用以下 dd 命令将 ISO 镜像写入磁盘:

dd if=/path/to/iso/image.iso of=/dev/sdb bs=512k

写入过程可能需要一些时间(最多 10 - 15 分钟),具体取决于镜像大小和运行系统的速度。镜像写入完成后,将出现类似以下的输出,USB 驱动器已准备好用于安装 CentOS 8:

5956+0 记录输入

5956+0 记录输出

3122659328 字节(3.1 GB,2.9 GiB)已复制,426.234 秒,7.3 MB/s

3.2.2 macOS

将 ISO 镜像写入附加到 macOS 系统的 USB 驱动器的第一步是使用 diskutil 工具识别设备。在连接 USB 设备之前,打开终端窗口并运行以下命令:

$ diskutil list

/dev/disk0(内部,物理):

: 类型 名称 大小 标识符

0:GUID 分区方案 *1.0 TB 磁盘 0

1:EFI EFI 209.7 MB 磁盘 0s1

2:Apple_APFS 容器 磁盘 2 1000.0 GB 磁盘 0s2

/dev/disk1(内部):

: 类型 名称 大小 标识符

0:GUID 分区方案 28.0 GB 磁盘 1

1:EFI EFI 314.6 MB 磁盘 1s1

2:Apple_APFS 容器 磁盘 2 27.7 GB 磁盘 1s2

/dev/disk2(合成):

: 类型 名称 大小 标识符

0:APFS 容器方案 - +1.0 TB 磁盘 2

物理存储 磁盘 1s2,磁盘 0s2

1:APFS 卷 Macintosh HD 473.6 GB 磁盘 2s1

2: APFS 卷 Preboot 42.1 MB disk2s2

3: APFS 卷 Recovery 517.0 MB disk2s3

4: APFS 卷 VM 1.1 GB disk2s4

在建立了检测到的设备的基准后,将 USB 驱动器插入 macOS 系统的端口并重新运行命令。应显示相同的结果,并且会多出一个 USB 驱动器条目,类似如下:

/dev/disk3(外部,物理):

: 类型 名称 大小 标识符

0: *16.0 GB disk3

在上述示例中,USB 驱动器已分配给/dev/disk3。继续之前,请按以下方式卸载磁盘:

$ diskutil unmountDisk /dev/disk3

成功卸载 disk3 上的所有卷

最后,使用 dd 命令将 ISO 镜像写入设备,注意引用原始磁盘设备(/dev/rdisk3),并在提示时输入用户密码:

$ sudo dd if=/path/to/iso/image.iso of=/dev/rdisk3 bs=1m

镜像写入完成后,USB 驱动器就可以使用了。

3.2.3 Windows

有许多免费的 Windows 工具可以将 ISO 镜像写入 USB 驱动器,但专门为写入 Linux ISO 镜像编写的工具是 Fedora Media Writer 工具,可以从以下网址下载:

getfedora.org/en/workstation/download/

安装完成后,启动写入工具并选择“自定义镜像”选项,如图 3-1 中所示:

图 3-1

在随后的文件选择对话框中,导航到并选择 CentOS 8 安装 ISO 镜像,然后点击“打开”按钮。选择镜像后,将弹出一个对话框,在其中可以将镜像写入 USB 驱动器。在点击“写入磁盘”按钮之前,请从设备菜单中选择目标 USB 驱动器:

图 3-2

镜像写入设备后,该设备就可以用于执行安装。

3.3 安装 CentOS 8

将 CentOS 8 安装介质插入适当的驱动器并启动系统。如果系统尝试从硬盘驱动器启动,您需要进入计算机的 BIOS 设置并更改启动顺序,使其首先从安装介质驱动器启动。系统启动后,您将看到以下屏幕:

图 3-3

使用箭头键在选项之间导航,并使用键进行选择。如果选择了“故障排除”选项,则会显示图 3-4 中的屏幕,包括从本地驱动器上的当前操作系统启动(如果已安装)、测试系统内存或修复已安装的 CentOS 8 系统的选项。对于没有图形控制台的系统,还可以选择以基本图形模式执行安装:

图 3-4

在主屏幕上选择安装 CentOS 选项,经过短暂的延迟后,图形安装程序的第一个界面将出现:

图 3-5

在第一个屏幕上选择您偏好的语言,然后点击“继续”进入主安装界面,如图 3-6 所示:

图 3-6

首先选择“网络与主机名”选项,启用系统上的网络设备并输入主机名,然后点击“应用”按钮:

图 3-7

如果您的网络连接需要额外设置,点击“配置...”按钮进入图 3-8 所示的高级网络设置屏幕:

图 3-8

一旦定义了主机名并启用了网络连接,点击“完成”返回到主屏幕。

如果您希望更改键盘、语言或时间和日期设置,请从主屏幕的“本地化”栏目中选择相应选项。在“时间与日期”屏幕上,选择与您地理位置相对应的选项。还提供了使用网络时间选项,它会自动将系统与外部网络时间协议服务器同步。

由于安装是从本地媒体进行的,因此无需更改安装源设置。如果需要从远程服务器上的媒体进行安装,请选择“安装源”,启用“网络上”选项,然后指定安装媒体的位置和使用的 URL 类型。安装媒体可以是一个 ISO 镜像,安装在远程 Web 服务器上,或使用 NFS 在本地网络中的系统上进行安装(关于 NFS 文件共享的详细内容,请参阅章节“使用 NFS 共享 CentOS 8 文件与远程系统”),或者是远程仓库的 URL(仓库本质上是在线集合,包含操作系统所需的软件、软件包和应用程序,可以用来在本地系统上执行安装)。

默认情况下,CentOS 8 的带 GUI 安装将由安装程序执行。该安装将包括运行操作系统和图形桌面环境所需的最小软件包集。要选择不同的安装配置,请选择“软件选择”选项以显示如下图所示的界面:

图 3-9

使用左侧面板选择基本配置,并使用右侧面板添加启动后需要的额外包。如果 CentOS 8 系统打算与图形桌面环境一起使用,选择工作站或带 GUI 的服务器选项。否则,一般推荐从最小化系统开始,在系统启动后根据需要安装额外的包。这可以避免安装任何可能永远不需要的包。

安全策略选项允许在系统上安装额外的安全包,这些包可以强制执行符合安全内容自动化协议(SCAP)标准的安全限制。选择列表中的一个配置文件会安装必要的包,但政策限制不会被强制执行,直到在运行的系统上启用它们。除非你为政府机构或公司工作,并且该机构要求此级别的安全性,否则无需在此屏幕上选择策略。

Kdump 功能启用时,在系统崩溃时会写出操作系统内核的状态。这个转储文件对于识别崩溃原因非常有用,但启用后会占用系统内存。除非系统内存有限,否则可以保持启用状态。

配置完基本设置后,下一步是决定如何分区硬盘以容纳操作系统。

3.4 为 CentOS 8 分区硬盘

当选择安装目标选项时,安装程序将显示一个类似于下面图 3-10 所示的界面:

图 3-10

默认情况下,安装程序配置为自动使用当前选择的磁盘驱动器上的可用空间安装操作系统,并配置标准分区大小。如果磁盘之前包含其他操作系统,这些现有的分区不会被删除,可能在 CentOS 8 安装后在磁盘上留下未使用的空间。要删除现有分区以便回收并供 CentOS 8 使用,请启用“我想提供额外的空间”选项,并点击完成按钮,显示图 3-11 所示的对话框。

图 3-11

要回收空间,选择一个不再需要的分区,并点击删除按钮标记其为删除。选择完所有要删除的分区后,点击回收空间按钮以执行删除操作。回收的空间将自动由 CentOS 8 安装程序使用。

若要手动配置磁盘布局以及如何分配可用空间,请将存储分配设置从“自动”更改为“自定义”,然后点击“完成”以显示手动分区屏幕(图 3-12):

图 3-12

手动分区屏幕提供了使用逻辑卷管理(LVM)或标准分区配置磁盘的选项。LVM 是推荐选项,因为它在系统启动并运行后提供了在管理分区大小方面的灵活性(LVM 详细介绍请参见章节 “将新磁盘添加到 CentOS 8 卷组和逻辑卷”)。

一旦选择了分区方案,最后一步是决定各个分区的大小以及相应的文件系统挂载点。一般而言,点击“自动创建”选项提供的默认配置即可满足大多数系统需求。若要手动创建分区并分配挂载点,请点击 + 按钮手动声明并分配每个分区。

另一种选择是选择自动分区创建,然后使用生成的屏幕根据需要手动更改分区配置。例如,图 3-13 显示了选择自动创建选项后定义的分区配置,并允许在对磁盘进行任何更改之前修改每个分区的设置:

图 3-13

配置完磁盘后,点击“完成”,查看要对磁盘进行的更改摘要(图 3-14),然后点击“接受更改”按钮:

图 3-14

CentOS 8 还允许通过加密保护磁盘内容。每次系统启动时都需要输入密码短语才能访问。要启用加密,请在主安装目标屏幕上选择“加密我的数据”选项,点击“完成”按钮后,在图 3-15 所示对话框中输入密码短语:

图 3-15

3.5 物理安装

完成合适的软件包选择后,点击“开始安装”将启动分区磁盘并安装与所选安装设置匹配的软件包的过程。在此阶段,将出现一个屏幕(图 3-16),要求创建根密码和一个可选的用户帐户:

图 3-16

root(超级用户)账户是一个具有系统管理权限的特殊账户。虽然通常使用自己的账户登录系统,但为了配置系统和执行其他管理任务,你需要获得 root 权限。输入 root 密码,创建用户账户并等待安装完成。

一旦所有系统软件包安装并配置完成,移除安装介质并点击重启以重新启动系统。

3.6 最终配置步骤

系统启动时在控制台上显示的内容将取决于在软件选择安装屏幕中是否选择了带有图形用户界面(GUI)的工作站或服务器选项。如果在安装过程中选择了这些选项,则将显示 GNOME 显示管理器(GDM)登录界面。如果选择了最小或服务器配置选项,则会显示基于文本的登录提示。无论配置如何,都需要以在安装过程最后步骤中创建的用户身份登录系统。

在安装了图形用户界面(GUI)的工作站或服务器的情况下,GNOME 初始设置工具将启动,提供语言、键盘布局、位置服务以及连接到包括 Google 和 Facebook 在内的在线帐户等配置选项。在这些设置完成(或跳过)之后,GNOME 桌面欢迎界面将出现,包含有关如何使用桌面环境的教程链接。

3.7 安装更新

与今天大多数操作系统一样,每个特定版本的 CentOS 发行版在发布给公众后,都会不断演进。这通常表现为错误修复和安全更新,有时也包括可以通过互联网下载并安装到系统上的新功能。

最佳实践建议在安装 CentOS 后,第一步是确保系统安装了所有可用的更新。可以通过在终端窗口中使用 dnf 包管理工具来实现这一点。要检查是否有可用的更新,只需运行以下命令:

dnf check-update

所有待处理的更新可以再次使用 dnf 工具进行应用:

dnf update

执行时,dnf 工具将列出可更新的包,并提示是否执行更新。

一旦更新完成,安装过程基本上就结束了,CentOS 8 就可以开始使用了。

3.8 显示启动消息

在启动过程中,CentOS 8 将显示 Red Hat 图形启动(RHGB)屏幕,该屏幕隐藏了系统加载时生成的所有启动消息。要在启动过程中使这些消息可见(如 图 3-17 所示),只需在系统启动时按下键盘上的 Esc 键:

图 3-17

默认行为可以通过编辑 /etc/default/grub 文件并更改 GRUB_CMDLINE_LINUX 设置来更改,默认情况下,GRUB_CMDLINE_LINUX 的内容如下所示:

GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"

若要移除图形启动屏幕,使消息在无需按 Esc 键的情况下可见,请从设置中移除“rhgb”选项:

GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet"

此更改将导致系统仅显示系统生成的部分启动消息。要显示系统生成的所有消息,还需要移除“quiet”选项:

GRUB_CMDLINE_LINUX="crashkernel=auto quiet"

一旦更改完成,运行以下命令以生成新的启动配置,以便下次系统启动时生效:

grub2-mkconfig --output=/boot/grub2/grub.cfg

3.9 总结

使用 CentOS 8 的第一步是安装操作系统。如果是基于云的服务器,通常在选择操作系统镜像时,云服务提供商会自动执行此任务。对于自有硬件,安装过程包括下载 ISO 镜像形式的安装介质,将该镜像写入合适的存储介质(如 DVD 或 USB 驱动器),然后从中启动。安装运行后,可以配置一系列选项,包括网络设置、安装是否从本地介质还是远程服务器或仓库进行、需要安装的包,以及磁盘的分区方案。安装完成后,务必安装自原始安装镜像创建以来发布的操作系统更新。

  1. 双重启动 CentOS 8 和 Windows

CentOS 8,像大多数 Linux 发行版一样,可以与任何版本的 Windows(包括 Windows 10)共存于同一硬盘驱动器中。这种概念称为双重启动。简单来说,当你启动系统时,会出现一个菜单,供你选择启动 CentOS 8 安装或 Windows。显然,你一次只能运行一个操作系统,但需要注意的是,无论你的 Windows 分区是使用 NTFS、FAT16 还是 FAT32 格式化的,Windows 分区上的文件都可以在 CentOS 8 中访问。

这种安装方法涉及缩小现有 Windows 分区的大小,然后将 CentOS 8 安装到回收的空间中。本章假设 CentOS 8 正在安装到一台当前运行 Windows 10 的系统上。

4.1 分区调整大小

为了在已经包含 Windows 安装的磁盘驱动器上安装 CentOS,第一步是缩小 Windows 分区以腾出一些空间。推荐的操作方式是使用 Windows 磁盘管理界面来减少分区的大小,然后再尝试安装 CentOS 8\。

要访问 Windows 10 上的磁盘管理,右键点击“开始”菜单并从结果菜单中选择“磁盘管理”,如图 4-1 所示:

图 4-1

加载后,磁盘管理工具将显示系统检测到的磁盘驱动器的图形表示:

图 4-2

右键点击你想要缩小的分区,并从弹出菜单中选择“压缩卷...”。该工具将计算可以在不丢失数据的情况下缩小卷大小的最大值(这个过程可能需要几分钟,具体时间取决于分区的总体大小)。一旦分析完成,将会出现一个类似于下面图 4-3 的对话框:

图 4-3

在“输入要缩小的空间大小(以 MB 为单位)”字段中指定一个值,然后点击“压缩”按钮以继续操作。一旦调整大小操作完成,使用 CentOS 8 安装媒体重新启动系统(如“在全新硬盘驱动器上安装 CentOS 8”中所述),然后继续使用新腾出的空闲空间进行安装。

4.2 编辑 CentOS 8 启动菜单

一旦 CentOS 安装到磁盘并且系统重新启动,标准的 CentOS 启动菜单将会出现:

图 4-4

此时,引导菜单仅提供引导 CentOS 8 系统的选项。显然,还需要添加一个选项,以便仍然可以访问 Windows 系统。这些步骤需要在 CentOS 8 系统内执行,因此启动系统并以 root 身份登录。

第一步是使用 fdisk 命令在磁盘驱动器上识别 Windows 引导分区,具体如下:

第四章:fdisk -l

设备引导 起始 结束 扇区 大小 Id 类型

/dev/sda1 * 2048 1126399 1124352 549M 7 HPFS/NTFS/exFAT

/dev/sda2 1126400 53655551 52529152 25G 7 HPFS/NTFS/exFAT

/dev/sda3 53655552 55752703 2097152 1G 83 Linux

/dev/sda4 55752704 104857599 49104896 23.4G 5 扩展

/dev/sda5 55754752 104857599 49102848 23.4G 8e Linux LVM

在上述输出中,/dev/sda3 到/dev/sda5 显然是 CentOS 8 的分区。较小的/dev/sda1 分区是 Windows 系统分区,留下/dev/sda2 作为 Windows 引导分区。

CentOS 8 引导系统使用分区索引,其中第一个分区是分区 0,第二个是分区 1,依此类推。因此,从引导菜单的角度来看,Windows 引导分区位于硬盘 0 的分区索引位置 1,并在引导配置中定义为“hd0,1”。

引导菜单配置设置存储在生成的/boot/grub2/grub.cfg 文件中,使用 grub2-mkconfig 工具基于位于/etc/grub.d 目录中的配置文件的内容。要添加 Windows 引导选项到配置中,请编辑应读取如下内容的/etc/grub.d/40_custom 文件:

!/bin/sh

exec tail -n +3 $0

这个文件提供了一个简单的方法来添加自定义菜单项。只需输入

在此注释后添加您想要添加的菜单项。请注意不要更改

上述“exec tail”行。

编辑文件,在 40_custom 文件的末尾添加以下条目:

menuentry "Windows 10" {

设置 root=(hd0,1)

chainloader +1

}

保存文件并生成引导菜单如下:

grub2-mkconfig --output=/boot/grub2/grub.cfg

生成 grub 配置文件…

完成

在下一次重新启动时,Windows 现在将作为引导选项包括在图 4-5 中显示:

图 4-5

4.3 更改默认引导选项

当系统启动时,将显示引导选项屏幕,并等待 5 秒钟供用户选择操作系统。如果在超时之前没有进行选择,则将启动默认操作系统。在新配置的系统上,默认操作系统将是标准(非救援)CentOS 8 映像。但是,可以从 CentOS 内部更改此默认设置。

在新安装中,声明了一系列引导配置选项(包括 5 秒超时和在“在干净磁盘驱动器上安装 CentOS 8”中概述的 boot RHGB 设置),这些选项在/etc/default/grub 文件中定义如下:

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR="\((sed 's, release .*\),,g' /etc/system-release)"

GRUB_DEFAULT=saved

GRUB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"

GRUB_DISABLE_RECOVERY="true"

GRUB_ENABLE_BLSCFG=true

更改默认启动系统的第一步是在此文件中声明 GRUB_SAVEDEFAULT 设置:

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR="\((sed 's, release .*\),,g' /etc/system-release)"

GRUB_DEFAULT=saved

GRUB_SAVEDEFAULT=true

.

.

此设置允许将新的默认值保存在启动配置中。接下来,运行 grub2-set-default 命令,通过使用编号系统(第一个选项为 0)来更改默认设置。例如,对于上面图 4-5 中显示的启动选项,第一个 CentOS 项为位置 0,而 Windows 10 选项为位置 2。因此,将 Windows 10 设置为默认启动选项的命令如下所示:

grub2-set-default 2

通过运行以下命令检查新设置是否生效:

grub2-editenv list

saved_entry=2

kernelopts=root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet

boot_success=0

boot_indeterminate=0

请注意,saved_entry 的值现在设置为 2。更改默认设置后,按如下方式重新生成启动配置文件:

grub2-mkconfig --output=/boot/grub2/grub.cfg

重启系统并验证启动菜单是否默认选择 Windows 10 选项,并且在超时后 Windows 会启动。

4.4 从 CentOS 8 访问 Windows 分区

在双系统配置下运行 CentOS 时,仍然可以访问位于 Windows 分区上的文件。可以通过从命令行手动挂载分区来实现此目标。然而,在这样做之前,需要在系统上安装一些额外的软件包。首先,需要下载并安装 fuse 内核模块:

dnf install fuse

modprobe fuse

接下来,需要安装 Fuse NTFS 驱动程序。不幸的是,这个包不包含在标准的 CentOS 8 仓库中,因此需要将企业 Linux 附加包(EPEL)仓库添加到系统中,方法如下:

dnf install wget

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

rpm -ivh epel-release-latest-8.noarch.rpm

添加了 EPEL 仓库后,可以安装驱动程序:

dnf install fuse-ntfs-3g

一旦所需的软件包安装完成,下一步是创建一个目录作为我们 Windows 分区的挂载点。在此示例中,我们将创建一个名为 /mnt/windows 的目录:

mkdir /mnt/windows

为了识别分配给 Windows 分区的设备名称,可以使用 fdisk 命令,如下所示:

fdisk -l

.

.

Device Boot Start End Blocks Id System

/dev/sda1 * 1 13 102400 7 HPFS/NTFS

/dev/sda2 13 1400 11141120 7 HPFS/NTFS

/dev/sda3 1400 1464 512000 83 Linux

/dev/sda4 1464 2611 9214976 5 Extended

/dev/sda5 1464 2611 9213952 8e Linux LVM

在上面的输出中,包含我们需要访问的文件的主要 Windows 分区表示为 /dev/sda2\。接下来,我们需要运行 mount 命令(假设 Windows 分区是 /dev/sda2 并且是 NTFS 格式),如下所示:

mount /dev/sda2 /mnt/windows

通过列出挂载点的顶级目录内容来检查挂载是否成功:

ls /mnt/windows

‘$Recycle.Bin’ ProgramData swapfile.sys

‘Documents and Settings’ ‘Program Files’ ‘System Volume Information’

pagefile.sys ‘Program Files (x86)’ Users

PerfLogs Recovery Windows

要使每次系统启动时自动挂载,只需将适当的挂载行添加到 /etc/fstab 文件中:

/dev/sda2 /mnt/windows ntfs defaults 0 0

要随时卸载 Windows 文件系统:

umount /mnt/windows

4.5 总结

CentOS 8 可以通过创建双重启动环境与 Windows 操作系统在同一个硬盘驱动器上安全共存。这涉及到先缩小 Windows 系统所占的空间,为 CentOS 8 腾出空间,然后再执行安装。一旦 CentOS 安装完成,必须修改启动菜单配置,以包括从 Windows 启动的选项。要在 CentOS 中访问 Windows 文件系统,需要安装 Fuse NTFS 驱动程序,并用它来挂载 Windows 分区。

  1. 为 CentOS 8 分配 Windows 磁盘分区

在上一章中,我们学习了如何在与 Windows 相同的磁盘上安装 CentOS 8。这种所谓的“双重启动”配置允许用户将两个操作系统安装在同一个磁盘驱动器上,并在系统启动时选择启动其中一个。

本章面向那些已经决定彻底删除磁盘上的 Windows,并将剩余空间用于 Linux 的 CentOS 8 用户。在接下来的部分中,我们将一步步地完成这个过程。

5.1 卸载 Windows 分区

如果已经按照 “在 CentOS 8 上与 Windows 双重启动” 章节中的步骤挂载了 Windows 分区,继续本章之前应该先卸载该分区。假设 Windows 分区挂载在 /mnt/windows,以下命令可以卸载它:

第五章:umount /mnt/windows

/etc/fstab 文件也应该被编辑,以删除先前添加的 /mnt/windows 自动挂载项(如果有的话)。

5.2 从磁盘删除 Windows 分区

将 Windows 分区释放出来供 CentOS 使用的第一步是删除该分区。然而,在执行此操作之前,务必确保从 Windows 和 CentOS 分区中备份好所有需要保留的数据。完成备份后,便可以安全地继续进行本章操作。

为了删除 Windows 分区,我们首先需要使用 fdisk 工具识别包含这些分区的磁盘:

fdisk -l

磁盘 /dev/sda: 50 GiB, 53687091200 字节, 104857600 扇区

单位:1 * 512 = 512 字节的扇区

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0xe3673009

设备 启动 开始 结束 扇区 大小 Id 类型

/dev/sda1 * 2048 1126399 1124352 549M 7 HPFS/NTFS/exFAT

/dev/sda2 1126400 53655551 52529152 25G 7 HPFS/NTFS/exFAT

/dev/sda3 53655552 55752703 2097152 1G 83 Linux

/dev/sda4 55752704 104857599 49104896 23.4G 5 扩展

/dev/sda5 55754752 104857599 49102848 23.4G 8e Linux LVM

在上述示例输出中,系统包含一个物理磁盘驱动器,通过设备名称 /dev/sda 引用。在该磁盘驱动器上有五个分区,分别通过设备名称 /dev/sda1 至 /dev/sda5 访问。根据系统栏中的值,有两个 NTFS 分区。第一个是 Windows 系统分区,第二个是较大的 NTFS 启动分区,包含 Windows 操作系统和用户数据。

要删除分区,使用包含该分区的磁盘的设备名称(在此示例中为 /dev/sda)启动 fdisk 工具,并按照提示再次显示分区和扇区信息:

fdisk /dev/sda

欢迎使用 fdisk(util-linux 2.32.1)。

变更将仅保留在内存中,直到你决定将其写入。

在使用写入命令之前请小心。

命令(输入 m 获取帮助):p

磁盘 /dev/sda: 50 GiB, 53687091200 字节, 104857600 扇区

单位:1 个扇区 = 512 字节

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0xe3673009

设备 启动 起始 结束 扇区 大小 ID 类型

/dev/sda1 * 2048 1126399 1124352 549M 7 HPFS/NTFS/exFAT

/dev/sda2 1126400 53655551 52529152 25G 7 HPFS/NTFS/exFAT

/dev/sda3 53655552 55752703 2097152 1G 83 Linux

/dev/sda4 55752704 104857599 49104896 23.4G 5 扩展分区

/dev/sda5 55754752 104857599 49102848 23.4G 8e Linux LVM

命令(输入 m 获取帮助):

目前,Windows 系统分区被列为引导分区。由于我们将删除此分区,需要将 Linux 引导分区标记为可引导。上述配置中,这由 /dev/sda3 表示。在 fdisk 工具中,按如下步骤将其设置为可引导分区:

命令(输入 m 获取帮助):a

分区号(1,3-5,默认 5):3

分区 3 的引导标志已启用。

在继续之前,请记录下我们将删除的分区的起始和结束地址(也就是 /dev/sda1 的起始和 /dev/sda2 的结束地址)。

在命令提示符下,删除 Windows 分区(在我们的示例系统中是分区 1 和 2):

命令(输入 m 获取帮助):d

分区号(1-5,默认 5):1

分区 1 已被删除。

命令(输入 m 获取帮助):d

分区号(2-5,默认 5):2

分区 2 已被删除。

现在我们已经删除了 Windows 分区,接下来需要在空闲的磁盘空间中创建新的 CentOS 分区。分区号必须与删除的分区号相同(在此例中为 1),并且将是一个主分区。还需要精确输入该分区的起始和结束扇区,正如原来分区所报告的那样(fdisk 通常会默认提供正确的值,但最好双重检查)。如果提示移除 NTFS 签名,请输入 Y:

命令(输入 m 获取帮助):n

分区类型

p 主分区(1 主分区,1 扩展分区,2 空闲)

l 逻辑(从 5 开始编号)

选择(默认 p):p

分区号(1,2,默认 1):1

第一个扇区(2048-104857599,默认 2048):

最后扇区,+扇区或 +大小{K,M,G,T,P}(2048-53655551,默认 53655551):

创建了一个新的分区 1,类型为“Linux”,大小为 25.6 GiB。

分区 #1 包含 NTFS 签名。

是否移除签名?[Y]是/[N]否:y

签名将通过写入命令被移除。

做出这些更改后,下一步是检查设置是否正确(借此机会再次确认 Linux 引导分区是否可引导):

命令(输入 m 获取帮助):p

磁盘 /dev/sda: 50 GiB, 53687091200 字节, 104857600 扇区

单位:1 个扇区 = 512 字节

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0xe3673009

设备 启动 起始 结束 扇区 大小 ID 类型

/dev/sda1 2048 53655551 53653504 25.6G 83 Linux

/dev/sda3 * 53655552 55752703 2097152 1G 83 Linux

/dev/sda4 55752704 104857599 49104896 23.4G 5 扩展分区

/dev/sda5 55754752 104857599 49102848 23.4G 8e Linux LVM

分区 1 上的文件系统/RAID 签名将被擦除。

要提交更改,现在需要将新分区信息写入磁盘并退出 fdisk 工具:

命令 (m 获取帮助):w

分区表已被更改。

同步磁盘。

5.3 格式化未分配的磁盘分区

为了使新分区适用于 CentOS 8,必须在其上创建文件系统。目前 CentOS 版本的默认文件系统类型是 XFS,相关细节将在标题为 “向 CentOS 8 系统添加新磁盘驱动器” 的章节中详细讲解。文件系统的创建使用 mkfs.xfs 命令,具体如下:

mkfs.xfs -f /dev/sda1

元数据=/dev/sda1 isize=512 agcount=4, agsize=1676672 blks

= sectsz=512 attr=2, projid32bit=1

= crc=1 finobt=1, sparse=1, rmapbt=0

= reflink=1

data = bsize=4096 blocks=6706688, imaxpct=25

= sunit=0 swidth=0 blks

naming =version 2 bsize=4096 ascii-ci=0, ftype=1

log =internal log bsize=4096 blocks=3274, version=2

= sectsz=512 sunit=0 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

5.4 挂载新分区

接下来,我们需要挂载新分区。在这个示例中,我们将其挂载到名为 /data 的目录中。您也可以根据需要使用任何有效的挂载点,或者将其作为逻辑卷的一部分进行使用(相关细节将在标题为 “向 CentOS 8 卷组和逻辑卷添加新磁盘” 的章节中详细介绍)。首先,我们需要创建一个目录作为挂载点:

mkdir /data

其次,我们需要编辑 /etc/fstab 中的挂载表,以确保每次系统启动时分区都能自动挂载。在 /etc/fstab 文件的底部,添加以下行以挂载新分区(修改 /dev/sda1 设备以匹配您的环境):

/dev/sda1 /data xfs 默认 0 0

最后,我们可以手动挂载新分区(请注意,在随后的重启中不再需要此操作,因为我们在 /etc/fstab 文件中添加的设置将使分区自动挂载)。

mount /data

要检查分区,请运行以下命令以显示可用空间:

df -h /data

文件系统 大小 已用 可用 使用% 挂载点

/dev/sda1 26G 215M 26G 1% /data

5.5 编辑启动菜单

下一步是修改 CentOS 启动菜单。由于这是一个原本的双重启动系统,菜单配置提供了启动 Windows 或 CentOS 的选项。现在 Windows 分区已被删除,我们需要移除这个启动选项。首先,编辑 /etc/grub.d/40_custom 文件并删除 Windows 菜单项:

!/bin/sh

执行 tail -n +3 $0

该文件提供了一种简单的方式来添加自定义菜单项。只需键入

在此评论之后添加你想要的菜单项。注意不要修改

上面的 'exec tail' 行。

menuentry "Windows 10" {

set root=(hd0,1)

chainloader +1

}

保存文件并使用 grub2-mkconfig 工具生成 /boot/grub2/grub.cfg 文件,如下所示:

grub2-mkconfig --output=/boot/grub2/grub.cfg

正在生成 grub 配置文件 ...

完成

下一次系统重启时,Windows 10 选项将不再出现在启动菜单中。

5.6 总结

在双系统配置中,Windows 分区可以随时被删除,以便为 CentOS 系统腾出空间,方法是识别属于 Windows 的分区,然后使用 fdisk 工具将其删除。删除后,未分配的空间可以用来创建新文件系统并挂载,以便 CentOS 系统使用。最后一步是从启动菜单配置中删除 Windows 选项。

6. GNOME 3 桌面导览

CentOS 8 包含 GNOME 3 桌面环境。尽管缺乏 Windows 和 macOS 桌面环境的复杂性,GNOME 3 提供了一个简洁直观的桌面环境,具备窗口环境的所有基本功能,且具备快速学习的优势。

本章将介绍 GNOME 桌面的主要特点,并概述如何执行基本任务。

6.1 安装 GNOME 桌面

如果在 CentOS 8 安装过程中选择了工作站或带 GUI 的服务器软件配置,GNOME 桌面将已安装,并将在每次系统启动时自动启动。

如果在 CentOS 8 安装过程中选择了其他软件配置,系统安装的包中将不包括 GNOME 桌面。在没有显示器连接的服务器系统上,安装图形桌面环境的想法可能显得多余。然而,值得注意的是,GNOME 桌面也可以通过远程访问,因此,即使在所谓的无头服务器(即缺少显示器、键盘和鼠标的服务器)上,安装 GNOME 桌面包仍然可能是有益的。本书的“CentOS 8 远程桌面访问通过 VNC”章节将详细介绍建立远程桌面访问的相关内容。

如果安装配置中未包括 GNOME 桌面,可以随时使用以下命令进行安装:

第六章:dnf groupinstall "Workstation"

安装完成后,可以通过命令行提示符在显示器上启动桌面环境,如下所示:

$ startx

6.2 GNOME 3 桌面概述

下方的屏幕显示了图 6-1 所示的典型新启动的 GNOME 桌面会话的外观,在此之前没有启动其他程序或进行配置更改。

图 6-1

主要桌面区域(标记为 A)是当启动应用程序和实用工具时,窗口将出现在此处。与其他桌面环境不同,无法将文件或应用程序拖放到桌面上,从而提供了一个干净、整洁的工作区。

屏幕顶部的栏(B)称为顶部栏,包括活动菜单(C)、日期和时间以及一组按钮和图标,包含网络状态、音量、电池电量以及其他状态和账户设置。当前桌面上运行的应用程序菜单也会出现在顶部栏中。图 6-2 显示了终端程序的应用程序菜单:

图 6-2

6.3 启动活动

应用程序和实用工具通过活动概览仪表盘(即仪表盘)启动,您可以通过点击顶部栏中的活动按钮或按下键盘上的特殊键来显示该仪表盘。在 Windows 系统中,这是 Windows 键;在 macOS 中,这是 Command 键;在 Chromebook 上,是显示放大镜的键。

显示时,仪表盘将如图 6-3 所示:

图 6-3

默认情况下,仪表盘将显示一组预定义的常用应用程序图标,还会显示任何当前正在运行的应用程序的图标。如果应用程序正在运行,它将在图标下方显示一个条形标记。

要启动应用程序,只需点击仪表盘中的图标。

要查找仪表盘中未包含的应用程序,一种选择是点击最底部的图标(由九个点组成的正方形),显示可浏览的应用程序列表,如图 6-4 所示:

图 6-4

请注意,列表可以通过选择屏幕底部中间的按钮来筛选,以显示所有应用程序或仅显示常用应用程序。还需要注意的是,列表中的某些条目实际上是包含附加应用程序的文件夹。例如,在上面的截图中,“实用工具”条目提供了对其他工具的访问,如系统监视器、磁盘管理工具和终端窗口应用程序。

浏览应用程序的另一种方式是使用搜索栏,在显示仪表盘时会出现该搜索栏,如图 6-5 所示:

图 6-5

当在搜索框中输入文本时,可能的匹配项列表将被精细化。

要将应用程序添加到仪表盘以便更方便地访问,找到应用程序的图标,右键点击图标并选择“添加到收藏夹”菜单选项:

图 6-6

要从仪表盘中移除应用程序,重复这些步骤,这次选择“从收藏夹中移除”。

6.4 管理窗口

与其他桌面环境一样,GNOME 中的应用程序也以窗口形式运行。当多个应用程序窗口打开时,使用 Super + Tab 键盘快捷键将显示切换面板(图 6-7),允许选择另一个窗口作为当前活动窗口(Super 键是 Windows 键,或在 Mac 键盘中是 Cmd 键):

图 6-7

如果单个应用程序打开了多个窗口,切换器将在第二个面板中显示这些窗口,以便选择特定的窗口:

图 6-8

要在切换器中向后循环浏览图标,请使用 Shift + Tab 键盘快捷键。

要最大化一个窗口,使其填满整个屏幕,点击标题栏并将窗口拖动到屏幕顶部。要将窗口恢复到原来的大小,点击标题栏并向下拖动。或者,只需双击标题栏即可在窗口大小之间切换。类似地,将窗口拖动到屏幕的左侧或右侧会使窗口填满屏幕的一半。

6.5 使用工作区

应用程序窗口出现的屏幕区域称为工作区,GNOME 3 允许配置多个工作区。要创建一个新的工作区,显示活动概览并将鼠标指针移动到屏幕的最右侧,显示工作区面板(图 6-9):

图 6-9

要切换到不同的面板,只需从列表中选择它。要将窗口从一个工作区移动到另一个工作区,显示工作区面板并将应用程序窗口(无论是当前工作区中的实际窗口,还是工作区面板中的缩略图窗口)拖放到目标工作区。当一个窗口被添加到空白工作区时,另一个空白工作区也会添加到工作区面板,从而允许创建多个工作区。

要移除一个工作区,可以关闭该工作区上的所有窗口,或者将它们移到另一个工作区。

6.6 日历和通知

当系统需要通知您某个事件(例如系统或应用程序更新可用)时,工作区顶部会弹出一个面板。可以通过点击顶部栏中的日期和时间来访问日历和任何之前的通知,如图 6-10 所示:

图 6-10

6.7 桌面设置

要访问设置应用程序,点击顶部栏最右侧的向下箭头,然后选择带有工具图标的按钮,如图 6-11 中所示:

图 6-11

设置应用程序提供了广泛的选项,如以太网和 Wi-Fi 连接、屏幕背景自定义选项、屏幕锁定和电源管理控制以及语言偏好。要探索每个类别中可用的设置,只需从设置窗口的左侧面板中选择一个选项:

图 6-12

上述在图 6-11 中显示的菜单还包括切换用户、调整音量、切换到不同的 Wi-Fi 网络,以及注销、重启或关闭系统的选项。

6.8 摘要

CentOS 8 包含 GNOME 3 桌面环境,可以在初始安装时包含,也可以稍后使用 dnf 群组包安装功能安装。与大多数其他桌面环境不同,GNOME 3 旨在提供一个简洁且易于使用的窗口用户界面。GNOME 3 桌面的关键区域包括顶部栏、活动概览和启动器。此外,GNOME 3 支持多个工作区,可以保持正在运行的应用程序井然有序,屏幕也更加简洁。设置应用中还提供了多种配置选项,包括桌面背景设置、音频、网络配置和 Wi-Fi 网络选择。

  1. CentOS 8 Cockpit 网页界面概述

尽管 CentOS 8 配备了最新的 Linux 桌面环境,但它仍然是一个以服务器为主的操作系统。因此,大多数 CentOS 部署将会部署在远程物理服务器上,或作为云端虚拟机实例。通常,这些系统没有键盘、鼠标或显示器,只有通过网络连接的命令行访问。这在远程位置进行系统管理时带来了挑战。虽然通过远程访问命令行和桌面环境可以实现很多操作,但对于需要在企业级操作系统如 CentOS 8 上每天执行的管理和监控任务来说,这远远不是一个一致且连贯的解决方案。

这个问题通过引入 Cockpit 基于网页的管理界面得以解决。本章将解释如何安装、配置和访问 Cockpit 界面,同时概述 Cockpit 的关键功能,其中许多功能将在后续章节中详细介绍。

7.1 Cockpit 概述

Cockpit 是一个轻量级的基于网页的界面,允许远程执行常规系统管理任务。安装和配置完成后,系统管理员只需打开本地浏览器窗口并导航到远程服务器上的 Cockpit 端口。加载 Cockpit 界面并登录后,管理员可以使用管理和监控工具以可视化方式执行广泛的任务。

在后台,Cockpit 使用与命令行工作时相同的工具执行任务,并且会自动更新以反映系统其他地方的变化。这使得 Cockpit 可以与其他管理工具和技术一起使用,而不会出现某个方法覆盖另一个方法的风险。Cockpit 还可以配置为访问多个服务器,使得多个服务器可以通过单个浏览器会话同时进行管理和监控。

Cockpit 默认与一系列工具一起安装。它还允许根据需要安装额外的扩展插件。Cockpit 的设计还支持通过 HTML 和 JavaScript 的组合来创建自定义扩展,以添加缺失或自定义的功能。

Cockpit 的模块化设计还允许许多功能嵌入到其他基于网页的应用程序中。

7.2 安装与启用 Cockpit

默认情况下,CentOS 8 通常没有安装 Cockpit,但可以通过几个简单的步骤进行设置和启用。第一步是按照如下方式安装 Cockpit 软件包:

第七章:dnf install cockpit

接下来,需要启用 Cockpit 套接字服务:

systemctl enable --now cockpit.socket

最后,需要在防火墙上打开必要的端口,以允许远程浏览器连接到 Cockpit:

firewall-cmd --add-service=cockpit --permanent

firewall-cmd --reload

7.3 访问 Cockpit

如果您可以访问已安装 Cockpit 的服务器桌面环境,请打开浏览器并导航至 https://localhost:9090 以访问 Cockpit 登录界面。另一方面,如果服务器是远程的,只需使用域名或 IP 地址(例如 https://myserver.com:9090)导航到服务器即可。

建立连接后,浏览器可能会发出连接不安全的警告。这是因为 Cockpit 服务使用了自签名证书。您可以选择继续访问该网站,或者为了避免将来出现此消息,可以选择高级选项并为服务器地址添加例外。

一旦连接,浏览器将加载如下所示的登录页面:图 7-1:

图 7-1

使用 root 或者用户账户凭据登录到 Cockpit 界面。请注意,当以用户身份登录时,由于权限限制,某些任务在 Cockpit 界面中会受到限制。登录后,Cockpit 将显示系统屏幕。

7.4 系统

系统屏幕提供了当前系统的概览,包括 CPU、内存、磁盘 I/O 和网络使用情况的实时性能指标。此屏幕还包括有关系统的信息,包括底层硬件、主机名、系统时间以及系统软件是否为最新版本。还提供了重新启动或关闭系统的选项。

图 7-2 例如,显示了 Cockpit 界面的系统监控页面:

图 7-2

7.5 日志

当选择“日志”类别时,Cockpit 会显示 systemd 日志的内容。选择一个日志条目将显示完整的日志消息。日志条目按时间顺序排列,最新的在顶部,并且菜单中包含过滤日志的选项,可以根据时间段和消息的严重性进行筛选。

图 7-3

7.6 存储

选择存储选项以查看和管理系统上的存储,包括磁盘、分区和卷组、网络文件系统(NFS)挂载以及 RAID 存储。此屏幕还允许实时监控磁盘 I/O 活动,并列出系统 udisksd 服务的日志输出,该服务用于查询和管理存储设备。

图 7-4

7.7 网络

网络屏幕提供了广泛的网络相关配置和服务的信息,包括网络接口和防火墙设置,并允许进行配置更改,例如创建网络桥接或设置虚拟网络。

图 7-5

7.8 虚拟机

虚拟化允许多个操作系统实例在单个计算机系统上同时运行,每个系统都运行在自己的虚拟机中。虚拟机 Cockpit 扩展提供了一种方式来创建和管理安装在服务器上的虚拟机客户机。

图 7-6

虚拟机扩展默认未安装,但可以通过运行以下命令将其添加到 Cockpit 中:

dnf install cockpit-machines

使用虚拟化技术的 CentOS 8 相关内容将从《在 CentOS 8 上安装 KVM 虚拟化》这一章开始介绍。

7.9 账户

选择此选项查看当前配置在系统上的用户账户,并为其他用户创建账户。用户管理的相关内容将在后面章节《管理 CentOS 8 用户和组》中详细介绍。

图 7-7

点击现有账户查看详细信息并进行更改。用户账户详细页面还可以用于查看和添加公共 SSH 密钥到用户账户,以便按章节《在 CentOS 8 上配置基于 SSH 密钥的身份验证》中所述进行远程访问服务器。

7.10 服务

此屏幕显示服务器上运行的系统服务列表,并允许对这些服务进行添加、删除、停止和启动操作。

图 7-8

服务的相关内容将在《配置 CentOS 8 systemd 单元》一章中详细介绍。

7.11 应用程序

如前所述,额外的功能可以通过扩展的形式添加到 Cockpit 中。这些扩展可以是自行开发的扩展,也可以是第三方提供的扩展。应用程序屏幕列出了已安装的扩展,并允许添加或删除扩展。

图 7-9

7.12 诊断报告

选中此选项后,可以生成诊断报告并下载到本地系统进行分析。生成的报告以压缩归档文件的形式提供,包含服务器系统上的所有日志文件。

图 7-10

7.13 内核转储

此屏幕仅显示当前 KDump 服务状态,并指示内核崩溃时内核转储文件将位于何处。此转储文件可用于识别崩溃的原因。提供了一个按钮来测试内核转储,通过触发内核崩溃来进行,但不建议在生产服务器系统上使用此选项:

图 7-11

7.14 SELinux

选择后,SELinux 类别显示当前是否执行 SELinux 策略,并显示该安全系统生成的任何警报。

图 7-12

7.15 软件更新

如果系统有任何可用的软件更新,它们将显示在此屏幕上。如果有更新,可以从此屏幕进行安装。

图 7-13

7.16 终端

顾名思义,终端屏幕提供对命令行提示符的访问。

图 7-14

7.17 连接到多个服务器

Cockpit 可以配置为从单一会话中管理多个服务器。这需要在主系统上安装 Cockpit 仪表盘(换句话说,就是建立初始 Cockpit 会话的系统)。要安装 Cockpit 仪表盘包,请运行以下命令:

dnf install cockpit-dashboard

安装仪表盘后,退出 Cockpit 然后重新登录。仪表盘现在将出现在 Cockpit 界面中,如图 7-15 中所示:

图 7-15

选择后,仪表盘页面将显示当前系统的性能图表,并提供当前连接的系统列表:

图 7-16

要添加另一台系统,请单击图 7-16 中高亮显示的 + 按钮,输入另一台系统的 IP 地址或主机名,并选择一个颜色以便与之前添加到 Cockpit 的其他服务器区分,然后点击添加按钮:

图 7-17

输入用于连接到其他系统的用户名和密码,然后单击登录按钮。新添加的服务器现在将列在 Cockpit 仪表盘中,并在图表中以之前选择的颜色显示:

图 7-18

要在使用 Cockpit 时切换系统,只需使用下方图 7-19 中所示的下拉菜单:

图 7-19

7.18 启用存储的度量数据

在标准安装中,Cockpit 不会保留任何超出图表所显示的短时间窗口范围的数据。如果要保留 Cockpit 收集的数据,需要安装存储度量功能。首先按照以下步骤安装 cockpit-pcp 包:

dnf install cockpit-pcp

要启用度量持久性,显示系统屏幕并点击图 7-20 中高亮显示的启用存储的度量数据...链接:

图 7-20

一旦选择了此选项,Cockpit 将请求安装 cockpit-pcp、pcp-libs 和 pcp-selinux 包。安装这些包后,启用持久性度量的链接将被一个名为“存储度量”的控件所替代。当启用此选项时,性能图表将包括额外的控件,允许您在时间轴上前后移动,以查看历史数据,并更改数据时间范围,从 1 小时到 1 周不等:

图 7-21

7.19 总结

Cockpit 网页界面允许通过网页浏览器进行远程系统管理任务,无需依赖命令行提示符和命令行工具。一旦安装并启用,系统管理员只需打开网页浏览器,连接到远程服务器并登录 Cockpit 界面。在后台,Cockpit 使用与命令提示符中可用的相同命令行工具,从而允许同时使用两者而不会出现配置冲突的风险。Cockpit 使用模块化框架,允许添加额外的扩展,并支持开发和集成自定义扩展。一个 Cockpit 会话可以用于管理单台服务器,或者配置为同时访问多台服务器。

  1. 使用 CentOS 8 上的 Bash Shell

学习如何在 CentOS 8 和一般的 Linux 发行版中工作,重要的一部分是熟练使用 Shell 环境。虽然 Linux 提供的图形桌面环境(如 GNOME)为操作系统提供了一个用户友好的界面,但实际上,Shell 环境提供了比图形桌面工具更强大的功能、灵活性和自动化能力。Shell 环境还为在没有桌面环境时与操作系统交互提供了一种手段;这在使用基于服务器的操作系统(如 CentOS 8)或无法完全启动的损坏系统时是常见的情况。

因此,本章的目标是概述 CentOS 8 的默认 Shell 环境(特别是 Bash shell)。

8.1 什么是 Shell?

Shell 是一个交互式命令解释器环境,用户可以在提示符下输入命令或将命令写入脚本文件并执行。Shell 的起源可以追溯到 UNIX 操作系统的早期。事实上,在 Linux 的早期,在引入图形桌面环境之前,Shell 是用户与操作系统交互的唯一方式。

多种 shell 环境在多年间陆续开发出来。第一个广泛使用的 shell 是由 Stephen Bourne 在贝尔实验室编写的 Bourne shell。

另一个早期的创作是 C shell,它与 C 编程语言共享一些语法相似性,并引入了命令行编辑和历史记录等可用性增强功能。

Korn shell(由 David Korn 在贝尔实验室开发)基于 Bourne shell 和 C shell 提供的功能。

CentOS 8 的默认 Shell 是 Bash Shell(即 Bourne Again SHell 的缩写)。这个 Shell 最初作为 Bourne shell 的开源版本出现,由 Brian Fox 为 GNU 项目开发,并基于 Bourne shell 和 C shell 提供的功能。

8.2 访问 Shell

在 GNOME 桌面环境中,可以通过从顶部栏选择“Activities”选项,在搜索栏中输入“Terminal”,并点击 Terminal 图标来访问 Shell 提示符。

例如,当远程登录 CentOS 8 服务器时(使用 SSH),用户也会看到 Shell 提示符。关于如何使用 SSH 访问远程服务器的详细信息将在《在 CentOS 8 上配置基于 SSH 的认证》一章中介绍。当启动一个未安装桌面环境的基于服务器的系统时,用户在完成登录程序后,会立即进入 Shell 界面(无论是在物理控制台终端还是远程登录会话中)。

8.3 在提示符下输入命令

命令是在 shell 提示符下通过输入命令并按 Enter 键来执行的。虽然有些命令在执行时不会输出任何信息,但大多数命令在返回提示符之前会显示某种形式的输出。例如,ls 命令可以用来显示当前工作目录中的文件和目录:

$ ls

桌面 文档 下载 音乐 图片 公共 模板 视频

可用的命令要么是内置在 shell 中,要么存在于物理文件系统中。可以使用 which 命令来查找命令在文件系统中的位置。例如,要查找 ls 可执行文件在文件系统中的位置:

$ which ls

alias ls=’ls --color=auto’

/usr/bin/ls

显然,ls 命令位于 /usr/bin 目录下。还需注意,有一个别名已配置,这一主题将在本章后续部分讨论。使用 which 命令查找内置于 shell 中的命令的路径时,会显示一个消息,表明无法找到可执行文件。例如,尝试查找 history 命令的位置(该命令实际上是内置在 shell 中,而不是作为文件系统中的可执行文件存在)时,会得到类似如下的输出:

$ which history

/usr/bin/which: no history in (/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin)

8.4 获取命令信息

许多 Linux shell 中可用的命令开始时可能看起来有些难以理解。要查找有关命令的详细信息及其使用方法,可以使用 man 命令并指定命令名称作为参数。例如,要了解更多关于 pwd 命令的信息:

$ man pwd

执行上述命令时,将显示 pwd 命令的详细描述。许多命令在使用 --help 命令行选项运行时,还会提供额外的信息:

$ wc --help

8.5 Bash 命令行编辑

早期的 shell 环境没有提供任何形式的行编辑功能。这意味着,如果你在输入一个长命令时发现开头有错误,你必须删除后面的所有字符,纠正错误后再重新输入其余的命令。幸运的是,Bash 提供了广泛的命令行编辑选项,如下表所示:

键盘快捷键 操作
Ctrl-b 或 左箭头 将光标向后移动一个位置
Ctrl-f 或 右箭头 将光标向前移动一个位置
Delete 删除当前光标下的字符
Backspace 删除光标左侧的字符
Ctrl-_ 撤销上一个更改(可以重复操作以撤销所有更改)
Ctrl-a 将光标移到行首
Ctrl-e 将光标移到行末
Meta-f 或 Esc 然后 f 将光标向前移动一个单词
Meta-b 或 Esc 然后 b 将光标向后移动一个单词
Ctrl-l 清除屏幕上除当前命令外的所有内容
Ctrl-k 从当前位置删除到行尾
Meta-d 或 Esc 然后 d 删除到当前单词的末尾
Meta-DEL 或 Esc 然后 DEL 删除到当前单词的开始位置
Ctrl-w 从当前位置删除到前一个空白字符

表 8-1

8.6 Shell 历史记录的使用

除了命令行编辑功能外,Bash Shell 还提供了命令行历史记录支持。可以使用 history 命令查看先前执行的命令列表:

$ history

1 ps

2 ls

3 ls –l /

4 ls

5 man pwd

6 man apropos

此外,可以使用 Ctrl-p(或上箭头)和 Ctrl-n(或下箭头)来前后滚动查看之前输入的命令。当显示出历史记录中的所需命令时,按 Enter 键执行该命令。

另一个选项是输入 ‘!’ 字符,后跟要重复执行的命令的前几个字符,然后按 Enter 键。

8.7 文件名简写

许多 Shell 命令都需要一个或多个文件名作为参数。例如,要显示名为 list.txt 的文本文件的内容,可以使用 cat 命令,命令如下:

$ cat list.txt

同样,可以通过指定所有文件名作为参数,显示多个文本文件的内容:

$ cat list.txt list2.txt list3.txt list4.txt

与其输入每个文件名,模式匹配可以用来指定所有符合特定标准的文件。例如,‘*’ 通配符可以简化上述示例:

$ cat *.txt

上述命令将显示所有以 .txt 结尾的文件的内容。你还可以进一步限制,只显示以 list 开头,且以 .txt 结尾的文件:

$ cat list*.txt

可以使用 ‘?’ 字符指定单个字符匹配:

$ cat list?.txt

8.8 文件名和路径补全

与其输入整个文件名或路径,或者使用模式匹配来减少输入量,Shell 提供了文件名自动补全功能。要使用文件名自动补全,只需输入文件或路径名的前几个字符,然后按两次 Esc 键。Shell 将自动为你完成文件名,补全目录中与输入字符匹配的第一个文件或路径名。要获取可能的匹配项列表,输入前几个字符后按 Esc = 键。

8.9 输入和输出重定向

如前所述,许多 Shell 命令在执行时会输出信息。默认情况下,这些输出会发送到一个名为 stdout 的设备文件,它本质上就是 Shell 正在运行的终端窗口或控制台。相反,Shell 从名为 stdin 的设备文件获取输入,默认情况下它是键盘。

可以使用 ‘>’ 字符将命令的输出从标准输出(stdout)重定向到文件系统上的实际文件。例如,要将 ls 命令的输出重定向到名为 files.txt 的文件,所需的命令如下:

$ ls *.txt > files.txt

执行完成后,files.txt 将包含当前目录中文件的列表。类似地,文件的内容也可以作为命令的输入替代标准输入(stdin)。例如,要将文件内容重定向为命令的输入:

$ wc –l < files.txt

上面的命令将显示 files.txt 文件中包含的行数。

需要注意的是,‘>’ 重定向操作符会创建一个新文件,或者在使用时截断已有文件。为了向已有文件追加内容,可以使用 ‘>>’ 操作符:

$ ls *.dat >> files.txt

除了标准输出外,shell 还提供了标准错误输出(stderr)。当命令的输出被重定向到 stdout 时,任何由命令生成的错误信息会被重定向到 stderr。这意味着,如果 stdout 被重定向到文件,错误信息仍会显示在终端。这通常是期望的行为,尽管如果需要,stderr 也可以使用 ‘2>’ 操作符进行重定向:

$ ls dkjfnvkjdnf 2> errormsg

命令执行完毕后,名为 dkjfnvkjdnf 的文件无法找到的错误信息将被保存在 errormsg 文件中。

stderrstdout 可以通过 &> 操作符重定向到同一个文件:

$ ls /etc dkjfnvkjdnf &> alloutput

执行完成后,alloutput 文件将包含 /etc 目录内容的列表,以及尝试列出一个不存在的文件时产生的错误信息。

8.10 在 Bash Shell 中使用管道

除了 I/O 重定向外,shell 还允许将一个命令的输出直接通过管道作为另一个命令的输入。管道操作是通过在命令行上的两个或多个命令之间插入 ‘|’ 字符来实现的。例如,要统计系统上正在运行的进程数量,可以将 ps 命令的输出通过管道传递给 wc 命令:

$ ps –ef | wc –l

在命令行上可以执行任意数量的管道操作。例如,要查找一个包含 "Smith" 名字的文件中行数:

$ cat namesfile | grep Smith | wc –l

8.11 配置别名

随着你对 shell 环境的熟练掌握,你可能会发现自己经常使用相同参数的命令。例如,你可能经常使用带有 lt 选项的 ls 命令:

$ ls –lt

为了减少输入命令时的键入量,可以创建一个别名,将命令和参数映射到该别名。例如,要创建一个别名,使得输入字母 l 时执行 ls –lt 命令,可以使用以下语句:

$ alias l="ls –lt"

在命令提示符下输入 l 现在会执行原始语句。

8.12 环境变量

Shell 环境变量提供数据和配置设置的临时存储。Shell 本身会设置一些环境变量,用户可以更改这些变量,以修改 Shell 的行为。可以使用 env 命令获取当前定义的变量列表:

$ env

SSH_CONNECTION=192.168.0.19 61231 192.168.0.28 22

MODULES_RUN_QUARANTINE=LD_LIBRARY_PATH

LANG=en_US.UTF-8

HISTCONTROL=ignoredups

HOSTNAME=-pc.ebookfrenzy.com

XDG_SESSION_ID=15

MODULES_CMD=/usr/share/Modules/libexec/modulecmd.tcl

USER=demo

ENV=/usr/share/Modules/init/profile.sh

SELINUX_ROLE_REQUESTED=

PWD=/home/demo

HOME=/home/demo

SSH_CLIENT=192.168.0.19 61231 22

SELINUX_LEVEL_REQUESTED=

.

.

.

可能最有用的环境变量是 PATH。它定义了 Shell 在命令提示符下输入命令时,会搜索的目录及其顺序。新安装的 CentOS 8 系统上,用户账户的 PATH 环境变量可能会被配置如下:

$ echo $PATH

/home/demo/.local/bin:/home/demo/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

另一个有用的变量是 HOME,它指定当前用户的主目录。例如,如果你希望 Shell 也在主目录中的 scripts 目录中查找命令,可以按如下方式修改 PATH 变量:

$ export PATH=\(PATH:\)HOME/scripts

可以使用 echo 命令显示现有环境变量的当前值:

$ echo $PATH

你可以使用 export 命令创建自己的环境变量。例如:

$ export DATAPATH=/data/files

一个有用的技巧是使用反引号(`)将命令的输出赋值给环境变量。例如,要将当前日期和时间赋值给名为 NOW 的环境变量:

$ export NOW=date

$ echo $NOW

2019 年 4 月 2 日 星期二 13:48:40 EDT

如果每次进入 Shell 环境时需要配置环境变量或别名设置,可以将它们添加到位于主目录中的 .bashrc 文件中。例如,以下示例 .bashrc 文件配置了 DATAPATH 环境变量和一个别名:

第八章:.bashrc

加载全局定义

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

用户特定的环境

PATH="\(HOME/.local/bin:\)HOME/bin:$PATH"

export PATH

如果你不喜欢 systemctl 的自动分页功能,请取消注释以下行:

export SYSTEMD_PAGER=

用户特定的别名和函数

export DATAPATH=/data/files

alias l="ls -lt"

8.13 编写 Shell 脚本

到目前为止,我们一直专注于 Bash shell 的交互性质。所谓交互性,指的是手动在提示符下逐一输入命令并执行。实际上,这只是 shell 能力的一小部分。可以说,shell 最强大的特性之一就是它可以创建 shell 脚本。Shell 脚本本质上是包含一系列语句的文本文件,可以在 shell 环境中执行这些语句以完成任务。除了能够执行命令,shell 还提供了许多编程构造,如 for 和 do 循环、if 语句等,这是你在脚本语言中通常会看到的功能。

不幸的是,关于 shell 脚本的详细概述超出了本章的范围。然而,有许多书籍和网站资源专门讲解 shell 脚本,它们远比我们在这里所能达到的更能公正地讲解这一主题。因此,在本节中,我们只会提供一个非常简单的 shell 脚本介绍。

创建 shell 脚本的第一步是创建一个文件(在本示例中,我们将其命名为 simple.sh),并将以下内容作为第一行添加:

!/bin/sh

! 被称为“shebang”,它是一种特殊的字符序列,表示接下来一项内容是执行脚本所需的解释器的路径(在此示例中是位于 /bin 的 sh 可执行文件)。如果你想使用的是其他解释器,比如 /bin/csh 或 /bin/ksh,这里同样可以写成这样的路径。

下一步是编写一个简单的脚本:

!/bin/sh

for i in *

do

echo $i

done

这个脚本的作用是遍历当前目录中的所有文件,并显示每个文件的名称。可以通过将脚本名称作为参数传递给 sh 来执行它:

$ sh simple.sh

为了使文件可执行(从而无需将其传递给 sh 命令),可以使用 chmod 命令:

$ chmod +x simple.sh

一旦文件的执行位被设置,它就可以直接执行。例如:

$ ./simple.sh

8.14 总结

在《CentOS 8 Essentials》一章中,我们简要浏览了 Bash shell 环境。在图形化桌面环境的世界里,我们很容易忘记操作系统的真正力量和灵活性往往只有通过跳出用户友好的桌面界面,使用 shell 环境才能得到充分发挥。此外,当需要管理和维护没有安装桌面的服务器系统,或者在修复损坏到无法启动桌面或 Cockpit 接口的系统时,对 shell 的熟悉是必不可少的。

Shell 的能力远远超出了本章涵盖的范围。如果你是 Shell 的新手,我们强烈建议你寻找额外的资源。一旦熟悉了这些概念,你会很快发现,在终端窗口中使用 Shell 来执行许多任务比在桌面上浏览菜单和对话框要快得多。

9. 管理 CentOS 8 用户和组

在 CentOS 8 的安装过程中,安装程序创建了一个 root 或超级用户账户,并要求配置密码。安装程序还提供了为系统创建用户账户的机会。我们不应忽视 CentOS 8 实际上是一个企业级、多用户、多任务的操作系统。因此,为了充分发挥 CentOS 8 的功能,可能需要为多个用户提供系统访问权限。每个用户应该有自己的用户账户登录、密码、主目录和权限。

用户进一步被划分为组,以便于管理,这些组可以具有不同级别的权限。例如,你可能有一个会计部门的用户组。在这种环境下,你可能希望创建一个 accounts 组并将所有会计部门的用户分配到该组。

在本章中,我们将介绍如何在 CentOS 8 系统中添加、删除和管理用户和组。管理用户和组有多种方法,最常见的选项是命令行工具和 Cockpit Web 界面。在本章中,我们将讨论这两种方法。

9.1 从命令行管理用户

新用户可以通过命令行使用 useradd 工具添加到 CentOS 8 系统中。要创建新用户账户,请输入类似以下的命令:

第九章:useradd john

默认情况下,这将为用户在/home 目录下创建一个主目录(在此例中为/home/john)。要指定不同的主目录,创建账户时可以使用-d 命令行选项:

useradd -d /users/johnsmith john

一旦账户创建完成,需要使用 passwd 工具设置密码,用户才能登录系统:

passwd john

正在为用户 john 更改密码。

新密码:

重新输入新密码:

passwd: 所有身份验证令牌已成功更新。

可以使用 userdel 工具通过命令行删除现有用户:

userdel john

在删除过程中,也可以将用户的主目录和邮件队列一起删除:

userdel --remove john

CentOS 8 系统上的所有用户都是一个或多个组的成员。默认情况下,新用户会被添加到与用户名相同的私有组(在上述例子中,为用户 john 创建的账户也属于一个名为 john 的私有组)。作为管理员,将用户组织到更合理的组中是有意义的。例如,所有销售人员可能属于一个销售组,而会计人员则可能属于 accounts 组,依此类推。新的组可以通过命令行工具 groupadd 来添加,例如:

groupadd accounts

使用 usermod 工具可以将现有用户从命令行添加到现有组:

usermod -G accounts john

要将现有用户添加到多个现有组,可以使用 -G 选项运行 usermod 命令:

usermod -G accounts,sales,support john

请注意,上述命令会将用户从 -G 后面未列出的所有附加组中移除,但这些组是用户当前的成员。为了保留当前的组成员身份,可以使用 -a 标志来附加新的组成员身份:

usermod -aG accounts,sales,support john

可以使用 groupdel 工具从系统中删除现有组:

groupdel accounts

请注意,如果要删除的组是某个用户的主组或初始组,则无法删除该组。必须先删除该用户,或使用 usermod 命令为该用户分配一个新的主组,然后才能删除该组。可以使用 usermod -g 选项将用户分配到新的主组:

usermod -g sales john

groupdel accounts

要查看某个用户所属的组,只需运行 groups 命令。例如:

$ groups john

john : john accounts support

默认情况下,用户账户无法执行需要超级用户(root)权限的任务,除非他们知道 root 密码。然而,可以配置用户账户,使其能够使用 sudo 命令执行特权任务。这涉及将用户账户添加为 wheel 组的成员,例如:

usermod -aG wheel john

一旦将用户添加到 wheel 组,用户就可以使用 sudo 执行通常受限的任务,操作如下:

$ sudo dnf update

[sudo] demo 的密码:

正在更新订阅管理存储库。

.

.

可以通过编辑 /etc/sudoers 文件并找到以下部分,来修改 wheel 组的 sudo 权限:

允许 wheel 组中的人运行所有命令

%wheel ALL=(ALL) ALL

没有密码的相同操作

%wheel ALL=(ALL) NOPASSWD: ALL

要禁用所有 wheel 组成员的 sudo 权限,可以将第二行注释掉,如下所示:

允许 wheel 组中的人运行所有命令

%wheel ALL=(ALL) ALL

要允许 wheel 组成员在不输入密码的情况下使用 sudo(出于安全原因,不推荐这样做),请取消 sudoers 文件中相应行的注释:

没有密码的相同操作

%wheel ALL=(ALL) NOPASSWD: ALL

值得注意的是,在后台,所有这些命令只是对系统上的 /etc/passwd、/etc/group 和 /etc/shadow 文件进行更改。

9.2 使用 Cockpit 进行用户管理

如果系统上已安装并启用了 Cockpit Web 界面(该主题在名为 “CentOS 8 Cockpit Web 界面概述” 的章节中讲解),则可以在下面显示的帐户屏幕中执行多个用户管理任务:图 9-1:

图 9-1

屏幕将显示系统中现有的用户帐户,并提供一个按钮以添加额外的帐户。要创建新帐户,点击“创建新帐户”按钮,并在弹出的对话框中输入所需的信息(图 9-2)。请注意,也可以选择创建帐户,但将其锁定直到以后:

图 9-2

要修改用户帐户,请从主屏幕中选择该帐户,并对帐户详细信息进行任何修改:

图 9-3

此屏幕允许执行多种任务,包括锁定或解锁帐户、更改密码或强制用户配置新密码。如果选择“服务器管理员”选项,则该用户将被添加到 wheel 组,并允许使用 sudo 执行管理任务。还提供了一个按钮来删除系统中的用户。

如果用户将使用 SSH 密钥加密连接远程访问系统,可以在此屏幕中添加用户的公钥。SSH 访问和身份验证将在“在 CentOS 8 上配置基于 SSH 的身份验证”中进一步讲解。

9.3 总结

作为一款多用户操作系统,CentOS 8 被设计为支持多个用户的受控访问。在安装过程中,创建了 root 用户帐户并为其分配了密码,同时也提供了创建用户帐户的选项。可以使用一组命令行工具或通过 Cockpit Web 界面向系统添加额外的用户帐户。除了用户帐户,Linux 还实现了组的概念。可以使用命令行工具添加新组,并将用户分配到这些组中,每个用户必须至少属于一个组。默认情况下,标准的非 root 用户没有权限执行特权任务。然而,属于特殊 wheel 组的用户可以通过使用 sudo 命令执行特权任务。

10. 理解 CentOS 8 软件安装与管理

新安装的 CentOS 8 系统不太可能包含所有执行其预期任务所需的软件包。即使在安装了所有必需的软件后,许多软件包的更新版本几乎肯定会在系统的生命周期中发布。在某些情况下,你需要确保这些最新的软件包版本被安装,以确保修复任何错误。然而,在其他情况下,可能需要保留某个特定软件包的旧版本,以与其他软件兼容。

本章介绍了 CentOS 8 中软件管理的基本概念,解释了如何处理这些问题,介绍了仓库、软件包和 CentOS 应用流(AppStream)的概念,并探讨了如何列出、安装和移除构成功能正常的 CentOS 8 系统的软件包。

10.1 仓库

Linux 本质上由一组基本包组成,这些包提供了操作系统的核心功能,以及一系列其他包和模块,增加了基于操作系统的功能和特性。

当 CentOS 8 首次安装时,会根据安装阶段选择的软件选项安装若干不同的包。然而,一旦系统运行起来,可以根据需要安装额外的软件。通常,所有 CentOS 8 的软件(即非第三方供应商提供的软件)都会使用 dnf 命令下载并安装到系统中。正如我们在前面的章节中所见,这通常包含在命令提示符下发出类似以下的命令:

dnf install httpd

当发出这样的命令时,请求的软件会从远程仓库下载并安装到本地系统上。默认情况下,CentOS 8 配置为从两个名为 BaseOS 和 AppStream 的仓库下载软件。运行以下命令将提供系统当前配置的用于下载软件的仓库列表:

dnf repolist

上次元数据过期检查:2019 年 11 月 14 日星期四 03:43:07 PM EST,0:01:02 前。

repo id repo name status

AppStream CentOS-8 - AppStream 5,089

BaseOS CentOS-8 - Base 2,843

extras CentOS-8 - Extras 3

google-chrome google-chrome 3

上面的示例显示,AppStream 和 BaseOS 的仓库都已在系统上启用。还需要注意的是,系统可能还会为第三方软件添加仓库,正如上面列出的 Google Chrome 仓库一样。

可以通过在 /etc/dnf/dnf.conf 文件中添加条目,或将 .repo 文件添加到 /etc/yum.repos.d/ 目录来将额外的仓库添加到系统中。或者,也可以使用 dnf config-manager 工具,传递 .repo 文件的 URL 作为命令行参数来添加仓库:

dnf config-manager --add-repo https://url/of/repo/file

10.2 BaseOS 仓库

BaseOS 仓库包含组成操作系统核心功能的包。这些软件元素以 Red Hat 包管理器(RPM)包文件的形式下载,然后安装到系统中。典型的 CentOS 8 系统将安装大约 1500 个 RPM 包。要查看当前系统上已安装的所有 RPM 包,只需运行以下 rpm 命令:

rpm -qa | more

qemu-kvm-block-rbd-2.12.0-41.el8+2104+3e32e6f8.x86_64

kyotocabinet-libs-1.2.76-17.el8.x86_64

cyrus-sasl-scram-2.1.27-0.3rc7.el8.x86_64

curl-7.61.1-5.el8.x86_64

.

.

可以通过如下命令列出来自 BaseOS 仓库的可安装包:

dnf 列表

要获得匹配搜索字符串的软件包列表,可以使用如下 dnf 命令:

dnf 搜索 "搜索字符串"

还可以识别哪个软件包包含特定的文件:

dnf 提供文件名

例如:

dnf 提供 /etc/httpd/conf/httpd.conf

最后一次元数据过期检查:2019 年 11 月 14 日星期四 03:43:07 PM EST,0 小时 03 分钟 03 秒前。

httpd-2.4.37-12.module_el8.0.0+185+5908b0db.x86_64 : Apache HTTP Server

仓库:AppStream

匹配来自:

文件名:/etc/httpd/conf/httpd.conf

要安装一个软件包,请运行以下命令:

dnf 安装软件包名

同样地,要删除一个软件包:

dnf 删除软件包名

当新的 BaseOS 包版本发布时,系统下次更新时会下载并安装它,通常通过 dnf 命令:

dnf 更新

任何更新过的包将替换系统中当前安装的旧版本。虽然在处理基础操作系统包时,这通常是理想的情况,但在处理其他软件包(如编程环境或开发库)时,这种行为不一定是期望的,因为升级到新版本可能会导致与系统中已安装的其他包不兼容。这个问题通过 AppStream 仓库来解决。

10.3 AppStream 仓库

AppStream 仓库按软件包、模块、流和配置文件来管理软件。AppStream 包仍然是 RPM 包,如前面描述 BaseOS 部分所述。另一方面,AppStream 模块是属于一组相关或存在依赖关系的软件包(例如,构建 Web 服务器时需要一起安装的软件包组)。每个模块可以有多个流,每个模块流代表软件模块的不同版本。

例如,考虑一个 CentOS 8 系统,它托管了一个依赖 PHP 脚本语言 7.1 版本的网站。该服务器仍然需要接收 PHP 7.1 的任何更新,以便从补丁和 bug 修复中获益,但与 PHP 的最新版本(7.2 版本)不兼容。在引入 AppStream 之前,当新版本发布时,要继续接收 7.1 版本的更新是困难的。

为了解决这个问题,CentOS 软件管理工具可以使用 AppStream 仓库,只订阅特定模块的特定流(在此案例中为 PHP 模块的版本 7.1 流)。

除了流,模块还可以按模块配置文件进行子类化。模块配置文件提供了不同的包配置,这些包将根据系统的需求安装。以 nodejs JavaScript 运行时环境模块为例,可以通过开发版或最小化配置文件进行安装。在进行 nodejs 开发的系统上,很可能使用开发版配置文件。开发使用 nodejs 的软件在部署时,可能只会安装包含运行时环境的最小系统。

要查看可安装的模块列表,可以使用如下 dnf 命令:

dnf module list

CentOS-8 - AppStream

名称 流 配置文件 概述

389-ds 1.4 默认 389 目录服务器(基础)

App-cpanminus 1.7044 [d] 默认 [d] 获取、解压、构建并安装 CPAN 模块

DBD-MySQL 4.046 [d] 默认 [d] 一个 MySQL 接口用于 Perl

DBD-Pg 3.7 [d] 默认 [d] 一个 PostgreSQL 接口用于 Perl

DBD-SQLite 1.58 [d] 默认 [d] SQLite DBI 驱动

DBI 1.641 [d] 默认 [d] 一个数据库访问 API 用于 Perl

YAML 1.24 [d] 默认 [d] Perl 的 YAML 解析器

.

.

.

提示: [d]efault, [e]nabled, [x]disabled, [i]nstalled

列表中的第一列是模块名称,第二列是流名称(通常是模块的版本)。流名称后的字母表示该流是否为默认流(即如果没有引用特定流,则使用此流进行安装)或是否在执行安装时启用。第三列列出了可用于相应包的配置文件,并指明该配置文件是默认的、已安装的还是已禁用的。

查看特定模块信息的 dnf 命令结构如下:

dnf module list modulename

以下输出示例列出了可安装的 PHP 模块信息:

dnf module list php

.

.

名称 流 配置文件 概述

php 7.1 开发版,最小化,默认 [d] PHP 脚本语言

php 7.2 [d] 开发版,最小化,默认 [d] PHP 脚本语言

显然,版本 7.2 会在系统中默认安装,并且该模块在开发版、默认和最小化配置文件中可用。

要使用默认流和配置文件安装模块,可以使用以下语法的 dnf 命令:

dnf install @modulename

例如:

dnf install @php

或者,可以指定一个流来执行安装:

dnf install @modulename:stream

例如:

dnf install @php:7.2

最后,配置文件也可以按如下方式声明:

dnf install @modulename:stream/profile

例如,要安装 PHP 7.2 的最小软件包集:

dnf install @php:7.2/minimal

执行上述命令后,PHP 模块将按如下方式列出:

php 7.1 [e] 开发版,最小化 [i],默认 [d] PHP 脚本语言

php 7.2 [d][e] common [d], devel, minimal [i] PHP 脚本语言

“[e]” 指示符在流列中告诉我们,7.2 流已被启用,而 “[i]” 在配置文件列中显示该模块已使用最小配置文件进行安装。

要启用一个流而不安装模块,请使用以下 dnf 命令:

dnf module enable modulename

同样,流也可以如下禁用:

dnf module disable modulename

要卸载一个模块,请使用以下语法:

dnf module remove modulename

可以使用以下 dnf 命令来识别有关模块的附加信息:

dnf module info modulename

要找出组成特定模块和流组合的不同配置文件的 RPM 包,请使用 dnf,如下所示:

dnf module info --profile modulename:stream

例如:

dnf module info --profile php:7.2

上次元数据过期检查:2019 年 11 月 14 日星期四下午 04:31:25 EST,已过去 0:02:11。

名称 : php:7.2:8000020190628155007:ad195792:x86_64

common : php-cli

php-common

php-fpm

php-json

php-mbstring

php-xml

devel : libzip

php-cli

php-common

php-devel

php-fpm

php-json

php-mbstring

php-pear

php-pecl-zip

php-process

php-xml

minimal : php-cli

php-common

最后,要从一个模块流切换到另一个模块流,只需运行以下安装命令,引用新的流:

dnf install @modulename:otherstream

该命令将下载新流的包,并将现有包升级或降级到指定版本。一旦此过程完成,重新同步新流的模块包:

dnf distro-sync

10.4 摘要

CentOS 8 系统由 RPM 格式的软件包组成,这些包是从 CentOS BaseOS 和 AppStream 仓库下载并安装的。根据需要,可以向系统中添加其他仓库以安装包。

BaseOS 仓库包含实现操作系统基本核心功能的包。而 AppStream 包提供额外的功能和特性,这些包将根据系统配置的目的进行选择性安装。在这种复杂的系统中,可能会有大量的包之间的相互依赖关系,其中系统的某些部分可能需要另一个软件包的特定版本才能正常运行。AppStreams 允许创建包含所有必要依赖包的模块和配置文件,确保将特定功能与正确版本的包一起安装。AppStreams 还允许已安装的包在不需要下载下一个主要版本的情况下接收当前版本的更新,从而避免破坏其他包的依赖关系。

  1. 配置 CentOS 8 systemd 单元

为了熟练掌握 CentOS 8 系统管理,了解 systemd 单元的概念非常重要,特别是要重点了解两种特定类型的单元:目标和服务。因此,本章的目标是提供一个关于 CentOS 8 支持的不同 systemd 单元的基本概述,并介绍如何配置运行中的 Linux 系统后台运行的多个服务。

11.1 理解 CentOS 8 systemd 目标

CentOS 8 可以配置为启动到多个状态(称为目标),每个目标旨在提供特定级别的操作系统功能。系统默认启动的目标由系统管理员根据系统用途配置。例如,桌面系统通常会配置为使用图形用户界面目标启动,而基于云的服务器系统更可能启动到多用户目标级别。

在启动过程中,一个名为 systemd 的进程会查看 /etc/systemd/system 文件夹,查找默认的目标设置。在确定默认目标后,它会启动与该目标相关联的 systemd 单元,以便系统启动时所有必要的进程都能运行。

对于熟悉旧版 CentOS 的用户来说,systemd 目标是对旧有运行级别系统的替代。

11.2 理解 CentOS 8 systemd 服务

服务本质上是一个进程,通常在后台运行,提供特定的功能。例如,sshd 服务是一个后台进程(也称为守护进程),提供系统的安全 shell 访问。不同的 systemd 目标会自动启动不同的服务集合,具体取决于该目标提供的功能。

目标和服务是 systemd 单元的类型,本章稍后将详细讲解这一主题。

11.3 CentOS 8 systemd 目标描述

如前所述,CentOS 8 可以启动到多个目标级别之一。系统默认配置的启动目标将决定启动哪些 systemd 单元。与系统启动和关闭相关的目标可以总结如下:

• poweroff.target - 这是系统关闭时的目标。出于显而易见的原因,这不太可能成为默认目标。

• rescue.target – 使系统在单用户模式下启动,此模式下只有 root 用户可以登录。在此模式下,系统不会启动任何网络、图形用户界面或多用户服务。此运行级别非常适合系统管理员执行系统维护或修复工作。

• multi-user.target - 将系统启动到多用户模式,并提供基于文本的控制台登录功能。

• graphical.target - 将系统启动到带有 X Window 系统功能的网络多用户状态。默认情况下,图形桌面环境将在引导过程结束时启动。这是桌面或工作站使用最常见的运行级别。

• reboot.target - 重启系统。由于显而易见的原因,你不太可能将其设置为默认目标。

除上述目标外,系统还包括大约 70 个其他目标,其中许多实际上是由上述主要目标使用的子目标。例如,后台,multi-user.target 还将启动一个名为 basic.target 的目标,它将启动 sockets.target 单元,该单元是不同进程之间通信所必需的。这确保了 multi-user.target 依赖的所有服务在引导过程中也会启动。

可以通过在终端窗口中运行以下命令来查看指定目标所依赖的目标和服务的列表:

第十章:systemctl list-dependencies

图 11-1,例如,显示了 multi-user 目标的部分 systemd 单元依赖项列表(完整列表包含超过 120 个目标和服务,必要时用于完全功能的多用户系统):

图 11-1

列表以层级树的形式呈现,说明某些依赖项有其自己的子依赖项。例如,滚动到列表底部,可以看到多用户目标依赖于两个与网络文件系统相关的目标(即 nfs-client.target 和 remote-fs.target),每个目标都有自己的服务和目标子依赖项:

图 11-2

列表中每个条目左侧的彩色点表示该服务或目标的当前状态,具体如下:

•绿色 - 服务或目标处于活动状态并正在运行。

•白色 - 服务或目标处于非活动状态(死状态)。通常是因为该服务或目标尚未启用,已因某种原因停止,或服务或目标依赖的条件未满足。

•红色 - 服务或目标因致命错误未能启动。

要了解系统 d 单元的更多详细信息,可以使用 systemctl 命令,后跟单元名称,如下所示:

systemctl status systemd-machine-id-commit.service

◉ systemd-machine-id-commit.service - 提交一个暂时的 machine-id 到磁盘

Loaded: loaded (/usr/lib/systemd/system/systemd-machine-id-commit.service; static; vendor preset: disabled)

Active: inactive (dead)

Condition: 启动条件在 2019 年 2 月 14 日星期四 15:27:47 EST 失败;1 小时 14 分钟之前

ConditionPathIsMountPoint=/etc/machine-id 未满足

Docs: man:systemd-machine-id-commit.service(8)

11.4 确定和配置默认目标

CentOS 8 系统的当前默认目标可以使用 systemctl 命令识别,如下所示:

systemctl get-default

multi-user.target

在上述情况下,系统被配置为默认使用 multi-user 目标启动。可以随时使用带有 set-default 选项的 systemctl 命令更改默认设置。以下示例将默认目标更改为在下次系统启动时启动图形用户界面:

systemctl set-default graphical.target

已移除 /etc/systemd/system/default.target。

已创建符号链接 /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target。

默认更改操作的输出显示了系统 ctl 命令在后台执行的步骤,以实现更改。当前默认配置通过在 /etc/systemd/system 中建立指向 /usr/lib/systemd/system 文件夹中相应目标文件的符号链接来实现(在本例中是 graphical.target 文件)。

11.5 理解 systemd 单元及单元类型

如前所述,目标和服务都是 systemd 单元类型。/usr/lib/systemd/system 文件夹中的所有文件都被称为 systemd 单元配置文件,每个文件代表一个 systemd 单元。每个单元又被分类为特定类型的单元。CentOS 8 支持 12 种不同的单元类型,包括本章已涉及的目标和服务单元类型。

单元文件的类型由文件名扩展名表示,详细信息见下表 Table 11-1:

Unit Type Filename Extension 类型描述
Service .service 系统服务。
Target .target systemd 单元组。
Automount .automount 文件系统自动挂载点。
Device .device 内核识别的设备文件。
Mount .mount 文件系统挂载点。
Path .path 文件系统中的文件或目录。
Scope .scope 外部创建的进程。
Slice .slice 层次结构组织的单元组,管理系统进程。
Snapshot .snapshot systemd 管理器的保存状态。
Socket .socket 进程间通信套接字。
Swap .swap 交换设备或交换文件。
Timer .timer systemd 定时器。

Table 11-1

请注意,目标单元类型与其他类型不同,它本质上由一组 systemd 单元(如服务或其他目标)组成。

11.6 动态更改当前目标

上述步骤指定了下次系统启动时将使用的目标,但不会改变当前运行的系统状态。要动态切换到不同的目标,请再次使用 systemctl 命令,这次使用 isolate 选项,后跟目标。举例来说,如果要在不重启的情况下将当前系统切换到图形目标,可以使用以下命令:

systemctl isolate graphical.target

执行后,系统将启动图形桌面环境。

11.7 启用、禁用和屏蔽 systemd 单元

新安装的 CentOS 8 系统将包括基础 systemd 服务单元,但在系统进入生产环境后,可能不会包含系统最终需要的所有服务。例如,基本的 CentOS 8 安装通常不包括运行 Apache Web 服务器所需的包,其中一个关键元素是 httpd.service 单元。

系统管理员将通过以下命令安装必要的 httpd 包来解决此问题:

dnf install httpd

配置完 Web 服务器后,接下来的任务是检查 httpd 服务单元的状态,以确认它是否在安装过程中被激活:

systemctl status httpd.service

httpd.service - Apache HTTP 服务器

已加载:已加载(/usr/lib/systemd/system/httpd.service;禁用;供应商预设:禁用)

活跃:非活动(已停止)

文档:man:httpd.service(8)

请注意,服务已加载,但处于非活动状态,因为供应商预设首次安装时禁用该服务。要启动该服务,可以使用以下命令:

systemctl start httpd.service

状态检查现在会显示服务处于活动状态:

httpd.service - Apache HTTP 服务器

已加载:已加载(/usr/lib/systemd/system/httpd.service;禁用;供应商预设:禁用)

活跃:活动(运行中),自 2019-02-15 11:13:26 EST 起;8 秒前

文档:man:httpd.service(8)

主 PID:10721(httpd)

状态:“已启动,正在监听:端口 80”

任务:213(限制:13923)

内存:24.1M

然而请注意,状态表明该服务仍处于禁用状态。这意味着下次系统重启时,httpd 服务不会自动启动,系统管理员需要手动启动该服务。

若要配置 httpd 服务在每次系统启动时自动启动,必须按如下方式启用:

systemctl enable httpd.service

一旦启用服务,状态输出的已加载部分将显示如下:

已加载:已加载(/usr/lib/systemd/system/httpd.service;已启用;供应商预设:禁用)

既然已启用,下次系统重启到当前目标时,httpd 服务将自动启动。例如,假设在系统运行多用户目标时启用了该服务,那么 httpd 服务将作为另一个依赖项添加到 multi-user.target systemd 单元中。

在后台,systemctl 通过在/etc/systemd/system 文件夹内为目标创建符号链接,将依赖项添加到目标的.wants 文件夹中。例如,multi-user.target 单元在/etc/systemd/system 中有一个名为 multi-user.target.wants 的文件夹,里面包含指向位于/usr/lib/systemd/system 中的所有系统 d 单元的符号链接,这些单元是它的依赖项。查看该文件夹将显示与本章前面介绍的 systemctl list-dependencies 命令列出的依赖项的关联。

要禁用一个服务,使其不再作为目标依赖项自动启动,只需按如下方式禁用它:

systemctl disable httpd.service

此命令将从.wants 目录中删除指向 httpd.service 单元文件的符号链接,使其不再是依赖项,因此在下一次系统启动时不会启动。

.wants 文件夹包含的依赖项,如果不可用,将不会阻止单元启动和运行。必须的依赖项(换句话说,若不可用会导致单元失败的依赖项)应放置在.requires 文件夹中(例如 multi-user.target.requires)。

除了启用和禁用之外,还可以按如下方式屏蔽 systemd 单元:

systemctl mask httpd.service

被屏蔽的 systemd 单元在任何情况下都无法启用、禁用或启动,即使它被列为其他单元的依赖项。实际上,就系统而言,屏蔽的 systemd 单元就像是不存在一样。这在确保无论系统条件如何都永远不会启动该单元时非常有用。恢复对该服务的访问的唯一方法是取消屏蔽它:

systemctl unmask httpd.service

11.8 在 Cockpit 中操作 systemd 单元

除了本章概述的命令行技巧外,还可以通过 Cockpit 的基于 Web 的界面来查看和管理 systemd 单元。假设 Cockpit 已按照“CentOS 8 Cockpit Web 界面概述”一章中的说明安装和设置,通过登录 Cockpit 并在图 11-3 中选择左侧导航面板中的“服务”选项 A,可以访问系统上的 systemd 单元列表:

图 11-3

标记为 B 的按钮将在标记为 C 的主区域显示特定类型的单元,其中每个单元的当前状态列将在状态列中列出。

从列表中选择一个单元将显示详细信息。例如,图 11-4 展示了 httpd.service 实例的详细信息,包括服务日志(A)和菜单选项(B),用于执行任务,如启动、停止、启用/禁用以及屏蔽/取消屏蔽单元。

图 11-4

11.9 总结

新安装的 CentOS 8 系统包含一组基础的 systemd 单元,其中许多在后台运行,为系统提供大部分功能。这些单元按类型分类,其中最常见的是目标和服务。目标单元只是一些其他单元的组合,它们需要一起启动。系统有一个默认的目标单元,定义了每次系统启动时需要启动的其他单元。最常见的目标是将系统引导到多用户模式或图形模式。systemctl 命令行工具提供了一系列选项,用于执行 systemd 单元配置任务,许多选项也可以通过 Cockpit 基于 Web 的界面进行操作。

  1. CentOS 8 网络管理

很难想象一个 CentOS 8 系统没有至少一个网络连接,更难想象这样一个孤立的系统有什么实际用途。事实上,CentOS 8 被设计为提供通过网络和互联网连接的企业级服务。学习如何管理 CentOS 8 系统的一个关键部分是学习如何配置和管理系统上安装的网络接口。

本章旨在概述 CentOS 8 上的网络管理,包括 NetworkManager 服务和工具,以及一些其他实用的工具。

12.1 NetworkManager 简介

NetworkManager 是一个服务和一组专门设计的工具,旨在简化 Linux 系统上的网络配置管理,是 CentOS 8 的默认网络管理服务。

除了在后台运行的服务外,NetworkManager 还包括以下工具:

•nmcli - 一个通过命令行与 NetworkManager 配合使用的工具。这个工具在没有图形环境访问的情况下非常有用,也可以在脚本中使用,以进行网络配置更改。

•nmtui - 一个基本的基于文本的用户界面,用于管理 NetworkManager。此工具可以在任何终端窗口中运行,并允许通过选择菜单和输入数据来进行更改。虽然在执行基本任务时有用,但 nmtui 缺少 nmcli 工具提供的许多功能。

•nm-connection-editor - 一个完整的图形管理工具,提供访问大多数 NetworkManager 配置选项的功能。

•GNOME 设置 - GNOME 桌面设置应用程序的网络屏幕允许执行基本的网络管理任务。

•Cockpit 网络设置 - Cockpit Web 界面的网络屏幕允许执行一系列网络管理任务。

尽管在 CentOS 8 系统上有多种方式管理网络环境,但本章将重点介绍 nmcli 命令。虽然图形工具在您访问桌面环境或启用了 Cockpit 时非常有用,但在只有命令行界面的情况下,理解命令行界面是至关重要的。此外,图形工具(包括 Cockpit)并不包括 nmcli 工具的所有功能。最后,一旦你对 NetworkManager 和 nmcli 有了一定的熟悉,这些技能可以轻松地转化为使用更直观的工具选项。而图形工具选项则不一定如此。例如,如果你只使用过 nm-connection-editor,那么使用 nmcli 会更为困难。

12.2 安装和启用 NetworkManager

NetworkManager 应该在大多数 CentOS 8 安装中默认安装。使用 rpm 命令查看是否需要安装:

第十一章:rpm -q NetworkManager

NetworkManager-1.14.0-14.el8.x86_64

如有必要,可以按以下方式安装软件包:

dnf install NetworkManager

安装完软件包后,需要启用 NetworkManager 守护进程,以便每次系统启动时都能自动启动:

systemctl enable NetworkManager

最后,启动服务并检查状态,以验证启动是否成功:

systemctl start NetworkManager

systemctl status NetworkManager

● NetworkManager.service - 网络管理器

已加载:已加载 (/usr/lib/systemd/system/NetworkManager.service; 已启用; vendor >

Drop-In: /usr/lib/systemd/system/NetworkManager.service.d

└─NetworkManager-ovs.conf

激活状态:激活(运行中)自 2019-04-09 10:07:22 EDT 起; 2 小时 48 分钟前

.

.

12.3 基本的 nmcli 命令

nmcli 命令已作为 NetworkManager 包的一部分安装,并且可以通过命令行使用以下语法执行:

nmcli [选项] 对象

在上述语法中,对象将是 general、networking、radio、connection、monitor、device 或 agent 中的一个,可以将其缩写为该词的几个字母(例如,connection 可缩写为 con,甚至只用字母 c)。例如,以下所有命令都会输出与设备对象相关的帮助信息:

nmcli device help

nmcli dev help

nmcli d help

要检查系统上 NetworkManager 的整体状态,请使用以下命令:

nmcli general status

状态 连接性 WIFI 硬件 WIFI WWAN 硬件 WWAN

已连接 完全启用 启用 启用 启用 启用

要检查系统上安装的设备状态,可以使用以下命令:

nmcli dev status

设备 类型 状态 连接

eno1 以太网 已连接 eno1

wlp0s26u1u2 wifi 已连接 zoneone

virbr0 桥接 已连接 virbr0

lo 回环 未管理 --

virbr0-nic tun 未管理 --

输出结果还可以通过使用 -p(pretty)选项进行修改,使输出更具人性化:

nmcli -p dev status

=====================

设备状态

=====================

设备 类型 状态 连接


eno1 以太网 已连接 eno1

wlp0s26u1u2 wifi 已连接 zoneone

virbr0 桥接 已连接 virbr0

lo 回环 未管理 --

virbr0-nic tun 未管理 --

相反,可以使用 -t 选项使输出更简洁,适合自动处理:

nmcli -t dev status

eno1:以太网:已连接:eno1

wlp0s26u1u2:wifi:已连接:emilyzone

virbr0:桥接:已连接:virbr0

lo:回环:未管理:

virbr0-nic:tun:未管理:

从状态输出中,我们可以看到系统已安装两台物理设备,一台为以太网,另一台为 Wi-Fi 设备。

桥接(virbr)条目是用于为虚拟机提供网络的虚拟设备(虚拟化技术概述章节将进行讨论,该章节名为“虚拟化技术概述”)。回环接口是一种特殊的虚拟设备,允许系统与自身通信,通常用于进行网络诊断。

在使用 NetworkManager 时,了解设备和连接之间的区别非常重要。如上所述,设备可以是物理或虚拟网络设备,而连接是设备连接到的网络配置。

以下命令显示了系统上配置的连接的信息:

nmcli con show

名称 UUID 类型 设备

zoneone 2abecafa-4ea2-47f6-b20f-4fb0c0fd5e94 wifi wlp0s26u1u2

eno1 99d40009-6bb1-4182-baad-a103941c90ff ethernet eno1

virbr0 e13e9552-1765-42d1-b739-ff981668fbee bridge virbr0

zonetwo f940a2d1-8c18-4a9e-bf29-817702429b8a wifi --

zonethree fd65c5e5-3e92-4e9e-b924-1b0b07b70032 wifi --

从上述输出中,我们可以看到 Wi-Fi 设备(wlp0s26u1u2)连接到名为 zoneone 的无线网络,而以太网设备(eno1)连接到名为 eno1 的连接。除了 zoneone,NetworkManager 还列出了另外两个名为 zonetwo 和 zonethree 的 Wi-Fi 连接,目前都没有设备连接。

要查找分配给连接的 IP 地址,可以使用 ip 工具加上 address 选项:

ip address

这也可以简写为:

ip a

.

.

3: wlp0s26u1u2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether 74:da:38:ee:be:50 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.121/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp0s26u1u2

valid_lft 57584 秒 preferred_lft 57584 秒

.

.

ip 命令将输出系统检测到的所有设备的信息。上述输出显示,Wi-Fi 设备已被分配 IP 地址 192.168.1.121。

如果我们只想列出活动连接,可以使用 nmcli 命令加上 -a 选项:

nmcli con show -a

名称 UUID 类型 设备

emilyzone 2abecafa-4ea2-47f6-b20f-4fb0c0fd5e94 wifi wlp0s26u1u2

eno1 99d40009-6bb1-4182-baad-a103941c90ff ethernet eno1

virbr0 e13e9552-1765-42d1-b739-ff981668fbee bridge virbr0

要将 Wi-Fi 设备连接从 zoneone 切换到 zonetwo,可以运行以下命令:

nmcli device wifi connect zonetwo -ask

密码:

-ask 标志会导致 nmcli 提示用户输入 Wi-Fi 网络的密码。要在命令行中包含 Wi-Fi 密码(特别是如果命令在脚本中执行时),请使用 password 选项:

nmcli device wifi connect zonetwo password

nmcli 工具也可以用来扫描可用的 Wi-Fi 网络,如下所示:

nmcli device wifi list

IN-USE SSID MODE CHAN RATE SIGNAL BARS SECURITY

zoneone Infra 6 195 Mbit/s 80 WPA2

  • zonetwo Infra 11 130 Mbit/s 74 WPA1 WPA2

当前激活的连接可以通过以下方式停用:

nmcli con down <连接名称>

同样,任何时候都可以重新激活一个非活动连接:

nmcli con up <连接名称>

当连接被停用时,NetworkManager 会自动搜索另一个连接,激活该连接并将其分配给先前建立连接的设备。为了防止在这种情况下使用某个连接,可以通过以下方式禁用自动连接选项:

nmcli con mod <连接名称> connection.autoconnect no

以下命令可用于获取有关特定连接的更多信息。这包括所有连接属性的当前值:

nmcli con show eno1

connection.id: eno1

connection.uuid: 99d40009-6bb1-4182-baad-a103941c90ff

connection.stable-id: --

connection.type: 802-3-ethernet

connection.interface-name: eno1

connection.autoconnect: yes

connection.autoconnect-priority: 0

connection.autoconnect-retries: -1(默认值)

connection.multi-connect: 0(默认值)

connection.auth-retries: -1

connection.timestamp: 1554833695

connection.read-only: no

connection.permissions: --

connection.zone: --

connection.master: --

connection.slave-type: --

connection.autoconnect-slaves: -1(默认值)

.

.

.

所有这些属性都可以使用 nmcli 的 modify 选项进行修改,语法如下:

nmcli con mod <连接名称> connection.<属性名称> <设置>

12.4 使用连接配置文件

到目前为止,我们已经探讨了如何使用连接,但尚未解释如何配置连接。连接的配置被称为连接配置文件,并存储在 /etc/sysconfig/network-scripts 目录中的一个文件中,该文件的内容可能如下所示:

ls /etc/sysconfig/network-scripts

ifcfg-zoneone ifcfg-eno1 ifdown-ppp

ifcfg-zonethree ifcfg-zonetwo ifup-ppp keys-zonethree

keys-zoneone keys-zonetwo

每个以 ifcg- 为前缀的文件都是一个接口配置文件,包含相应连接的连接配置文件,而 key- 文件则包含 Wi-Fi 连接的密码。

例如,考虑 ifcfg-eno1 文件的内容:

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

NAME=eno1

UUID=99d40009-6bb1-4182-baad-a103941c90ff

DEVICE=eno1

ONBOOT=yes

BOOTPROTO=dhcp

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

该文件包含有关连接的基本信息,包括设备类型(以太网)以及当前分配的设备(eno1),并且该连接将在系统启动时自动激活,并通过 DHCP 获取 IP 地址。通过修改此文件并指示 nmcli 重新加载连接配置文件,可以实现对连接配置文件的更改:

nmcli con reload

新的连接配置文件也可以通过 nmcli 手动创建或自动生成。例如,假设系统中安装了新的网络设备。当发生这种情况时,NetworkManager 服务会检测到新硬件并为其创建一个设备。在以下示例中,新设备已被分配了名称 eno2:

nmcli dev status

DEVICE TYPE STATE CONNECTION

en01 以太网已连接 eno1

eno2 以太网已连接 有线连接 1

NetworkManager 自动检测到设备,激活了它并将其分配到名为“有线连接 1”的连接上。这是一个默认连接,我们无法对其进行配置控制,因为在/etc/sysconfig/network-scripts 中没有该接口的配置文件。接下来的步骤是删除“有线连接 1”连接,并使用 nmcli 创建一个新的连接并将其分配给设备。删除连接的命令如下:

nmcli con delete "有线连接 1"

接下来,可以使用 nmcli 创建一个新的连接配置文件,该配置文件可以使用静态 IP 地址,或者通过 DHCP 服务器获取动态 IP 地址。要创建一个名为 dyn_ip 的动态连接配置文件,可以使用以下命令:

nmcli connection add type ethernet con-name dyn_ip ifname eno2

连接‘dyn_ip’(160d9e10-bbc8-439a-9c47-a2ec52990472)成功添加。

要创建一个新的连接配置文件,而不将其锁定到特定设备,只需在命令中省略 ifname 选项:

nmcli connection add type ethernet con-name dyn_ip

创建连接后,一个名为 ifcg-dyn_ip 的文件将被添加到/etc/sysconfig/network-scripts 目录中。

或者,要创建一个名为 static_ip 的连接并分配静态 IP 地址(此例中为 192.168.1.200),可以使用以下命令:

nmcli con add type ethernet con-name static_ip ifname eno0 ip4 192.168.1.200/24 gw4 192.168.1.1

连接‘static_ip’(3fccafb3-e761-4271-b310-ad0f28ee8606)成功添加。

对应的 ifcg-static_ip 文件内容如下所示:

TYPE=Ethernet

PROXY_METHOD=none

BROWSER_ONLY=no

BOOTPROTO=none

IPADDR=192.168.1.200

PREFIX=24

GATEWAY=192.168.1.1

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=static_ip

UUID=3fccafb3-e761-4271-b310-ad0f28ee8606

DEVICE=eno2

ONBOOT=yes

添加新连接的命令可以稍微修改,以便同时分配 IPv4 和 IPv6 静态地址:

nmcli con add type ethernet con-name static_ip ifname eno0 ip4 192.168.1.200/24 gw4 192.168.1.1 gw4 192.168.1.1 ip6 cabf::4532 gw6 2010:dfa::1

12.5 交互式编辑

除了使用 nmcli 带有命令行选项外,该工具还包括一个交互模式,可以用于创建和修改连接配置文件。例如,以下记录展示了使用交互模式创建一个名为 demo_con 的新以太网连接:

nmcli con edit

有效的连接类型:6lowpan,802-11-olpc-mesh(olpc-mesh),802-11-wireless(wifi),802-3-ethernet(以太网),adsl,蓝牙,bond,桥接,cdma,dummy,generic,gsm,infiniband,ip-tunnel,macsec,macvlan,ovs-bridge,ovs-interface,ovs-port,pppoe,team,tun,vlan,vpn,vxlan,wimax,wpan,bond-slave,bridge-slave,team-slave

输入连接类型:以太网

=| nmcli 交互式连接编辑器 |=

添加一个新的 ‘802-3-ethernet’ 连接

输入 'help' 或 '?' 获取可用命令。

输入 'print' 显示所有连接属性。

输入 ‘describe [.]’ 查看详细属性描述。

您可以编辑以下设置:连接,802-3-ethernet(以太网),802-1x,dcb,sriov,ethtool,match,ipv4,ipv6,tc,代理

nmcli> 设置 connection.id demo_con

nmcli> 设置 connection.interface eno1

nmcli> 设置 connection.autoconnect yes

nmcli> 设置 ipv4.method 自动

nmcli> 设置 802-3-ethernet.mtu 自动

nmcli> 设置 ipv6.method 自动

nmcli> 保存

保存连接并设置 ‘autoconnect=yes’。这可能会导致连接立即激活。

您是否仍希望保存?(是/否)[是] 是

连接 ‘demo_con’ (cb837408-6c6f-4572-9548-4932f88b9275) 已成功保存。

nmcli> 退出

以下记录修改了先前创建的 static_ip 连接配置文件,使用不同于原始指定的静态 IP 地址:

nmcli con 编辑 static_ip

=| nmcli 交互式连接编辑器 |=

编辑现有的 '802-3-ethernet' 连接:'static_ip'

输入 'help' 或 '?' 获取可用命令。

输入 'print' 显示所有连接属性。

输入 'describe [.]' 查看详细属性描述。

您可以编辑以下设置:连接,802-3-ethernet(以太网),802-1x,dcb,sriov,ethtool,match,ipv4,ipv6,tc,代理

nmcli> 打印 ipv4.addresses

ipv4.addresses: 192.168.1.200/24

nmcli> 设置 ipv4.addresses 192.168.1.201/24

nmcli> 保存

连接 'static_ip' (3fccafb3-e761-4271-b310-ad0f28ee8606) 已成功更新。

nmcli> 退出

修改现有连接后,请记得指示 NetworkManager 重新加载配置文件:

nmcli con 重新加载

在使用交互模式时,了解有一个丰富的内置帮助系统可以帮助你学习如何使用该工具是非常有用的。帮助主题可以通过在 nmcli > 提示符下输入 help 或 ? 来访问:

nmcli> ?


---[ 主菜单 ]---

转到 [ | ] :: 转到某个设置或属性

移除 [.] | :: 移除设置或重置属性值

设置 [. ] :: 设置属性值

描述 [.] :: 描述属性

打印 [all | [.]] :: 打印连接

验证 [all | fix] :: 验证连接

保存 [persistent|temporary] :: 保存连接

激活 [] [/|] :: 激活连接

返回 :: 向上一层返回 (back)

help/? [] :: 打印帮助信息

nmcli :: nmcli 配置

quit :: 退出 nmcli


12.6 配置 NetworkManager 权限

除了简化 CentOS 8 上的网络管理,NetworkManager 还允许为连接指定权限。例如,以下命令将连接配置文件限制为 root 用户和名为 john 和 caitlyn 的用户帐户:

nmcli con mod static_ip connection.permissions user:root,john,caitlyn

一旦 NetworkManager 重新加载了连接配置文件,静态 _ip 连接仅在至少有一个指定用户登录到系统的活跃会话时才会处于活动状态并可供其他用户访问。只要最后一个用户注销,连接将会断开并保持不活跃,直到其中一个用户重新登录。

此外,只有具有权限的用户才能更改连接状态或配置。

12.7 总结

CentOS 8 上的网络管理由 NetworkManager 服务处理。NetworkManager 将网络视为由网络接口设备和连接组成。网络设备可以是物理以太网或 Wi-Fi 设备,或是虚拟机客户机使用的虚拟设备。连接表示设备连接的网络,并通过连接配置文件进行配置。配置文件将定义连接是否具有静态或动态 IP 地址、网络使用的任何网关的 IP 地址,以及系统启动时是否自动建立连接。

NetworkManager 可以使用多种工具进行管理,包括 nmcli 和 nmtui 命令行工具、nm-connection-editor 图形工具以及 Cockpit 网络设置界面。通常,nmcli 命令行工具提供了最多的功能和灵活性。

  1. 基本的 CentOS 8 防火墙配置与 firewalld

防火墙是保护计算机系统或计算机网络免受外部攻击(通常是通过互联网连接的外部来源)至关重要的组成部分。任何直接连接到互联网的计算机都必须运行防火墙以防止恶意活动。类似地,任何内部网络必须在与外部互联网连接之间安装某种形式的防火墙。

所有 Linux 发行版都提供某种形式的防火墙解决方案。在 CentOS 8 中,防火墙解决方案以一个名为 firewalld 的服务形式提供。

虽然防火墙配置的话题可能比较复杂,但幸运的是 CentOS 8 提供了命令行、基于 Web 的以及图形化工具来简化防火墙配置过程。本章将介绍 firewalld 的基本概念,并涵盖使用操作系统提供的工具配置防火墙的必要步骤。

13.1 firewalld 简介

firewalld 服务使用一套规则来控制进入的网络流量,并定义哪些流量应该被阻止,哪些流量可以通过系统。它建立在一个更复杂的防火墙工具 iptables 之上。

firewalld 系统提供了一种灵活的方式来管理进入流量。例如,可以配置防火墙阻止来自特定外部 IP 地址的流量,或者阻止所有到达特定 TCP/IP 端口的流量。还可以定义规则,将进入的流量转发到不同的系统,或者充当互联网网关来保护网络上的其他计算机。

按照常见的安全实践,默认的 firewalld 安装会配置为阻止所有访问,除了 SSH 远程登录和系统用于获取动态 IP 地址的 DHCP 服务(这两者对系统管理员在完成安装后能够访问系统是至关重要的)。

CentOS 8 上防火墙配置的关键元素包括区域(zones)、接口(interfaces)、服务(services)和端口(ports)。

13.1.1 区域

默认情况下,firewalld 安装时会包含一系列预配置的区域。区域是一组可以随时应用于系统的预配置规则,用于快速实现特定场景下的防火墙配置。例如,block 区域会阻止所有进入流量,而 home 区域则假设系统运行在一个更安全的环境中,因此会施加较少的严格规则,并期望有更高的信任级别。新区域可以添加到系统中,现有区域可以修改以添加或移除规则。区域也可以完全从系统中删除。表 13-1 列出了 CentOS 8 系统默认提供的区域集:

区域 描述
drop 最安全的区域。仅允许传出连接,所有传入连接都会被丢弃,并且不会向连接的客户端发送任何通知。
block 类似于丢弃区,不同之处在于,传入连接会被 icmp-host-prohibited 或 icmp6-adm-prohibited 通知拒绝。
public 当连接到公共网络或互联网,且其他计算机不被认为是可信的时使用。允许选择性地接受传入连接。
external 当系统充当网络中计算机的互联网网关时,外部区域应用于连接到互联网的接口。本区域与内部区域一起使用,用于实现伪装或网络地址转换(NAT),如本章后续部分所述。允许选择性地接受传入连接。
internal 与外部区域一起使用,并应用于连接到内部网络的接口。假设内部网络中的计算机是可信的。允许选择性地接受传入连接。
dmz 当系统运行在隔离区(DMZ)时使用。这些通常是可以公开访问但与内部网络其他部分隔离的计算机。允许选择性地接受传入连接。
work 当在工作环境中的网络上运行系统,且其他计算机被信任时使用。允许选择性地接受传入连接。
home 当在家庭网络中运行系统,且其他计算机被信任时使用。允许选择性地接受传入连接。
trusted 最不安全的区域。所有传入连接都会被接受。

表 13-1

13.1.2 接口

任何连接到互联网或网络(或两者)的 CentOS 8 系统都会包含至少一个接口,可能是物理的或虚拟的网络设备。当 firewalld 处于活动状态时,这些接口中的每一个都会分配到一个区域,从而允许为不同的接口分配不同级别的防火墙安全。考虑一台包含两个接口的服务器,一个接口连接到外部互联网,另一个接口连接到内部网络。在这种情况下,面向外部的接口很可能会分配到更严格的外部区域,而内部接口可能会使用内部区域。

13.1.3 服务

TCP/IP 定义了一组在标准端口上进行通信的服务。例如,安全的 HTTPS web 连接使用端口 443,而 SMTP 邮件服务使用端口 25。为了选择性地启用特定服务的传入流量,可以向区域添加 firewalld 规则。例如,home 区域默认不允许传入 HTTPS 连接。可以通过向区域添加规则来启用此流量,从而无需引用特定端口号即可允许传入 HTTPS 连接。

13.1.4 端口

尽管可以在添加 firewalld 规则时引用常见的 TCP/IP 服务,但会出现需要在未分配给服务的特定端口上允许传入连接的情况。这可以通过添加引用特定端口的规则来实现,而不是服务。这种技术在名为 “CentOS 8 Cockpit Web 界面概述” 的章节中使用,当时打开了 9090 端口以允许访问 Cockpit Web 界面。

13.2 检查 firewalld 状态

firewalld 服务在所有 CentOS 8 安装中默认已安装并启用。可以通过以下命令检查服务的状态:

第十二章:systemctl status firewalld

firewalld.service - firewalld - 动态防火墙守护进程

已加载:已加载 (/usr/lib/systemd/system/firewalld.service; 启用; 供应商预设:启用)

活动状态:活动(运行中),自 2019-02-14 14:24:31 EST 起;3 天前

文档:man:firewalld(1)

主 PID:816 (firewalld)

任务:2(限制:25026)

内存:30.6M

CGroup: /system.slice/firewalld.service

816 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

如果需要,可以按照以下方式安装 firewalld 服务:

dnf 安装 firewalld

firewalld 服务默认启用,因此在安装完成后以及每次系统启动时都会自动启动。

13.3 使用 firewall-cmd 配置防火墙规则

firewall-cmd 命令行工具允许查看 firewalld 配置的信息,并从终端窗口中更改区域和规则。

在更改防火墙设置时,重要的是要理解运行时配置和永久配置的概念。默认情况下,任何规则更改都被视为运行时配置更改。这意味着,虽然更改会立即生效,但它们将在系统下次重启或 firewalld 服务重新加载时丢失,例如通过执行以下命令:

firewall-cmd --reload

要使更改永久生效,必须使用 --permanent 命令行选项。永久更改不会立即生效,直到 firewalld 服务重新加载,但会保持有效,直到手动更改。

13.3.1 确定和更改默认区域

要识别默认区域(换句话说,所有接口将在没有特别选择其他区域时分配到该区域),可以使用 firewall-cmd 工具,如下所示:

firewall-cmd --get-default-zone

public

要将默认设置更改为其他区域:

firewall-cmd --set-default-zone=home

成功

13.3.2 显示区域信息

列出系统上所有可用的区域:

firewall-cmd --get-zones

block dmz drop external home internal libvirt public trusted work

获取当前活动区域的列表,并查看它们分配的接口,如下所示:

firewall-cmd --get-active-zones

external

网络接口:eth0

internal

网络接口:eth1

可以通过以下方式列出当前为特定区域配置的所有规则:

firewall-cmd --zone=home --list-all

home (active)

target: default

icmp-block-inversion: no

interfaces: eth0

sources:

services: cockpit dhcpv6-client http mdns samba-client ssh

ports:

protocols:

masquerade: no

forward-ports:

source-ports:

icmp-blocks:

rich rules:

使用以下命令列出当前可用于包含在 firewalld 规则中的服务:

firewall-cmd --get-services

RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine cockpit ...

要列出当前为某个区域启用的服务:

firewall-cmd --zone=public --list-services

cockpit dhcpv6-client ssh

可以通过以下方式获取端口规则列表:

firewall-cmd --zone=public --list-ports

9090/tcp

13.3.3 添加和移除区域服务

要向区域添加服务,在本例中将 HTTPS 添加到公共区域,可使用以下命令:

firewall-cmd --zone=public --add-service=https

success

默认情况下,这是一个运行时更改,因此添加的规则将在系统重启后丢失。要永久添加服务,以便下次系统重启时生效,请使用 --permanent 标志:

firewall-cmd --zone=public --permanent --add-service=https

success

要验证某个服务是否已永久添加,确保在请求服务列表时包含 --permanent 标志:

firewall-cmd --zone=public --permanent --list-services

cockpit dhcpv6-client http https ssh

请注意,作为永久更改,此新规则将直到系统重启或 firewalld 重新加载后才会生效:

firewall-cmd --reload

使用 --remove-service 选项从区域中移除服务。由于这是一个运行时更改,因此规则将在系统重启后重新应用:

firewall-cmd --zone=public --remove-service=https

要永久移除服务,请使用 --permanent 标志,并记得在更改需要立即生效时重新加载 firewalld:

firewall-cmd --zone=public --permanent --remove-service=https

13.3.4 使用基于端口的规则

要启用特定端口,请使用 --add-port 选项。请注意,在手动定义端口时,需要提供端口号和协议(TCP 或 UDP):

firewall-cmd --zone=public --permanent --add-port=5000/tcp

也可以在向区域添加规则时指定端口范围:

firewall-cmd --zone=public --permanent --add-port=5900-5999/udp

13.3.5 创建新区域

可以通过运行以下命令创建一个全新的区域。创建后,可以像管理任何预定义区域一样管理该区域:

firewall-cmd --permanent --new-zone=myoffice

success

在添加新区域后,需要重新启动 firewalld 才能使区域生效:

firewall-cmd --reload

success

13.3.6 更改区域/接口分配

如前所述,系统上的每个接口必须分配到一个区域。可以使用 firewall-cmd 工具更改接口的区域分配。在以下示例中,eth0 接口被分配到公共区域:

firewall-cmd --zone=public --change-interface=eth0

成功

13.3.7 伪装

伪装(Masquerading)在网络管理领域更为人熟知,它也叫做网络地址转换(NAT)。当使用 CentOS 8 系统作为网络内计算机的互联网网关时,伪装允许所有内部系统在通过互联网通信时使用该 CentOS 8 系统的 IP 地址。这有助于隐藏内部系统的 IP 地址,避免恶意外部实体的攻击,并且还避免了为网络上每台计算机分配公共 IP 地址的需要。

使用以下命令检查防火墙上是否已经启用伪装:

firewall-cmd --zone=external --query-masquerade

使用以下命令启用伪装(如果需要永久更改,记得使用 --permanent 标志):

firewall-cmd --zone=external --add-masquerade

13.3.8 添加 ICMP 规则

网络控制消息协议(ICMP)用于网络中的客户端系统之间发送信息,如错误消息。它也是 ping 命令的基础,网络管理员和用户都使用该命令来检测特定客户端是否在线。ICMP 类别允许阻止特定的 ICMP 消息类型。例如,管理员可能会选择阻止传入的 ping(回显请求)ICMP 消息,以防止基于 ping 的拒绝服务(DoS)攻击(即服务器被恶意发送大量 ping 消息,导致其无法响应合法请求)。

要查看 firewalld 规则中可包含的 ICMP 类型,请运行以下命令:

firewall-cmd --get-icmptypes

address-unreachable bad-header beyond-scope communication-prohibited destination-unreachable echo-reply ...

以下命令例如,永久添加一条规则,用于阻止公共区域的回显应答(ping 请求)消息:

firewall-cmd --zone=public --permanent --add-icmp-block=echo-reply

13.3.9 实现端口转发

端口转发与伪装一起使用,当 CentOS 8 系统作为内部计算机网络的互联网网关时。端口转发允许通过互联网到达防火墙的特定端口的流量被转发到内部网络中的特定系统。这可以通过以下示例来更好地说明。

假设 CentOS 8 系统作为内部计算机网络的防火墙,并且网络中的一台系统被配置为 Web 服务器。假设该 Web 服务器系统的 IP 地址为 192.168.2.20。托管在该系统上的网站的域名记录配置了位于 CentOS 8 防火墙系统后面的公共 IP 地址。当一个 HTTP 网页请求到达端口 80 时,作为防火墙的 CentOS 8 系统需要知道如何处理它。通过配置端口转发,可以将所有 Web 流量定向到托管 Web 服务器的内部系统(在此案例中为 IP 地址 192.168.2.20),可以继续使用端口 80,或将流量重定向到目标服务器的不同端口。实际上,端口转发甚至可以配置为将流量转发到与防火墙相同系统上的不同端口(这种概念称为本地转发)。

要使用端口转发,首先启用伪装,如下所示(此处假设连接到互联网的接口已被分配到外部区域):

firewall-cmd --zone=external --add-masquerade

要将端口转发到不同的本地端口,可以使用类似于以下的命令:

firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2750

在上面的例子中,任何到达端口 22 的 TCP 流量都将被转发到本地系统的端口 2750。另一方面,以下命令将本地系统的端口 20 转发到 IP 地址为 192.168.0.19 的系统上的端口 22:

firewall-cmd --zone=external \

--add-forward-port=port=20:proto=tcp:toport=22:toaddr=192.168.0.19

类似地,以下命令将本地端口 20 转发到 IP 地址为 192.168.0.18 的系统上的端口 2750:

firewall-cmd --zone=external --add-forward-port=port=20:proto=tcp:toport=2750:toaddr=192.168.0.18

13.4 从 Cockpit 界面管理 firewalld

到目前为止,本章已概述了 firewalld 并探讨了使用 firewall-cmd 命令行工具来管理防火墙区域和接口。虽然 firewall-cmd 提供了最灵活的方式来管理 firewalld 配置,但也可以通过 Cockpit Web 控制台查看和管理默认区域的服务。

要访问 firewalld 设置,请登录到 Cockpit 界面并从导航面板选择“Networking”。在网络页面上,选择防火墙选项,具体如图 13-1 所示:

图 13-1

防火墙页面显示了为默认区域配置的当前服务规则(并允许使用垃圾桶按钮删除服务),可以向区域添加新服务,并可打开或关闭防火墙:

图 13-2

13.5 使用 firewall-config 管理 firewalld

如果你可以访问图形桌面环境,也可以使用 firewall-config 工具来配置防火墙。虽然它默认没有安装,但可以通过以下方式安装 firewall-config:

dnf install firewall-config

启动时,主 firewall-config 屏幕如 图 13-3 所示:

图 13-3

工具的关键区域可以总结如下:

A - 显示当前所有活动的接口及其分配的区域。要将接口分配到另一个区域,从此面板中选择接口,点击更改区域按钮,并从弹出的对话框中选择所需的区域。

B - 控制工具内显示的信息以及所做的更改是否适用于运行时或永久规则。

C - 系统上配置的区域、服务或 IPSets 的列表。此面板中列出的信息取决于工具栏 F 中所做的选择。从此面板中的列表中选择项目会更新标记为 D 的主面板。

D - 主面板,包含有关工具栏 E 中当前类别选择的信息。在此示例中,面板显示的是公共区域的服务。每个服务旁边的复选框控制该服务是否在防火墙中启用。可以在这些类别面板中添加新规则、配置现有规则或删除规则。

E - 控制面板 D 中显示的内容。从此栏中选择项目会显示所选类别的当前规则。

F - 控制面板 C 中显示的列表。

firewall-config 工具直观易用,允许在可视化环境中执行 firewall-cmd 提供的许多任务。

13.6 小结

精心规划和实施的防火墙是任何安全系统的重要组成部分。以 CentOS 8 为例,firewalld 服务提供了一个既灵活又易于管理的防火墙系统。

firewalld 服务使用区域的概念来将一组防火墙规则进行分组,并包括一套预定义的区域,旨在满足各种防火墙保护要求。这些区域可以修改以添加或删除规则,或者完全创建并配置新的区域。系统中连接到网络或互联网的网络设备被称为接口。每个接口都会被分配到一个区域。与 firewalld 一起工作的主要工具是 firewall-cmd 命令行工具和 firewall-config 图形工具。通过 Cockpit Web 界面,还可以使用最小的防火墙管理选项。

  1. 配置 CentOS 8 上的 SSH 密钥身份验证

当 CentOS 8 系统首次安装时,默认配置为允许通过安全外壳(SSH)连接进行远程命令行访问。这为 root 帐户和在安装过程中添加的任何其他用户提供了受密码保护和加密的访问权限。这个安全级别远远不足,应尽早升级为基于 SSH 密钥的身份验证。

本章将概述通过实现基于密钥的 SSH 身份验证来提高 CentOS 8 系统安全性的步骤。

14.1 安全外壳(SSH)概述

SSH 设计用于允许安全的远程访问系统,以便获得 shell 访问权限并传输文件和数据。如在“CentOS 8 使用 VNC 远程桌面访问”中所述,SSH 也可以用来提供一个安全隧道,通过该隧道可以通过网络连接实现对 GNOME 桌面的远程访问。

基本的 SSH 配置由客户端(用于建立连接的计算机)和服务器(运行在要建立连接的系统上)组成。例如,用户可能会使用运行在 Linux、Windows 或 macOS 系统上的 SSH 客户端,连接到运行在 CentOS 8 系统上的 SSH 服务器,从而访问 shell 命令行提示符或执行文件传输。客户端和服务器之间的所有通信,包括输入的访问密码,都会加密,防止外部方截取数据。

基本 SSH 实现的固有弱点在于它完全依赖于分配给系统帐户的密码强度。如果恶意方能够识别某个帐户的密码(无论是通过猜测、欺骗还是暴力破解攻击),系统就会变得脆弱。通过实施基于 SSH 密钥的身份验证,可以解决这个弱点。

14.2 基于 SSH 密钥的身份验证

基于 SSH 密钥的身份验证利用非对称公钥加密为远程系统访问增加了额外的安全层。公钥加密的概念由 Whitfield Diffie 和 Martin Hellman 于 1975 年提出,基于使用一对密钥的概念,其中一个是私钥,另一个是公钥。

在公钥加密系统中,公钥用于加密数据,而只有私钥的拥有者才能解密数据。

在 SSH 密钥身份验证的情况下,私钥由 SSH 客户端所在的主机持有,而相应的公钥则保存在运行 SSH 服务器的系统上。保护私钥非常重要,因为拥有私钥的人可以登录到远程系统。因此,作为额外的保护层,私钥也可以被加密,并通过密码保护,每次建立连接到服务器时都必须输入该密码。

14.3 设置基于密钥的认证

设置基于密钥的 SSH 认证需要四个步骤,概括如下:

1. 生成公钥和私钥。

2. 在服务器上安装公钥。

3. 测试认证。

4. 禁用服务器上的基于密码的认证。

本章剩余部分将详细描述这些步骤,适用于 Linux、macOS 和 Windows 客户端操作系统。

14.4 Linux 和 macOS 客户端的 SSH 密钥认证

设置基于 SSH 密钥的认证的第一步是在客户端系统上生成密钥对。如果客户端系统运行的是 Linux 或 macOS,可以使用 ssh-keygen 工具来完成:

第十三章:ssh-keygen

这将生成类似如下的输出:

生成公钥/私钥对。

输入保存密钥的文件 (/home/<用户名>/.ssh/id_rsa):

按 Enter 键接受密钥文件的默认位置。这将把两个文件放置在当前用户主目录下的 .ssh 子目录中。私钥将存储在名为 id_rsa 的文件中,而公钥将存储在名为 id_rsa.pub 的文件中。

接下来,ssh-keygen 将提示输入密码短语来保护私钥。如果提供了密码短语,私钥将在本地磁盘上加密,并且在访问远程系统时需要该密码短语。为了更好的安全性,建议使用密码短语。

输入密码短语(如不设置密码短语则留空):

最后,ssh-keygen 工具将生成以下输出,表示密钥已生成:

您的身份信息已保存在 /home/neil/.ssh/id_rsa 中。

您的公钥已保存在 /home/neil/.ssh/id_rsa.pub 中。

密钥指纹是:

SHA256:FOLGWEEGFIjWnCT5wtTOv5VK4hdimzWghZizUEMYbfo <用户名>@<主机名>

密钥的随机艺术图像是:

+---[RSA 2048]----+

|.BB+=+*.. |

|o+B= * . . |

|===.. + . |

|*+ * . . |

|.++ o S |

|..E+ * o |

o B *
+ +
.

+----[SHA256]-----+

下一步是将公钥安装到远程服务器系统中。这可以通过使用 ssh-copy-id 工具实现,方法如下:

$ ssh-copy-id username@remote_hostname

例如:

$ ssh-copy-id neil@192.168.1.100

/usr/bin/ssh-copy-id: 信息:待安装的密钥来源:"/home/neil/.ssh/id_rsa.pub"

/usr/bin/ssh-copy-id: 信息:正在尝试使用新密钥登录,以过滤掉已安装的密钥

/usr/bin/ssh-copy-id: 信息:仍需安装 1 个密钥 —— 如果现在提示您,它是为了安装新密钥

neil@192.168.1.100 的密码:

添加的密钥数量:1

现在尝试使用以下命令登录机器:“ssh ‘neil@192.168.1.100’”

并检查确保只有您希望添加的密钥被添加。

安装密钥后,使用 ssh 客户端进行远程登录,测试认证是否正常工作:

$ ssh -l <用户名> <主机名>

如果私钥经过加密并且有密码保护,请在提示时输入密码短语以完成身份验证并建立对 CentOS 8 系统的远程访问:

输入密钥‘/home/neil/.ssh/id_rsa’的密码短语:

上次登录:2019 年 2 月 21 日 13:41:23,从 192.168.1.101 登录

[neil@demosystem02 ~]$

对服务器上需要远程访问的其他账户重复这些步骤。如果其他客户端系统也需要访问,只需将 id_rsa 私钥文件复制到其他系统的主文件夹中的 .ssh 子目录下即可。

如当前配置所示,仍可以使用较不安全的密码验证方式访问远程系统。确认密钥认证工作正常后,登录远程系统,编辑 /etc/ssh/ssh_config 文件并将 PasswordAuthentication 设置为 no:

PasswordAuthentication no

保存文件并重启 sshd 服务以实施更改:

systemctl restart sshd.service

从此以后,只有通过 SSH 密钥认证才能远程访问该系统。

14.5 管理多个密钥

客户端系统上有多个私钥的情况并不罕见,每个私钥都能提供对不同服务器的访问权限。在建立连接时,选择特定密钥有多种方式。例如,可以在启动 ssh 客户端时指定要使用的私钥文件,如下所示:

$ ssh -l neilsmyth -i ~/.ssh/id_work 35.194.18.119

另外,也可以使用 SSH 客户端的用户配置文件,将密钥文件与服务器关联。该配置文件名为 config,必须位于用户主目录下的 .ssh 目录中,可以用来配置包括私钥文件、连接时使用的默认端口、默认用户名以及用于引用服务器的简短别名等多种选项。以下示例配置文件为两台服务器定义了不同的密钥文件,并允许通过昵称 home 和 work 来引用它们。在 work 系统的配置中,文件还指定了身份验证时使用的用户名:

Host work

HostName 35.194.18.119

IdentityFile ~/.ssh/id_work

User neilsmyth

Host home

HostName 192.168.0.21

IdentityFile ~/.ssh/id_home

在设置配置文件之前,用户曾使用以下命令连接到 work 系统:

$ ssh -l neilsmyth -i ~/.ssh/id_work 35.194.18.119

现在,可以通过以下方式简化命令:

$ ssh work

可以通过运行以下命令来查看完整的配置文件选项:

$ man ssh_config

14.6 从 Windows 10 客户端使用基于 SSH 的认证

最新发布的 Windows 10 版本包括 OpenSSH 实现的子集,该实现被大多数 Linux 和 macOS 系统使用,作为 Windows PowerShell 的一部分。这使得可以使用类似于上述 Linux 和 macOS 步骤的方法,从 Windows 10 客户端设置 SSH 密钥认证。

在 Windows 10 系统上打开 Windows PowerShell,按下 Win+X 键组合并从菜单中选择,或者从开始菜单中找到并选择它。运行后,PowerShell 窗口将如 图 14-1 所示:

图 14-1

如果你已经有来自其他客户端系统的私钥,只需将 id_rsa 文件复制到 Windows 10 系统中名为 .ssh 的文件夹中。一旦文件放置好,可以在 PowerShell 窗口中按如下方式测试认证:

$ ssh -l <用户名>@<主机名>

例如:

PS C:\Users\neil> ssh -l neil 192.168.1.101

输入密钥 'C:\Users\neil/.ssh/id_rsa' 的密码短语:

提示时输入密码短语,完成认证过程。

如果尚未存在私钥,请在 PowerShell 窗口中使用 ssh-keygen 工具生成新的私钥和公钥对,方法与 Linux 和 macOS 中的步骤相同。一旦生成了密钥,密钥将再次位于当前用户的主文件夹中的 .ssh 目录,公钥文件 id_rsa.pub 需要安装在远程 CentOS 8 系统上。不幸的是,Windows PowerShell 并不包括 ssh-copy-id 工具,因此该任务需要手动执行。

在 PowerShell 窗口中,进入 .ssh 子目录并显示公钥文件 id_rsa.pub 的内容:

PS C:\Users\neil> cd .ssh

PS C:\Users\neil.ssh> type id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFgx1vzu59lll6/uQw7FbmKVsQ3fzLz9MW1fgo4sdsxXp81wCHNAlqcjx1Pgr9BJPXWUMInQOi7BQ5I+vc2xQ2AS0kMq3ZH9ybWuQe/U2GjueXZd0FKrEXrT55wM36Rm6Ii3roUCoGCzGR8mn95JvRB3VtCyDdzTWSi8JBpK5gV5oOxNTNPsewlLzouBlCT1qW3CKwEiIwu8S9MTL7m3nrcaNeLewTTHevvHw4QDwzFQ+B0PDg96fzsYoTXVhzyHSWyo6H0gqrft7aK+gILBtEIhWTkSVEMAzy1piKtCr1IYTmVK6engv0aoGtMUq6FnOeGp5FjvKkF4aQkh1QR28r neil@DESKTOP-S8P8D3N

高亮显示文件内容并使用 Ctrl-C 快捷键复制它。

在 PowerShell 窗口中,使用密码验证登录远程系统:

PS C:\Users\neil.ssh> ssh -l <用户名> <主机名>

登录后,检查 .ssh 子目录是否存在。如果不存在,可以按如下方式创建:

$ mkdir .ssh

进入 .ssh 目录并检查是否已存在名为 authorized_keys 的文件。如果没有,创建该文件并将 Windows 10 系统中的公钥文件内容粘贴到其中。

如果 authorized_keys 文件已经存在,它很可能已经包含其他密钥。如果是这种情况,编辑该文件并将新公钥粘贴到文件末尾。例如,以下文件包含两个密钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzRWH27Xs8ZA5rIbZXKgxFY5XXauMv+6F5PljBLJ6j+9nkmykVe3GjZTp3oD+KMRbT2kTEPbDpFD67DNL0eiX2ZuEEiYsxZfGCRCPBGYmQttFRHEAFnlS1Jx/G4W5UNKvhAXWyMwDEKiWvqTVy6syB2Ritoak+D/Sc8nJflQ6dtw0jBs+S7Aim8TPfgpi4p5XJGruXNRScamk68NgnPfTL3vT726EuABCk6C934KARd+/AXa8/5rNOh4ETPstjBRfFJ0tpmsWWhhNEnwJRqS2LD0ug7E3yFI2qsNKGEzvAYUC8Up45MRP7liR3aMlCBil1tsy9R+IB7oMEycZAe/qj neil@localhost.localdomain

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFgx1vzu59lll6/uQw7FbmKVsQ3fzLz9MW1fgo4sdsxXp81wCHNAlqcjx1Pgr9BJPXWUMInQOi7BQ5I+vc2xQ2AS0kMq3ZH9ybWuQe/U2GjueXZd0FKrEXrT55wM36Rm6Ii3roUCoGCzGR8mn95JvRB3VtCyDdzTWSi8JBpK5gV5oOxNTNPsewlLzouBlCT1qW3CKwEiIwu8S9MTL7m3nrcaNeLewTTHevvHw4QDwzFQ+B0PDg96fzsYoTXVhzyHSWyo6H0gqrft7aK+gILBtEIhWTkSVEMAzy1piKtCr1IYTmVK6engv0aoGtMUq6FnOeGp5FjvKkF4aQkh1QR28r neil@DESKTOP-S8P8D3N

一旦公钥安装到服务器上,通过在 Windows 10 PowerShell 窗口中登录到服务器来测试认证,例如:

PS C:\Users\neil.ssh> ssh -l neil 192.168.1.100

输入密钥的密码短语 'C:\Users\neil/.ssh/id_rsa':

一旦为所有账户设置并验证了基于密钥的身份验证,就按照上一节末尾的说明,在 CentOS 8 系统上禁用密码身份验证。

14.7 使用 PuTTY 进行 SSH 密钥认证

对于没有 OpenSSH 的 Windows 系统,或者作为使用 PowerShell 的更灵活替代工具,PuTTY 是一个广泛使用的替代工具。使用 PuTTY 的第一步是下载并安装它,安装在需要 SSH 客户端的任何 Windows 系统上。PuTTY 是一个免费的工具,可以通过以下链接进行下载:

www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

下载与您的 Windows 系统匹配的 Windows 安装程序(提供 32 位和 64 位版本),然后执行安装程序完成安装。

如果在另一台系统上已经存在私钥,请在当前用户的主文件夹中创建 .ssh 文件夹,并将私钥 id_rsa 复制到其中。

接下来,需要使用 PuTTYgen 工具将私钥文件转换为 PuTTY 私钥格式文件。找到 Windows 开始菜单中的该工具并启动:

图 14-2

启动后,点击位于操作区的 Load 按钮,导航到之前复制到 .ssh 文件夹中的私钥文件(注意,可能需要将文件类型过滤器更改为“所有文件 (.)”才能看到密钥文件)。找到文件后,选择该文件并加载到 PuTTYgen 中。当系统提示时,输入最初用来加密文件的密码短语。一旦私钥导入成功,点击 Save Private Key 按钮将其保存为 PuTTY 密钥文件。为了一致性,建议将密钥文件保存到 .ssh 文件夹中,并给它起一个不同的名称,以便与原始密钥文件区分开来。

从开始菜单启动 PuTTY,在主屏幕上输入远程服务器的 IP 地址或主机名,然后选择左侧面板中的连接 -> SSH -> 认证类别,如图 14-3 所示:

图 14-3

点击身份验证字段旁的浏览按钮,导航并选择先前保存的 PuTTY 私钥文件。可选地,滚动到左侧面板顶部,选择会话条目,并在“保存的会话”字段中输入会话名称,然后点击保存按钮。这将保存会话配置,以便将来使用时无需重新输入设置。

最后,点击打开按钮以建立与远程服务器的连接,在提示时输入用户名和密码短语以完成身份验证。

14.8 使用 PuTTYgen 生成私钥

前一节探讨了在使用 PuTTY 时如何使用现有的私钥和公钥。如果密钥尚不存在,可以使用随主 PuTTY 安装程序一起提供的 PuTTYgen 工具创建它们。

要创建新的密钥,请启动 PuttyGen 并点击图 14-4 中高亮显示的生成按钮:

图 14-4

按照提示移动鼠标指针以生成随机数据,然后输入一个可选的密码短语来加密私钥。密钥生成后,使用保存公钥和保存私钥按钮将文件保存到合适的位置。私钥可以像上一节中所述一样与 PuTTY 一起使用。要将公钥安装到远程服务器上,请按照前一节中有关在 Windows 10 上通过 PowerShell 使用 SSH 的步骤操作。

14.9 为 Google Cloud 实例安装公钥

如果您的 CentOS 8 系统托管在 Google Cloud 上,例如作为计算引擎实例,有多种方法可以使用基于密钥的身份验证方式通过 SSH 访问服务器。最直接的方法可能是将您的公钥添加到 Google Cloud 账户的元数据中。这样,公钥就可以用于您在 Google Cloud 中创建的所有虚拟机实例。要添加公钥,请登录 Google Cloud Platform 控制台,从左侧导航面板中选择元数据选项,如图 14-5 所示,然后选择 SSH 密钥标签:

图 14-5

在 SSH 密钥屏幕上,点击编辑按钮(如图 14-5 中高亮显示的那样)以编辑密钥列表。向下滚动至当前列表的底部,点击+ 添加项目按钮。将会出现一个新的字段,你需要将整个公钥粘贴进去,该公钥应当与你 id_rsa.pub 文件中的内容一致。输入密钥后,点击保存按钮以添加密钥。

公钥现在将出现在 SSH 密钥列表中。请注意,密钥条目中还包含了登录任何 Google Cloud 实例时必须使用的用户名:

图 14-6

在元数据中添加了公钥后,应该能够从任何安装了对应私钥且用户有账户的客户端访问任何虚拟机实例。实际上,Google Cloud 所做的工作就是将公钥添加到用户在任何虚拟机上账户所在的.home 目录中的.ssh/authorized_keys 文件中。

14.10 小结

任何远程访问 CentOS 8 系统的方式都必须确保高度的安全性。默认情况下,CentOS 8 系统允许使用基于密码的认证进行 SSH 访问,这使得系统容易受到任何能够猜测密码或通过其他方式获取密码的人的攻击。因此,建议使用基于密钥的认证来保护系统访问。基于密钥的认证使用公钥加密的概念,涉及公钥和私钥。当实现时,用户只能连接到服务器,如果他们使用的客户端拥有与服务器上的公钥匹配的私钥。作为额外的安全措施,私钥也可以被加密并设置密码保护。一旦实现了基于密钥的加密,服务器系统将配置为禁用对不太安全的基于密码的认证的支持。

本章概述了基于 SSH 密钥的认证,并概述了在 macOS、Linux 和 Windows 上生成密钥和配置客户端的步骤,此外还包括在 CentOS 8 服务器上安装和管理公钥的步骤。

15. CentOS 8 使用 VNC 进行远程桌面访问

CentOS 8 可以配置为通过网络或互联网连接提供对图形桌面环境的远程访问。尽管默认情况下未启用,但相对简单即可在任何网络或互联网系统上显示和访问 CentOS 8 桌面。无论该系统运行的是 Linux、Windows 还是 macOS,都可以实现这一点。事实上,甚至有适用于 Android 和 iOS 的应用程序,允许你从几乎任何有数据信号的地方访问 CentOS 8 桌面。

远程桌面访问在多种情况下非常有用。例如,它允许你或其他人从另一台计算机系统查看并互动你的 CentOS 8 桌面环境,无论是在同一网络中还是通过互联网。这在你外出旅行等离开办公桌时需要使用计算机时特别有用。如果同事或 IT 支持人员需要访问你的桌面以解决问题时,这也非常有帮助。

在 CentOS 8 系统运行在基于云的服务器上时,它还允许作为使用命令行提示符或 Cockpit Web 控制台执行管理任务的替代方案,访问桌面环境。

CentOS 8 的远程桌面功能基于一种名为虚拟网络计算(VNC)的技术,本章将介绍配置和使用 CentOS 8 远程桌面的关键方面。

15.1 安全和不安全的远程桌面访问

在本章中,我们将讨论安全和不安全的远程桌面访问方法。假设你是在一个安全的内部网络环境中从一台系统访问另一台系统,那么通常使用不安全的访问方法是安全的。另一方面,如果你计划通过任何公共网络远程访问桌面,则必须使用安全的访问方法,以避免系统和数据受到威胁。

15.2 安装 GNOME 桌面环境

当然,只有在桌面环境已经安装的情况下,才能访问桌面环境。例如,如果系统最初配置为服务器,则不太可能安装桌面软件包。安装运行 GNOME 桌面所需的软件包最简单的方法是执行组安装。安装一组软件包以启用特定功能的关键是知道该组的名称。在撰写时,用于在 CentOS 8 上安装桌面环境的组名为“Workstation”。由于组名在不同的 CentOS 版本之间可能会发生变化,因此知道可以使用 dnf 工具获得已安装或可安装的组列表是非常有用的,方法如下:

第十四章:dnf grouplist

可用的环境组:

工作站

最小化安装

自定义操作系统

已安装的环境组:

带图形界面的服务器

已安装的组:

容器管理

可用组:

.NET Core 开发

RPM 开发工具

智能卡支持

科学支持

安全工具

开发工具

系统工具

无头管理

网络服务器

传统 UNIX 兼容性

图形管理工具

在上面的示例中,列出了工作站环境组作为可用(因此尚未安装)。要在安装之前了解有关组的更多信息,请使用以下命令:

dnf groupinfo 工作站

环境组:工作站

描述:工作站是一个用户友好的桌面系统,适用于笔记本电脑和台式机。

强制性组:

常见的 NetworkManager 子模块

核心

字体

GNOME

客户桌面代理

网络浏览器

多媒体

标准

工作站产品核心

base-x

确认这是正确的组后,可以按以下方式进行安装:

dnf groupinstall 工作站

安装后,如果系统已添加显示器,可以使用以下命令启动桌面:

$ startx

另一方面,如果系统是没有直接连接显示器的服务器,则唯一的方式是配置系统的 VNC 支持,以便运行和访问桌面。

15.3 在 CentOS 8 上安装 VNC

访问远程桌面需要在远程系统上安装 VNC 服务器,在建立访问的系统上安装 VNC 查看器,并可选地使用安全的 SSH 连接。虽然有多种 VNC 服务器和查看器实现,但 CentOS 标准化使用 TigerVNC,它提供了针对基于 Linux 的操作系统的服务器和查看器组件。非 Linux 平台的 VNC 查看器客户端包括 RealVNC 和 TightVNC。

在 CentOS 8 上安装 TigerVNC 服务器软件包,只需运行以下命令:

dnf install tigervnc-server

如果需要,可以按照以下方式安装 TigerVNC 查看器:

dnf install tigervnc

安装完服务器后,系统需要配置以运行一个或多个 VNC 服务,并在防火墙上打开适当的端口。

15.4 配置 VNC 服务器

安装了 VNC 服务器软件包后,下一步是配置服务器。第一步是为将访问远程桌面环境的用户指定一个密码。以 root 用户身份登录后,执行以下命令(假设用户名为 demo):

su - demo

[demo@demoserver ~]$ vncpasswd

密码:

验证:

您是否希望输入仅查看密码(y/n)? n

不使用仅查看密码

[demo@demoserver ~]$ exit

接下来,需要在 /etc/systemd/system 目录中创建一个名为 vncserver@.service 的 VNC 服务器配置文件。该文件的内容应如下所示,其中所有的 替换为设置 VNC 密码时引用的用户名:

[单元]

说明=远程桌面服务(VNC)

After=syslog.target network.target

[服务]

类型=forking

工作目录=/home/

用户=

组=

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

ExecStart=/usr/bin/vncserver -autokill %i

ExecStop=/usr/bin/vncserver -kill %i

Restart=on-success

RestartSec=15

[Install]

WantedBy=multi-user.target

接下来,需要配置防火墙以提供外部访问权限,以便远程 VNC 查看器实例访问 VNC 服务器,例如:

firewall-cmd --permanent --zone=public --add-port=5901/tcp

firewall-cmd --reload

创建好服务配置文件后,需要按照以下步骤启用并启动服务:

systemctl daemon-reload

systemctl start vncserver@:1.service

systemctl enable vncserver@:1.service

请注意,:1包含在服务名称中,表示这是 VNC 服务器显示器号 1 的服务。它与先前在防火墙中打开的端口 5901 相匹配。

检查服务是否已成功启动,方法如下:

systemctl status vncserver@:1.service

如果服务启动失败,运行以下命令检查错误信息:

journalctl -xe

重新启动系统后也可以再试。如果服务继续失败,可以通过以指定用户身份登录并运行以下命令手动启动 VNC 服务器:

$ vncserver :1

15.5 连接到 VNC 服务器

VNC 查看器有多个操作系统的实现版本,通过快速的互联网搜索,很可能会找到许多关于如何在所选平台上获取和安装该工具的链接。

从已安装 VNC 查看器(如 TigerVNC)的 Linux 系统桌面,可以通过终端窗口按如下方式建立远程桌面连接:

$ vncviewer :

在上面的示例中,是远程系统的主机名或 IP 地址,是 VNC 服务器桌面的显示号,例如:

$ vncviewer 192.168.1.115:1

或者,运行命令时不带任何选项,以便提示输入远程服务器的详细信息:

图 15-1

在 VNC 服务器字段中输入主机名或 IP 地址,然后是显示号(例如 192.168.1.115:1),并点击连接按钮。查看器将提示输入用户的 VNC 密码以完成连接,此时将出现一个新窗口,其中显示远程桌面。

本节假设远程桌面是从 Linux 或 UNIX 系统访问的,相同的步骤适用于大多数其他操作系统。

使用本节中的步骤连接到远程 VNC 服务器会导致客户端与服务器之间建立一个不安全、未加密的连接。这意味着远程会话期间传输的数据容易被拦截。要建立一个安全且加密的连接,需要额外的几个步骤。

15.6 建立安全的远程桌面会话

到目前为止,我们在本章中探索的远程桌面配置被认为是不安全的,因为没有使用加密。当远程连接仅限于防火墙保护的内部网络时,这种配置是可以接受的。然而,当需要通过互联网连接进行远程会话时,则需要更安全的选项。这可以通过将远程桌面通过安全外壳(SSH)连接进行隧道传输来实现。本节将介绍如何在 Linux、UNIX 和 macOS 客户端系统上进行此配置。

SSH 服务器通常在 CentOS 8 系统上默认安装并启用。如果你的系统没有此配置,请参考标题为 “在 CentOS 8 上配置基于 SSH 密钥的身份验证” 的章节。

假设 SSH 服务器已安装并处于活动状态,现在是时候转到另一台系统。在另一台系统上,使用以下命令登录远程系统,这将建立两台系统之间的安全隧道:

$ ssh -l -L 5901:localhost:5901

在上述示例中, 指代已经配置了 VNC 访问权限的远程系统上的用户帐户,而 是远程系统的主机名或 IP 地址,例如:

$ ssh -l neilsmyth -L 5901:localhost:5901 192.168.1.115

当系统提示时,使用帐户密码登录。安全连接建立后,是时候启动 vncviewer 以使其使用安全隧道。保持另一终端窗口中的 SSH 会话运行,启动另一个终端并输入以下命令:

$ vncviewer localhost:5901

如果需要密码,vncviewer 会提示输入密码,然后启动 VNC 查看器,提供对桌面环境的安全访问。

尽管连接现在已加密且安全,但 VNC 查看器仍可能报告连接不安全。例如,图 15-2 显示了在 macOS 系统上运行的 RealVNC 查看器所显示的警告对话框:

图 15-2

不幸的是,尽管连接现在已经安全,但 VNC 查看器软件无法识别这一点,因此继续发出警告。请放心,只要 SSH 隧道正在使用中,连接确实是安全的。

在上述示例中,我们让 SSH 隧道会话在终端窗口中运行。如果你希望将会话在后台运行,可以在启动连接时使用 –f 和 –N 标志:

$ ssh -l -f -N -L 5901:localhost:5901

上述命令将提示输入远程服务器的密码,然后在后台建立连接,使终端窗口可以用于其他任务。

如果您是从防火墙外部连接远程桌面,请记住,SSH 连接的 IP 地址将是您的 ISP 或云托管提供商提供的外部 IP 地址,而不是远程系统的局域网 IP 地址(因为该 IP 地址对于防火墙外部的人不可见)。您还需要配置防火墙,将端口 22(用于 SSH 连接)转发到运行桌面系统的 IP 地址。无需转发端口 5900。不同防火墙的端口转发步骤不同,因此请参阅您防火墙、路由器或无线基站的文档,以了解适用于您配置的详细信息。

15.7 在 Windows 上使用 PuTTY 建立安全隧道

从 Windows 系统到 CentOS 8 服务器建立安全桌面会话的方法类似。假设你已经安装了一个 VNC 客户端,如 TightVNC,那么唯一剩下的要求是一个 Windows SSH 客户端(此处为 PuTTY)。

下载并安装 PuTTY 后,第一步是建立 Windows 系统与远程 CentOS 8 系统之间的安全连接,并配置适当的隧道。启动 PuTTY 后,将显示以下界面:

图 15-3

输入远程主机的 IP 地址或主机名(如果您是从防火墙外部连接,请输入网关的外部 IP 地址)。下一步是设置隧道。在对话框左侧的类别树中,点击 SSH 旁边的 +,然后点击 Tunnels。屏幕应随后显示如下:

图 15-4

在源端口字段中输入 5901,将目标设置为 localhost:5901,并点击 Add 按钮。最后,通过点击 Session 类别返回主界面。在 Saved Sessions 文本框中输入会话名称并点击 Save。点击 Open 以建立连接。一个终端窗口将会出现,并显示远程系统的登录提示。输入相应的用户名和密码凭证。

SSH 连接已建立。启动 TightVNC 查看器,输入 localhost:5901 到 VNC Server 文本框,并点击 Connect。查看器将建立连接,提示输入密码,然后显示桌面。现在,您通过安全的 SSH 隧道连接从 Windows 访问 Linux 系统的远程桌面。

15.8 关闭桌面会话

若要关闭 VNC Server 托管的桌面会话,使用 --kill 命令行选项,并指定要终止的桌面编号。例如,要关闭桌面 :1:

vncserver –kill :1

15.9 VNC 连接故障排除

在后台发生如此多的事情时,VNC 有时会显得不透明,特别是在出现问题时,服务器无法启动,或者尝试远程连接时出现错误信息。然而,有许多技巧可以帮助追踪并解决 VNC 问题:

如果 VNC 服务无法启动,请检查该服务的 systemctl 状态并查找错误信息:

systemctl status vncserver@:1.service

若要获得更详细的信息,请通过运行以下命令检查 systemd 日志:

journalctl -xe

额外的信息可能可以在以下位置的日志文件中找到:

/home/<用户名>/.vnc/<主机名>.<域名>:<显示号>.log

例如:

/home/neilsmyth/.vnc/server01.localdomain:1.log

如果 systemd 的 VNC 服务仍无法启动 VNC 服务器,请尝试使用以下命令手动启动:

vncserver :<显示号>

例如:

vncserver :1

检查输出和日志文件中是否有任何可能帮助识别问题的错误。如果服务器成功启动,请尝试使用 VNC 查看器再次连接。

如果 VNC 服务器似乎正在运行,但从查看器连接失败,可能值得检查是否已打开正确的防火墙端口。首先,通过以下方式识别默认区域:

firewall-cmd --get-default-zone

public

在获取到默认区域后,检查必要的端口是否已打开:

firewall-cmd --permanent --zone=public --list-ports

5901/tcp 5900/tcp

如果 VNC 使用的端口未打开,请按以下方式添加端口:

firewall-cmd --permanent --zone=public --add-port=<端口号>/tcp

15.10 总结

可以通过使用虚拟网络计算(VNC)来启用对 CentOS 8 系统的 GNOME 桌面环境的远程访问。VNC 包括在远程服务器上运行的 VNC 服务器和在本地主机上运行的相应客户端,允许远程访问服务器上运行的多个桌面实例。

当 VNC 连接通过公共连接使用时,建议使用 SSH 隧道来确保客户端和服务器之间的通信是加密且安全的。

16. 远程显示 CentOS 8 应用程序(X11 转发)

在前一章节中,我们讨论了如何在远程计算机上显示整个 CentOS 8 桌面。如果你确实需要远程显示整个桌面,这个方法效果很好,但如果你只想显示单个应用程序,这可能就显得有些过于复杂了。因此,在这一章中,我们将探讨如何在远程系统上显示单个应用程序。

16.1 远程显示 CentOS 8 应用程序的要求

为了在一台 CentOS 8 系统上运行应用程序并将其显示在另一台系统上,必须满足一些先决条件。首先,应用程序将要显示的系统必须运行 X 服务器。如果该系统是运行桌面环境的 Linux 或 UNIX 系统,则没有问题。但是,如果该系统运行的是 Windows 或 macOS,则必须先在其上安装 X 服务器,才能从远程系统显示应用程序。有许多商业和免费的 Windows 基础 X 服务器可供选择,网络搜索应该可以提供一些选项。

其次,运行应用程序的系统(与显示应用程序的系统不同)必须配置为允许 SSH 访问。在 CentOS 8 系统上配置 SSH 的详细信息可以在名为“在 CentOS 8 上配置基于 SSH 密钥的身份验证”的章节中找到。该系统还必须运行来自 X.org 的 X Window 系统,而不是 Wayland。要查找正在使用的系统,请打开一个终端窗口并运行以下命令:

第十五章:echo $XDG_SESSION_TYPE

x11

如果上述命令输出“wayland”而不是“x11”,则编辑 /etc/gdm/custom.conf 文件并取消注释 WaylandEnable 行,如下所示,并重新启动系统:

取消注释以下行以强制登录屏幕使用 Xorg

WaylandEnable=false

最后,必须配置 SSH 以允许 X11 转发。这可以通过在要进行转发的系统的 SSH 配置中添加以下指令来实现。在 CentOS 8 上,/etc/ssh_config 文件默认包含一条指令,用于包含 /etc/ssh/ssh_config.d 目录中所有的配置文件:

Include /etc/ssh/ssh_config.d/*.conf

在新安装的系统中,/etc/ssh/ssh_config.d 目录中唯一的文件是名为 05-redhat.conf 的文件。编辑该文件并添加一行以启用 X11 转发,如下所示:

.

.

Host *

GSSAPIAuthentication yes

X11Forwarding yes

.

.

修改后,保存文件并重新启动 SSH 服务:

systemctl restart sshd

一旦满足上述要求,就应该能够远程显示基于 X 的桌面应用程序。

16.2 远程显示 CentOS 8 应用程序

远程显示应用程序的第一步是转到要显示应用程序的系统。在该系统上,建立到远程系统的 SSH 连接,以便获取命令提示符。这可以通过使用 ssh 命令来实现。在使用 ssh 命令时,我们需要使用 -X 标志,告诉它我们打算通过连接隧道传输 X11 流量:

$ ssh -X user@hostname

在上述示例中,user 是登录远程系统时使用的用户名,hostname 是远程系统的主机名或 IP 地址。在登录提示符下输入密码,登录后运行以下命令查看 DISPLAY 设置:

$ echo $DISPLAY

执行该命令时,应该输出类似如下的内容:

localhost:10.0

要显示一个应用程序,只需从命令提示符运行它。例如:

$ gedit

执行上述命令时,它应该在远程系统上运行 gedit 工具,但在本地系统上显示输出。

16.3 可信 X11 转发

如果远程系统上的 /etc/ssh/ssh_config.d/05-redhat.conf 文件包含以下行,那么就可以使用可信的 X11 转发:

ForwardX11Trusted yes

可信的 X11 转发比不可信的转发稍微快一点,但由于不涉及 X11 安全控制,它的安全性较低。使用可信 X11 转发时需要使用 -Y 标志:

$ ssh -Y user@hostname

16.4 压缩 X11 转发

在使用较慢的连接时,可以使用 -C 标志压缩 X11 数据以提高性能:

$ ssh -X -C user@hostname

16.5 在 Windows 上显示远程 CentOS 8 应用程序

要在 Windows 上显示基于 CentOS 8 的应用程序,需要在 Windows 系统上安装 SSH 客户端和 X 服务器。本书前面的“在 CentOS 8 上配置基于 SSH 的认证”章节已介绍了如何在 Windows 上安装和使用 PuTTY 客户端。如果您尚未在 Windows 系统上安装 PuTTY,请参阅该章节。

在 X 服务器方面,有多个选项可供选择,但一个流行的选择似乎是 VcXsrv,它可以从以下网址免费下载:

sourceforge.net/projects/vcxsrv/

安装完 VcXsrv X 服务器后,桌面和开始菜单中会出现一个名为 XLaunch 的应用程序。启动 XLaunch 并选择一个显示选项(最灵活的是多窗口选项,它允许每个客户端应用程序出现在自己的窗口中):

图 16-1

点击“下一步”按钮,按默认配置设置继续完成剩余的屏幕。在最后一个屏幕上,点击“完成”按钮以启动 X 服务器。如果 Windows Defender 对话框出现,点击按钮以允许访问您选择的网络。

启动后,XLaunch 将出现在任务栏中,可以通过右键点击图标并选择退出菜单选项来退出:

图 16-2

在安装并运行 X 服务器后,启动 PuTTY,输入远程主机的连接信息或加载之前保存的会话配置文件。不过,在建立连接之前,需要启用 X11 转发。在 PuTTY 主窗口中,向下滚动左侧面板的选项,展开 SSH 部分并选择 X11 选项,如图 16-3 所示:

图 16-3

打开 图 16-4 中突出显示的启用 X11 转发复选框,返回会话界面并打开连接(如果计划再次使用,请提前保存会话)。

图 16-4

在 PuTTY 会话窗口中登录到 CentOS 8 系统并运行桌面应用程序。稍等片刻,应用程序将出现在 Windows 桌面上并以单独的窗口显示。由应用程序打开的任何对话框也将以独立的窗口显示,就像它们在 CentOS 8 GNOME 桌面上那样。图 16-5 例如,显示了 CentOS 8 nm-connection-editor 工具在 Windows 10 系统上的显示:

图 16-5

16.6 总结

对于需要远程访问单个 CentOS 8 桌面应用程序的情况,而不是整个 GNOME 桌面,X11 转发提供了一个轻量级的解决方案,用于远程显示图形应用程序。应用程序需要显示的系统必须运行基于 X Window 系统的桌面环境(如 GNOME)或安装并运行 X 服务器。一旦在远程服务器上启用了 X11 转发,并且从本地系统通过 X11 转发选项建立了安全的 SSH 连接,大多数应用程序就可以在本地 X 服务器上远程显示。

17. 使用 NFS 将 CentOS 8 文件与远程系统共享

CentOS 8 提供了两种与网络上其他系统共享文件和文件夹的机制。一种方法是使用称为 Samba 的技术。Samba 基于 Microsoft Windows 文件夹共享,允许 Linux 系统使文件夹对 Windows 系统可访问,并从 Linux 访问基于 Windows 的文件夹共享。只要其他系统已安装并配置了 Samba 支持,此方法也可用于在其他 Linux 和 UNIX 系统之间共享文件夹。这是在异构网络环境中共享文件夹的最流行方法。关于使用 Samba 在 CentOS 8 和 Windows 系统之间共享文件夹的主题在 “使用 Samba 在 CentOS 8 和 Windows 系统之间共享文件” 中讨论。

另一种选项专门用于在 Linux 和基于 UNIX 的系统之间共享文件夹,使用称为 Network File System (NFS) 的技术。NFS 允许通过网络连接访问一台 Linux 计算机上的文件系统,其他 Linux 或 UNIX 系统。NFS 最初由 Sun Microsystems(现在是 Oracle Corporation 的一部分)在 1980 年代开发,至今仍是共享远程 Linux/UNIX 文件系统的标准机制。

NFS 与 Windows SMB 资源共享技术(由 Samba 使用)非常不同。在本章中,我们将探讨使用 NFS 在 CentOS 8 和其他基于 UNIX/Linux 的系统之间进行基于网络的文件夹共享。

17.1 确保 CentOS 8 上运行 NFS 服务

第一个任务是验证 NFS 服务是否安装并在 CentOS 8 系统上运行。可以通过命令行或使用 Cockpit 界面完成此操作。

在幕后,NFS 利用远程过程调用(RPC)以 rpcbind 服务的形式在网络中共享文件系统。从终端窗口运行以下命令安装 rpcbind 和 NFS 服务:

第十六章:dnf install rpcbind nfs-utils

接下来,配置这些服务,使它们在启动时自动启动:

systemctl enable rpcbind

systemctl enable nfs-server

一旦服务已启用,按如下方式启动它们:

systemctl start rpcbind

systemctl start nfs-server

17.2 配置 CentOS 8 防火墙以允许 NFS 流量

接下来,需要配置防火墙以允许 NFS 流量。为此,请在以下 firewall-cmd 命令中运行 替换为适合您防火墙和系统配置的适当区域:

firewall-cmd --zone= --permanent --add-service=mountd

firewall-cmd --zone= --permanent --add-service=nfs

firewall-cmd --zone= --permanent --add-service=rpc-bind

firewall-cmd --reload

17.3 指定要共享的文件夹

现在 NFS 已启动且防火墙已配置,我们需要指定 CentOS 8 文件系统中哪些部分可以被远程 Linux 或 UNIX 系统访问。这些设置可以在/etc/exports 文件中声明,需要修改该文件以通过 NFS 导出目录供远程访问。该文件中导出行的语法如下:

() ()...

在上述行中,由要导出的目录替换,是授予访问权限的系统的名称或 IP 地址,表示对该访问权限施加的限制(只读、读写等)。如果需要,可以在同一行中放置多个主机和选项条目。例如,以下行将对 IP 地址为 192.168.2.38 的主机授予/datafiles 目录的只读权限:

/datafiles 192.168.2.38(ro)

允许使用通配符来将导出应用于多个主机。例如,以下行允许所有外部主机对/home/demo 具有读写访问权限:

/home/demo *(rw)

可以通过阅读 exports 手册页,找到 exports 文件支持的完整选项列表:

man exports

为了本章的目的,我们将配置/etc/exports 文件如下:

/tmp *(rw,sync)

/vol1 192.168.2.21(ro,sync)

配置完成后,NFS 服务器维护的导出文件系统表需要使用 exportfs 命令更新为最新的/etc/exports 设置,如下所示:

exportfs -a

也可以使用 exportfs 工具从命令行查看当前的共享设置:

exportfs

上述命令将生成以下输出:

/tmp

/vol1 192.168.2.21

17.4 访问共享的 CentOS 8 文件夹

共享文件夹可以通过从客户端系统手动挂载来访问。在尝试挂载远程 NFS 文件夹之前,应先在客户端系统上安装 nfs-utils 软件包:

dnf install nfs-utils

要从命令行挂载远程文件夹,打开一个终端窗口并创建一个文件夹,指定要挂载远程文件夹的位置:

mkdir /home/demo/tmp

接下来,输入命令以使用远程 NFS 服务器的 IP 地址或主机名挂载远程文件夹,例如:

mount -t nfs 192.168.1.115:/tmp /home/demo/tmp

然后,远程的/tmp 文件夹将在本地系统上挂载。挂载后,/home/demo/tmp 文件夹将包含远程文件夹及其所有内容。

挂载远程 NFS 文件系统时,也可以指定选项。例如,下面的命令挂载相同的文件夹,但将其配置为只读:

mount -t nfs -o ro 192.168.1.115:/tmp /home/demo/tmp

17.5 在系统启动时挂载 NFS 文件系统

还可以通过编辑 /etc/fstab 文件配置 CentOS 8 系统,在每次系统启动时自动挂载远程文件系统。加载到编辑器后,它可能类似于以下内容:

/dev/mapper/cl-root / xfs 默认 0 0

UUID=c2c3b49a-e1a1-4004 /boot xfs 默认 0 0

/dev/mapper/cl-home /home xfs 默认 0 0

/dev/mapper/cl-swap swap swap 默认 0 0

例如,要将路径为 /tmp 的文件夹挂载到本地路径 /home/demo/tmp(请注意,该文件夹必须已存在),可以将以下行添加到 /etc/fstab 文件中:

192.168.1.115:/tmp /home/demo/tmp nfs rw 0 0

下一次系统重启时,位于远程系统上的 /tmp 文件夹将被挂载到本地的 /home/demo/tmp 挂载点。然后,所有远程文件夹中的文件都可以像本地硬盘驱动器上的文件一样访问。

17.6 卸载 NFS 挂载点

一旦通过 NFS 挂载了远程文件系统,就可以使用 umount 命令卸载它,命令行参数为本地挂载点。例如,以下命令将卸载我们的示例文件系统挂载点:

umount /home/demo/tmp

17.7 在 Cockpit 中访问 NFS 文件系统

除了使用命令行在客户端挂载远程 NFS 文件系统外,还可以通过 Cockpit Web 界面进行挂载操作。假设 Cockpit 已经在客户端系统上安装并配置完毕,登录到 Cockpit 界面,在浏览器内从左侧导航面板选择“存储”选项。如果没有显示“存储”选项,则需要安装 cockpit-storaged 包并重启 Cockpit 服务,如下所示:

dnf install cockpit-storaged

systemctl restart cockpit.socket

一旦 Cockpit 服务重启,重新登录 Cockpit 界面,此时应能看到“存储”选项。

选择后,主存储页面将包括一个部分,列出当前挂载的 NFS 文件系统,如 图 17-1 所示:

图 17-1

要挂载远程文件系统,请点击上方突出显示的“+”按钮,在弹出的对话框中输入远程 NFS 服务器和文件系统共享的相关信息,以及本地挂载点和所需的选项,然后点击“添加”按钮:

图 17-2

要修改、卸载或移除 NFS 文件系统共享,请在 NFS 挂载列表中选择相应的挂载(如上文所示的 图 17-1),以显示下图 图 17-3:

图 17-3

在此界面中,可以执行诸如更改服务器或挂载点,或卸载文件系统等任务。删除选项会卸载文件系统并从/etc/fstab 文件中删除该条目,以确保系统下次重启时不会重新挂载该文件系统。

17.8 总结

网络文件系统(NFS)是一种基于客户端/服务器的系统,最初由 Sun Microsystems 开发,它为 Linux 和 Unix 系统提供了一种通过网络共享文件系统的方法。NFS 允许客户端系统访问并(在权限允许的情况下)修改位于远程服务器上的文件,就像这些文件存储在本地文件系统上一样。本章提供了 NFS 的概述,并概述了使用命令行或 Cockpit Web 界面配置客户端和服务器系统的可用选项。

  1. 在 CentOS 8 和 Windows 系统之间共享文件

尽管 Linux 在桌面市场取得了一些进展,但它的起源和未来主要是面向服务器的。因此,CentOS 8 能够作为文件服务器并不令人惊讶。因此,CentOS 和 Windows 系统通常会在网络环境中并行使用。因此,CentOS 8 系统上的文件需要能够通过网络连接被 Linux、UNIX 和 Windows 系统访问。同样,位于 Windows 系统上的共享文件夹和打印机也可能需要从 CentOS 8 系统进行访问。

Windows 系统使用一种叫做 Server Message Block (SMB) 的协议来共享文件系统和打印机等资源。因此,为了让 CentOS 8 系统能够通过网络将这些资源提供给 Windows 系统,反之亦然,它必须支持 SMB。这可以通过使用 Samba 技术来实现。除了提供 Linux 和 Windows 系统之间的集成外,Samba 还可以用于在 Linux 系统之间提供文件夹共享(作为替代方案,与上一章介绍的 NFS 相对)。

本章将介绍将文件系统资源和打印机从 CentOS 8 系统共享到远程 Windows 和 Linux 系统的步骤,以及从 CentOS 8 访问 Windows 资源的步骤。

18.1 Samba 和 Samba 客户端

Samba 允许 CentOS 8 资源与 Windows 系统共享,也允许 Windows 资源与 CentOS 8 系统共享。CentOS 使用 Samba 客户端访问 Windows 资源。另一方面,通过安装和配置 Samba 服务,CentOS 资源可以与 Windows 系统共享。

18.2 在 CentOS 8 系统上安装 Samba

在 CentOS 8 安装过程中,默认设置通常不会安装必要的 Samba 包。除非你特别要求安装 Samba,否则系统中很可能没有安装 Samba。要检查 Samba 是否已安装,可以打开终端窗口并运行以下 rpm 命令:

第十七章:rpm -q samba samba-common samba-client

如果没有安装任何 Samba 包,rpm 会返回“package is not installed”。如果是这种情况,可以使用 dnf 命令行工具来安装它们:

dnf install samba samba-common samba-client

18.3 配置 CentOS 8 防火墙以启用 Samba

接下来,需要配置当前保护 CentOS 8 系统的防火墙,以允许 Samba 流量。为此,请执行以下 firewall-cmd 命令:

firewall-cmd --permanent --add-port=

firewall-cmd --reload

在启动 Samba 服务之前,需要进行一系列配置步骤,以定义 CentOS 系统如何呈现给 Windows 系统,以及需要与远程客户端共享的资源。大多数配置任务都在 /etc/samba/smb.conf 文件中进行。

18.4 配置 smb.conf 文件

在 CentOS 6 之前,提供了一个名为 system-config-samba 的图形化工具,帮助配置 Samba。然而,在 CentOS 7 及更高版本中,该工具已被移除。这意味着 Samba 环境必须手动配置,通过编辑 /etc/samba/smb.conf 文件并使用 smbpasswd 命令行工具来完成。虽然那些依赖于该工具的用户可能会对此感到惋惜,但该工具的简化实际上掩盖了 Samba 的许多高级功能。实际上,通过花时间理解 smb.conf 文件的复杂性,能实现更多的配置。

Samba 是一个高度灵活且可配置的系统,提供了多种选项来控制 Windows 网络上资源的共享方式。这种灵活性可能导致 Samba 看起来过于复杂。然而,实际上,许多配置选项对于典型安装并不需要,设置基本配置的学习曲线实际上相当短。

本章的目标是将 CentOS 8 系统加入一个 Windows 工作组,并设置一个目录作为共享资源,供特定用户访问。这种配置被称为独立 Samba 服务器。更高级的配置,比如将 Samba 集成到 Active Directory 环境中,也有提供,但这些超出了本书的范围。

配置 Samba 的第一步是编辑 /etc/samba/smb.conf 文件。

18.4.1 配置 [global] 部分

smb.conf 文件被划分为多个部分。第一部分是 [global] 部分,可以在其中指定适用于整个 Samba 配置的设置。尽管这些设置是全局的,但每个选项可以在配置文件的其他部分中被覆盖。

第一个任务是定义 CentOS 8 资源将要共享的 Windows 工作组名称。这个设置通过 [global] 部分的 workgroup = 指令控制,默认情况下配置如下:

workgroup = SAMBA

首先,修改为实际的工作组名称。例如,如果工作组名称为 WORKGROUP(大多数 Windows 网络的默认值):

[global]

workgroup = WORKGROUP

security = user

passdb backend = tdbsam

.

.

除了 workgroup 设置外,其他设置表明这是一个独立服务器,共享的资源将通过用户密码进行保护。在配置共享资源之前,还需要向 [global] 部分添加以下其他参数:

[global]

workgroup = WORKGROUP

security = user

netbios name = LinuxServer

passdb backend = tdbsam

log file = /var/log/samba/%m.log

log level = 1

.

.

“netbios name” 属性指定服务器在网络中对其他系统可见的名称,而日志设置则仅指定日志输出的文件位置。

18.4.2 配置共享资源

下一步是配置共享资源(换句话说,就是将在 Windows 网络中的其他系统上可以访问的资源)。为了实现这一点,需要为该部分指定一个名称,通过这个名称在共享时进行引用。例如,如果我们计划共享 CentOS 8 系统上的 /sampleshare 目录,可以将该部分命名为 [sampleshare]。在这个部分中,可以进行各种配置选项。然而,为了这个示例,我们将简单地定义要共享的目录,指定该目录可浏览和可写入,并声明该资源为公共资源,以便访客用户能够访问:

[sampleshare]

注释 = 示例 Samba 共享

路径 = /sampleshare

可浏览 = 是

公共 = 是

可写入 = 是

为了限制对特定用户的访问,可以使用“有效用户”属性,例如:

有效用户 = demo, bobyoung, marcewing

18.4.3 移除不必要的共享

smb.conf 文件已预先配置了用于共享打印机和系统上用户主文件夹的部分。如果这些资源不需要共享,可以将相应的部分注释掉,这样 Samba 就会忽略它们。在以下示例中,[homes] 部分已被注释掉:

[homes]

注释 = 主目录

有效用户 = %S, %D%w%S

可浏览 = 否

只读 = 否

继承 ACLs = 是

18.5 配置 SELinux 以支持 Samba

SELinux 是一个默认集成到所有 CentOS 8 系统的 Linux 内核中的系统,为操作系统和用户文件提供额外的安全性和保护。

传统上,Linux 安全性基于允许用户决定谁可以访问他们拥有的文件和其他资源的概念。例如,考虑一个位于某个特定用户的主目录中的文件,并由该用户拥有。该用户可以控制该文件的访问权限,决定其他系统用户是否可以读取和写入,或者在脚本或二进制文件的情况下,是否可以执行该文件。这种安全性被称为自主访问控制,因为资源的访问权限由用户自行决定。

然而,使用 SELinux 时,访问由系统管理员控制,用户无法覆盖此控制。这被称为强制访问控制,由管理员使用 SELinux 策略进行定义。继续之前的示例,文件的所有者只有在 SELinux 策略(无论是系统默认定义的,还是由管理员定义的)允许时,才能对该文件执行任务。

可以使用 sestatus 工具查看 CentOS 8 系统上 SELinux 的当前状态,方法如下:

sestatus

SELinux 状态:已启用

SELinuxfs 挂载:/sys/fs/selinux

SELinux 根目录:/etc/selinux

加载的策略名称:targeted

当前模式:启用

配置文件中的模式:启用

策略 MLS 状态:已启用

策略 deny_unknown 状态:已允许

内存保护检查:实际(安全)

最大内核策略版本:31

SELinux 可以在强制执行模式或宽容模式下运行。启用时,强制执行模式会拒绝所有 SELinux 策略未允许的操作。而宽容模式则允许本应被拒绝的操作继续进行,但会将违规操作记录在日志文件中。

SELinux 安全基于上下文标签的概念。系统上的所有资源(包括进程和文件)都被分配 SELinux 上下文标签,标签包括用户、角色、类型和可选的安全级别。例如,可以按如下方式查看文件或文件夹的 SELinux 上下文:

$ ls -Z /home/demo

unconfined_u:object_r:user_home_t:s0 Desktop

unconfined_u:object_r:user_home_t:s0 Documents

同样,可以使用 ps 命令识别正在运行的进程的上下文,这里是 ls 命令:

$ ps -eZ | grep ls

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 14311 tty1 00:00:18 ls

当进程(例如上面的 ls 命令)尝试访问文件或文件夹时,SELinux 系统会检查策略以确定是否允许访问。现在考虑 Samba 服务的上下文:

$ ps -eZ | grep smb

system_u:system_r:smbd_t:s0 14129 ? 00:00:00 smbd

system_u:system_r:smbd_t:s0 14132 ? 00:00:00 smbd-notifyd

SELinux 通过多种方式实现安全性,其中最常见的是称为类型强制执行。简单来说,当进程尝试对对象执行任务(例如写入文件)时,SELinux 会检查进程和对象的上下文类型,并验证安全策略是否允许执行该操作。例如,如果类型 A 的进程尝试写入类型 B 的文件,只有当 SELinux 策略明确表示类型 A 的进程可以执行对类型 B 文件的写入操作时,才会被允许。在 SELinux 强制执行模式下,默认情况下拒绝所有操作,除非存在专门允许该操作的规则。

SELinux 与 Samba 的问题在于 SELinux 策略未配置为允许 smb_t 类型的进程对除 samba_share_t 之外的任何类型文件执行操作。例如,上面列出的 /home/demo 目录将无法被 Samba 服务访问,因为它的类型是 user_home_t。为了使系统上的文件或文件夹能够被 Samba 服务访问,必须将这些特定资源的强制执行类型更改为 samba_share_t。

本示例中,我们将创建前面在 smb.conf 文件中提到的 /sampleshare 目录,并更改强制执行类型,使其能够被 Samba 服务访问。首先按以下步骤创建该目录:

mkdir /sampleshare

接下来,检查该目录的当前 SELinux 上下文:

$ ls -aZ /sampleshare/

unconfined_u:object_r:default_t:s0 .

在此实例中,文件夹的上下文标签被分配为 default_t 类型。为了使文件夹可由 Samba 共享,必须使用 semanage 工具将其强制类型设置为 samba_share_t,如下所示:

semanage fcontext -a -t samba_share_t "/sampleshare(/.*)?"

注意在 semanage 命令中使用通配符,以确保该类型应用于 /sampleshare 目录中的任何子目录和文件。添加后,需要使用 restorecon 命令应用更改,并使用 -R 标志递归地应用该更改到所有子目录:

restorecon -R -v /sampleshare

将 /sampleshare 的标签从 unconfined_u:object_r:default_t:s0 更改为 unconfined_u:object_r:samba_share_t:s0

一旦做出这些更改,文件夹将被配置为符合 smb 进程的 SELinux 策略,并准备通过 Samba 共享。

18.6 创建 Samba 用户

任何需要访问 Samba 共享资源的用户,必须配置为 Samba 用户并分配密码。这个任务通过使用 smbpasswd 命令行工具来完成。例如,假设有一个名为 demo 的用户,需要从 Windows 系统访问我们的 CentOS 8 系统上的 /sampleshare 目录。为了实现这个要求,我们必须如下添加 demo 为 Samba 用户:

smbpasswd -a demo

新的 SMB 密码:

重新输入新的 SMB 密码:

已添加用户 demo。

现在我们已经完成了一个非常基础的 Samba 服务器配置,是时候测试我们的配置文件并启动 Samba 服务了。

18.7 测试 smb.conf 文件

可以使用 testparm 命令行工具检查 smb.conf 文件中的错误,方法如下:

testparm

从 /etc/samba/smb.conf 加载 smb 配置文件

rlimit_max:将 rlimit_max(1024)增加到 Windows 最小限制(16384)

正在处理部分 "[sampleshare]"

正在处理部分 "[homes]"

正在处理部分 "[printers]"

正在处理部分 "[print$]"

服务文件加载成功。

服务器角色:ROLE_STANDALONE

按下回车键查看服务定义的输出

全局参数

[global]

日志文件 = /var/log/samba/%m.log

netbios 名称 = LINUXSERVER

printcap 名称 = cups

安全性 = 用户

WINS 支持 = 是

idmap 配置 * : 后端 = tdb

cups 选项 = raw

[sampleshare]

注释 = 示例 Samba 共享

允许游客访问 = 是

路径 = /sampleshare

只读 = 否

[homes]

可浏览 = 否

注释 = 家庭目录

继承 ACL = 是

只读 = 否

有效用户 = %S %D%w%S

[printers]

可浏览 = 否

注释 = 所有打印机

创建掩码 = 0600

路径 = /var/tmp

可打印 = 是

[print$]

注释 = 打印机驱动程序

创建掩码 = 0664

目录掩码 = 0775

强制组 = @printadmin

路径 = /var/lib/samba/drivers

写入列表 = @printadmin root

18.8 启动 Samba 和 NetBIOS 名称服务

为了使 CentOS 8 服务器能够在 Windows 网络中运行,必须启动 Samba (SMB) 和 NetBIOS 名称服务 (NMB)。另外,也可以启用这些服务,以便每次系统启动时自动启动:

systemctl enable smb

systemctl start smb

systemctl enable nmb

systemctl start nmb

在尝试从 Windows 系统连接之前,使用 smbclient 工具验证共享是否已配置:

smbclient -U demo -L localhost

输入 WORKGROUP\demo 的密码:

共享名称 类型 注释


sampleshare 磁盘示例 Samba 共享

print$ 磁盘打印机驱动程序

IPC$ IPC IPC 服务 (Samba 4.9.1)

demo 磁盘主目录

使用 SMB1 重新连接以进行工作组列表。

服务器注释


工作组主机


WORKGROUP LINUXSERVER

18.9 访问 Samba 共享

现在 Samba 资源已配置并且服务正在运行,是时候从 Windows 系统访问共享资源了。在与 CentOS 8 系统处于同一工作组的合适 Windows 系统上,打开 Windows 资源管理器并导航到“网络”面板。此时,资源管理器应搜索网络并列出它找到的任何使用 SMB 协议的系统。下图展示了一个名为 LINUXSERVER 的 CentOS 8 系统,在 Windows 10 系统上通过 Windows 资源管理器找到:

图 18-1

双击 LINUXSERVER 主机将提示输入具有访问权限的用户的用户名和密码。在这种情况下,是我们使用 smbpasswd 工具配置的 demo 帐户:

图 18-2

输入用户名和密码后,配置给该用户的共享资源将出现在资源管理器窗口中,包括之前配置的 /sampleshare 资源:

图 18-3

双击 /sampleshare 共享资源将显示其中包含的文件和目录列表。

18.10 从 CentOS 8 访问 Windows 共享

如前所述,Samba 是一条双向通道,允许 Windows 系统访问托管在 CentOS 8 系统上的文件和打印机,也允许 CentOS 8 系统访问 Windows 系统上的共享资源。通过使用本章开始时安装的 samba-client 软件包来实现这一点。如果目前尚未安装,可以通过终端窗口按如下方式安装:

dnf install samba-client

可以通过 CentOS 桌面上的“文件”应用程序或通过命令行提示符使用 smbclient 和 mount 工具来访问 Windows 系统上的共享资源。本节的步骤假设 Windows 系统已启用适当的网络共享设置。

要通过桌面访问 Windows 系统上的共享资源,首先启动“文件”应用程序并选择“其他位置”选项。这将显示如下图 图 18-4 所示的屏幕,包括 Windows 网络图标(如果检测到的话):

图 18-4

选择 Windows 网络选项将显示网络上检测到的 Windows 系统,并允许访问任何共享的资源。

图 18-5

另外,还可以使用“连接到服务器”选项来连接到特定的系统。请注意,远程系统的名称或 IP 地址必须以 smb:// 前缀,并且可以跟随特定共享资源的路径,例如:

smb://WinServer10/Documents

在没有桌面环境的情况下,可以通过命令行使用 mount 命令并指定 cifs 文件系统类型来挂载远程 Windows 共享。例如,以下命令将挂载一个名为 Documents 的共享,该共享位于名为 WinServer 的 Windows 系统上,挂载点为本地路径 /winfiles:

mount -t cifs //WinServer/Documents /winfiles -o user=demo

18.11 总结

在本章中,我们探讨了配置 CentOS 8 系统作为 Samba 客户端和服务器的必要步骤,从而允许与基于 Windows 的系统共享资源。涵盖的主题包括 Samba 客户端和服务器软件包的安装以及将 Samba 配置为独立服务器。此外,还介绍了 SELinux 的基本概念,并讲解了如何为 Samba 提供访问共享资源的步骤。

第十八章

  1. 虚拟化技术概述

虚拟化通常定义为在单个计算机系统上同时运行多个操作系统的能力。虽然这并不一定是一个新概念,但由于它能够充分利用服务器系统的 CPU 和资源容量,同时提供稳定性(即,如果某个虚拟化的客户系统崩溃,主机和任何其他客户系统仍然继续运行),虚拟化在近年来得到了广泛关注。

虚拟化在尝试不同操作系统时也非常有用,无需配置双重启动环境。例如,你可以在虚拟机中运行 Windows,而无需重新分区磁盘、关闭 CentOS 8 并从 Windows 启动。你只需启动一个虚拟化版本的 Windows 作为客户操作系统。类似地,虚拟化允许你在 CentOS 8 系统中运行其他 Linux 发行版,从而实现两个操作系统的并行访问。

在决定实施虚拟化的最佳方法时,清楚了解当前可用的不同虚拟化解决方案是非常重要的。因此,本章的目的是概述今天常用的虚拟化技术。

19.1 客户操作系统虚拟化

客户操作系统虚拟化,也称为基于应用程序的虚拟化,可能是最容易理解的概念。在这种情况下,物理主机计算机系统运行标准的未修改操作系统,如 Windows、Linux、UNIX 或 macOS。在这个操作系统上运行的是一个虚拟化应用程序,它的运行方式与任何其他应用程序(如文字处理器或电子表格)类似。正是在这个虚拟化应用程序中创建一个或多个虚拟机,以便在主机计算机上运行客户操作系统。

虚拟化应用程序负责启动、停止和管理每个虚拟机,实质上代表各个虚拟机控制对物理硬件资源的访问。虚拟化应用程序还参与一种被称为二进制重写的过程,这个过程包括扫描执行中的客户操作系统的指令流,并将任何特权指令替换为安全的仿真指令。这样做的效果是使客户操作系统认为它是直接在系统硬件上运行,而不是在应用程序中的虚拟机内运行。

以下图示例展示了基于客户操作系统的虚拟化:

图 19-1

如上图所示,来宾操作系统在虚拟化应用程序中的虚拟机内运行,而虚拟化应用程序则像其他应用程序一样运行在宿主操作系统之上。显然,来宾操作系统与底层宿主硬件之间的多层抽象不利于虚拟机的高性能。然而,这种技术的优点是,宿主操作系统和来宾操作系统都无需进行任何更改,并且不需要特殊的 CPU 硬件虚拟化支持。

19.2 虚拟机监控程序虚拟化

在虚拟机监控程序虚拟化中,虚拟机监控程序的任务除了处理虚拟机的资源和内存分配外,还提供更高层次的管理和监控工具接口。基于虚拟机监控程序的解决方案分为类型 1 和类型 2 两种\。

类型 2 虚拟机监控程序(有时称为托管虚拟机监控程序)作为软件应用程序安装在宿主操作系统之上,通过协调对资源(如 CPU、内存和网络)的访问,为来宾虚拟机提供虚拟化功能。图 19-2 展示了使用类型 2 虚拟机监控程序虚拟化的系统的典型架构:

图 19-2

要理解类型 1 虚拟机监控程序的工作原理,首先需要了解一些关于 Intel x86 处理器架构的知识。x86 系列 CPU 提供了一系列保护级别,称为环(rings),代码可以在其中执行。环 0 具有最高的特权级,操作系统内核通常在该环中运行。在环 0 中执行的代码被称为在系统空间、内核模式或监控模式下运行。所有其他代码,如在操作系统上运行的应用程序,通常在较低特权的环中运行,通常是环 3。

与类型 2 虚拟机监控程序(hypervisor)相比,类型 1 虚拟机监控程序(也称为金属虚拟机监控程序或原生虚拟机监控程序)直接运行在宿主系统的硬件上,并且在环 0 中运行。显然,由于虚拟机监控程序占用了 CPU 的环 0,任何在该系统上运行的来宾操作系统的内核必须在更低权限的 CPU 环中运行。不幸的是,大多数操作系统内核都是显式编写为在环 0 中运行,原因很简单:它们需要执行仅在该环中可用的任务,例如执行特权 CPU 指令和直接操作内存的能力。近年来,针对这个问题已经设计了许多不同的解决方案,下面将逐一介绍:

19.2.1 半虚拟化

在半虚拟化下,来宾操作系统的内核被专门修改以便在虚拟机监控器上运行。这通常涉及将只能在 CPU 的环 0 中运行的特权操作替换为对虚拟机监控器的调用(称为超级调用)。虚拟机监控器则代表来宾内核执行该任务。通常,这种方式将支持限制为可以自由修改的开源操作系统,如 Linux,以及那些所有者同意对其进行必要代码修改以支持特定虚拟机监控器的专有操作系统。尽管存在这些问题,来宾内核能够直接与虚拟机监控器通信,这使得性能相比其他虚拟化方法更为优越。

19.2.2 完全虚拟化

完全虚拟化支持未修改的来宾操作系统。未修改是指操作系统内核没有被修改以便在虚拟机监控器上运行,因此仍然执行特权操作,就像在 CPU 的环 0 中运行一样。在这种情况下,虚拟机监控器提供 CPU 仿真来处理和修改未修改的来宾操作系统内核所发出的特权和保护 CPU 操作。不幸的是,这一仿真过程需要时间和系统资源,因此与半虚拟化相比,性能较差。

19.2.3 硬件虚拟化

硬件虚拟化利用了英特尔和 AMD 最新一代 CPU 中内置的虚拟化功能。这些技术,分别称为 Intel VT 和 AMD-V,提供了必要的扩展,使得在没有完全虚拟化 CPU 仿真开销的情况下能够运行未修改的来宾虚拟机。简单来说,这些新处理器提供了一个比环 0 更高的特权模式(称为环 -1),虚拟机监控器可以在其中运行,从而将环 0 留给未修改的来宾操作系统。

下图展示了 Type-1 虚拟机监控器的虚拟化方法:

图 19-3

如上图所示,除了虚拟机外,还运行着一个管理操作系统和/或管理控制台,这些都在虚拟机监控器上运行,从而允许系统管理员对虚拟机进行管理。

19.3 虚拟机网络

虚拟机通常需要连接到网络才能发挥实际作用。一种选择是将客户机连接到运行在宿主机操作系统中的虚拟网络。在这种配置下,虚拟网络上的任何虚拟机都可以相互访问,但外部网络的访问是通过网络地址转换(NAT)提供的。在使用虚拟网络和 NAT 时,每个虚拟机在外部网络(宿主机所连接的网络)上都会通过宿主机的 IP 地址进行表示。这是 CentOS 8 上 KVM 虚拟化的默认行为,通常无需额外配置。通常,默认会创建一个虚拟网络,名称为 default,设备为 virbr0。

为了使客户机在外部网络上作为独立的系统出现(即拥有自己的 IP 地址),它们必须配置为共享宿主机上的物理网络接口。实现这一目标的最快方法是将虚拟机配置为使用“直接连接”网络配置选项(也称为 MacVTap),这样将为客户系统分配与宿主机相同网络中的 IP 地址。不幸的是,虽然这可以使虚拟机访问网络上的其他系统,但在使用 MacVTap 驱动时,无法建立客户机与宿主机之间的连接。

更好的选择是配置一个网络桥接接口,在宿主系统上供客户机连接。这为客户机提供外部网络上的 IP 地址,同时也允许客户机与宿主机进行通信,相关内容将在章节“创建 CentOS 8 KVM 网络桥接接口”中进行讲解。

19.4 总结

虚拟化被定义为在单一宿主操作系统内运行多个客户操作系统的能力。已经开发出多种虚拟化方法,包括客户操作系统虚拟化和虚拟机管理程序(Hypervisor)虚拟化。虚拟机管理程序虚拟化分为两类:Type-1 和 Type-2。Type-2 虚拟化解决方案包括准虚拟化、完全虚拟化和硬件虚拟化,后者利用了一些 Intel 和 AMD 处理器型号的特殊虚拟化特性。

虚拟机客户操作系统在网络配置方面有多个选项,包括 NAT、直接连接(MacVTap)和网络桥接配置。

  1. 安装 KVM 虚拟化到 CentOS 8

在 CentOS 6 之前,CentOS 提供了两种虚拟化平台:基于内核的虚拟机(KVM)和 Xen。随着 CentOS 6 的发布,Xen 的支持被移除,KVM 成为 CentOS 8 中唯一的捆绑虚拟化选项。除了 KVM 外,第三方解决方案如 VMware 和 Oracle VirtualBox 也可用。然而,由于 KVM 与 CentOS 8 一起提供,因此本章及后续章节将讨论 KVM 作为虚拟化解决方案。

在深入安装和运行 KVM 之前,值得花点时间讨论它如何适应上一章中概述的各种虚拟化类型。

20.1 KVM 概述

KVM 被归类为一种 Type-1 虚拟化解决方案,能够实现完整虚拟化,并支持使用 Intel VT 和 AMD-V 硬件虚拟化技术的未修改客户操作系统。

KVM 与许多其他 Type-1 解决方案不同,它将主机 Linux 操作系统本身转变为虚拟机监控程序(hypervisor),从而实现裸机虚拟化,同时仍然运行完整的企业级主机操作系统。

20.2 KVM 硬件要求

在继续本章之前,我们需要讨论在 KVM 环境中运行虚拟机的硬件要求。首先,KVM 虚拟化仅适用于某些类型的处理器。如前所述,这些处理器必须包含 Intel VT 或 AMD-V 技术。

要检查虚拟化支持情况,请在终端窗口中运行以下命令:

第十九章:lscpu | grep Virtualization:

如果系统中包含支持 Intel VT 的 CPU,则上述命令将提供以下输出:

虚拟化:VT-x

当检测到支持 AMD-V 的 CPU 时,将显示以下输出:

虚拟化:AMD-V

如果 CPU 不支持虚拟化,lscpu 命令将不会显示任何输出。

请注意,虽然上述命令仅报告处理器是否支持相应的功能,但并未指示该功能是否已在 BIOS 中启用。实际上,大多数系统的 BIOS 默认禁用虚拟化支持。因此,建议在继续本教程之前,检查 BIOS 设置以确保适当的虚拟化技术已启用。

与双引导环境不同,虚拟化环境涉及在单台计算机系统上同时运行两个或更多完整操作系统。这意味着系统必须具有足够的物理内存、磁盘空间和 CPU 处理能力,以舒适地并行承载所有这些系统。在开始配置和安装过程之前,请检查 CentOS 8 和您选择的客户操作系统的最低系统要求,并验证您的系统是否具备处理这两个系统要求的足够资源。

20.3 为 KVM 虚拟化准备 CentOS 8

与 Xen 不同,不需要运行特殊版本的内核以支持 KVM。因此,通过安装 KVM 内核模块,标准内核已经支持 KVM,从而避免了安装和引导特殊内核的需要。

为避免冲突,如果系统当前正在运行启用了 Xen 的内核,请重新启动系统,并在继续本章剩余部分之前从引导菜单中选择非 Xen 内核。

除非在 CentOS 8 操作系统安装过程中明确选择,默认情况下不会安装设置和维护基于 KVM 的虚拟化系统所需的工具。要从命令提示符安装 KVM,请在终端窗口中执行以下命令:

dnf install qemu-kvm qemu-img libvirt virt-install libvirt-client

如果您可以访问图形桌面环境,还建议安装 virt-manager 软件包:

dnf install virt-manager

20.4 验证 KVM 安装

在继续之前,值得检查 KVM 安装是否正常工作。安装和运行 KVM 后,两个模块将已加载到内核中。可以通过在终端窗口中运行以下命令来验证这些模块的存在或否:

lsmod | grep kvm

假设安装成功,上述命令应生成类似以下内容的输出:

lsmod | grep kvm

kvm_intel 237568 0

kvm 737280 1 kvm_intel

irqbypass 16384 1 kvm

请注意,如果系统包含 AMD 处理器,kvm 模块可能会读取 kvm_amd 而不是 kvm_intel。

安装过程还应配置 libvirtd 守护程序在后台运行。再次使用终端窗口,运行以下命令以确保 libvirtd 正在运行:

systemctl status libvirtd

libvirtd.service - 虚拟化守护程序

已加载:loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)

Active: active (running) since Wed 2019-03-06 14:41:22 EST; 3min 54s ago

如果进程未运行,可以按以下方式启动:

systemctl enable --now libvirtd

systemctl start libvirtd

如果桌面环境可用,请通过选择“活动”并在搜索框中输入“virt”来运行 virt-manager 工具。当虚拟机管理器图标出现时,点击它以启动。加载完成后,管理器应该如以下图所示:

图 20-1

如果没有列出 QEMU/KVM 入口,请选择文件 -> 添加连接菜单选项,在弹出的对话框中选择 QEMU/KVM 虚拟化管理程序,然后点击连接按钮:

图 20-2

如果管理器当前未连接到虚拟化进程,右键点击列出的条目,并从弹出菜单中选择连接。

20.5 小结

KVM 是一种 Type-1 虚拟化解决方案,通过支持 Intel VT 和 AMD-V 硬件虚拟化,能够实现完全虚拟化并支持未修改的来宾操作系统。它是与 CentOS 8 一起捆绑的默认虚拟化解决方案,可以快速且轻松地在任何支持适当处理器的 CentOS 8 系统上安装。安装并启用 KVM 支持后,接下来的章节将概述一些在 CentOS 8 主机上安装和管理虚拟机的选项。

  1. 使用 Cockpit 和 virt-manager 创建 KVM 虚拟机

基于 KVM 的虚拟机可以通过 virt-install 命令行工具、virt-manager 图形工具或 Cockpit Web 控制台的虚拟机模块在 CentOS 8 上轻松配置。为了本章的目的,我们将使用 Cockpit 和 virt-manager 工具,在 CentOS 8 主机上安装 Fedora 发行版作为 KVM 客户机。然而,需要注意的是,virt-manager 在 CentOS 8 中已被弃用,未来将完全由 Cockpit 模块取代。尽管如此,截至 CentOS 8,virt-manager 仍然可用,并包含一些尚未集成到 Cockpit 虚拟机模块中的功能。

创建虚拟机的命令行方法将在下一章中介绍,章节标题为“使用 virt-install 和 virsh 创建 KVM 虚拟机”。

21.1 安装 Cockpit 虚拟机模块

默认情况下,虚拟机模块不会包含在标准的 Cockpit 安装中。假设 Cockpit 已经安装并配置好,可以按照以下步骤安装虚拟机模块:

第二十章:dnf install cockpit-machines

安装完成后,下次登录 Cockpit 界面时,虚拟机选项(如图 21-1 中标记的 A)将出现在导航面板中:

图 21-1

21.2 在 Cockpit 中创建虚拟机

要在 Cockpit 中创建虚拟机,只需点击图 22-1 中标记为 B 的“创建虚拟机”按钮,打开创建对话框。

在对话框中,输入虚拟机的名称,并选择安装介质的形式,可以是通过 URL 访问的 ISO 文件或本地文件系统路径。理想情况下,还应选择客户操作系统的供应商和类型信息。虽然这不是必须的,但它有助于系统为客户优化虚拟机。

还需要指定用于操作系统安装的虚拟磁盘驱动器的大小以及分配给虚拟机的内存量:

图 21-2

在这个例子中,保持“立即启动虚拟机”选项未选中,配置完新的虚拟机后,点击“创建”按钮来构建虚拟机。创建过程完成后,新的虚拟机会出现在 Cockpit 中,如图 21-3 所示:

图 21-3

如“虚拟化技术概述”中所述,KVM 为虚拟机提供了多种网络配置选项。要查看和更改虚拟机的网络设置,请点击图 21-4 所示的“网络”标签,然后点击位于网络条目旁边的“编辑”按钮:

图 21-4

在弹出的对话框中,可以使用“网络类型”菜单更改网络连接类型,例如从虚拟网络(NAT)切换到直接连接(MacVTap)。

21.3 启动安装

要启动新的虚拟机并从指定的安装介质开始安装来宾操作系统,请点击上图图 21-3 中突出显示的“安装”按钮。Cockpit 将启动虚拟机并切换到“控制台”视图,来宾操作系统的屏幕将出现:

图 21-5

如果安装失败,请检查消息,看看是否显示如下内容:

无法打开‘’:权限被拒绝

域安装似乎未成功。

这通常是因为 QEMU 模拟器以名为 qemu 的用户身份运行,而该用户没有访问 ISO 安装镜像所在目录的权限。要解决此问题,请切换到 ISO 镜像文件所在的目录,并将 qemu 用户添加到父目录的访问控制列表(ACL)中,如下所示:

cd /path/to/iso/directory

setfacl --modify u:qemu:x ..

进行此更改后,检查设置,如下所示:

getfacl ..

file: ..

owner: demo

group: demo

user::rwx

user:qemu:--x

group::---

mask::--x

other::---

一旦完成这些更改,请再次点击“安装”按钮以完成安装。

要完成安装,请像在物理硬件上安装操作系统一样,在“控制台”视图中与屏幕进行交互。

还可以使用 virt-viewer 工具从 Cockpit 浏览器会话外连接并显示虚拟机的图形控制台。要在 CentOS 8 系统上安装 virt-viewer,请运行以下命令:

dnf install virt-viewer

virt-viewer 工具也适用于 Windows 系统,可以从以下网址下载:

virt-manager.org/download/

要连接到本地主机上运行的虚拟机,只需运行 virt-viewer 并在弹出的对话框中选择您希望连接的虚拟机:

图 21-6

或者,也可以指定虚拟机名称并绕过选择对话框,例如:

virt-viewer myFedoraGuest

要通过 SSH 将 virt-viewer 实例连接到远程主机上运行的虚拟机,可以使用以下命令:

$ virt-viewer --connect qemu+ssh://@/system

例如:

$ virt-viewer --connect qemu+ssh://root@192.168.1.122/system MyFedoraGuest

使用此技术时,需要注意的是,在完全建立连接之前,系统会要求输入用户密码两次。

创建虚拟机后,可以使用 Cockpit 界面来监控虚拟机并执行重启、关机或删除来宾系统等任务。磁盘面板上还提供了添加额外磁盘到虚拟机配置中的选项。

21.4 使用 virt-manager 创建虚拟机

需要注意的是,virt-manager 已经被弃用,并将在虚拟机 Cockpit 扩展完全实现后被移除,本章的其余部分将探讨如何使用该工具创建新的虚拟机。

21.5 启动虚拟机管理器

从命令行终端窗口中启动虚拟机管理器,可以运行 virt-manager。加载后,虚拟机管理器会提示输入当前活动用户的密码,然后显示以下界面:

图 21-7

主界面列出了当前系统上运行的虚拟机。此时,应该只有一台虚拟机,即运行在主机系统上的虚拟化管理程序。默认情况下,管理器应该已经连接到主机。如果没有连接,请右键点击列表中的条目,然后从弹出菜单中选择“连接”以连接到主机系统。

要创建一个新的虚拟系统,点击新建虚拟机按钮(工具栏最左侧的按钮),或右键点击虚拟化管理程序条目,从弹出菜单中选择“新建”以显示新虚拟机向导的第一屏。在“名称”字段中输入一个适当描述虚拟系统的名称。在此界面,还需要选择要安装来宾操作系统的介质位置。可以选择 CD 或 DVD 驱动器、本地主机可访问的 ISO 镜像文件、使用 HTTP、FTP、NFS 或 PXE 进行的网络安装,或者来自现有虚拟机的磁盘映像:

图 21-8

21.6 配置 KVM 虚拟系统

点击“Forward”按钮将显示一个屏幕,要求提供关于安装过程的额外信息。显示的屏幕及所需的信息将取决于前一屏幕中所做的选择。例如,如果选择了 CD、DVD 或 ISO,系统将要求提供 ISO 文件或物理介质设备的具体位置。该屏幕还会尝试根据指定的安装媒体识别要安装的客户操作系统的类型和版本(例如,Windows 版本或 Linux 发行版)。如果无法识别,请取消选中“Automatically detect from installation media / source”选项,输入操作系统名称的前几个字符,并从可能的匹配项列表中选择一个选项:

图 21-9

完成这些设置后,点击“Forward”按钮配置 CPU 和内存设置。最佳设置将取决于主机中 CPU 的数量和物理内存的大小,以及与新虚拟机并行运行的其他应用程序和虚拟机的需求:

图 21-10

创建虚拟机之前需要配置的最后一项是客户操作系统及其相关用户数据的存储空间。这可以是虚拟磁盘映像或现有存储。虚拟磁盘驱动器本质上是存储在主机计算机文件系统中的一个映像文件,虚拟机将其视为物理磁盘驱动器。

可以选择创建指定大小的映像磁盘、选择现有卷或创建指定格式的存储卷(raw、vmdk、ISO 等)。除非你有特殊需求使用特定格式(例如,你可能需要使用 vmdk 格式以便日后迁移到基于 VMware 的虚拟化环境)或需要使用专用磁盘或分区,否则通常只需在此屏幕上指定大小即可:

图 21-11

配置好这些设置后,再次点击“Forward”按钮。最终屏幕将显示配置摘要。请检查显示的信息。还提供了高级选项,可以更改客户机的虚拟网络配置,如图 21-12 所示:

图 21-12

21.7 启动 KVM 虚拟机

点击“Finish”按钮开始创建过程。虚拟化管理器将在启动客户系统之前创建磁盘并配置虚拟机。新的虚拟机将出现在主 virt-manager 窗口中,状态设置为“Running”,如图 21-13 所示:

图 21-13

默认情况下,虚拟机的控制台应显示在虚拟机查看器窗口中。如需在未来的任何时间查看正在运行的虚拟机的控制台,请确保在虚拟机列表中选择该虚拟机,并从工具栏中选择“打开”按钮。虚拟机查看器应准备好开始安装过程:

图 21-14

从此时起,只需按照操作系统安装说明在 KVM 虚拟机中安装客操作系统。

21.8 总结

本章概述了在 CentOS 8 主机系统上创建基于 KVM 的新虚拟机的两种不同方法。第一种方法是使用 Cockpit 基于 Web 的界面来创建和管理虚拟机,这种方法的优点是无需访问主机系统上的桌面环境。另一种选择是使用 virt-manager 图形工具。尽管在 CentOS 8 中已被弃用,并且可能会在未来的版本中移除,但 virt-manager 目前提供的某些功能是 Cockpit 虚拟机扩展所不具备的。预计在 virt-manager 被移除后,Cockpit 将提供相同或更强大的功能。

在掌握了这些基础知识之后,下一章将介绍如何通过命令行创建虚拟机。

22. 使用 virt-install 和 virsh 创建 KVM 虚拟机

在上一章中,我们探索了如何使用 Cockpit 和 virt-manager 图形工具在 CentOS 8 主机上创建 KVM 客户操作系统。在本章中,我们将转向使用 virt-install 和 virsh 命令行工具创建基于 KVM 的虚拟机。这些工具提供了与 virt-manager 和 Cockpit 选项相同的功能,且附带的优势是它们可以在脚本中使用,自动化虚拟机的创建。此外,virsh 命令允许根据配置文件中的规范创建虚拟机。

virt-install 工具提供了一种通过列出命令行选项来创建新虚拟机的方式。本章假设已安装必要的 KVM 工具。有关这些要求的详细信息,请阅读名为“在 CentOS 8 上安装 KVM 虚拟化”的章节。

22.1 使用 virt-install 构建 KVM 客户系统

virt-install 实用程序接受广泛的命令行参数,用于提供与所创建虚拟机相关的配置信息。这些命令行选项中有一些是必须提供的(特别是名称、内存和磁盘存储必须提供),而其他选项则是可选的。

至少,一个 virt-install 命令通常需要以下参数:

•--name - 要分配给虚拟机的名称。

•--memory - 分配给虚拟机的内存大小。

•--disk - 用作虚拟机存储的映像文件的名称和位置。如果没有指定 --import 选项以表明使用现有的映像文件,则该文件将在虚拟机创建过程中由 virt-install 创建。

•--cdrom 或 --location - 指定包含客户操作系统安装媒体的本地路径或远程 ISO 镜像的 URL。

所有可用于 virt-install 的参数总结可以在手册页中找到:

$ man virt-install

22.2 一个 CentOS 8 virt-install 命令示例

根据上面的命令行参数列表,我们现在可以查看使用 virt-install 工具的一个示例命令行构造。

请注意,为了能够显示虚拟机并完成安装,virt-viewer 实例需要在 virt-install 工具启动虚拟机后连接到虚拟机。默认情况下,virt-install 会尝试在虚拟机开始运行时自动启动 virt-viewer。如果 virt-viewer 不可用,virt-install 将等待直到建立 virt-viewer 连接。如果主机系统具有图形桌面,virt-viewer 会在本地运行,或者可以从远程客户端建立连接,详细内容请参见章节“使用 Cockpit 和 virt-manager 创建 KVM 虚拟机”。

以下命令创建一个新的 KVM 虚拟机,配置为使用 KVM 半虚拟化运行 Fedora 29。它创建了一个新的 10GB 磁盘镜像,为虚拟机分配了 1024MB 的内存,并为安装介质 ISO 镜像配置了一个虚拟 CD 设备:

第二十一章:virt-install --name MyFedora --memory 1024 --disk path=/tmp/myFedora.img, size=10 --network network=default --os-variant fedora29 --cdrom /tmp/Fedora-Server-dvd-x86_64-29-1.2.iso

在创建过程中,virt-install 命令将显示创建进度的状态更新:

开始安装...

正在分配‘MyFedora.img’ | 10 GB 00:00:01

域安装仍在进行中,等待安装完成。

一旦来宾系统创建完成,virt-viewer 屏幕将出现,显示从指定安装介质加载的操作系统安装程序:

图 22-1

从此开始,按照来宾操作系统的标准安装程序进行操作。

22.3 从命令行启动和停止虚拟机

既然是通过命令行创建了虚拟机,那么将来你可能也需要通过命令行来启动它。这可以通过使用 virsh 命令行工具来实现,引用在创建过程中分配给虚拟机的名称。例如:

virsh start MyFedora

同样,虚拟机也可以通过以下方式接收关机信号:

virsh shutdown MyFedora

如果虚拟机未响应关机信号且未开始正常关机,则可以使用 destroy 指令销毁虚拟机(但会有数据丢失的风险):

virsh destroy MyFedora

22.4 从配置文件创建虚拟机

virsh create 命令可以接受一个配置文件名作为参数,用于基于该文件创建新虚拟机。该配置文件采用 XML 格式。可以说,创建配置文件的最简单方法是导出现有虚拟机的配置并对其进行修改以适应新虚拟机。这可以通过 virsh dumpxml 命令实现。以下命令将名为 MyFedora 的虚拟机域的配置数据输出到名为 MyFedora.xml 的文件中:

virsh dumpxml MyFedora > MyFedora.xml

一旦文件生成完毕,加载到编辑器中以查看并修改新虚拟机的设置。

至少需要更改 和镜像文件路径 ,以避免与配置文件来源虚拟机的冲突。对于 UUID,可以直接从文件中删除这一行。

如果需要,虚拟化类型、内存分配和 CPU 数量等选项也可以进行更改。一旦文件被修改,新虚拟机可以通过以下方式创建:

virsh create MyFedora.xml

22.5 总结

KVM 提供了 virt-install 和 virsh 命令行工具,作为使用 Cockpit 和 virt-manager 工具创建和管理虚拟机实例的快捷高效替代方案。这些工具的优势在于,它们可以在脚本中使用,从而自动化虚拟机的创建和管理。virsh 命令还包括了从基于 XML 的配置文件创建虚拟机实例的选项。

23. 创建 CentOS 8 KVM 网络桥接接口

默认情况下,CentOS 8 上的 KVM 虚拟化环境会创建一个虚拟网络,虚拟机可以连接到这个网络。也可以使用 MacVTap 驱动程序配置直接连接,尽管正如在名为“虚拟化技术概述”的章节中所概述的那样,这种方法不允许主机和客户系统进行通信。

本章的目标是介绍在 CentOS 8 上创建网络桥接的步骤,使客户系统能够共享主机系统的一个或多个物理网络连接,同时允许客户系统和主机系统之间的通信。

在本章的其余部分,我们将介绍配置 CentOS 8 网络桥接的步骤,以便 KVM 基础的客户操作系统使用。

23.1 获取当前网络设置

可以使用 NetworkManager 命令行工具(nmcli)创建网络桥接。NetworkManager 在 CentOS 8 系统上默认安装并启用,负责检测并连接网络设备,同时提供用于管理网络配置的接口。

当前主机系统上的网络连接列表可以如下显示:

第二十二章:nmcli con show

NAME UUID TYPE DEVICE

eno1 99d40009-6bb1-4182-baad-a103941c90ff 以太网 eno1

virbr0 7cb1265e-ffb9-4cb3-aaad-2a6fe5880d38 桥接 virbr0

在上述输出中,我们可以看到主机通过名为 eno1 的设备建立了以太网连接,默认的桥接接口 virbr0 提供对基于 NAT 的虚拟网络的访问,该虚拟网络是 KVM 客户系统默认连接的网络。

同样,以下命令可以用来识别当前系统上配置的设备(包括虚拟和物理设备):

nmcli device show

GENERAL.DEVICE: eno1

GENERAL.TYPE: 以太网

GENERAL.HWADDR: AC:16:2D:11:16:73

GENERAL.MTU: 1500

GENERAL.STATE: 100(已连接)

GENERAL.CONNECTION: eno1

GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1

WIRED-PROPERTIES.CARRIER: on

IP4.ADDRESS[1]: 192.168.86.59/24

IP4.GATEWAY: 192.168.86.1

IP4.ROUTE[1]: dst = 0.0.0.0/0, nh = 192.168.86.1, mt = 100

IP4.ROUTE[2]: dst = 192.168.86.0/24, nh = 0.0.0.0, mt = 100

IP4.DNS[1]: 192.168.86.1

IP4.DOMAIN[1]: lan

IP6.ADDRESS[1]: fe80::6deb:f739:7d67:2242/64

IP6.GATEWAY: --

IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 100

IP6.ROUTE[2]: dst = ff00::/8, nh = ::, mt = 256, table=255

GENERAL.DEVICE: virbr0

GENERAL.TYPE: bridge

GENERAL.HWADDR: 52:54:00:59:30:22

GENERAL.MTU: 1500

GENERAL.STATE: 100(已连接)

GENERAL.CONNECTION: virbr0

GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2

IP4.ADDRESS[1]: 192.168.122.1/24

IP4.GATEWAY: --

IP4.ROUTE[1]: dst = 192.168.122.0/24, nh = 0.0.0.0, mt = 0

IP6.GATEWAY: --

.

.

上述部分输出表明,执行命令的主机系统包含一个物理以太网设备(eno1)和虚拟桥接(virbr0)。

也可以使用 virsh 命令列出当前系统上配置的虚拟网络:

virsh net-list --all

Name State Autostart


default active yes

此时,唯一存在的虚拟网络是 virbr0 提供的默认网络。现在已经获得了当前网络配置的基本信息,下一步是创建一个连接到物理网络设备(在此案例中是 eno1 设备)的网络桥接。

23.2 从命令行创建网络桥接

创建网络桥接的第一步是将新的连接添加到网络配置中。这可以通过 nmcli 工具来实现,指定连接类型为桥接,并为连接和接口提供名称:

nmcli con add ifname br0 type bridge con-name br0

一旦连接被添加,就需要在物理设备 eno1(从设备)和桥接连接 br0(主设备)之间建立桥接从属接口,命令如下:

nmcli con add type bridge-slave ifname eno1 master br0

此时,NetworkManager 连接列表应显示如下内容:

nmcli con show

NAME UUID TYPE DEVICE

eno1 66f0abed-db43-4d79-8f5e-2cbf8c7e3aff ethernet eno1

virbr0 0fa934d5-0508-47b7-a119-33a232b03f64 bridge virbr0

br0 59b6631c-a283-41b9-bbf9-56a60ec75653 bridge br0

bridge-slave-eno1 395bb34b-5e02-427a-ab31-762c9f878908 ethernet --

下一步是启动桥接接口。如果桥接配置是在网络连接(即通过 SSH)中执行的,这一步可能会出现问题,因为在启动桥接连接之前,当前的 eno1 连接必须先关闭。这意味着在启用桥接连接以替代当前连接之前,当前连接将会丢失,可能会导致远程主机无法访问。

如果你是通过远程访问主机系统,可以通过创建一个 Shell 脚本来执行网络更改,从而避免这个问题。这样可以确保在 eno1 接口关闭后,桥接接口被启用,使你在更改完成后能够重新连接到主机。首先创建一个名为 bridge.sh 的 Shell 脚本文件,包含以下命令:

!/bin/bash

nmcli con down eno1

nmcli con up br0

一旦脚本被创建,可以按以下方式执行它:

sh ./bridge.sh

当脚本执行时,eno1 连接会被关闭,连接将会丢失。然而,等待几秒钟后,应该可以在 br0 连接激活后重新连接到主机。

如果你是在主机上本地工作,可以在终端窗口中运行这两个 nmcli 命令,不会有丢失连接的风险:

nmcli con down eno1

nmcli con up br0

一旦桥接启动并运行,连接列表现在应该包括桥接和桥接从属连接:

nmcli con show

NAME UUID TYPE DEVICE

br0 59b6631c-a283-41b9-bbf9-56a60ec75653 bridge br0

bridge-slave-eno1 395bb34b-5e02-427a-ab31-762c9f878908 ethernet eno1

virbr0 0fa934d5-0508-47b7-a119-33a232b03f64 bridge virbr0

eno1 66f0abed-db43-4d79-8f5e-2cbf8c7e3aff ethernet --

请注意,eno1 连接仍然列出,但实际上已经不再处于活动状态。要将非活动连接从列表中排除,只需在请求列表时使用--active 标志:

nmcli con show --active

NAME UUID TYPE DEVICE

br0 c2fa30cb-b1a1-4107-80dd-b1765878ab4f bridge br0

bridge-slave-eno1 21e8c945-cb94-4c09-99b0-17af9b5a7319 ethernet eno1

virbr0 a877302e-ea02-42fe-a3c1-483440aae774 bridge virbr0

23.3 声明 KVM 桥接网络

此时,桥接连接已存在于系统中,但对 KVM 环境不可见。运行 virsh 命令仍然应该将默认网络列为唯一可用的网络选项:

virsh net-list --all

Name State Autostart Persistent


default active yes yes

在虚拟机可以使用桥接之前,必须声明并将其添加到 KVM 网络配置中。这涉及到创建一个定义文件,再次使用 virsh 命令行工具。

首先创建一个名为 bridge.xml 的桥接网络定义文件,内容如下:

br0

接下来,使用该文件定义新的网络:

virsh net-define ./bridge.xml

一旦网络定义完成,启动它,并根据需要配置其在每次系统重启时自动启动:

virsh net-start br0

virsh net-autostart br0

再次列出网络,验证桥接网络现在是否可以在 KVM 环境中访问:

virsh net-list --all

Name State Autostart Persistent


br0 active yes yes

default active yes yes

23.4 在虚拟机中使用桥接网络

要创建一个使用桥接网络的虚拟机,使用 virt-install --network 选项并指定 br0 桥接名称。例如:

virt-install --name MyFedora --memory 1024 --disk path=/tmp/myFedora.img,size=10 --network network=br0 --os-variant fedora29 --cdrom /home/demo/Downloads/Fedora-Server-dvd-x86_64-29-1.2.iso

当客户操作系统运行时,它将与主机系统处于同一物理网络,并且不再处于基于 NAT 的虚拟网络中。

要修改现有虚拟机以使其使用桥接,使用 virsh edit 命令。该命令将 XML 定义文件加载到编辑器中,可以在其中进行更改并保存:

virsh edit GuestName

默认情况下,文件将加载到 vi 编辑器中。要使用其他编辑器,只需更改$EDITOR 环境变量,例如:

export EDITOR=gedit

要从默认的虚拟网络进行更改,请找到文件中的 部分,对于基于 NAT 的配置,它应如下所示:

或者,如果虚拟机使用的是直接连接,则该条目可能如下所示:

要使用桥接功能,在保存文件之前,请将源网络属性更改为如下所示:

如果虚拟机已经在运行,变更将需要重启才能生效。

23.5 使用 nm-connection-editor 创建桥接网络

如果主机系统上提供了本地或远程桌面访问,则大部分桥接配置过程可以使用 nm-connection-editor 图形工具完成。要使用此工具,请在桌面内打开一个终端窗口并输入以下命令:

nm-connection-editor

当工具加载完毕时,显示的窗口将列出当前配置的网络连接(基本上与执行 nmcli con show 命令生成的输出相同),如图 23-1 所示:

图 23-1

要创建新的连接,请点击窗口左下角的‘+’按钮。在弹出的对话框中(图 23-2),从菜单中选择 Bridge 选项:

图 23-2

选择桥接选项后,点击创建...按钮进入桥接配置屏幕。首先,将连接和接口名称字段都更改为 br0,然后点击位于桥接连接列表右侧的添加按钮,如图 23-3 所示:

图 23-3

在连接类型对话框中(图 23-4),将菜单设置更改为以太网,然后点击创建...按钮:

图 23-4

现在会出现另一个对话框,需要在其中配置桥接从属连接。在此对话框中,从设备菜单中选择要连接的物理网络(例如 eno1):

图 23-5

点击“保存”按钮以应用更改,并返回编辑 br0 对话框(如上图 图 23-3 所示)。在该对话框内,点击“保存”按钮以创建桥接。在返回主窗口后,新的桥接和从属连接应当列出:

图 23-6

剩下的就是按照上一章中概述的步骤,关闭原来的 eno1 连接并启动 br0 连接(如果主机是远程访问的,请记得在 shell 脚本中执行这些步骤):

nmcli con down eno1

nmcli con up br0

同样,就像使用命令行工具创建桥接时一样,还需要将该桥接添加到 KVM 网络配置中。为此,只需重复上一节中名为 “声明 KVM 桥接网络” 的步骤。一旦完成此步骤,桥接就可以供客户虚拟机使用。

23.6 小结

默认情况下,KVM 虚拟机连接到一个虚拟网络,该网络使用 NAT 提供主机系统连接的网络访问。如果需要让客户虚拟机使用自己的 IP 地址出现在网络上,则需要配置虚拟机共享主机系统的物理网络接口。如本章所述,可以使用 nmcli 或 nm-connection-editor 工具来创建一个网络桥接接口。

  1. 使用 virsh 命令行工具管理 KVM

在前几章中,我们已经讲解了在 CentOS 8 上安装和配置基于 KVM 的来宾操作系统所需的步骤。本章将介绍 virsh 工具中一些之前未涉及的额外功能,以及如何从命令行使用它来管理基于 KVM 的来宾操作系统。

24.1 virsh Shell 和命令行

virsh 工具既是一个命令行工具,也是一个交互式 shell 环境。在命令行模式下使用时,只需在命令提示符下输入命令,并附上适当的参数以执行相应任务。

要将选项作为命令行参数使用,请在终端命令提示符下输入,如下示例所示:

第二十三章:virsh

virsh 工具在 shell 模式下使用时,提供了一个交互式环境,从中可以发出一系列命令。

要在 virsh shell 中运行命令,请运行以下命令:

virsh

欢迎使用 virsh,虚拟化交互式终端。

输入:‘help’以获取命令帮助

输入‘quit’退出

virsh #

在 virsh # 提示符下,输入您希望运行的选项。例如,下面的 virsh 会话列出了当前的虚拟机,启动了一个名为 FedoraVM 的虚拟机,然后获取另一个列表以验证虚拟机是否正在运行:

virsh

欢迎使用 virsh,虚拟化交互式终端。

输入:‘help’以获取命令帮助

输入‘quit’退出

virsh # list

Id 名称 状态


8 RHEL8VM 正在运行

9 CentOS7VM 正在运行

virsh # start FedoraVM

域 FedoraVM 已启动

virsh # list

Id 名称 状态


8 RHEL8VM 正在运行

9 CentOS7VM 正在运行

10 FedoraVM 正在运行

virsh#

virsh 工具支持多种命令,您可以使用 help 选项获取完整的命令列表:

virsh help

通过在 help 指令后指定命令,可以获得每个命令语法的更多详细信息:

virsh help restore

名称

restore - 从文件中恢复一个域到保存的状态

概述

restore [--bypass-cache] [--xml ] [--running] [--paused]

描述

恢复一个域。

选项

[--file] 要恢复的状态

--bypass-cache 避免恢复时使用文件系统缓存

--xml 文件名,包含目标的更新 XML

--正在恢复域到运行状态

--paused 恢复域到暂停状态

在本章的剩余部分,我们将更详细地探讨一些这些命令。

24.2 列出来宾系统状态

CentOS 8 虚拟化主机上的来宾系统状态可以随时通过 virsh 工具的 list 选项查看。例如:

virsh list

上述命令将显示包含每个来宾的行,类似如下内容:

virsh # list

Id 名称 状态


8 RHEL8VM 正在运行

9 CentOS7VM 正在运行

10 FedoraVM 正在运行

24.3 启动来宾系统

可以使用 virsh 工具配合 start 选项启动客户操作系统,并在后面跟上要启动的客户操作系统名称。例如:

virsh start myGuestOS

24.4 关闭客户系统

virsh 工具的关闭选项,顾名思义,用于关闭客户操作系统:

virsh shutdown guestName

请注意,关闭选项允许客户操作系统在收到关闭指令时执行有序关机。要立即停止客户操作系统,可以使用 destroy 选项(但会伴随文件系统损坏和数据丢失的风险):

virsh destroy guestName

24.5 暂停和恢复客户系统

可以使用 virsh 工具的 suspend 和 resume 选项暂停和恢复客户系统。例如,要暂停特定的系统:

virsh suspend guestName

同样,要恢复暂停的系统:

virsh resume guestName

请注意,如果主机系统重新启动,挂起的会话将会丢失。此外,挂起的系统仍然会占用内存。为了保存会话,使其不再占用内存并且可以恢复到原始状态(即使在重启后),需要保存并恢复虚拟机。

24.6 保存和恢复客户系统

可以使用 virsh 工具保存并恢复正在运行的客户操作系统。当系统被保存时,客户操作系统的当前状态将写入磁盘并从系统内存中移除。保存的系统可以在任何时候恢复(包括主机系统重启后):

要保存客户:

virsh save guestName path_to_save_file

要恢复保存的客户操作系统会话:

virsh restore path_to_save_file

24.7 重启客户系统

要重启客户操作系统:

virsh reboot guestName

24.8 配置分配给客户操作系统的内存

要配置分配给客户操作系统的内存,请使用 virsh 命令的 setmem 选项。例如,以下命令将分配给客户系统的内存减少到 256Mb:

virsh setmem guestName 256

请注意,接受的内存设置必须在当前域可用的内存范围内。可以使用setmaxmem选项增加内存。

24.9 总结

virsh 工具提供了广泛的选项,用于创建、监控和管理客户虚拟机。如本章所述,该工具可以在命令行或交互模式下使用。

第二十四章

  1. Linux 容器简介

前几章介绍了虚拟化的概念,特别强调了使用 KVM 创建和管理虚拟机。本章将介绍与之相关的技术——Linux 容器。尽管虚拟机和容器之间有一些相似之处,但也有一些关键区别,本章将概述这些区别,并介绍 Linux 容器的概念和优势。本章还将提供一些 CentOS 8 容器管理工具的概览。在本章介绍完容器的基本知识后,下一章将通过一些实际示例讲解如何在 CentOS 8 上创建和运行容器。

25.1 Linux 容器和内核共享

简单来说,Linux 容器可以被看作是虚拟化的一种轻量级替代方案。在虚拟化环境中,会创建一个虚拟机,虚拟机中包含并运行整个来宾操作系统。虚拟机又运行在像是虚拟机管理程序(hypervisor)之类的环境上,管理对宿主系统物理资源的访问。

容器通过使用一个被称为内核共享的概念来工作,这一概念利用了 Linux 和 UNIX 基础操作系统的架构设计。

为了理解内核共享和容器是如何工作的,首先需要理解 Linux 或 UNIX 操作系统的两个主要组件。在操作系统的核心部分是内核。简单来说,内核处理操作系统与物理硬件之间的所有交互。第二个关键组件是根文件系统,它包含操作系统正常运行所需的所有库、文件和工具。利用这一结构,容器每个都有自己的根文件系统,但共享宿主操作系统的内核。这个结构在下图中的图 25-1 架构图中有所展示。

这种资源共享得以实现,是因为内核能够动态地将当前的根文件系统(这一概念被称为 change root 或 chroot)更改为不同的根文件系统,而不需要重启整个系统。Linux 容器本质上是这种能力的扩展,并结合了容器运行时,后者的职责是为在宿主系统上执行和管理容器提供接口。现有多个容器运行时可供选择,包括 Docker、lxd、containerd 和 CRI-O。早期版本的 CentOS 默认使用 Docker,但在 CentOS 8 中,Docker 已被 Podman 替代,成为默认选项。

图 25-1

25.2 容器的用途与优势

容器的主要优势在于,它们比虚拟化占用的资源开销要少得多,因此可以在单台服务器上同时运行多个容器实例,并且可以快速高效地根据需求的变化启动和停止容器。容器原生运行在主机系统上,提供了虚拟机无法比拟的性能水平。

容器还具有极高的可移植性,可以在系统之间快速轻松地迁移。当与容器管理系统(如 Docker、OpenShift 和 Kubernetes)结合使用时,可以在多个服务器和云平台之间大规模部署和管理容器,潜在地运行数千个容器。

容器常用于为应用程序创建轻量级的执行环境。在这种情况下,每个容器提供一个隔离的环境,其中包含应用程序以及应用程序运行所需的所有运行时和支持文件。容器可以部署到任何支持容器执行的兼容主机系统上,并且无需担心目标系统是否具有应用程序所需的运行时配置——应用程序的所有依赖项都已包含在容器中。

容器还在弥合开发环境和生产环境之间的差距时发挥作用。通过在容器中进行开发和质量保证工作,这些容器随后可以传递到生产环境中,并且可以放心地启动,因为应用程序在与开发和测试过程中相同的容器环境中运行。

容器还促进了以模块化方式部署大型复杂解决方案的方式。容器可以被用来将应用程序设计为一组相互作用的模块,而不是作为单一的庞大实体,每个模块都运行在一个独立的容器中。

容器的一个潜在缺点是,客户操作系统必须与共享的内核版本兼容。例如,无法在 Linux 系统上的容器中运行 Microsoft Windows。也不能让设计为 2.6 版本内核的 Linux 客户系统共享 2.4 版本内核。然而,这些要求并不是容器设计的初衷。因此,这些限制不应被视为局限性,而应当看作是容器在提供简单、可扩展和可靠的部署平台方面的一些关键优势。

25.3 CentOS 8 容器工具

CentOS 8 提供了多种用于创建、检查和管理容器的工具。主要工具如下:

•buildah – 一款用于构建容器镜像的命令行工具。

•podman – 一款基于命令行的容器运行时和管理工具。执行从远程注册表下载容器镜像、检查、启动和停止镜像等任务。

•skopeo – 一个命令行工具,用于转换容器镜像、在注册表之间复制镜像以及检查存储在注册表中的镜像,无需下载它们。

•runc – 一个轻量级的容器运行时,用于从命令行启动和运行容器。

•OpenShift – 一个企业级容器应用管理平台,包含命令行工具和基于 Web 的工具。

上述所有工具都符合开放容器倡议(Open Container Initiative,OCI),该倡议是一组规范,旨在确保容器在不同的工具和平台之间遵循相同的标准。

25.4 Docker 注册表

尽管 CentOS 提供了一组旨在替代 Docker 提供的工具,这些工具仍然需要访问 CentOS 镜像,以便在构建容器时使用。为此,CentOS 项目在 Docker Hub 中维护了一组 CentOS 容器镜像。Docker Hub 是一个在线容器注册表,由多个仓库组成,每个仓库包含一系列可用于构建容器时下载的容器镜像。仓库中的每个镜像都分配了一个仓库标签(例如,centos8、centos7.7、latest 等),该标签可以在执行镜像下载时引用。例如,以下是 Docker Hub 中 centos8 镜像的 URL:

docker://docker.io/library/centos:centos8

除了从 Docker 和其他第三方主机注册表下载(在容器术语中称为“拉取”)容器镜像外,你还可以使用注册表存储自己的镜像。这可以通过托管自己的注册表,或利用 Docker、Amazon AWS、Google Cloud、Microsoft Azure 和 IBM Cloud 等现有服务来实现,以上仅列举了众多选项中的一些。

25.5 容器网络

默认情况下,容器通过容器网络接口(Container Networking Interface,CNI)桥接网络堆栈连接到网络。在桥接配置中,服务器上运行的所有容器都属于同一子网(默认为 10.88.0.0/16),因此,它们能够相互通信。容器还通过桥接宿主系统的网络连接与外部网络连接。同样,宿主机也可以通过虚拟网络接口(通常命名为 cni0)访问容器,该接口会在容器工具安装时创建。

25.6 总结

Linux 容器提供了一种轻量级的虚拟化替代方案,并充分利用了 Linux 和 Unix 操作系统的结构。Linux 容器本质上共享宿主操作系统的内核,每个容器都有自己的根文件系统,包含文件、库和应用程序。容器具有高效性和可扩展性,是构建和部署模块化企业级解决方案的理想平台。现在有许多工具和平台可用于构建、部署和管理容器,包括第三方解决方案和 CentOS 提供的工具。

26. 在 CentOS 8 上使用容器

现在,上一章已涵盖 Linux 容器的基础知识,本章的目标是演示如何使用 CentOS 8 中包含的 Podman、Skopeo 和 Buildah 工具创建和管理容器。本章结束时,你将更清楚地理解如何在 CentOS 8 上创建和管理容器,并为继续探索 Linux 容器的强大功能打下知识基础。

26.1 拉取容器镜像

在这个例子中,CentOS 8 基础镜像将从仓库中拉取。然而,在拉取镜像之前,可以使用 skopeo 工具获取有关镜像仓库的信息,例如:

第二十五章:skopeo inspect docker://docker.io/library/centos

{

"名称": "docker.io/library/centos",

"摘要": "sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9",

"RepoTags": [

"5.11",

"5",

"6.10",

"6.6",

"6.7",

"6.8",

"6.9",

"6",

"7.0.1406",

"7.1.1503",

"7.2.1511",

"7.3.1611",

"7.4.1708",

"7.5.1804",

"7.6.1810",

"7.7.1908",

"7",

"8",

"centos5.11",

"centos5",

"centos6.10",

"centos6.6",

"centos6.7",

"centos6.8",

"centos6.9",

"centos6",

"centos7.0.1406",

"centos7.1.1503",

"centos7.2.1511",

"centos7.3.1611",

"centos7.4.1708",

"centos7.5.1804",

"centos7.6.1810",

"centos7.7.1908",

"centos7",

"centos8",

"最新"

],

"创建时间": "2019-10-01T23:19:57.105928163Z",

"Docker 版本": "18.06.1-ce",

"标签": {

"org.label-schema.build-date": "20190927",

"org.label-schema.license": "GPLv2",

"org.label-schema.name": "CentOS 基础镜像",

"org.label-schema.schema-version": "1.0",

"org.label-schema.vendor": "CentOS"

},

"架构": "amd64",

"操作系统": "linux",

"层": [

"sha256:729ec3a6ada3a6d26faca9b4779a037231f1762f759ef34c08bdd61bf52cd704"

]

}

在验证了仓库中包含我们需要的镜像后,可以使用 podman 命令通过以下语法下载所需 CentOS 版本的镜像,其中应替换为 skopeo 输出中显示的 CentOS 版本标签:

podman pull docker://docker.io/library/centos:

例如,要拉取 CentOS 7 镜像:

podman pull docker://docker.io/library/centos:centos7

另外,为了默认拉取 CentOS 的最新版本:

podman pull docker://docker.io/library/centos:latest

尝试拉取 docker://docker.io/library/centos:latest... 获取镜像源签名

跳过 blob 729ec3a6ada3(已存在):68.21 MiB / 68.21 MiB [=======] 0s

正在复制配置 0f3e07c0138f: 2.13 KiB / 2.13 KiB [==========================] 0s

正在将清单写入镜像目标

存储签名

0f3e07c0138fbe05abcb7a9cc7d63d9bd4c980c3f61fea5efa32e7c4217ef4da

通过要求 podman 列出所有本地镜像来验证镜像是否已存储:

podman images

仓库 标签 镜像 ID 创建时间 大小

docker.io/library/centos latest 0f3e07c0138f 8 周前 227 MB

可以通过运行 podman inspect 命令获取本地镜像的详细信息:

podman inspect centos:latest

26.2 在容器中运行镜像

从注册表中拉取的镜像是一个完全可以运行的镜像,准备好在容器中运行,无需修改。要运行镜像,可以使用podman run命令。在这种情况下,将指定–rm选项,以指示我们希望在容器中运行镜像,执行一个命令,然后让容器退出。在此情况下,将使用cat工具输出容器根文件系统中/etc/passwd文件的内容:

podman run --rm centos:latest cat /etc/passwd

root❌0:0:root:/root:/bin/bash

bin❌1:1:bin:/bin:/sbin/nologin

daemon❌2:2:daemon:/sbin:/sbin/nologin

adm❌3:4:adm:/var/adm:/sbin/nologin

lp❌4:7:lp:/var/spool/lpd:/sbin/nologin

sync❌5:0:sync:/sbin:/bin/sync

shutdown❌6:0:shutdown:/sbin:/sbin/shutdown

halt❌7:0:halt:/sbin:/sbin/halt

mail❌8:12:mail:/var/spool/mail:/sbin/nologin

operator❌11:0:operator:/root:/sbin/nologin

games❌12💯games:/usr/games:/sbin/nologin

ftp❌14:50:FTP User:/var/ftp:/sbin/nologin

nobody❌65534:65534:Kernel Overflow User:/:/sbin/nologin

dbus❌81:81:System message bus:/:/sbin/nologin

systemd-coredump❌999:997:systemd Core Dumper:/:/sbin/nologin

systemd-resolve❌193:193:systemd Resolver:/:/sbin/nologin

比较容器内的/etc/passwd文件与宿主系统中的/etc/passwd文件,注意容器内缺少宿主系统中所有的附加用户,这证明了cat命令是在容器环境中执行的。同时注意到容器在几秒钟内启动、执行命令并退出。与启动一个完整的操作系统、执行任务并关闭虚拟机所需的时间相比,你会开始欣赏容器的速度和效率。

要启动一个容器,保持它运行并访问 shell,可以使用以下命令:

$ podman run --name=mycontainer -it centos:latest /bin/bash

[root@965acf617e6e /]#

请注意,使用了一个额外的命令行选项来为容器指定名称“mycontainer”。虽然这是可选的,但这使得容器更容易识别和引用,作为使用自动生成的容器 ID 的替代方法。

当容器正在运行时,在另一个终端窗口运行 podman,以查看系统中所有容器的状态

podman ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

965acf617e6e docker.io/library/centos:latest /bin/bash 大约一分钟前 启动 大约一分钟前 mycontainer

要从宿主机在运行中的容器中执行命令,只需使用podman exec命令,指定运行中的容器名称和要执行的命令。例如,以下命令会在名为mycontainer的容器中启动第二个 bash 会话:

podman exec -it mycontainer /bin/bash

bash-4.4#

请注意,尽管上面的示例引用了容器名称,但也可以通过 podman ps -a 命令列出的容器 ID 来实现相同的结果:

podman exec -it 965acf617e6e /bin/bash

bash-4.4#

或者,podman attach 命令也可以附加到一个正在运行的容器并访问 shell 提示符:

podman attach mycontainer

bash-4.4#

一旦容器启动并运行,就可以像任何其他 CentOS 8 系统一样进行额外的配置更改并安装软件包。

26.3 管理容器

一旦启动,容器将继续运行,直到通过 podman 停止,或者当启动容器时运行的命令退出。例如,在主机上运行以下命令将使容器退出:

podman stop mycontainer

或者,在容器最后一个剩余的 bash shell 中按下 Ctrl-D 键盘组合,将会使得 shell 和容器都退出。退出后,容器的状态会相应地变化:

podman ps -a

容器 ID 镜像 命令 创建时间 状态 端口 名称

965acf617e6e docker.io/library/centos:latest /bin/bash 10 分钟前 已退出 (0) 21 秒前 mycontainer

尽管容器已经不再运行,但它仍然存在,并且包含了所有对配置和文件系统所做的更改。如果你安装了软件包、做了配置更改或添加了文件,这些更改将在“mycontainer”中保持不变。要验证这一点,只需按如下方式重新启动容器:

podman start mycontainer

启动容器后,使用 podman exec 命令再次在容器内执行命令,具体方法如前所述。例如,再次获得 shell 提示符:

podman exec -it mycontainer /bin/bash

正在运行的容器也可以通过 podman pausepodman unpause 命令进行暂停和恢复,如下所示:

podman pause 我的容器

podman unpause 我的容器

26.4 将容器保存为镜像

一旦容器的客系统配置完成,并符合你的要求,你很可能想要创建并运行多个此类型的容器。为此,需要将容器保存为镜像到本地存储中,以便用作额外容器实例的基础。可以通过 podman commit 命令结合容器的名称或 ID 以及镜像存储的名称来实现,例如:

$ podman commit mycontainer mycentos_image

一旦镜像保存完毕,检查它是否出现在本地仓库的镜像列表中:

$ podman images

仓库 标签 镜像 ID 创建时间 大小

localhost/mycentos_image latest c32c45218143 5 秒前 227 MB

docker.io/library/centos latest 0f3e07c0138f 8 周前 227 MB

保存的镜像现在可以用来创建与原始容器完全相同的额外容器:

$ podman run --name=mycontainer2 -it localhost/mycentos_image /bin/bash

26.5 从本地存储中删除镜像

要从本地存储中删除不再需要的镜像,只需运行 podman rmi 命令,并引用 podman images 命令输出的镜像名称或 ID。例如,要删除前面部分创建的名为 mycentos_image 的镜像,可以按如下方式运行 podman:

$ podman rmi localhost/mycentos_image

注意:在删除镜像之前,基于该镜像的任何容器必须先被删除。

26.6 删除容器

即使容器已退出或被停止,它仍然存在,并且可以随时重新启动。如果容器不再需要,可以在容器停止后使用 podman rm 命令将其删除,方法如下:

podman rm mycontainer2

26.7 使用 Buildah 构建容器

Buildah 允许从现有容器、镜像或完全从头开始构建新容器。Buildah 还包括挂载容器文件系统的功能,这样就可以从主机访问和修改它。

例如,以下 buildah 命令将从 CentOS 8 Base 镜像构建容器(如果该镜像尚未从注册表拉取,buildah 将在创建容器之前先下载它):

$ buildah from docker://docker.io/library/centos:centos8

运行此命令的结果将是一个名为 centos-working-container 的容器,它已准备好运行:

$ buildah run centos-working-container cat /etc/passwd

26.8 从头开始构建容器

从头开始构建容器本质上是创建一个空容器。创建后,可以安装软件包以满足容器的需求。当创建一个仅需要安装最少软件包的容器时,这种方法特别有用。

从头开始构建的第一步是运行以下命令来构建空容器:

buildah from scratch

working-container

构建完成后,将创建一个名为 working-container 的新容器:

$ buildah containers

CONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME

00f81b68f03f * 0f3e07c0138f docker.io/library/centos:centos8 centos-working-container

d7dd4b652379 * scratch working-container

空容器现在已准备好安装一些软件包。不幸的是,这不能在容器内执行,因为此时连 bash 或 dnf 工具都不存在。相反,需要将容器的文件系统挂载到主机系统上,并使用 dnf 安装软件包,系统根目录设置为挂载的容器文件系统。通过以下方式开始挂载容器的文件系统:

buildah mount working-container

/var/lib/containers/storage/overlay/20b46cf0e2994d1ecdc4487b89f93f6ccf41f72788da63866b6bf80984081d9a/merge

如果文件系统成功挂载,buildah 会输出容器文件系统的挂载点。现在我们已经可以访问容器文件系统,使用 dnf 命令可以通过--installroot 选项将软件包安装到容器中,指向已挂载的容器文件系统。例如,以下命令会在容器文件系统中安装 bash、CoreUtils 和 dnf 包(其中<container_fs_mount>是之前通过 buildah mount 命令输出的挂载路径):

dnf install --releasever=8 --installroot <container_fs_mount> bash coreutils dnf

请注意,--releasever 选项用于告知 dnf 在容器中安装 CentOS 版本 8 的包。

安装完成后,按照以下方式卸载临时文件系统:

buildah umount working-container

一旦 dnf 完成了包的安装,就可以运行容器并访问 bash 命令提示符,方法如下:

buildah run working-container bash

bash-4.4#

26.9 容器桥接网络

如前一章所述,容器网络是通过容器网络接口(CNI)桥接网络栈实现的。以下命令展示了运行容器的主机系统上的典型网络配置:

ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft 永久 preferred_lft 永久

inet6 ::1/128 scope host

valid_lft 永久 preferred_lft 永久

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

link/ether 08:00:27:20:dc:2f brd ff:ff:ff:ff:ff:ff

inet 192.168.0.33/24 brd 192.168.0.255 scope global dynamic noprefixroute enp0s3

valid_lft 3453 秒 preferred_lft 3453 秒

inet6 2606:a000:4307:f000:aa6:6da1:f8a9:5f95/64 scope global dynamic noprefixroute

valid_lft 3599 秒 preferred_lft 3599 秒

inet6 fe80::4275:e186:85e2:d81f/64 scope link noprefixroute

valid_lft 永久 preferred_lft 永久

3: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

link/ether 7e:b6:04:22:4f:22 brd ff:ff:ff:ff:ff:ff

inet 10.88.0.1/16 scope global cni0

valid_lft 永久 preferred_lft 永久

inet6 fe80::7cb6:4ff:fe22:4f22/64 scope link

valid_lft 永久 preferred_lft 永久

12: veth2a07dc55@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni0 state UP group default

link/ether 42:0d:69:13:89:af brd ff:ff:ff:ff:ff:ff link-netns cni-61ba825e-e596-b2ef-a59f-b0743025e448

inet6 fe80::400d:69ff:fe13:89af/64 scope link

valid_lft 永久 preferred_lft 永久

在上面的示例中,主机有一个名为 enp0s3 的接口,连接到外部网络,IP 地址为 192.168.0.33。 此外,还创建了一个名为 cni0 的虚拟接口,并分配了 IP 地址 10.88.0.1。 在主机上运行相同的 ip 命令时,容器可能会显示以下输出:

ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

3: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default

link/ether 3e:52:22:4b:e0:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 0

inet 10.88.0.28/16 scope global eth0

valid_lft forever preferred_lft forever

inet6 fe80::3c52:22ff:fe4b:e0d8/64 scope link

valid_lft forever preferred_lft forever

在这种情况下,容器的 IP 地址是 10.88.0.28。 在主机上运行 ping 命令可以验证主机和容器确实在同一子网内:

ping 10.88.0.28

PING 10.88.0.28 (10.88.0.28) 56(84) 字节的数据。

64 字节来自 10.88.0.28:icmp_seq=1 ttl=64 时间=0.056 ms

64 bytes from 10.88.0.28: icmp_seq=2 ttl=64 time=0.039 ms

.

.

CNI 配置设置可以在主机系统的 /etc/cni/net.d/87-podman-bridge.conflist 文件中找到,默认情况下,文件内容如下:

{

"cniVersion": "0.3.0",

"name": "podman",

"plugins": [

{

"type": "bridge",

"bridge": "cni0",

"isGateway": true,

"ipMasq": true,

"ipam": {

"type": "host-local",

"subnet": "10.88.0.0/16",

"routes": [

{ "dst": "0.0.0.0/0" }

]

}

},

{

"type": "portmap",

"capabilities": {

"portMappings": true

}

}

]

}

可以修改此文件以更改子网地址范围,也可以更改插件类型(此示例中设置为 bridge)以实现不同的网络配置。

26.10 总结

本章介绍了如何在 CentOS 8 上使用 skopeo 和 buildah 工具创建和管理 Linux 容器,包括使用从仓库中获取的容器镜像和完全从头开始构建的新镜像。

  1. 设置 CentOS 8 Web 服务器

CentOS 8 操作系统中包含了 Apache Web 服务器等多个软件包。事实上,CentOS 8 的可扩展性和弹性使其成为托管即使是流量最密集的网站的理想平台。

在本章中,我们将解释如何配置 CentOS 8 系统,使用 Apache 作为 Web 服务器,包括安全(HTTPS)和不安全(HTTP)配置。

27.1 配置 CentOS 8 Web 服务器的要求

要设置你自己的网站,你需要一台计算机(或云服务器实例)、操作系统、Web 服务器、域名、名称服务器和 IP 地址。

在操作系统方面,我们将假设你使用的是 CentOS 8。如前所述,CentOS 8 支持 Apache Web 服务器,一旦操作系统安装并运行起来,便可以轻松安装 Apache Web 服务器。域名可以通过任何域名注册服务进行注册。

如果你在云实例上运行 CentOS 8,提供商分配的 IP 地址将显示在服务器概览信息中。如果你托管自己的服务器,并且互联网服务提供商(ISP)分配了静态 IP 地址,则需要将域名与该地址关联。这是通过名称服务器来实现的,所有域名注册服务都会为你提供此服务。

如果你没有静态 IP 地址(即你的 ISP 提供给你的是动态地址,且频繁变化),那么你可以使用一些免费的动态 DNS(DDNS 或 DynDNS)服务,这些服务将你的动态 IP 地址映射到你的域名。

一旦你配置好域名和名称服务器,下一步就是安装和配置你的 Web 服务器。

27.2 安装 Apache Web 服务器软件包

当前版本的 CentOS 通常默认不安装 Apache Web 服务器。要检查服务器是否已安装,可以运行以下命令:

第二十六章:rpm -q httpd

如果 rpm 生成的输出类似于以下内容,则表示 Apache 服务器已安装:

httpd-2.4.35-6.el8+2089+57a79027.x86_64

或者,如果 rpm 生成了“未安装 httpd 包”的消息,那么显然,接下来的步骤是安装它。要安装 Apache,请在命令提示符下运行以下命令:

dnf install httpd

27.3 配置防火墙

在启动和测试 Apache Web 服务器之前,需要修改防火墙,允许 Web 服务器与外界通信。默认情况下,HTTP 和 HTTPS 协议分别使用 80 和 443 端口,因此,根据使用的协议,需要打开这两个端口中的一个或两个。在打开端口时,请务必指定适用于面向互联网的网络连接的防火墙区域:

firewall-cmd --permanent --zone= --add-port=80/tcp

firewall-cmd --permanent --zone= --add-port=443/tcp

在打开必要的端口之后,确保重新加载防火墙设置:

firewall-cmd --reload

对于云托管的服务器,可能还需要在云控制台中为服务器实例启用相应的端口。请查阅云服务提供商的文档,了解如何进行此操作。

27.4 端口转发

如果托管 Web 服务器的 CentOS 8 系统位于受防火墙保护的网络中(无论是由另一台计算机运行防火墙,还是由包含内置防火墙保护的路由器或无线基站),你需要配置防火墙,将 80 端口和/或 443 端口转发到你的 Web 服务器系统。不同防火墙和设备的配置方式有所不同,因此请查阅相关文档了解如何配置端口转发。

27.5 启动 Apache Web 服务器

一旦安装了 Apache 服务器并配置了防火墙,下一步是验证服务器是否正在运行,并在必要时启动它。

要通过命令行检查 Apache httpd 服务的状态,请在命令提示符下输入以下命令:

systemctl status httpd

如果上述命令显示 httpd 服务未运行,可以通过命令行启动该服务,方法如下:

systemctl start httpd

如果你希望 Apache httpd 服务在系统启动时自动启动,可以运行以下命令:

systemctl enable httpd

27.6 测试 Web 服务器

安装完成后,下一步是验证 Web 服务器是否已启动并运行。

第一步是向默认的 Web 网站文件夹添加一个文件。在终端窗口中,切换到 /var/www/html 目录,并创建一个名为 index.html 的新文件,文件内容如下:

<title>CentOS Apache 测试页面</title> <body>

欢迎来到 CentOS

Apache 正在运行。

</body>

如果你可以访问服务器的桌面环境(无论是本地还是远程),只需启动浏览器并在地址栏输入 http://127.0.0.1(127.0.0.1 是回送网络地址,表示系统连接到本地计算机)。如果一切设置正确,浏览器应该加载显示在图 27-1 中的页面:

图 27-1

如果桌面环境不可用,可以从同一局域网内的其他系统连接,或者如果服务器托管在远程位置,可以使用分配给系统的外部 IP 地址进行连接。

27.7 为你的域名配置 Apache Web 服务器

设置 Web 服务器的下一步是为你的域名配置服务器。首先通过进入 /etc/httpd 目录开始配置 Web 服务器,该目录包含多个子目录。进入 conf 子目录,你会找到一个名为 httpd.conf 的文件,该文件包含 Apache 服务器的配置设置。

使用你偏好的编辑器并以超级用户权限编辑 httpd.conf 文件,确保你对该文件具有写入权限。加载文件后,需要更改多个设置,以匹配你的环境。

配置 Apache 以支持特定域名的最常见方法是向 httpd.conf 文件中添加虚拟主机条目。这样做的好处是,单个 Apache 服务器可以通过为每个站点域名添加一个虚拟主机条目,支持多个网站。在 httpd.conf 文件中,添加你域名的虚拟主机条目,如下所示:

<VirtualHost *:80>

ServerAdmin feedback@myexample.com

ServerName www.myexample.com

DocumentRoot /var/www/myexample

ErrorLog logs/myexample_error_log

CustomLog logs/myexample_access_log combined

上述虚拟主机条目中的 ServerAdmin 指令定义了一个管理员电子邮件地址,供希望联系你网站的站长的人使用。请将其更改为一个合适的电子邮件地址,以便别人可以联系到你。

接下来,声明 ServerName,以便 Web 服务器知道与此虚拟主机关联的域名。

由于服务器支持的每个网站都有自己的文件集,DocumentRoot 设置用于指定该网站域名的文件位置。传统上,使用/var/www/域名,例如:

DocumentRoot /var/www/myexample

最后,添加访问历史记录和错误日志文件的条目。

按照 httpd.conf 文件中的声明,创建/var/www/<域名>目录,并在其中放置一个包含基本 HTML 的 index.html 文件。例如:

<title>示例网页</title> <body>

欢迎访问 MyExample.com

</body>

最后一步是重新启动 httpd 服务,确保它加载新的设置:

systemctl restart httpd

最后,打开浏览器窗口,使用域名而不是 IP 地址访问站点,检查服务器配置是否工作正常。加载的网页应该是上述创建的 index.html 文件中定义的页面。

27.8 安全网站的基础

本章中创建的 Web 服务器和网站使用 HTTP 协议在 80 端口上运行,因此被认为是不安全的。问题在于,Web 服务器与客户端(通常是用户的 Web 浏览器)之间的流量是以明文传输的。换句话说,数据没有加密,容易被截获。虽然对于一般的 Web 浏览而言这不是问题,但在执行诸如登录网站或传输敏感信息(如身份或信用卡信息)等任务时,这是一个严重的弱点。

现在,网站通常要求使用 HTTPS,它使用安全套接层(SSL)或传输层安全性(TLS)来建立 Web 服务器与客户端之间的安全加密通信。这种安全性通过使用公钥、私钥和会话加密以及证书来建立。

为支持 HTTPS,网站必须具有由可信的证书颁发机构(Certificate Authority, CA)颁发的证书。当浏览器连接到一个安全的网站时,web 服务器会返回该网站的 SSL 证书副本,其中也包含该站点的公钥副本。浏览器随后会验证该证书的真实性,并通过受信的证书颁发机构进行验证。

如果证书被验证为有效,浏览器将使用服务器发送的公钥来加密会话密钥并将其传送给服务器。服务器使用私钥解密会话密钥,并用它向浏览器发送加密确认。一旦此过程完成,浏览器和服务器将使用会话密钥来加密所有后续数据传输,直到会话结束。

27.9 配置 Apache 以支持 HTTPS

默认情况下,Apache 服务器不包含实现安全 HTTPS 网站所需的模块。因此,第一步是按照以下方式在服务器系统上安装 Apache 的 mod_ssl 模块:

dnf install mod_ssl

安装完成后,重启 httpd 以将新模块加载到 Apache 服务器中:

systemctl restart httpd

使用以下命令检查模块是否已加载到服务器中:

apachectl -M | grep ssl_module

ssl_module (shared)

假设模块已安装,下一步是为网站生成 SSL 证书。

27.10 获取 SSL 证书

网站的证书必须从证书颁发机构(Certificate Authority)获取。市面上有多种选择,价格不一。然而,最好的选择是从 Let's Encrypt 获取免费的证书,网址如下:

https://letsencrypt.org/

从 Let’s Encrypt 获取证书的过程只需要安装并运行 Certbot 工具。该工具会扫描服务器上的 httpd.conf 文件,并提供为系统中配置的任何虚拟主机生成证书的选项。然后,它会生成证书并在 Apache 配置中为相应网站添加虚拟主机条目。

按照 Let’s Encrypt 网站上的步骤,在你的 CentOS 8 系统上下载并安装 Certbot,然后按照以下方式运行 certbot 工具生成并安装证书:

certbot --apache

在请求电子邮件地址并接受服务条款后,Certbot 将列出在 httpd.conf 文件中找到的域名,并提供选择一个或多个站点来安装证书的选项。然后,Certbot 会在获取和安装证书之前进行一些检查:

你希望为哪些域名启用 HTTPS?


1: www.myexample.com


选择适当的数字,数字之间用逗号和/或空格分隔,或者保持输入为空

空格选择所有显示的选项(按 ‘c’ 取消):1

获取新证书

执行以下挑战:

www.myexample.com 的 http-01 挑战

等待验证...

清理挑战

在 /etc/httpd/conf/httpd-le-ssl.conf 创建了一个 SSL 虚拟主机

将证书部署到虚拟主机 /etc/httpd/conf/httpd-le-ssl.conf

通过将 Include 添加到根配置,启用站点 /etc/httpd/conf/httpd-le-ssl.conf

Certbot 还将在 /etc/httpd/conf 目录中创建一个名为 httpd-le-ssl.conf 的新文件,包含为每个生成证书的域名配置的安全虚拟主机条目。以下条目类似:

<VirtualHost *:443>

ServerAdmin feedback@myexample.com

ServerName www.myexample.com

DocumentRoot /var/www/myexample

ErrorLog logs/myexample_error_log

CustomLog logs/myexample_access_log combined

SSLCertificateFile /etc/letsencrypt/live/www.myexample.com/fullchain.pem

SSLCertificateKeyFile /etc/letsencrypt/live/www.myexample.com/privkey.pem

包含 /etc/letsencrypt/options-ssl-apache.conf

最后,Certbot 会询问是否应该将未来的 HTTP 网络请求重定向到 HTTPS。换句话说,如果用户尝试访问 http://www.myexample.com,web 服务器将把用户重定向到 https://www.myexample.com

请选择是否将 HTTP 流量重定向到 HTTPS,移除 HTTP 访问。


1: 不重定向 - 不对 web 服务器配置做进一步修改。

2: 重定向 - 将所有请求重定向到安全的 HTTPS 访问。选择此项以

新网站,或者如果您确定您的网站已支持 HTTPS。您可以撤销此操作

通过编辑您的 web 服务器配置进行更改。


选择适当的数字 [1-2] 然后按 [enter](按 ‘c’ 取消):2

如果您当前正在测试 HTTPS 配置,并希望保持 HTTP 版本活跃直到稍后,选择“不重定向”选项。否则,一般建议重定向到 HTTPS。

证书安装完成后,可以在浏览器中通过以下网址测试(将 myexample.com 替换为您自己的域名):

https://www.ssllabs.com/ssltest/analyze.html?d=www.myexample.com

如果证书配置成功,SSL Labs 报告将提供高评分,如 图 27-2 所示:

图 27-2

最后的测试是,打开一个浏览器窗口并使用 https:// 前缀访问您的域名。页面应与之前一样加载,并且浏览器应显示浏览器与服务器之间的连接是安全的(通常在地址栏显示一个可以点击查看更多信息的挂锁图标):

图 27-3

27.11 小结

可以通过安装 Apache web 服务器在 CentOS 8 系统上托管网站。CentOS 8 上可以部署不安全的(HTTP)和安全的(HTTPS)网站。安全网站使用安全套接层(SSL)或传输层安全协议(TLS)来通过使用公钥、私钥和会话加密,以及由可信证书颁发机构签发的证书,在 web 服务器和客户端之间建立加密通信。

28. 配置 CentOS 8 Postfix 邮件服务器

除了作为 Web 服务器,电子邮件是 CentOS 8 系统的主要用途之一,特别是在商业环境中。鉴于电子邮件的重要性和普及,许多人对 Linux 系统上电子邮件结构的复杂性感到惊讶,这种复杂性往往会让 CentOS 8 的新手感到有些不知所措。

好消息是,大部分复杂性存在的原因是为了让有经验的电子邮件管理员能够为大规模企业安装配置复杂的设置。事实上,对于大多数 Linux 管理员来说,设置一个基本的电子邮件系统以便用户能够发送和接收电子邮件相对简单。

在《CentOS 8 Essentials》这一章中,我们将解释基于 Linux 的电子邮件配置基础,并逐步介绍如何配置一个基本的电子邮件环境。为了提供基础知识,我们将把电子邮件系统的复杂性留给更高级的书籍进行详细讨论。

28.1 电子邮件系统的结构

一个完整的电子邮件系统由多个组件组成。以下是对每个组件的简要描述:

28.1.1 邮件用户代理

这是系统中典型用户最熟悉的部分。邮件用户代理(MUA),即邮件客户端,是用于编写、发送和阅读电子邮件的应用程序。任何在计算机上编写并发送邮件的人,都使用过某种类型的邮件用户代理。

Linux 上典型的图形化 MUA 包括 Evolution、Thunderbird 和 KMail。对于那些偏好基于文本的邮件客户端的用户,还有传统的 Pine 和 mail 工具。

28.1.2 邮件传输代理

邮件传输代理(MTA)是电子邮件系统的一部分,负责将电子邮件从一台计算机传输到另一台计算机(无论是在同一局域网内还是通过互联网传输到远程系统)。一旦配置正确,大多数用户通常不会直接与他们选择的 MTA 交互,除非他们出于某种原因希望重新配置它。Linux 系统上有许多 MTA 的选择,包括 sendmail、Postfix、Fetchmail、Qmail 和 Exim。

28.1.3 邮件投递代理

电子邮件系统的另一个基础设施部分,邮件投递代理(MDA),通常对用户是隐藏的,它在后台执行邮件传输代理与邮件客户端(MUA)之间的邮件过滤。最常见的 MDA 形式是垃圾邮件过滤器,它会在邮件到达用户的收件箱之前,从系统中移除所有不需要的电子邮件。流行的 MDA 包括 Spamassassin 和 Procmail。需要注意的是,一些邮件用户代理应用程序(如 Evolution、Thunderbird 和 KMail)自带 MDA 过滤功能,而其他一些应用程序(如 Pine 和 Basla)则没有。这可能会让 Linux 初学者感到困惑。

28.1.4 SMTP

SMTP 是 Simple Mail Transport Protocol(简单邮件传输协议)的缩写。它是电子邮件系统用于将邮件从一台服务器传输到另一台服务器的协议。这个协议本质上是 MTA 之间用来相互通信并传输邮件消息的语言。

28.1.5 SMTP Relay

SMTP Relay 是一种协议,允许使用外部 SMTP 服务器发送电子邮件,而不是托管本地 SMTP 服务器。通常,这将涉及使用如 MailJet、SendGrid 或 MailGun 等服务。这些服务避免了配置和维护自己的 SMTP 服务器的必要性,并且通常提供额外的好处,如分析功能。

28.2 配置 CentOS 8 电子邮件服务器

许多系统使用 Sendmail MTA 来传输电子邮件消息,并且在许多 Linux 发行版中,这是默认的邮件传输代理。然而,Sendmail 是一个复杂的系统,对于初学者和有经验的用户来说,它都可能难以理解和配置。由于处理电子邮件消息的速度较慢,Sendmail 也逐渐失宠,相比之下,许多较新的 MTA 被认为更高效。

现在,许多系统管理员使用 Postfix 或 Qmail 来处理电子邮件。与 Sendmail 相比,它们的配置更快且更容易。

因此,本章将重点介绍 Postfix 作为 MTA,因为它简洁且流行。如果您更愿意使用 Sendmail,有许多专门讲解此主题的书籍,比我们在本章中能够讲解的要深入得多。

作为第一步,本章将介绍如何配置 CentOS 8 系统作为完整的电子邮件服务器。之后,本章还将介绍如何使用 SMTP Relay 服务。

28.3 Postfix 安装前步骤

在安装 Postfix 之前,第一步是确保系统上没有正在运行 Sendmail。您可以使用以下命令进行检查:

第二十七章:systemctl status sendmail

如果未安装 sendmail,该工具将显示类似以下的消息:

单元 sendmail.service 未找到。

如果系统上正在运行 sendmail,则必须在安装和配置 Postfix 之前停止它。要停止 sendmail,请运行以下命令:

systemctl stop sendmail

下一步是确保 sendmail 在系统重启时不会自动重新启动:

systemctl disable sendmail

Sendmail 现在已关闭,并已配置为在系统启动时不自动启动。可选地,要完全从系统中删除 sendmail,请运行以下命令:

dnf remove sendmail

28.4 防火墙/路由器配置

由于发送和接收电子邮件涉及网络连接,因此需要使用 firewall-cmd 工具将 smtp 服务添加到防火墙中,命令如下:

firewall-cmd --permanent --add-service=smtp

同时,配置任何位于服务器与互联网之间的防火墙或路由器,以允许端口 25、143 和 587 的连接也非常重要。如果有必要,还需要为这些端口配置端口转发,将其转发到邮件服务器上的相应端口。

完成这些初步步骤后,我们可以继续安装 Postfix。

28.5 在 CentOS 8 上安装 Postfix

默认情况下,CentOS 8 安装过程会为大多数配置安装 postfix。要验证是否已经安装 postfix,请使用以下 rpm 命令:

rpm -q postfix

如果 rpm 报告 postfix 未安装,可以通过以下方式安装:

dnf install postfix

dnf 工具将下载并安装 postfix,并在 /etc/passwd 文件中配置一个特殊的 postfix 用户。

28.6 配置 Postfix

postfix 的主要配置设置位于 /etc/postfix/main.cf 文件中。网上有许多资源提供关于 postfix 的详细信息,因此本节将重点介绍启动邮件系统所需的基本选项。

main.cf 文件中的关键选项如下:

myhostname = mta1.domain.com

mydomain = domain.com

myorigin = $mydomain

mydestination = mydestination = \(myhostname, localhost.\)mydomain, localhost, $mydomain

inet_interfaces = $myhostname

mynetworks = subnet

其他设置可能已经在安装过程中为您配置,或者除非您有冒险精神并且希望配置一个更复杂的电子邮件系统,否则不需要进行任何更改。

myhostname 的格式为 host.domain.extension。如果您的 Linux 系统名为 MyLinuxHost,您的互联网域名为 MyDomain.com,则应将 myhostname 选项设置如下:

myhostname = mylinuxhost.mydomain.com

mydomain 设置只是上述设置中的域名部分。例如:

mydomain = mydomain.com

myorigin 设置定义了输出邮件从哪个域名看似发送,当邮件到达收件人的收件箱时应该显示为您的域名:

myorigin = $mydomain

其中一个最重要的参数是 mydestination,它与传入邮件有关,声明该服务器是哪些域的最终投递目的地。任何发送到不在此列表中的域名的传入邮件将被视为中继请求,通常会导致投递失败,这也受 mynetworks 设置(见下文)的影响。

inet_interfaces 设置定义了允许 postfix 接收电子邮件的系统网络接口,一般设置为 all:

inet_interfaces = all

mynetworks 设置定义了哪些外部系统被信任可以将该服务器用作 SMTP 中继。此设置的可能值如下:

•host - 仅本地系统被信任。所有外部客户端尝试使用该服务器作为中继将被拒绝。

•subnet - 只有在同一网络子网中的系统才被允许将服务器用作中继。例如,如果服务器的 IP 地址为 192.168.1.29,则 IP 地址为 192.168.1.30 的客户端系统可以使用服务器作为中继。

•class - 同一 IP 地址类别(A、B 和 C)中的任何系统都可以将服务器用作中继。

可信 IP 地址也可以通过手动指定子网、地址范围或引用模式文件来定义。以下示例声明本地主机和子网 192.168.0.0 为可信 IP 地址。

mynetworks = 192.168.0.0/24, 127.0.0.0/8

对于此示例,将属性设置为子网,这样与服务器在同一局域网中的其他系统就能通过 SMTP 中继发送电子邮件,而外部系统则无法发送邮件。

mynetworks = subnet

28.7 配置 DNS MX 记录

当您通过注册商注册并配置域名时,DNS 设置中将配置一些默认值。其中之一是所谓的邮件交换器(MX)记录。该记录本质上定义了邮件应发送到域的哪个位置,通常默认设置为由注册商提供的邮件服务器。如果您托管自己的邮件服务器,则 MX 记录应设置为您的域名或邮件服务器的地址。如何更改此记录取决于您的域名注册商,但通常需要编辑域名的 DNS 信息,并添加或编辑现有的 MX 记录,以使其指向您的邮件服务器。

28.8 在 CentOS 8 系统上启动 Postfix

一旦/etc/postfix/main.cf 文件配置了正确的设置,就可以启动 Postfix。可以通过以下命令从命令行启动:

systemctl start postfix

要配置 Postfix 在系统启动时自动启动,请运行以下命令:

systemctl enable postfix

此时,Postfix 进程应该已经启动。验证一切正常的最佳方法是检查邮件日志。该日志通常位于/var/log/maillog 文件中,并且应该包含类似以下输出的条目:

Mar 25 11:21:48 demo-server postfix/postfix-script[5377]: starting the Postfix mail system

Mar 25 11:21:48 demo-server postfix/master[5379]: daemon started -- version 3.3.1, configuration /etc/postfix

只要没有记录错误消息,您就已成功安装并启动了 Postfix,并准备好测试 Postfix 配置。

28.9 测试 Postfix

测试 Postfix 配置的一种简单方法是发送本地用户之间的电子邮件消息。要进行快速测试,可以使用以下 mail 工具(其中 name 和 mydomain 分别替换为系统中的用户名和您的域名):

mail name@mydomain.com

当提示时,输入电子邮件消息的主题,然后输入消息正文。要发送电子邮件,只需按 Ctrl-D。例如:

mail neil@mydomain.com

主题:测试邮件消息

这是一个测试消息。

EOT

再次运行邮件命令,这次以另一个用户身份执行,验证消息是否已发送和接收:

$ mail

Heirloom Mail 版本 12.5 7/5/10. 输入?获取帮助。

"/var/spool/mail/neilsmyth": 1 message 1 new

N 1 root Mon Mar 25 13:36 18/625 "测试邮件消息"

&

如果消息没有出现,检查日志文件(/var/log/maillog)以查找错误。成功的邮件投递将在日志文件中如下所示:

Mar 25 13:41:37 demo-server postfix/pickup[7153]: 94FAF61E8F4A: uid=0 from=

Mar 25 13:41:37 demo-server postfix/cleanup[7498]: 94FAF61E8F4A: message-id=20190325174137.94FAF61E8F4A@demo-server.mydomain.com

Mar 25 13:41:37 demo-server postfix/qmgr[7154]: 94FAF61E8F4A: from=root@mydomain.com, size=450, nrcpt=1 (queue active)

Mar 25 13:41:37 demo-server postfix/local[7500]: 94FAF61E8F4A: to=neil@mydomain.com, relay=local, delay=0.12, delays=0.09/0.01/0/0.02, dsn=2.0.0, status=sent (delivered to mailbox)

Mar 25 13:41:37 demo-server postfix/qmgr[7154]: 94FAF61E8F4A: removed

本地邮件功能正常后,尝试向外部地址(例如 GMail 账户)发送邮件。同时,测试通过外部账户向你域名中的用户发送邮件,验证来邮功能是否正常。每次操作后,检查/var/log/maillog 文件中的错误说明。

28.10 通过 SMTP 中继服务器发送邮件

配置邮件服务器以处理外发邮件的替代方案是使用 SMTP 中继服务。如前所述,有许多此类服务可用,大多数可以通过搜索“SMTP Relay Service”找到。大部分服务要求你以某种方式验证域名,并提供 MX 记录以更新 DNS 设置。你还将获得一个用户名和密码,这些信息需要添加到 postfix 配置中。本节假设你已经在系统上安装了 postfix,并且你选择的 SMTP 中继提供商要求的所有初始步骤都已完成。

首先编辑/etc/postfix/main.cf 文件,并使用你的域名配置 myhostname 参数:

myhostname = mydomain.com

接下来,在/etc/postfix 目录下创建一个名为 sasl_passwd 的新文件,并添加一行,内容包括中继服务提供的邮件服务器主机以及用户名和密码。例如:

[smtp.myprovider.com]:587 neil@mydomain.com:mypassword

请注意,上述条目中也指定了端口 587。如果没有此设置,postfix 将默认为使用端口 25,而大多数 SMTP 中继服务提供商默认会封锁该端口。

创建密码文件后,使用 postmap 工具生成包含邮件凭证的哈希数据库:

postmap /etc/postfix/sasl_passwd

在继续之前,采取一些额外步骤来保护你的 postfix 凭证:

chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

再次编辑 main.cf 文件,并添加一条配置项来指定中继服务器:

relayhost = [smtp.myprovider.com]:587

在 main.cf 文件中,添加以下行以配置 SMTP 服务器的身份验证设置:

smtp_use_tls = yes

smtp_sasl_auth_enable = yes

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

smtp_sasl_security_options = noanonymous

smtp_sasl_tls_security_options = noanonymous

最后,重新启动 Postfix 服务:

systemctl restart postfix

一旦服务重新启动,尝试使用邮件工具或你喜欢的邮件客户端发送和接收邮件。

28.11 总结

一个完整的端到端邮件系统包括邮件用户代理(MUA)、邮件传输代理(MTA)、邮件投递代理(MDA)和 SMTP 协议。CentOS 8 提供了多种 MTA 解决方案,其中较为流行的是 Postfix。本章概述了如何在 CentOS 8 系统上安装、配置和测试 Postfix,使其既能充当邮件服务器,又能使用第三方 SMTP 中继服务器发送和接收邮件。

29. 向 CentOS 8 系统添加新硬盘驱动器

目前用户和系统管理员面临的第一个问题之一是,系统往往会因存储数据的磁盘空间不足而出现问题。幸运的是,磁盘空间现在是最便宜的 IT 商品之一。在接下来的两章中,我们将介绍配置 CentOS 8 以使用新物理或虚拟硬盘驱动器提供的空间所需的步骤。

29.1 挂载的文件系统或逻辑卷

在 CentOS 8 系统上配置新硬盘有两种方法。一种非常简单的方法是,在新硬盘上创建一个或多个 Linux 分区,在这些分区上创建 Linux 文件系统,然后将它们挂载到特定的挂载点,以便访问。此方法将在本章中进行讲解。

另一种方法是将新空间添加到现有的卷组中,或创建一个新的卷组。当 CentOS 8 安装时,会创建一个名为 cl 的卷组。在该卷组中,有三个逻辑卷,分别命名为 root、home 和 swap,用于存储 / 和 /home 文件系统以及交换分区。通过将新硬盘配置为卷组的一部分,我们可以增加现有逻辑卷的磁盘空间。因此,我们可以通过将新硬盘上的部分或全部空间分配给 home 卷,来增大 /home 文件系统的大小。这个话题将在《向 CentOS 8 卷组和逻辑卷添加新硬盘》中详细讨论。

29.2 查找新硬盘

本教程假设系统已安装新物理或虚拟硬盘,并且该硬盘对操作系统可见。添加后,操作系统应自动检测到新硬盘。通常,系统中的硬盘驱动器会分配以 hd 或 sd 开头的设备名称,后跟一个字母表示设备编号。例如,第一个设备可能是 /dev/sda,第二个设备是 /dev/sdb,依此类推。

以下是只有一个硬盘驱动器连接到 SATA 控制器的系统输出:

第二十八章:ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2

这显示了由 /dev/sda 表示的硬盘驱动器被分为 2 个分区,分别由 /dev/sda1 和 /dev/sda2 表示。

以下输出来自同一系统,在安装了第二个硬盘驱动器后:

ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2 /dev/sdb

如上所示,新硬盘已被分配到设备文件 /dev/sdb。目前该驱动器没有显示任何分区(因为我们尚未创建任何分区)。

此时,我们可以选择在新磁盘上创建分区和文件系统并将其挂载以便访问,或者将该磁盘作为物理卷添加到卷组中。若要执行前者,请继续阅读本章,否则请阅读“将新磁盘添加到 CentOS 8 卷组和逻辑卷”,了解配置逻辑卷的详细信息。

29.3 创建 Linux 分区

下一步是在新磁盘上创建一个或多个 Linux 分区。这是通过使用 fdisk 工具来实现的,fdisk 工具接受一个命令行参数,该参数指定要分区的设备:

fdisk /dev/sdb

欢迎使用 fdisk(util-linux 2.32.1)。

更改将仅保留在内存中,直到您决定写入它们。

在使用写入命令之前要小心。

设备不包含可识别的分区表。

创建了一个新的 DOS 磁盘标签,磁盘标识符为 0xbd09c991。

命令(输入 m 以获取帮助):

为了查看磁盘上的当前分区,请输入 p 命令:

命令(输入 m 以获取帮助):p

磁盘 /dev/sdb:8 GiB,8589934592 字节,16777216 个扇区

单位:1 * 512 = 512 字节的扇区

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0xbd09c991

从上面的 fdisk 输出可以看出,该磁盘目前没有分区,因为它是一个以前未使用的磁盘。下一步是在磁盘上创建一个新分区,操作方法是输入 n(表示新分区)和 p(表示主分区):

命令(输入 m 以获取帮助):n

分区类型

p 主分区(0 主分区,0 扩展分区,4 空闲)

e 扩展分区(逻辑分区的容器)

选择(默认 p):p

分区号(1-4,默认 1):

在这个例子中,我们只打算创建一个分区,即分区 1。接下来,我们需要指定分区的起始和结束位置。由于这是第一个分区,我们需要它从第一个可用扇区开始,并且由于我们希望使用整个磁盘,我们将最后一个扇区作为结束位置。请注意,如果您希望创建多个分区,可以通过扇区、字节、千字节或兆字节来指定每个分区的大小。

分区号(1-4,默认 1):1

第一个扇区(2048-16777215,默认 2048):

最后一个扇区,+扇区数或+大小{K,M,G,T,P}(2048-16777215,默认 16777215):

创建了一个新的类型为‘Linux’、大小为 8 GiB 的分区 1。

命令(输入 m 以获取帮助):

现在我们已经指定了分区,我们需要使用 w 命令将其写入磁盘:

命令(输入 m 以获取帮助):w

分区表已更改。

正在调用 ioctl()以重新读取分区表。

正在同步磁盘。

如果我们现在再次查看设备,我们会看到新的分区显示为/dev/sdb1:

ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1

下一步是在我们新创建的分区上创建文件系统。

29.4 在 CentOS 8 磁盘分区上创建文件系统

我们现在安装了一块新磁盘,它对 CentOS 8 是可见的,我们已经在该磁盘上配置了一个 Linux 分区。接下来的步骤是在该分区上创建一个 Linux 文件系统,以便操作系统可以使用它来存储文件和数据。创建文件系统的最简单方法是使用 mkfs.xfs 工具:

mkfs.xfs /dev/sdb1

meta-data=/dev/sdb1 isize=512 agcount=4, agsize=524224 blks

= sectsz=512 attr=2, projid32bit=1

= crc=1 finobt=1, sparse=1, rmapbt=0

= reflink=1

data = bsize=4096 blocks=2096896, imaxpct=25

= sunit=0 swidth=0 blks

naming =version 2 bsize=4096 ascii-ci=0, ftype=1

log =internal log bsize=4096 blocks=2560, version=2

= sectsz=512 sunit=0 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

在这种情况下,我们创建了一个 XFS 文件系统。XFS 是一个高性能文件系统,是 CentOS 8 上的默认文件系统类型,并且在并行 I/O 性能和使用日志记录方面具有许多优势。

29.5 日志记录文件系统概述

日志记录文件系统会保留一个日志,记录在磁盘写入过程中对文件系统所做的更改,可以用来快速重建由于系统崩溃或断电等事件导致的文件系统损坏。

使用日志记录文件系统有很多优点。随着时间的推移,存储在磁盘驱动器上的数据的大小和数量呈指数增长。非日志记录文件系统的问题是,在发生崩溃后,必须运行 fsck(文件系统一致性检查)工具。fsck 工具会扫描整个文件系统,验证所有条目,并确保块被正确分配和引用。如果发现损坏的条目,它会尝试修复问题。这里有两个问题。首先,fsck 工具并不总是能够修复损坏,结果会将数据存放在 lost+found 目录中。这些数据曾被某个应用程序使用,但系统不再知道它来自哪里。另一个问题是时间问题。在大型文件系统上完成 fsck 过程可能需要很长时间,可能导致不可接受的停机时间。

另一方面,日志记录文件系统会在每次写入时,将信息记录到磁盘上的日志区域(日志和日志本身不需要位于同一设备上)。这本质上是“打算提交”数据到文件系统。日志的记录信息量是可配置的,范围从不记录任何信息,到记录“元数据”(如所有权、时间戳信息等),再到记录“元数据”以及将写入文件的数据块。一旦日志更新,系统会将实际数据写入文件系统的相应区域,并在日志中标记一个条目,表示数据已提交。

在崩溃后,可以使用日志文件快速将文件系统重新上线,从而减少使用 fsck 可能需要几分钟的时间,带来的优势是几乎没有数据丢失或损坏的机会。

29.6 挂载文件系统

现在,我们在新磁盘驱动器的 Linux 分区上创建了一个新的文件系统,需要将其挂载以使其可访问和可用。为此,我们需要创建一个挂载点。挂载点只是文件系统将要挂载到其中的目录或文件夹。为了本例子的目的,我们将创建一个 /backup 目录以匹配我们的文件系统标签(尽管这些值匹配并非必需):

mkdir /backup

然后可以使用 mount 命令手动挂载文件系统:

mount /dev/sdb1 /backup

运行 mount 命令而不带任何参数会显示所有当前挂载的文件系统(包括我们的新文件系统):

mount

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

.

.

/dev/sdb1 on /backup type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

29.7 配置 CentOS 8 自动挂载文件系统

为了设置系统,使新文件系统在引导时自动挂载,需要向 /etc/fstab 文件添加条目。fstab 条目的格式如下:

这些条目可以总结如下:

- 文件系统要挂载的设备。

- 作为文件系统挂载点的目录。

- 文件系统类型(xfs、ext4 等)。

- 额外的文件系统挂载选项,例如使文件系统为只读或控制是否可以由任何用户挂载文件系统。运行 man mount 可查看完整的选项列表。将此值设置为 defaults 将使用文件系统的默认设置(rw、suid、dev、exec、auto、nouser、async)。

- 确定文件系统内容是否包含在由 dump 实用程序执行的任何备份中。此设置很少使用,可以通过设置为 0 来禁用。

- 文件系统在系统崩溃后是否由 fsck 检查以及检查顺序。对于像 XFS 这样的日志文件系统,应将此设置为 0,表示不需要检查。

以下示例显示了一个配置自动挂载我们的 /backup 分区到 /dev/sdb1 分区的 fstab 文件:

/dev/mapper/cl-root / xfs defaults 0 0

UUID=b4fc85a1-0b25-4d64-8100-d50ea23340f7 /boot xfs defaults 0 0

/dev/mapper/cl-home /home xfs defaults 0 0

/dev/mapper/cl-swap swap swap defaults 0 0

/dev/sdb1 /backup xfs defaults 0 0

每次系统重新启动时,/backup 文件系统都会自动挂载。

29.8 使用 Cockpit 添加磁盘

除了使用本章中概述的命令行工具操作存储外,还可以使用 Cockpit Web 控制台配置新存储设备。要查看当前存储配置,请登录 Cockpit 控制台并选择“存储”选项,如图 29-1 所示:

图 29-1

要查找新添加的存储,请滚动至存储页面底部,直到“驱动器”部分出现:

图 29-2

在上图的情况下,新硬盘是 8 GiB 的硬盘。选择新硬盘以显示如图 29-3 所示的硬盘界面:

图 29-3

点击“创建分区表”按钮,在弹出的对话框中接受默认设置并点击“格式化”按钮:

图 29-4

点击“创建分区”按钮,并使用对话框指定此分区将分配多少空间、文件系统类型(推荐使用 XFS),以及可选的标签、文件系统挂载点和挂载选项。请注意,如果此新分区没有使用所有可用空间,后续可能会在硬盘上添加更多分区。如果需要更改设置,例如文件系统是否为只读或是否在启动时挂载,请将“挂载”菜单选项更改为“自定义”,并调整切换按钮设置:

图 29-5

一旦选择了设置,点击“创建分区”按钮以提交更改。完成创建过程后,新的分区将被添加到磁盘,相关的文件系统将被创建并挂载到指定的挂载点,且/etc/fstab 文件将做出相应的更改。

29.9 小结

本章介绍了如何将额外的物理或虚拟磁盘驱动器添加到现有的 CentOS 8 系统中。这个过程相对简单,主要包括确保操作系统检测到新硬盘、在硬盘上创建一个或多个分区,并在这些分区上创建文件系统。虽然 CentOS 8 上有多种不同的文件系统类型可用,但通常推荐使用 XFS。文件系统准备好后,可以使用mount命令进行挂载。为了确保新创建的文件系统在系统启动时自动挂载,可以在/etc/fstab 配置文件中进行相应的添加。

30. 向 CentOS 8 卷组和逻辑卷添加新磁盘

在上一章中,我们探讨了如何向 CentOS 8 系统添加新硬盘,创建分区和文件系统,然后挂载文件系统以便访问磁盘。创建固定分区和文件系统的替代方案是使用逻辑卷管理(LVM)创建由一个或多个物理磁盘或虚拟磁盘/分区的空间组成的逻辑磁盘。使用 LVM 的好处在于,可以根据需要向逻辑卷添加或移除空间,而无需将数据分散到多个文件系统中。

举个例子,假设我们有一台基于 CentOS 8 的服务器,其根目录(/home)文件系统。没有 LVM 时,操作系统安装时会创建一个特定大小的文件系统。如果安装了新硬盘,则无法将任何空间分配给 /home 文件系统。唯一的选择是创建新的文件系统并将其挂载到特定的挂载点。在这种情况下,你在新文件系统上会有足够的空间,但 /home 文件系统仍然几乎满了。唯一的解决方案是将文件移动到新的文件系统上。而使用 LVM 时,新的磁盘(或其一部分)可以分配给包含根文件系统的逻辑卷,从而动态扩展可用空间。

本章将介绍将新磁盘空间添加到卷组和逻辑卷的步骤,目的是为 CentOS 8 系统的根文件系统添加额外空间。

30.1 逻辑卷管理(LVM)概述

LVM 提供了一种灵活的高级磁盘空间管理方法。不同于将每个磁盘驱动器分割成固定大小的分区,并在这些分区上创建固定大小的文件系统,LVM 提供了一种将磁盘空间聚合成逻辑卷的方式,逻辑卷可以轻松调整大小和移动。此外,LVM 允许管理员通过为不同用户组分配不同的卷组或逻辑卷来精确控制磁盘空间的分配。当最初分配给卷的空间用尽时,管理员可以简单地增加更多空间,而无需将用户文件移动到不同的文件系统中。

LVM 由以下组件组成:

30.1.1 卷组(VG)

卷组是一个高级容器,包含一个或多个逻辑卷和物理卷。

30.1.2 物理卷(PV)

物理卷代表一个存储设备,如磁盘驱动器或其他存储介质。

30.1.3 逻辑卷(LV)

逻辑卷相当于一个磁盘分区,和磁盘分区一样,逻辑卷可以包含文件系统。

30.1.4 物理扩展(PE)

每个物理卷(PV)被划分为大小相等的块,称为物理扩展。

30.1.5 逻辑扩展(LE)

每个逻辑卷(LV)被划分为大小相等的块,这些块称为逻辑扩展。

假设我们正在创建一个名为 VolGroup001 的新卷组。为了使该卷组能够正常工作,它需要物理磁盘空间,因此我们分配了三个磁盘分区 /dev/sda1、/dev/sdb1 和 /dev/sdb2。这些将成为 VolGroup001 中的物理卷。接着,我们将在该卷组中创建一个名为 LogVol001 的逻辑卷,该逻辑卷由这三个物理卷组成。

如果 LogVol001 空间不足,我们只需添加更多磁盘分区作为物理卷,并将它们分配给卷组和逻辑卷。

30.2 获取逻辑卷的信息

作为使用 LVM 与 CentOS 8 的示例,我们将通过一个例子来增加标准 CentOS 8 安装中 / 文件系统的空间。为了预见到根分区大小的灵活性,CentOS 8 将 / 文件系统设置为名为 root 的逻辑卷,该逻辑卷位于名为 cl 的卷组中。然而,在对 LVM 配置进行任何更改之前,首先收集信息是非常重要的。

运行 mount 命令将输出关于一系列挂载点的信息,包括根文件系统的以下条目:

/dev/mapper/cl-root 挂载在 / 上,类型 xfs (rw, relatime, seclabel, attr2, inode64, noquota)

可以使用 vgdisplay 命令获取有关卷组的信息:

第二十九章:vgdisplay

--- 卷组 ---

VG 名称 cl

系统 ID

格式 lvm2

元数据区域 1

元数据序列号 3

VG 访问 权限 读/写

VG 状态 可调整大小

最大 LV 0

当前 LV 2

打开 LV 2

最大 PV 0

当前 PV 1

当前 PV 1

VG 大小 <44.70 GiB

PE 大小 4.00 MiB

总 PE 11442

已分配 PE / 大小 11442 / <44.70 GiB

空闲 PE / 大小 0 / 0

VG UUID fANXsd-8l0S-0zO1-BJVN-rnBa-gNf4-eIgjG8

如上例所示,cl 卷组的物理扩展大小为 4.00MB,具有总共 44.7GB 的可用空间可以分配给逻辑卷。目前,已经分配了 11442 个物理扩展,总容量为 44.7GB。如果我们希望增加分配给 cl 卷组中任何逻辑卷的空间,必须添加一个或多个物理卷。vgs 工具也很有用,可以快速显示系统中卷组的空间概况:

vgs

VG #PV #LV #SN 属性 VSize VFree

cl 1 2 0 wz--n- <44.70g 0

可以使用lvdisplay命令获取有关卷组中逻辑卷的信息:

lvdisplay

--- 逻辑卷 ---

LV 路径 /dev/cl/swap

LV 名称 swap

VG 名称 cl

LV UUID FDSEXC-XawV-QhsZ-0CIq-IwV5-rxH6-Q6ATg2

LV 写入访问权限 读/写

LV 创建主机,时间 localhost,2019-11-15 15:59:58 -0500

LV 状态 可用

打开 2

LV 大小 4.57 GiB

当前 LE 1170

段 1

分配 继承

预读扇区 自动

  • 当前设置为 8192

块设备 253:1

--- 逻辑卷 ---

LV 路径 /dev/cl/root

LV 名称 root

VG 名称 cl

LV UUID Nysd1Y-483C-IKLf-P4ez-c3Kq-s2hZ-eumSB5

LV 写入访问权限 读/写

LV 创建主机,时间 localhost,2019-11-15 15:59:58 -0500

LV 状态 可用

打开 1

LV 大小 40.12 GiB

当前 LE 10272

段 1

分配 继承

预读扇区自动

  • 当前设置为 8192

块设备 253:0

如上例所示,40.12 GiB 的空间在卷组 cl 中分配给逻辑卷 root(用于/文件系统),4.57 GiB 分配给 swap(用于交换空间)。

现在我们知道了哪些空间正在被使用,通常有助于了解哪些设备提供了这些空间(换句话说,哪些设备被用作物理卷)。为了获取这些信息,我们需要运行 pvdisplay 命令:

pvdisplay

--- 物理卷 ---

PV 名称 /dev/sda2

卷组名称 cl

物理卷大小 <44.70 GiB / 不可用 3.00 MiB

可分配是的(但已满)

PE 大小 4.00 MiB

总 PE 11442

空闲 PE 0

已分配 PE 11442

PV UUID Gq547r-HUyj-hPeZ-7be0-CvFx-206v-Hy2xmj

显然,逻辑卷 cl 控制的空间是通过位于/dev/sda2 的物理卷提供的。

现在我们对 LVM 配置有了更多了解,可以开始将空间添加到卷组和其中的逻辑卷的过程。

30.3 从命令行向卷组添加额外空间

就像之前收集有关 CentOS 8 系统当前逻辑卷管理配置的信息一样,可以通过命令行对该配置进行更改。

在本章的剩余部分,我们假设系统中已添加了一个新磁盘,并且操作系统将其识别为/dev/sdb。我们还假设这是一个没有包含任何现有分区的新磁盘。如果存在现有分区,应先备份,然后使用 fdisk 工具删除磁盘上的分区。例如,假设一个设备由/dev/sdb 表示,包含两个分区,如下所示:

fdisk -l /dev/sdb

磁盘/dev/sdb:8 GiB,8589934592 字节,16777216 扇区

单位:每个扇区 1 * 512 = 512 字节

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘标签类型:dos

磁盘标识符:0xbd09c991

设备 启动 起始 结束 扇区 数量 大小 ID 类型

/dev/sdb1 2048 5678545 5676498 2.7G 83 Linux

/dev/sdb2 5679104 16777215 11098112 5.3G 83 Linux

一旦这些分区上的文件系统已卸载,就可以按如下方式删除它们:

fdisk /dev/sdb

欢迎使用 fdisk(util-linux 2.32.1)。

更改将仅保留在内存中,直到您决定写入它们。

使用写入命令时请小心。

命令(m 获取帮助):d

分区号(1,2,默认为 2):1

分区 1 已被删除。

命令(m 获取帮助):d

选择的分区 2

分区 2 已被删除。

命令(m 获取帮助):w

分区表已被更改。

正在调用 ioctl()以重新读取分区表。

正在同步磁盘。

在进入下一步之前,确保从/etc/fstab 文件中删除这些文件系统的任何条目,以避免系统在下一次重启时尝试挂载它们。

一旦磁盘准备好,下一步是使用 pvcreate 命令将该磁盘转换为物理卷(如果存在,则擦除 DOS 签名):

pvcreate /dev/sdb

物理卷 "/dev/sdb" 成功创建。

如果创建失败并显示“设备 /dev/ 被过滤器排除”的信息,则可能需要在创建物理卷之前使用 wipefs 命令擦除磁盘:

wipefs -a /dev/sdb

/dev/sdb: 在偏移量 0x00000200 (gpt) 擦除了 8 字节:45 46 49 20 50 41 52 54

/dev/sdb: 在偏移量 0x1fffffe00 (gpt) 擦除了 8 字节:45 46 49 20 50 41 52 54

/dev/sdb: 在偏移量 0x000001fe (PMBR) 擦除了 2 字节:55 aa

/dev/sdb: 调用 ioctl 重新读取分区表:成功

创建了物理卷后,我们需要使用 vgextend 命令将其添加到卷组(此例中为 cl):

vgextend cl /dev/sdb

卷组 "cl" 成功扩展

新的物理卷现在已被添加到卷组,并准备分配给逻辑卷。为此,我们运行 lvextend 工具,指定我们希望扩展的大小。在此例中,我们希望将逻辑卷 root 扩展 7 GB。请注意,我们需要提供逻辑卷的路径,这可以通过 lvdisplay 命令获取(此例中为 /dev/cl/root):

lvextend -L+7G /dev/cl/root

逻辑卷 cl/root 的大小从 40.12 GiB (10272 extents) 更改为 47.12 GiB (12064 extents)。

逻辑卷 cl/root 成功调整大小。

过程的最后一步是调整存储在逻辑卷上的文件系统,以便它使用额外的空间。由于我们假设使用默认的 CentOS 8 安装并使用 XFS 文件系统,因此可以使用 xfs_growfs 工具来实现:

xfs_growfs /

meta-data=/dev/mapper/cl-root isize=512 agcount=4, agsize=2629632 blks

= sectsz=512 attr=2, projid32bit=1

= crc=1 finobt=1, sparse=1, rmapbt=0

= reflink=1

数据 = bsize=4096 blocks=10518528, imaxpct=25

= sunit=0 swidth=0 blks

naming =version 2 bsize=4096 ascii-ci=0, ftype=1

log =internal log bsize=4096 blocks=5136, version=2

= sectsz=512 sunit=0 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

数据块从 10518528 更改为 12353536

另一方面,如果文件系统类型为 ext2、ext3 或 ext4,则应使用 resize2fs 工具来执行文件系统的调整大小操作:

resize2fs /dev/cl/root

一旦调整大小完成,文件系统将扩展以使用新磁盘驱动器提供的额外空间。所有这一切都在不移动任何文件或甚至不需要重启服务器的情况下完成。对于系统上的任何用户来说,什么都没有改变(当然,除了现在有更多的磁盘空间)。

30.4 使用 Cockpit 向卷组添加额外空间

除了本章中概述的命令行工具外,还可以通过 Cockpit 网页界面的 Storage 页面来访问逻辑卷的信息,并进行卷组和逻辑卷的更改,如图 30-1 所示:

图 30-1

如果 Storage 选项未列出,需要安装 cockpit-storaged 包,并按以下方式重新启动 cockpit 服务:

dnf install cockpit-storaged

systemctl restart cockpit.socket

一旦 Cockpit 服务重新启动,重新登录 Cockpit 界面,此时应该可以看到 Storage 选项。

要从 Cockpit 控制台向现有卷组添加新的磁盘驱动器,从上述 Storage 页面开始,点击与要扩展的卷组相关的文件系统,该文件系统在上面的列表中标记为 A。

在结果屏幕上,点击下方图 30-2 中高亮显示的+按钮,以添加一个物理卷:

图 30-2

选择要添加到卷组的新驱动器,并点击“Add”按钮:

图 30-3

返回卷组屏幕后,向下滚动到要扩展的逻辑卷,并点击它以展开更多信息。例如,图 30-4 显示了根逻辑卷的详细信息:

图 30-4

要使用新空间扩展逻辑卷,请点击“Grow”按钮,并在弹出的对话框中使用滑块选择要添加到卷的空间大小。点击“Grow”按钮以提交更改(如果需要,可将可用空间在不同的卷组之间共享):

图 30-5

完成这些步骤后,卷组将已配置为使用新添加的空间。

30.5 总结

卷组和逻辑卷为 CentOS 8 系统中的物理存储设备提供了一个抽象层,提供了一种灵活的方式来分配由多个磁盘驱动器提供的空间。这使得可以动态地进行磁盘空间分配和更改,而无需重新分区磁盘驱动器并在文件系统之间移动数据。本章概述了卷组、逻辑卷和物理卷的基本概念,并演示了如何使用命令行工具和 Cockpit 网页界面来管理这些。

31. 添加和管理 CentOS 8 交换空间

维护 CentOS 8 系统性能的一个重要部分是确保有足够的交换空间,以满足系统内存的需求。因此,本章的目标是提供 CentOS 8 上交换空间管理的概述。

31.1 什么是交换空间?

计算机系统具有有限的物理内存,这些内存供操作系统使用。当操作系统接近可用内存的限制时,它会通过将内存页面写入磁盘来释放空间。当操作系统需要这些页面时,它们会被重新读取到内存中。分配给此任务的磁盘区域称为交换空间。

31.2 CentOS 8 推荐的交换空间

对于 CentOS 8,推荐的交换空间大小取决于多个因素,包括系统内存的大小、内存上的工作负载以及系统是否需要支持休眠。CentOS 8 交换空间的当前指南如下:

安装的 RAM 大小 推荐的交换空间 启用休眠时推荐的交换空间
2GB 或更少 安装的 RAM x 2 安装的 RAM x 3
2GB - 8GB 安装的 RAM x 1 安装的 RAM x 2
8GB - 64GB 至少 4GB 安装的 RAM x 1.5
64GB 或更多 至少 4GB 不推荐休眠

表 31-1

当系统进入休眠时,当前的系统状态会被写入硬盘,主机关闭电源。随后,当机器重新开机时,系统状态会从硬盘驱动器中恢复。这与挂起不同,挂起时系统状态存储在 RAM 中。机器会进入休眠状态,在此状态下,系统 RAM 保持供电,而其他设备则关闭。

31.3 确定当前的交换空间使用情况

可以通过多种方式识别 CentOS 8 系统当前使用的交换空间。一种方法是输出 /proc/swaps 文件:

第三十章:cat /proc/swaps

文件名 类型 大小 已用 优先级

/dev/dm-1 分区 4169724 41484 -2

或者,可以使用 swapon 命令:

swapon

NAME TYPE SIZE USED PRIO

/dev/dm-1 分区 4G 40.5M -2

要查看交换空间相对于总体可用 RAM 的大小,可以使用 free 命令:

free

总计 已用 空闲 共享 缓冲/缓存 可用

Mem: 4035436 1428276 2224596 21968 382564 2360172

Swap: 4169724 41484 4128240

31.4 向 CentOS 8 系统添加交换文件

可以通过创建一个文件并将其分配为交换空间来向系统添加额外的交换空间。首先,使用 dd 命令创建交换文件。可以通过调整 count= 变量来更改文件的大小。例如,以下命令创建一个 2.0 GB 的文件:

dd if=/dev/zero of=/newswap bs=1024 count=2000000

2000000+0 记录已输入

2000000+0 记录已输出

2048000000 字节(2.0 GB,1.9 GiB)已复制,3.62697 秒,565 MB/s

在将文件转换为交换文件之前,重要的是确保文件已设置安全的权限:

chmod 0600 /newswap

一旦创建了合适的文件,就需要使用 mkswap 命令将其转换为交换文件:

mkswap /newswap

设置交换空间版本 1,大小 = 1.9 GiB (2047995904 字节)

无标签,UUID=4ffc238d-7fde-4367-bd98-c5c46407e535

创建并配置好交换文件后,可以使用 swapon 工具实时将其添加到系统中:

swapon /newswap

重新运行 swapon 应该会报告新文件现在作为交换空间使用:

swapon

名称 类型 大小 已用 优先级

/dev/dm-1 分区 4G 0B -2

/newswap 文件 1.9G 0B -3

可以使用 swapoff 工具动态删除交换空间,方法如下:

swapoff /newswap

最后,修改 /etc/fstab 文件,通过添加以下行在系统启动时自动添加新的交换空间:

/newswap 交换 交换 默认 0 0

31.5 将交换空间添加为分区

作为指定交换空间的替代方法,整个磁盘分区也可以指定为交换空间。实现这一点的步骤与添加交换文件大致相同。不过,在将分区分配给交换空间之前,请确保相应文件系统上的任何现有数据已备份或不再需要,并且该文件系统已卸载。

假设磁盘驱动器上存在一个分区,例如 /dev/sdb1,第一步是将其转换为交换分区,再次使用 mkswap 工具:

mkswap /dev/sdb1

mkswap: /dev/sdb1: 警告: 擦除旧的 xfs 签名。

设置交换空间版本 1,大小 = 8 GiB (8587833344 字节)

无标签,UUID=a899c8ec-c410-4569-ba18-ddea03370c7f

接下来,将新分区添加到系统交换空间,并验证其是否已成功添加:

swapon /dev/sdb1

swapon

名称 类型 大小 已用 优先级

/dev/dm-1 分区 4G 0B -2

/dev/sdb1 分区 8G 0B -3

再次修改 /etc/fstab 文件,以便在启动时自动添加交换分区,方法如下:

/dev/sdb1 交换 交换 默认 0 0

31.6 向 CentOS 8 LVM 交换卷添加空间

默认情况下,CentOS 8 使用逻辑卷管理(LVM)配置交换空间。因此,除了通过文件或磁盘分区添加交换空间外,还可以扩展用于交换空间的逻辑卷。

第一步是使用 lvdisplay 工具确定当前可用的交换空间、卷组和用于交换空间的逻辑卷(有关 LVM 的更多信息,请参见章节 “将新磁盘添加到 CentOS 8 卷组和逻辑卷”):

lvdisplay

--- 逻辑卷 ---

逻辑卷路径 /dev/cl/swap

逻辑卷名称 swap

卷组名称 cl

逻辑卷 UUID fwOZsF-ROwu-6eLe-2KDR-JZ0d-Pn4o-K5B0Vb

逻辑卷写访问权限 读/写

逻辑卷创建主机,时间 demoserver, 2019-02-14 11:12:07 -0500

逻辑卷状态 可用

打开 2

逻辑卷大小 ❤️.98 GiB

当前逻辑扩展 1018

段 1

分配继承

预读扇区 自动

  • 当前设置为 256

块设备 253:1

.

.

显然,交换空间位于名为 swap 的逻辑卷上,而该逻辑卷属于名为 cl 的卷组。下一步是验证卷组中是否有可用空间可分配给交换卷:

vgs

VG #PV #LV #SN 属性 VSize VFree

cl 2 3 0 wz--n- 197.66g <22.00g

如果可用的空间足以满足额外的交换需求,则关闭交换,并扩展交换逻辑卷,以使用所需的可用空间来满足系统的交换需求:

swapoff /dev/cl/swap

lvextend -L+8GB /dev/cl/swap

逻辑卷 cl/swap 成功调整大小。

接下来,重新格式化交换卷并重新启用交换:

mkswap /dev/cl/swap

mkswap: /dev/cl/swap: 警告:擦除旧的交换签名。

设置交换空间版本 1,大小 = 12 GiB (12754874368 字节)

无标签,UUID=241a4818-e51c-4b8c-9bc9-1697fc2ce26e

swapon /dev/cl/swap

进行更改后,检查交换空间是否已增加:

swapon

NAME 类型 大小 已用 优先级

/dev/dm-1 分区 12G 0B -2

31.7 向卷组添加交换空间

在上面的部分中,我们扩展了交换逻辑卷以使用已经在卷组中的可用空间。如果卷组中没有可用空间,那么在扩展交换空间之前,需要先添加空间。

首先检查卷组的状态:

vgs

VG #PV #LV #SN 属性 VSize VFree

cl 1 3 0 wz--n- <189.67g 0

上述输出表明,卷组中没有可用空间。然而,假设我们需要在系统上为交换增加 8 GB。显然,这将需要向卷组中添加更多空间。为了这个示例,假设一个大小为 8 GB 的磁盘 /dev/sdb 可供添加到卷组。第一步是将此分区转换为物理卷:

pvcreate /dev/sdb

物理卷 "/dev/sdb" 成功创建。

如果创建失败并出现类似“设备 /dev/sdb 被过滤器排除”的信息,可能需要在创建物理卷之前擦除磁盘:

wipefs -a /dev/sdb

/dev/sdb: 在偏移量 0x00000200 (gpt) 处擦除了 8 字节:45 46 49 20 50 41 52 54

/dev/sdb: 在偏移量 0x1fffffe00 (gpt) 处擦除了 8 字节:45 46 49 20 50 41 52 54

/dev/sdb: 在偏移量 0x000001fe (PMBR) 处擦除了 2 字节:55 aa

/dev/sdb: 调用 ioctl 重新读取分区表:成功

接下来,需要扩展卷组以使用此额外的物理卷:

vgextend cl /dev/sdb

卷组 "cl" 成功扩展

此时,vgs 命令应报告将 8 GB 空间添加到卷组:

vgs

VG #PV #LV #SN 属性 VSize VFree

cl 2 3 0 wz--n- 197.66g <8.00g

现在,卷组中已增加了额外的空间,可以扩展交换逻辑卷以利用这些空间。首先,使用 swapoff 工具关闭交换:

swapoff /dev/cl/swap

接下来,扩展逻辑卷以使用新空间:

lvextend -L+7.9GB /dev/cl/swap

将大小舍入到物理扩展之间的边界:7.90 GiB。

逻辑卷 cl/swap 的大小从 ❤️.98 GiB(1018 个扩展)更改为 <11.88 GiB(3041 个扩展)。

逻辑卷 cl/swap 成功调整大小。

在逻辑卷上重新创建交换空间:

mkswap /dev/cl/swap

mkswap: /dev/cl/swap: 警告:正在清除旧的交换签名。

设置交换空间版本 1,大小 = 11.9 GiB(12754874368 字节)

无标签,UUID=241a4818-e51c-4b8c-9bc9-1697fc2ce26e

接下来,重新开启交换空间:

swapon /dev/cl/swap

最后,使用 swapon 命令验证交换空间是否已成功添加到系统:

swapon

名称 类型 大小 已用 优先级

/dev/dm-1 分区 11.9G 0B -2

31.8 总结

交换空间是几乎所有操作系统中处理内存资源紧张情况的重要组件。通过将部分内存区域交换到磁盘,系统能够继续运行并满足其上运行的进程和应用程序的需求。

CentOS 8 提供了一组指导原则,建议根据系统中安装的内存量分配相应的基于磁盘的交换空间。在这些建议不足以满足需求的情况下,可以向系统添加额外的交换空间,通常不需要重启。如本章所述,交换空间可以通过文件、磁盘或磁盘分区的形式添加,或者通过扩展已配置为交换空间的现有逻辑卷来实现。

第三十一章

索引

符号

05-redhat.conf 文件 127

.bashrc 文件 63

/etc/exports 文件 134

/etc/fstab 文件 29, 31

/etc/fstab 文件 223

/etc/yum.repos.d/ 目录 72

/home 目录 65

/proc/swaps 文件 235

.requires 文件夹 82

.ssh 文件夹 107

.wants 文件夹 82

A

ACC 公司 4

AMD-V 154

检查可用性 157

Apache web 服务器 203

配置防火墙 204

域配置 205

httpd.conf 文件 206

HTTPS 206, 207

安装 203

安全网站 206

SSL 证书 207

启动 204

测试 204

应用流 71

AppStream 71, 73

模块 73

包 73

配置文件 73

AppStream 仓库 71

B

BaseOS 仓库 71, 72

Bash shell 57

别名 61

.bashrc 文件 63

命令行编辑 58

环境变量 62

文件名简写 60

历史 59

I/O 重定向 60

路径补全 60

模式匹配 60

管道 61

shell 脚本 63

basic.target 78

启动菜单

编辑 25, 35

Bourne shell 57

buildah 191, 198

从零开始 198

挂载 199

运行 199

C

CA 207

cat 60

CentOS 5

证书颁发机构 (CA) 207

更改根目录 189

chmod 64

chroot 189

CNI 192, 199

Cockpit

访问 46

账户管理 49

添加磁盘 223

应用程序 50

cockpit-storaged 233

创建虚拟机 161

仪表板 52

诊断报告 50

启用 46

扩展 45, 50

防火墙管理 102

安装 46

内核转储 51

日志 47

多服务器 52

网络 48

NFS 管理 136

概述 45

持久化指标 54

端口 46

SELinux 51

服务 50

软件更新 51

存储 48

系统 47

systemd 单元 82

终端访问 52

用户管理 67

虚拟机 49

虚拟机模块 161

卷组管理 233

cockpit-pcp 55

cockpit-storaged 233

连接配置文件 90

containerd 189

容器网络接口 192, 199

容器运行时 189

容器 189

buildah 191

从头构建 198

更改根目录 189

chroot 189

CNI 192

cni0 192

containerd 189

容器运行时 189

CRI-O 189

Docker 189

内核共享 189

lxd 189

网络 192

OpenShift 191

概述 189

podman 191

Podman 189

拉取镜像 193

runc 191

运行镜像 195

保存为镜像 197

skopeo 191

上下文标签 143

CRI-O 189

C shell 57

D

守护进程 77

dd 9, 236

default.target 文件 80

自主访问控制 142

磁盘驱动

添加 219

检测 219

磁盘分区

格式化 34

diskutil 9

dmesg 8

dnf 20

dnf.conf 文件 72

DNS MX 记录 215

Docker 189

双重启动 23, 31

E

邮件服务器 211

配置 212

MX 记录 215

电子邮件系统

概述 211

加密

磁盘 18

环境 62

环境变量 62

EPEL 28

错误更正 2

导出 62

企业 Linux 的额外软件包 28

F

FAT16 23

FAT32 23

fdisk 31, 220, 230

Fedora Linux 5

Fedora 媒体写入工具 10

Fedora 项目 5

文件系统

创建 221

挂载 222

查找挂载点 8

防火墙

电子邮件设置 213

概述 95

Web 服务器设置 204

firewall-cmd 97

NFS 设置 134

Samba 设置 140

firewall-config 102

firewalld

默认区域 98

显示区域信息 98

firewall-cmd 97

firewall-config 102

ICMP 规则 100

接口 95, 96

列出服务 99

概述 95

永久设置 97

端口转发 101

端口规则 99

端口 95, 97

重新加载 98

运行时设置 97

服务 95, 97

状态 97

区域创建 100

区域/接口分配 100

区域 95

区域服务 99

自由 236

自由软件基金会 4

fsck 222

完全虚拟化 154

Fuse NTFS 驱动程序 28

G

GDM 20

GNOME 3 37

GNOME 桌面 37

安装 37

安装 117

启动 37

GNOME 显示管理器 20

GNU/Linux 4

Google Cloud 113

graphical.target 78

groupadd 66

groupdel 66

组 66

添加 66

成员列表 66

删除 66

wheel 66

grub 26

grub2-mkconfig 26

客户操作系统虚拟化 151

H

硬件虚拟化 154

休眠 235

历史记录 58, 59

主目录 62

托管的虚拟化监视程序 152

httpd 203

httpd.conf 文件 206

httpd-le-ssl.conf 文件 208

httpd.service 81

HTTPS 206

超级调用 153

虚拟化监视程序 152

Type-1 152

Type-2 152

id_rsa 106, 107, 109

id_rsa.pub 109

安装

磁盘分区 15

安装

清理磁盘 7

安装软件包

列表 72

Intel VT 154

检查可用性 157

IP 地址 88

地址 88

iptables 95

ISO 镜像

写入 USB 驱动器 8

J

日志文件系统 221

K

Kdump 15

KDump 51

内核共享 189

KVM 157

在 Cockpit 中创建虚拟机 161

硬件要求 157

安装 158

kvm_amd 159

kvm_intel 159

libvirtd 159

网络桥接接口 175

概览 157

验证 158

virsh 185

virt-manager 158, 159

virt-viewer 164

kvm_amd 159

kvm_intel 159

L

libvirtd 159

Linus Torvalds 4

Linux 容器。参见 Containers

逻辑扩展 228

逻辑卷管理 17

交换空间 237

逻辑卷 227, 228

扩展 232

获取信息 228

管理 227

ls 58

lvdisplay 229, 237

lvextend 232

LVM 17, 227

lxd 189

M

macOS

写入 ISO 到 USB 驱动器 9

邮件传递代理 212

邮件传输代理 211

邮件用户代理 211

main.cf 文件 213

man 58

强制访问控制 142

Marc Ewing 4

Martin Hellman 105

MDA 212

金属虚拟化管理程序 153

mkfs.xfs 34

mkswap 236, 237

挂载 228

MTA 211

MUA 211

multi-user.target 78

MX 记录 215

N

NAT 155

本地虚拟化管理程序 153

NetBIOS 名称服务 146

网络地址转换 155

网络桥接接口 175

网络文件系统 133

NetworkManager 85

检查状态 86

连接配置文件 90

连接 87

设备 87

设备状态 86

启用 86

安装 86

管理连接 89

修改连接 89

network-scripts 文件夹 90

nmcli 85

nm-connection-editor 85

nmtui 85

权限 94

network-scripts

文件夹 90

network-scripts 文件夹 90

NFS 133

Cockpit 管理 136

导出文件系统 134

防火墙设置 134

挂载文件系统 135

启动服务 133

卸载文件系统 135

nfs-client.target 78

NMB 146

nmcli 85, 175

基本命令 86

连接权限 94

连接配置文件 90

交互式编辑 92

管理连接 89

网络桥接创建 177

权限 94

显示连接 89

Wi-Fi 扫描 89

nm-connection-editor 85, 180

网络桥接接口 180

nmtui 85

NTFS 23, 28, 32

O

OpenShift 191

P

半虚拟化 153

分区

挂载 34

passwd 65

PATH 62

pcp-libs 55

pcp-selinux 55

物理扩展 228

物理卷 227

创建 231

podman 191

附加 196

执行 196

列出镜像 195

暂停 197

ps -a 196

rm 198

启动 197

停止 196

取消暂停 197

Podman 189

端口转发 101

后缀

配置 212, 213

安装 213

日志文件 215

main.cf 文件 213

SMTP 中继服务器 216

staring 215

测试 215

Postfix 211

poweroff.target 77

ps 61

公钥加密 105

PuTTY 110

安全隧道 123

PuTTYgen 111, 112

pvcreate 231

pvdisplay 230

pwd 58

Q

QEMU/KVM 159

R

RealVNC 119

reboot.target 78

Red Hat, Inc. 3

Red Hat 包管理器 72

红帽支持 4

远程桌面访问 117

安全与不安全 117

remote-fs.target 78

远程安装 14

远程过程调用 133

仓库

列出 71

仓库 71

rescue.target 78

resize2fs 232

restorecon 144

理查德·斯托尔曼 4

root 密码

在安装期间指定 19

root 用户 1

RPC 133

rpcbind 服务 133

rpm 72

RPM 72

runc 191

运行级别 77

S

samba 139

Samba 139

客户端 139

配置共享资源 141

创建用户 144

自主访问控制 142

防火墙设置 140

安装 139

强制访问控制 142

NetBIOS 名称服务 146

NMB 146

samba-client 148

SELinux 142

smb:// 149

smbclient 146

smb.conf 文件 140

smbpasswd 140

测试 smb.conf 文件 144

工作组 140

samba-client 139, 148

Samba 客户端 139

samba-common 139

SATA 控制器 219

安全套接层(SSL) 207

安全网站

配置 206

SELinux 142

上下文标签 143

强制执行 143

宽松模式 143

恢复默认上下文 restorecon 144

Samba 142

semanage 144

sestatus 142

smbpasswd 144

类型强制 143

semanage 144

服务器消息块(Server Message Block) 139

服务 77

禁用 82

启用 81

掩码 82

启动 81

停止 81

sestatus 142

sh 64

shadow 文件 67

Shell

历史 59

概览 57

shell 脚本 63

skopeo 191, 193

获取图像信息 193

smb:// 149

SMB 139

smbclient 146

smb.conf 144

smb.conf 文件 140

[global] 部分 140

测试 144

smbpasswd 140, 144

SMTP 212

SMTP Relay 212

SMTP Relay 服务器 216

配置 216

sockets.target 78

软件更新 51

SSH 105

SSH 认证 106

来自 Linux 106

来自 macOS 106

来自 Windows 109

Google Cloud 113

多密钥 108

PuTTY 110

PuTTYgen 111, 112

ssh_config 文件 108

ssh-copy-id 107

ssh-keygen 106

ssh_config.d 文件 127

ssh_config 文件 108

ssh-copy-id 107

sshd.service 108

ssh-keygen 106

SSL 207

SSL 证书 207

startx 37, 119

stderr 61

stdin 60

stdout 60

存储设备

识别 8

su - 命令 1

sudo 1, 66

sudoers 文件 67

超级用户 1

swapoff 236

swapoff u 239

swapon 236, 240

交换空间

添加分区 237

添加交换文件 236

将添加到卷组 238

当前使用情况 235

扩展逻辑交换卷 237

推荐的 235

systemctl 78, 79

systemd

默认目标 77

targets 77

单元 77

systemd 目标

basic.target 78

动态更改 80

获取默认值 79

graphical.target 78

列出依赖项 78

multi-user.target 78

nfs-client.target 78

poweroff.target 77

reboot.target 78

remote-fs.target 78

rescue.target 78

设置默认值 79

sockets.target 78

systemd 单元

配置文件 80

禁用 81

启用 81

掩码 81

状态 79

类型 80

systemd 单元 77

T

目标 77

TigerVNC 119

TightVNC 123, 124

TLS 207

传输层安全性(TLS) 207

Type-1 虚拟化 152

Type-2 虚拟化 152

U

umount 8

更新软件包 73

更新

安装 20

USB 驱动器

设备名称 8

useradd 65

userdel 65

usermod 66

用户

添加和删除 65

添加到组 66

用户和组 65

V

VcXsrv 129

vgdisplay 228

vgextend 232

virsh

交互模式 185

重启来宾 188

恢复来宾 187

恢复来宾 187

保存来宾 187

setmem 188

shell 185

挂起来宾 187

virt-install 161

virt-manager 158, 159, 161, 165

创建虚拟机 165

启动虚拟机 168

虚拟化 151

AMD-V 154

完全虚拟化 154

客户操作系统虚拟化 151

硬件虚拟化 154

托管虚拟机监控程序 152

超级调用 153

虚拟机监控程序虚拟化 152

英特尔 VT 154

KVM 157

金属虚拟机监控程序 153

本地虚拟机监控程序 153

半虚拟化 153

virt-viewer 164

安装 164

远程 SSH 连接 165

VNC

连接到服务器 120

防火墙设置 120

安全访问 121

服务器安装 119

服务器关闭 124

故障排除 124

卷组 227

W

wc 61

Web 服务器 203

wheel 组 66

which 58

惠特菲尔德·迪菲 105

Windows

磁盘管理工具 23

将 ISO 写入 USB 驱动器 10

Windows 分区

文件系统访问 28

回收 31

调整大小 23

卸载 31

Windows PowerShell 109

Windows SMB 133

Windows 系统分区 32

wipefs 231

X

X11 转发 127

压缩 128

受信任的 128

XFS 文件系统 221

xfs_growfs 232

Y

yum.repos.d 目录 72

posted @ 2025-07-04 15:40  绝不原创的飞龙  阅读(17)  评论(0)    收藏  举报