Ubuntu-23-04-精要-全-

Ubuntu 23.04 精要(全)

原文:annas-archive.org/md5/d172a40b767921398b6b65ea0fbf0fa9

译者:飞龙

协议:CC BY-NC-SA 4.0

1. 介绍

Ubuntu 无疑是当今最受推崇和广泛使用的 Linux 发行版之一。因其易用性和可靠性而广受赞誉,Ubuntu 还拥有一批忠实的 Linux 用户和一个活跃的开发者社区。

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

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

1.1 超级用户约定

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

[demo@demo-server ~]$ su -

密码:

[demo@demo-server ~]#

请注意,普通用户的命令提示符以 $ 符号结束,而 root 用户的命令提示符以 # 符号结束。在使用命令行时,这是判断您当前是否作为 root 用户发出命令的有用标志。

如果 su - 命令失败,系统上的 root 账户很可能已因安全原因被禁用。在这种情况下,可以使用 sudo 命令,如下所示。

使用 sudo,非 root 用户也可以执行需要 root 权限的单个命令。考虑以下使用最新补丁和软件包更新操作系统的尝试:

$ apt update

正在读取软件包列表... 完成

E: 无法打开锁定文件 /var/lib/apt/lists/lock - open (13: 权限被拒绝)

可选地,用户账户可以配置为具有 root 级别权限。这样,用户账户可以通过 sudo 运行本应受到限制的命令,而无需先使用 su - 命令获得 root 访问权限:

$ sudo apt update

[sudo] demo 的密码:

Hit:1 http://us.archive.ubuntu.com/ubuntu bionic InRelease

.

.

若要在不反复使用 sudo 命令的情况下执行多个命令,可以通过以下方式访问具有持久超级用户权限的命令提示符:

[demo@demo-server]$ sudo su -

[demo@demo-server]#

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

$ date

如果需要 root 权限执行命令,则命令前会出现 # 命令提示符:

第一章:apt install openssh-server

1.2 打开终端窗口

如果你使用的是 GNOME 桌面环境,并需要访问命令提示符,则需要打开一个终端窗口。可以通过右键点击桌面背景并选择“在终端中打开”菜单选项来实现,如图 1-1 所示:

图 1-1

在 GNOME 桌面环境中,也可以通过使用 Ctrl-Alt-T 快捷键来打开终端窗口。

1.3 编辑文件

配置 Linux 系统通常涉及编辑文件。对于 Linux 新手来说,可能不清楚该使用哪种编辑器。如果你正在运行终端会话并且没有已经偏好的编辑器,我们推荐使用 nano 编辑器。在终端窗口中启动 nano,可以输入以下命令:

nano

其中, 是你希望编辑的文件的路径。例如:

nano /etc/passwd

加载完成后,nano 会如图 1-2 所示出现:

图 1-2

要创建一个新文件,可以按如下方式运行 nano:

nano

编辑文件完成后,按 Ctrl-S 保存文件,然后按 Ctrl-X 退出。要打开现有文件,可以使用 Ctrl-R 快捷键。

如果你更喜欢在 GNOME 桌面环境中使用图形编辑器,gedit 是一个非常适合用于基本编辑任务的起点。要从桌面启动 gedit,按 Alt-F2 打开“输入命令”窗口,如图 1-3 所示:

图 1-3

在文本框中输入 gedit,然后按回车键。稍等片刻,gedit 会加载并准备好打开、创建和编辑文件:

图 1-4

另外,也可以通过终端窗口启动 gedit,带或不带文件路径都可以:

gedit

gedit /etc/passwd

1.4 反馈

我们希望你对购买本书感到满意。如果你发现本书中有任何错误,或有任何意见、问题或顾虑,请通过 feedback@ebookfrenzy.com 联系我们。

1.5 勘误

虽然我们尽最大努力确保本书内容的准确性,但由于本书涉及的主题领域庞大且复杂,难免会出现一些错误和疏漏。任何已知的问题都将在以下网址列出,并提供解决方案:

www.ebookfrenzy.com/errata/Ubuntu2304.html

如果您发现有未在勘误表中列出的错误,请通过电子邮件将问题告知我们的支持团队:feedback@ebookfrenzy.com。

第二章

  1. 一个简短的 Ubuntu Linux 历史

Ubuntu Linux 是 Linux 操作系统的众多变种之一(也称为发行版),由英国公司 Canonical Ltd. 开发。这家公司由 Mark Shuttleworth 于 1994 年创立。然而,Linux 的起源可以追溯得更远。本章将概述 Linux 操作系统和 Ubuntu 的历史。

2.1 Linux 究竟是什么?

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 开发的,他对 MS-DOS 心生厌恶,并且对新款英特尔 80386 微处理器上 MINIX 的可用性感到不耐烦,于是决定编写自己的类 UNIX 内核。当他完成了内核的第一个版本后,他以开源许可发布了它,允许任何人下载源代码,并自由使用和修改,而不必向 Linus 支付任何费用。

大约在同一时期,Richard Stallman 在自由软件基金会工作,他是自由和开源软件的坚定倡导者,也在开发自己的开源操作系统。然而,Stallman 并未首先专注于内核,而是从开发所有必要的 UNIX 工具、实用程序和编译器的开源版本开始,以便使用和维护操作系统。当他完成这一基础设施的开发时,显然的解决方案是将他的工作与 Linus 编写的内核结合,创建一个完整的操作系统。这个组合被称为 GNU/Linux。纯粹主义者坚持认为 Linux 应始终被称为 GNU/Linux(实际上,曾有一段时间,Richard Stallman 拒绝接受任何未将 Linux 称为 GNU/Linux 的出版物的采访)。这一要求并不无理,因为自由软件基金会开发的 GNU 工具构成了 GNU/Linux 的重要和关键部分。不幸的是,大多数人和出版物称其为 Linux,这种情况可能永远不会改变。

2.4 Ubuntu 的历史

如前所述,Ubuntu 是许多 Linux 发行版中的一种。构成 Ubuntu 发行版的源代码源自一个备受推崇的 Linux 发行版——Debian,由 Ian Murdoch 创建。

一位名叫 Mark Shuttleworth 的南非互联网大亨(他通过将自己的公司出售给 VeriSign,获得了大约 5 亿美元的财富)决定是时候为 Linux 打造一个更加用户友好的版本了。他将 Debian 发行版进行了改进,旨在使其成为一个更加人性化的发行版,并将其命名为 Ubuntu。随后,他成立了一家公司——Canonical Ltd,旨在推广和提供 Ubuntu 的支持。

如果你是 Linux 新手,或者已经在使用 Linux 并想尝试不同的 Linux 发行版,Ubuntu 无疑是一个非常好的选择。

2.5 “Ubuntu”这个词是什么意思?

“Ubuntu”这个词是一个古老的祖鲁语和科萨语词汇,意思是“对他人的人性”。Ubuntu 还意味着“我之所以是我,是因为我们所有人之所以是我们”。它之所以被选择,是因为这些情感恰好描述了 Ubuntu 发行版的精神。

2.6 小结

Linux 操作系统的起源可以追溯到 Linus Torvalds 和 Richard Stallman 的工作,具体表现为 Linux 内核与由 GNU 项目构建的工具和编译器相结合。

多年来,Linux 的开源特性促使了各种不同的 Linux 发行版的发布。其中一个发行版是 Ubuntu,它基于由 Mark Shuttleworth 创立的公司 Canonical Ltd 创建的 Debian Linux 发行版。

3. 在干净的磁盘驱动器上安装 Ubuntu

现在有三种方法可以部署 Ubuntu 系统。一种方法是购买新硬件或重新利用现有计算机系统,在其上安装和运行操作系统。另一种方法是使用虚拟化平台,如 VirtualBox 或 VMware,在现有操作系统内部安装和运行 Ubuntu 虚拟机。另一种选择是使用像 Amazon AWS、Google Cloud 或 Microsoft Azure 这样的服务创建基于云的操作系统实例。由于云端实例通常是通过选择预配置、准备运行的操作系统映像来创建的,这些映像已经针对云平台进行了优化,并将其用作 Ubuntu 系统的基础,因此在这种情况下无需执行手动操作系统安装。

另一方面,如果您计划在自己的硬件上安装 Ubuntu 或者使用虚拟化环境,了解 Ubuntu 的第一步是安装操作系统。

Ubuntu 可以在干净的磁盘环境(清除任何现有分区并完全专用于 Ubuntu 的整个磁盘)或双启动环境中安装,在后者中,Ubuntu 与磁盘上的另一个操作系统共存(通常是 Microsoft Windows 系列的成员)。

在本章中,我们将介绍从本地或远程安装媒体进行安装的清空磁盘方法。Windows 10 系统的双启动安装将在《使用 Windows 双启动 Ubuntu》中介绍。

3.1 Ubuntu 安装选项

Ubuntu 可以免费从以下网页下载:

ubuntu.com/download

此页面根据操作系统的安装和使用方式提供了多个下载选项:

•Ubuntu 桌面版 - 下载操作系统桌面版的安装媒体。此版本适用于需要图形桌面环境的台式机和笔记本电脑系统,仅支持 64 位 x86 系统。桌面版可以以 ISO 镜像的形式下载,然后您可以按照本章节后面介绍的步骤将其写入 USB 驱动器。启动时,桌面媒体将允许您通过运行 Live Ubuntu 会话来测试 Ubuntu,在执行安装之前。

•Ubuntu Server - 下载用于操作系统服务器版的 Live Server ISO 安装介质。该镜像适用于在不需要图形桌面环境的服务器上进行安装,适用于 x86、ARM、IBM POWER(PowerPC)和 s390x(IBM System z 主机)系统。安装介质不包括在安装前尝试 Ubuntu 的选项,而是使用基于文本的安装程序,而非用于 Ubuntu 桌面的图形安装程序。这使得 Ubuntu 可以在没有图形控制台的系统上安装。

Ubuntu Server 镜像也可以用于执行预启动执行环境(PXE)网络安装。在使用 PXE 安装 Ubuntu 时,Ubuntu 镜像会被安装到一个特别配置的服务器上(称为 PXE 启动服务器)。然后,待安装 Ubuntu 的客户端系统被配置为通过网络从 PXE 启动服务器上的镜像启动(前提是客户端硬件支持 PXE),以启动安装过程。

3.2 服务器版与桌面版

很明显,在开始安装之前,需要在桌面版和服务器版镜像之间做出选择。如果你想在安装之前先尝试 Ubuntu,那么桌面版是最佳选择,因为它允许你从安装介质启动 Ubuntu,而无需先将其安装到硬盘上。这个选项还允许在 live 会话中启动安装。

如果不需要图形桌面环境,并且目标系统没有互联网访问或图形控制台,那么推荐使用 Live Server ISO 镜像,因为它可以在不需要下载任何额外软件包的情况下构建一个完全功能的服务器。

无论选择哪种安装方法,安装后都可以向系统添加或删除软件包,以将系统配置为满足特定需求。

3.3 获取 Ubuntu 安装介质

本章的目的,是通过图形化安装程序安装 Ubuntu 桌面环境。因此,首先从以下网址下载 Ubuntu 桌面 23.04 的 ISO 镜像:

ubuntu.com/download/desktop

DVD ISO 镜像是自包含的,包含了安装 Ubuntu 系统所需的所有软件包,并使用以下约定命名:

ubuntu---.iso

例如,Ubuntu 23.04 桌面版 ISO 镜像用于 64 位 Intel/AMD 系统,其命名如下:

ubuntu-23.04-desktop-amd64.iso

下载完镜像后,可以将其刻录到光盘上,或者使用下一部分的步骤将介质写入 USB 驱动器,并配置你的虚拟化环境以将其视为 DVD 驱动器。

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

如今,从 USB 驱动器安装操作系统比从 DVD 安装的可能性更大。在下载了 Ubuntu 的 ISO 安装镜像后,写入镜像到 USB 驱动器的步骤会根据驱动器连接到 Linux、macOS 或 Windows 系统而有所不同。本节接下来的步骤假设 USB 驱动器是新的,或者已经重新格式化以删除任何现有的数据或分区:

3.4.1 Linux

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

第三章: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?

目标 来源 文件系统类型 选项

/media/demo/C24E-6727 /dev/sdb1 vfat rw,nosuid,nodev, ...

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

umount /media/demo/C24E-6727

一旦文件系统被卸载,使用 dd 命令如下所示将 ISO 镜像写入驱动器:

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

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

4056+1 条记录输入

4056+1 条记录输出

2126544896 字节(2.1 GB,2.0 GiB)已复制,625.911 秒,3.4 MB/s

3.4.2 macOS

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

$ diskutil list

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

: 类型 名称 大小 标识符

0: GUID 分区方案 *1.0 TB disk0

1: EFI EFI 209.7 MB disk0s1

2: Apple_APFS 容器 disk2 1000.0 GB disk0s2

/dev/disk1(内部):

: 类型 名称 大小 标识符

0: GUID 分区方案 28.0 GB disk1

1: EFI EFI 314.6 MB disk1s1

2: Apple_APFS 容器 disk2 27.7 GB disk1s2

/dev/disk2(合成):

: 类型 名称 大小 标识符

0: APFS 容器方案 - +1.0 TB disk2

物理存储 disk1s2, disk0s2

1: APFS 卷 Macintosh HD 473.6 GB disk2s1

2: APFS 卷 Preboot 42.1 MB disk2s2

3: APFS 卷 恢复 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.4.3 Windows/macOS

有多个免费工具可供 Windows 和 macOS 使用,能够将 ISO 镜像写入 USB 驱动器,但专门为写入 Linux ISO 镜像而编写的工具是 Fedora Media Writer,您可以从以下网址下载:

https://getfedora.org/en/workstation/download/

安装完成后,插入目标 USB 驱动器,启动写入工具,选择图 3-1 中突出显示的“选择.iso 文件”选项:

图 3-1

点击“下一步”继续到写入选项屏幕,并选择 USB 驱动器,然后点击“选择...”按钮:

图 3-2

在弹出的文件选择对话框中,导航并选择 Ubuntu 安装 ISO 镜像,然后点击“打开”按钮。最后,点击“写入”按钮以开始将镜像写入 USB 驱动器:

图 3-3

一旦镜像写入完成,设备就准备好进行安装。

3.5 从 Ubuntu USB 镜像启动

将 Ubuntu 安装介质插入适当的驱动器并启动系统。如果系统尝试从硬盘驱动器启动,您需要进入计算机的 BIOS 设置,并更改启动顺序,以便首先从安装介质驱动器启动。初始启动序列完成后,GRUB 菜单将显示在图 3-4 中:

图 3-4

使用方向键选择“尝试或安装 Ubuntu”菜单选项,然后按下回车键以启动 Ubuntu Live 会话。Ubuntu 完全启动后,下面将显示图 3-5 所示的窗口:

图 3-5

选择您偏好的语言,然后点击“下一步”按钮。在下一个屏幕中,提供了尝试 Ubuntu Live 会话或开始安装过程的选项:

3.6 安装 Ubuntu

选择“安装 Ubuntu”选项,然后点击“下一步”按钮,进入键盘布局屏幕:

图 3-6

请选择您的键盘布局,或者,如果不确定,可以点击“检测”按钮,按照一些步骤来识别您的键盘,然后点击“下一步”选择安装过程中使用的网络连接:

图 3-7

在下一个屏幕上,选择执行常规安装或最小安装:

图 3-8

如果您有充足的磁盘空间,并希望探索包含在 Ubuntu 中的主要应用程序和工具而无需以后手动安装它们,请选择“常规”选项。或者,为了避免在系统中堆积可能永远不需要的软件,请选择“最小”选项。不管您选择哪种选项,未来随时可以轻松安装或卸载所有提供的 Ubuntu 软件。

该选项还可以在安装过程中更新包含在 Ubuntu 发行版中的软件包。Ubuntu,与大多数积极支持的操作系统一样,在发布给公众后会继续进行更新,修复错误和安全漏洞。如果选择此选项且系统已连接到互联网,安装程序将在安装过程中下载自 Ubuntu 安装镜像发布以来发布的所有更新,并将其应用到系统中。如果你选择在安装过程中不进行此更新,这些更新仍然可以在安装完成后随时应用。

第二个选项提供了是否安装第三方非开源软件的选择,用以支持特定硬件设备和播放专有媒体文件。一些用户强烈反对使用任何未发布在公共许可证下的软件。如果你是其中之一,那么请不要选择此选项。另一方面,如果你只希望获得最佳的 Ubuntu 安装体验,那么推荐选择此选项。

在做出适当选择后,点击“下一步”按钮,进入磁盘分配屏幕:

图 3-9

假设这是一个没有现有操作系统的新磁盘,安装程序将提供擦除整个磁盘并将其用于 Ubuntu 的选项(在这种情况下,安装程序将计算并实施典型的推荐分区布局)。或者,若要定义自己的自定义磁盘布局,请选择“手动分区”选项,手动创建并调整包含操作系统和数据的磁盘分区。

点击“高级功能...”按钮将提供使用逻辑卷管理(LVM)的选项。强烈推荐使用 LVM,以便更容易管理系统上的磁盘和分区,详细内容请参阅章节“为 Ubuntu 23.04 卷组和逻辑卷添加新磁盘”:

图 3-10

如果数据安全性至关重要,请选择加密 Ubuntu 安装选项。如果选择此选项,下一屏幕将提示您选择一个安全密钥,每次系统启动时都需要输入该密钥。

在此示例中,选择使用 LVM 选项并点击确定。

一旦做出选择,请点击“下一步”按钮以查看磁盘分区信息:

图 3-11

点击安装按钮开始安装。在安装过程中,安装程序会询问您的地理位置,以配置时区设置:

图 3-12

接下来,安装程序将要求您为系统上的第一个账户提供用户名和密码:

图 3-13

该选项还提供了是否每次用户希望登录系统时都必须输入密码的设置。默认情况下,每次启动 Ubuntu 时,系统都会出现登录界面,要求输入用户名和密码。如果您是系统的唯一用户,并希望跳过此屏幕,每次系统启动时自动登录,请确保在继续之前关闭“登录时需要我的密码”选项。

一旦所有问题都已回答,安装程序将继续安装。根据系统的速度,以及是否选择在安装过程中下载更新,此过程可能需要一些时间。要查看安装程序正在执行的详细步骤,请点击图 3-14 中高亮显示的按钮:

图 3-14

安装完成后,弹出窗口会更新,告知您系统已准备好重启:

图 3-15

当您准备好重启时,点击“立即重启”按钮。安装程序可能会提示您移除安装介质,系统将花费几秒钟关闭。在此时,请移除 USB 闪存驱动器并按回车键继续。

3.7 访问 Ubuntu 桌面

系统启动后,如果启用了密码要求选项,则会出现 GNOME 显示管理器(GDM)登录界面(图 3-16)。要访问系统,请选择用户名并输入在安装过程中设置的密码:

图 3-16

或者,如果安装时配置为直接登录到桌面,系统重启后将显示 GNOME 桌面(如图 3-17 所示):

图 3-17

3.8 安装更新

与如今大多数操作系统一样,每个 Ubuntu 发行版在发布后会继续演变。这通常表现为修复错误和安全更新,并偶尔会有新特性,可以通过互联网下载并安装到系统上。

最佳实践建议,在安装 Ubuntu 后的第一步是确保应用所有可用的更新。当有更新时,软件更新器将显示以下对话框,用户可以从中安装更新:

图 3-18

还可以通过终端窗口的命令行提示符使用 apt 包管理器工具安装更新。要检查是否有可用的更新,右键点击桌面背景,在弹出的菜单中选择“在终端中打开”选项:

图 3-19

在终端窗口中,运行以下命令以获得 root 权限并更新包列表:

$ sudo su -

apt update

如果有可用的更新包,命令将显示类似以下的输出:

.

.

.

正在读取包列表... 完成

正在构建依赖树

正在读取状态信息... 完成

220 个包可以升级。运行 'apt list --upgradable' 查看它们。

可以使用 apt 工具应用任何待处理的更新:

apt upgrade

执行时,apt 工具会提供可用更新包的列表,并提示是否执行更新:

220 个升级,7 个新安装,0 个待移除,0 个未升级。

需要获取 75.2 MB/286 MB 的档案。

完成此操作后,将使用 34.8 MB 的额外磁盘空间。

是否继续?[Y/n]

一旦升级完成,安装基本上就结束了。

3.9 显示启动信息

在启动过程中,系统将显示 Ubuntu 启动画面,这会隐藏系统加载时生成的所有启动信息。要在启动过程中使这些信息可见(如图 3-20 所示),只需在系统启动时按下键盘上的 Esc 键:

图 3-20

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

GRUB_CMDLINE_LINUX="... rhgb quiet"

如果你是 Linux 新手,且不熟悉可用的编辑器,请参考“简介”章节中概述的编辑器推荐。例如,要使用 nano 编辑器,输入以下命令以启动编辑器并加载 grub 文件:

nano /etc/default/grub

要移除图形启动屏幕,以便在不按 Esc 键的情况下看到消息,请从设置中移除“splash”和“quiet”选项:

GRUB_CMDLINE_LINUX=""

此更改将导致系统显示所有由系统生成的启动消息。

一旦做出更改,运行以下命令以生成新的启动配置,并使其在下次系统启动时生效:

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

3.10 摘要

使用 Ubuntu 的第一步是安装操作系统。在云服务器的情况下,当为系统选择操作系统镜像时,这个任务通常会由云服务提供商自动完成,具体取决于提供的选项范围。然而,在自己的硬件上或在虚拟机中安装时,涉及到下载以 ISO 镜像形式提供的安装介质,将该镜像写入适当的存储设备(如 DVD 或 USB 驱动器),并从中启动。安装完成后,重要的是安装任何可能自最初安装镜像创建以来发布的操作系统更新。

  1. 双重启动 Ubuntu 与 Windows

Ubuntu 就像大多数 Linux 发行版一样,可以与任何版本的 Windows 在同一硬盘驱动器上共存。这种概念被称为双重启动。实质上,当你启动电脑时,会显示一个菜单,提供启动 Ubuntu 或 Windows 的选项。显然,你一次只能运行一个操作系统,但值得注意的是,不管你的 Windows 分区是使用 NTFS、FAT16 还是 FAT32 格式化的,Ubuntu 都能访问 Windows 分区上的文件。

在安装过程中,Ubuntu 安装程序将检测硬盘上的 Windows 安装,并提供删除 Windows 安装并使用整个磁盘安装 Ubuntu,或者与 Windows 共享磁盘的选项。在后者的情况下,你可以指定用于 Ubuntu 的磁盘百分比。

根据 Ubuntu 文档,完整的 Ubuntu Desktop 版安装至少需要 25 GB 的磁盘空间,还需要更多空间存储你以后可能创建的文件。一旦选择了用于 Ubuntu 的磁盘空间,安装程序将调整 Windows 分区的大小(不会破坏任何数据),并使用剩余的磁盘空间安装 Ubuntu。

本章将演示如何设置一个与 Windows 10 共存的双重启动系统,如何更改开机时默认启动的系统,以及如何在 Ubuntu 中访问硬盘上 Windows 分区中的文件。

本章假设已按照前一章中的步骤,使用 Ubuntu Desktop 安装镜像创建了一个可启动的 Ubuntu 安装 USB 驱动器,并且系统已配置为在启动时从 USB 驱动器启动。

4.1 开始 Ubuntu 安装

将 Ubuntu 安装介质插入适当的驱动器并启动系统。如果系统启动了 Windows,你需要进入电脑的 BIOS 设置,修改启动顺序,使其从安装介质驱动器优先启动。完成初始启动顺序后,将显示图 4-1 所示的 GRUB 菜单:

图 4-1

使用箭头键选择“试用或安装 Ubuntu”菜单选项,然后按 Enter 键进入 Ubuntu 实时会话。Ubuntu 启动完成后,下面将显示图 4-2 所示的窗口:

图 4-2

选择你偏好的语言,然后点击“下一步”按钮。在下一个屏幕上,提供了选择试用 Ubuntu 实时会话或开始安装过程的选项:

图 4-3

4.2 安装 Ubuntu

选择“安装 Ubuntu”选项,然后点击“下一步”按钮继续到键盘布局屏幕:

图 4-4

选择您的键盘布局,或者如果不确定,请点击“检测”按钮,按照一些步骤识别您的键盘,然后点击“下一步”选择安装过程中使用的网络连接:

图 4-5

在下一个屏幕上,选择执行“正常安装”还是“最小安装”:

图 4-6

如果您有足够的磁盘空间,并且希望探索 Ubuntu 包含的主要应用程序和工具而不必在以后手动安装,请选择“正常安装”选项。或者,如果您不希望系统中充满可能永远用不到的软件,请选择“最小安装”选项。无论选择哪种方式,Ubuntu 提供的所有软件在将来都可以轻松安装或移除。

该选项还可以在安装过程中更新 Ubuntu 发行版中包含的软件包。与大多数积极支持的操作系统一样,Ubuntu 在发布给公众后,仍然会继续发布包含错误修复和安全补丁的更新。如果选择此选项并且系统已连接到互联网,安装程序将在安装过程中下载自 Ubuntu 安装镜像发布以来发布的所有更新并应用到系统中。如果您选择在安装过程中不执行此更新,这些更新仍可以在安装完成后随时应用。

第二个选项提供了是否安装第三方非开源软件以支持特定硬件设备和播放专有媒体文件的选择。一些用户强烈反对使用任何不是公开许可证下发布的软件。如果您是其中之一,请不要选择此选项。如果您希望从 Ubuntu 安装中获得最佳体验,则推荐选择此选项。

进行适当选择后,点击“下一步”按钮,进入磁盘分配屏幕:

图 4-7

由于我们的目标是配置一个双重启动系统,选择“在 Windows 引导管理器旁边安装 Ubuntu”是理想的选择。选择此选项后,点击“继续”按钮继续操作。随后的屏幕允许配置每个操作系统(在此情况下是 Windows 和 Ubuntu)分配的磁盘空间:

图 4-8

在此时,您必须决定要为 Ubuntu 安装捐赠多少 Windows 分区空间。在图示中,移动滑块(位于 Windows 和 Ubuntu 分区之间),直到 Ubuntu 分区的大小满足您的需求。至少需要为完整的 Ubuntu 桌面安装提供 25GB 的空间。

完成选择后,点击“下一步”按钮以查看磁盘分区信息:

图 4-9

点击“安装”按钮以开始安装。安装过程中,安装程序将询问你的地理位置,以便配置时区设置:

图 4-10

接下来,安装程序会要求你为系统上的第一个账户提供用户名和密码:

图 4-11

还提供了一个选项来决定每次用户希望登录系统时是否需要指定密码。默认情况下,每次 Ubuntu 启动时,都会显示一个登录屏幕,要求输入用户名和密码。如果你是系统的唯一用户,并且希望跳过此屏幕,每次系统启动时都能自动登录,请确保在继续操作之前关闭“需要我的密码登录”开关。

一旦所有问题都回答完毕,安装程序将继续进行安装。根据系统的速度以及是否选择在安装过程中下载更新,这一过程可能需要一些时间。若要更详细地查看安装程序正在执行的步骤,请点击图 4-12 中高亮显示的按钮:

图 4-12

安装完成后,弹出对话框将更新,告知你系统已经准备好重新启动:

图 4-13

当你准备好重启时,点击“立即重启”按钮。安装程序可能会提示你移除安装介质,系统将在几秒钟内关闭。此时,移除 USB 闪存驱动器并按下 Enter 键继续。

当你准备好重启时,点击“立即重启”按钮。安装程序可能会提示你移除安装介质,系统将在几秒钟内关闭。此时,移除 USB 闪存驱动器并按下 Enter 键继续。

4.3 第一次启动 Ubuntu

当系统重启时,会出现类似下图的屏幕,提供选择启动 Windows 或 Ubuntu 的选项:

图 4-14

按下 Enter 键启动 Ubuntu。如果你想启动 Windows,使用键盘上的箭头键选择 Windows 启动管理器选项。如果选择启动 Ubuntu,操作系统将加载,并且会出现 Ubuntu 登录屏幕(除非选择了自动登录选项)。输入在安装过程中设置的用户名和密码后,你将登录到 Ubuntu 桌面环境。

4.4 更改默认启动选项

当系统启动时,启动选项屏幕将出现,用户有 10 秒钟时间选择操作系统。如果在超时之前没有做出选择,默认操作系统将启动。在新配置的系统中,默认操作系统将是标准的 Ubuntu 映像。但是,此默认值可以在 Ubuntu 中进行更改。

一系列启动配置选项(包括 10 秒超时和在《在全新磁盘上安装 Ubuntu》中概述的启动设置)在 /etc/default/grub 文件中声明,该文件在新安装时如下所示:

GRUB_DEFAULT=0

GRUB_TIMEOUT_STYLE=hidden

GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX=""

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

GRUB_DEFAULT=saved

GRUB_SAVEDEFAULT=true

GRUB_TIMEOUT_STYLE=hidden

GRUB_TIMEOUT=10

.

.

这个设置允许在启动配置中保存新的默认值。接下来,运行 grub-set-default 命令,通过数字编号系统来更改默认设置,编号从 0 开始。例如,如果 Windows 10 选项在菜单中排在第 5 位,命令将如下所示,使 Windows 10 成为默认启动选项:

第四章:grub-set-default 4

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

grub-editenv list

saved_entry=4

请注意,saved_entry 的值现在已设置为 4。在更改默认值后,请按照以下步骤重新生成启动配置文件:

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

重启系统并验证启动菜单默认选择 Windows 10 选项,并在超时后加载 Windows。

4.5 从命令行访问 Windows 分区

在双启动配置中运行 Ubuntu 时,仍然可以访问位于 Windows 分区上的文件。这可以通过从命令行或使用桌面上的 Disks(gnome-disks)图形实用程序手动挂载该分区来实现。

在命令行操作时,该过程的第一步是创建一个目录,作为我们 Windows 分区的挂载点。在本示例中,我们将创建一个名为 /mnt/windows 的目录:

mkdir /mnt/windows

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

fdisk -l

.

.

磁盘 /dev/nvme0n1:64 GiB,68719476736 字节,134217728 扇区

磁盘型号:VMware 虚拟 NVMe 磁盘

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

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

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

磁盘标签类型:gpt

磁盘标识符:F0D04B58-29F5-4B6B-B10F-07295BEF9AAC

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

/dev/nvme0n1p1 2048 206847 204800 100M EFI 系统

/dev/nvme0n1p2 206848 239615 32768 16M Microsoft 保留

/dev/nvme0n1p3 239616 80184560 79944945 38.1G Microsoft 基本数据

/dev/nvme0n1p4 132833280 134213631 1380352 674M Windows 恢复环境

/dev/nvme0n1p5 80185344 132833279 52647936 25.1G Linux 文件系统

.

.

在上面的输出中,包含我们需要访问的文件的主要 Windows 分区由 /dev/nvme0n1p3 表示。接下来,我们需要运行挂载命令(假设 Windows 分区为 /dev/nvme0n1p3),如下所示:

mount /dev/nvme0n1p3 /mnt/windows

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

ls /mnt/windows

'$Recycle.Bin' pagefile.sys swapfile.sys

'$WinREAgent' PerfLogs '系统卷信息'

'文档和设置' ProgramData 用户

DumpStack.log '程序文件' Windows

DumpStack.log.tmp '程序文件 (x86)'

OneDriveTemp Recovery

为了在每次系统启动时自动挂载,只需将相应的挂载行添加到 /etc/fstab 文件中:

/dev/nvme0n1p3 /mnt/windows ntfs defaults 0 0

随时卸载 Windows 文件系统:

umount /mnt/windows

4.6 从桌面访问 Windows 分区

使用桌面环境挂载分区的第一步是启动磁盘工具。在桌面加载完成后,右键点击桌面背景并从弹出的菜单中选择“打开终端”。在终端窗口中,先获取根权限,然后启动磁盘工具,方法如下:

$ gnome-disks

一旦磁盘工具启动,类似于图 图 4-15 所示的窗口将会出现:

图 4-15

要查看分区信息,选择对话框中卷部分的图形表示中的分区。在上面的示例中,选中并高亮显示了 Windows 系统分区。要挂载该分区以便在 Ubuntu 中访问其内容,选择该分区并点击图 图 4-16 中所示的选项按钮以显示菜单:

图 4-16

从菜单中选择“编辑挂载选项...”,以显示如图 图 4-17 所示的对话框。关闭用户会话默认选项开关,并确保启用“在用户界面中显示”选项。在挂载点文本框中,将路径更改为 /mnt/windows。如果分区需要在每次系统重启时自动挂载,还需启用“在系统启动时挂载”选项:

图 4-17

在进行更改后,点击“确定”按钮以返回主对话框。要挂载分区,只需点击图 图 4-18 中所示的挂载按钮:

图 4-18

一旦分区被挂载,退出 gnome-disks,并注意到一个卷的图标已经出现在 dock 中,如图 4-19 所示(请注意,如果“在用户界面中显示”选项被禁用,则此图标不会出现):

图 4-19

双击图标使用“文件”工具浏览该分区:

图 4-20

要卸载分区,请点击挂载按钮(该按钮将变为停止按钮),如上方图 4-18 所示。

4.7 总结

Ubuntu 可以通过创建双重启动环境安全地与 Windows 操作系统共存于同一个磁盘驱动器上。这涉及到缩小 Windows 系统占用的空间,为 Ubuntu 安装腾出空间。一旦 Ubuntu 安装完成,可以修改启动菜单配置以更改默认操作系统。可以通过命令行或使用 Disks 桌面工具从 Ubuntu 访问磁盘驱动器上的 Windows 分区。

  1. 为 Ubuntu 分配 Windows 磁盘分区

在前一章节中,我们探讨了在与 Windows 同一磁盘上安装 Ubuntu 的过程。这种所谓的“双重启动”配置允许用户将两个操作系统安装在一个磁盘驱动器上,并在系统启动时选择其中一个进行引导。

本章节适用于那些决定喜欢 Ubuntu 到足以从磁盘上完全删除 Windows 并将其空闲空间用于 Linux 的用户。在接下来的部分中,我们将逐步讲解这个过程,使用命令行工具和 gnome-disks 工具进行操作。

5.1 卸载 Windows 分区

如果在“与 Windows 双重启动 Ubuntu”章节中按照步骤在 Ubuntu 中挂载了 Windows 分区,那么在继续本章节之前,应该先卸载该分区。假设 Windows 分区已挂载为 /mnt/windows,可以按如下方式卸载:

第五章:umount /mnt/windows

如果之前已添加 /mnt/windows 自动挂载,应该编辑 /etc/fstab 文件以将其移除。

5.2 删除磁盘上的 Windows 分区

为了让 Ubuntu 使用 Windows 分区,第一步是删除该分区。然而,在此之前,任何需要保留的数据必须从 Windows 分区中备份。备份完成后,可以安全地继续进行本章节的操作。

要删除 Windows 分区,首先需要使用 fdisk 工具识别它们所在的磁盘:

fdisk -l

磁盘 /dev/nvme0n1:64 GiB, 68719476736 字节, 134217728 扇区

磁盘型号:VMware 虚拟 NVMe 磁盘

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

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

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

磁盘标签类型:gpt

磁盘标识符:F0D04B58-29F5-4B6B-B10F-07295BEF9AAC

设备 启始 结束 扇区 数量 大小 类型

/dev/nvme0n1p1 2048 206847 204800 100M EFI 系统

/dev/nvme0n1p2 206848 239615 32768 16M Microsoft 保留

/dev/nvme0n1p3 239616 80184560 79944945 38.1G Microsoft 基本数据

/dev/nvme0n1p4 132833280 134213631 1380352 674M Windows 恢复环境

/dev/nvme0n1p5 80185344 132833279 52647936 25.1G Linux 文件系统

在上述示例输出中,系统包含一个物理磁盘驱动器,设备名为 /dev/nvme0n1\。该磁盘驱动器上有六个分区,分别通过设备名 /dev/nvme0n1p1 至 /dev/nvme0n1p5 访问。根据“类型”列中的值,有三个与 Windows 相关的分区。第一个是 Windows 系统分区,第二个是较大的 Windows 启动分区,包含 Windows 操作系统和用户数据,第三个是 Windows 恢复分区。

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

fdisk /dev/nvme0n1

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

变更仅会保存在内存中,直到您决定写入它们。

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

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

磁盘 /dev/nvme0n1:64 GiB,68719476736 字节,134217728 个扇区

磁盘型号:VMware 虚拟 NVMe 磁盘

单位:1 个扇区 = 512 字节

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

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

磁盘标签类型:gpt

磁盘标识符:F0D04B58-29F5-4B6B-B10F-07295BEF9AAC

设备 起始 结束 扇区 数量 大小 类型

/dev/nvme0n1p1 2048 206847 204800 100M EFI 系统

/dev/nvme0n1p2 206848 239615 32768 16M Microsoft 保留区

/dev/nvme0n1p3 239616 80184560 79944945 38.1G Microsoft 基本数据

/dev/nvme0n1p4 132833280 134213631 1380352 674M Windows 恢复环境

/dev/nvme0n1p5 80185344 132833279 52647936 25.1G Linux 文件系统

分区表条目未按磁盘顺序排列。

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

在继续之前,请注意我们将要删除的分区的起始和结束地址(换句话说,/dev/nvme0n1p2 的起始位置和/dev/nvme0n1p5 起始位置前一个扇区)。

在命令提示符下,删除 Windows 分区(这些分区为我们示例系统中的分区 2、3 和 4):

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

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

分区 2 已被删除。

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

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

分区 3 已被删除。

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

分区编号(1,4,5,默认为 5):4

分区 4 已被删除。

既然我们已经删除了 Windows 分区,接下来必须在腾出的磁盘空间中创建新的 Ubuntu 分区。分区编号必须与第一个删除的分区编号匹配(在此例中为 2)。此外,还需要精确输入分区的起始和结束扇区,与旧分区所报告的值一致(fdisk 通常会默认提供正确的值,但最好再次确认):

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

分区编号(2-4,6-128,默认为 2):2

第一个扇区(206848-134217694,默认为 206848):

最后一个扇区,+/-扇区或+/-大小{K,M,G,T,P}(206848-80185343,默认为 80185343):

创建了一个新的类型为'Linux 文件系统',大小为 38.1 GiB 的分区 2。

完成这些更改后,下一步是检查设置是否正确:

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

磁盘 /dev/nvme0n1:64 GiB,68719476736 字节,134217728 个扇区

磁盘型号:VMware 虚拟 NVMe 磁盘

单位:1 个扇区 = 512 字节

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

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

磁盘标签类型:gpt

磁盘标识符:F0D04B58-29F5-4B6B-B10F-07295BEF9AAC

设备 起始 结束 扇区 数量 大小 类型

/dev/nvme0n1p1 2048 206847 204800 100M EFI 系统

/dev/nvme0n1p2 206848 80185343 79978496 38.1G Linux 文件系统

/dev/nvme0n1p5 80185344 132833279 52647936 25.1G Linux 文件系统

为了提交更改,我们需要将新的分区信息写入磁盘,并退出 fdisk 工具:

Command (m for help): w

分区表已被更改。

正在同步磁盘。

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

为了使新的分区适合 Ubuntu 使用,需要在其上创建文件系统。当前版本的 Ubuntu 推荐使用 XFS 文件系统,相关内容将在章节 “向 Ubuntu 23.04 系统添加新磁盘驱动器”中详细介绍。文件系统的创建使用 mkfs.xfs 命令,如下所示(如有需要,安装 xfsprogs 包):

apt install xfsprogs

mkfs.xfs -f /dev/nvme0n1p2

meta-data=/dev/nvme0n1p2 isize=512 agcount=4, agsize=2499328 blks

= sectsz=512 attr=2, projid32bit=1

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

= reflink=1 bigtime=0 inobtcount=0

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

= sunit=0 swidth=0 blks

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

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

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

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

5.4 挂载新分区

接下来,我们需要挂载新的分区。在本示例中,我们将其挂载到名为 /data 的目录中。不过,您也可以自由选择任何有效的挂载点,或者将其作为逻辑卷的一部分进行挂载(有关详细内容,请参见章节 “向 Ubuntu 23.04 卷组和逻辑卷中添加新磁盘”)。首先,我们需要创建一个目录作为挂载点:

mkdir /data

接下来,我们需要编辑 /etc/fstab 中的挂载表,以便每次系统启动时都能自动挂载该分区。在 /etc/fstab 文件的底部,添加以下行来挂载新的分区(根据您的环境修改 /dev/nvme0n1p2 设备):

/dev/nvme0n1p2 /data xfs defaults 0 0

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

mount /data

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

df -h /data

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

/dev/nvme0n1p2 39G 305M 38G 1% /data

5.5 编辑引导菜单

下一步是修改 Ubuntu 的引导菜单。由于这是原本的双启动系统,菜单配置了可以选择启动 Windows 或 Ubuntu。现在 Windows 分区已被删除,我们需要移除这个启动选项。在 Ubuntu 中,可以通过以下步骤完成:

rm -r /boot/efi/EFI/Microsoft

update-grub

由于现在只剩下一个操作系统可以启动,系统将在下一次重启时自动启动 Ubuntu,而不会显示启动菜单。如果需要访问此启动菜单,例如使用高级启动选项,只需在启动过程的初始阶段按 Esc 键即可。

5.6 使用 GNOME Disks 工具

gnome-disks 工具提供了一种图形化的用户友好界面,作为命令行回收 Windows 分区的替代方案。由于此示例中将把 Windows NTFS 分区转换为 XFS 格式,因此第一步是安装 xfsprogs 包,如下所示:

apt install xfsprogs

安装完包之后,打开终端窗口并启动 gnome-disks 工具:

gnome-disks

稍等片刻,gnome-disks 工具将如 图 5-1 所示出现:

图 5-1

在上述示例中,磁盘包含两个 Windows NTFS 分区,必须删除这两个分区。磁盘映射中显示带星号的任何 NTFS 分区(如上图中突出显示的分区)都需要在删除之前先卸载。这可以通过选择分区并点击卸载按钮来实现,卸载按钮位置如 图 5-2 所示:

图 5-2

在卸载所有 NTFS 分区后,下一步是删除它们。在磁盘映射中选择最左侧的 NTFS 分区,并点击“删除”按钮,如 图 5-3 所示:

图 5-3

在确认对话框中查看信息后,点击“删除”按钮以确认更改。一旦删除了第一个分区,重复此步骤以删除剩余的 NTFS 分区。删除 NTFS 分区后,磁盘映射中应显示该空间为“空闲”状态。接下来需要创建一个新分区来利用这个空闲空间。选择该空间后,点击新分区按钮(如 图 5-4 中箭头所示):

图 5-4

在“创建分区”对话框中,选择分区是否要占用所有可用空间,或者如果计划将该空间用于多个分区,则选择减少分区大小:

图 5-5

点击“下一步”,在随后的屏幕上,为新分区输入名称,并选择在创建过程中是否擦除该分区。这将使创建过程需要更多时间,但这是推荐的选项。最后,选择一个文件系统类型作为该分区的文件系统类型,通常为 ext4 或 XFS。鉴于 XFS 的优势,选择“其他”,然后点击“下一步”按钮。

图 5-6

在下一个屏幕上,选择 XFS 选项,然后点击创建按钮:

图 5-7

gnome-disks 工具将开始格式化过程,并显示过程状态:

图 5-8

一旦分区准备好,可以通过命令行或使用 gnome-disks 工具挂载它。要配置挂载点,选择分区并点击设置按钮,如图 5-9 所示:

图 5-9

从设置菜单中,选择“编辑挂载选项...”项目,显示图 5-10 所示的对话框。

图 5-10

关闭“用户会话默认值”开关,并根据需求配置挂载点。在上图中,分区在系统启动时挂载到 /mnt/Data,并配置为通过标签“Data”进行识别。

完成设置后,点击确定,然后点击图 5-11 中高亮的挂载按钮:

图 5-11

要检查分区是否已挂载并准备好使用,运行以下命令显示可用空间:

$ df -h /mnt/Data

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

/dev/sda3 253G 1.8G 251G 1% /mnt/Data

最后,按照本章前面概述的步骤更新启动菜单,移除 Windows 选项。

5.7 小结

双重启动配置中的 Windows 分区可以随时删除,以为 Ubuntu 系统释放空间,方法是识别出属于 Windows 的分区并删除它们。删除后,未分配的空间可以用于创建新文件系统并挂载,使其可以用于 Ubuntu 系统。

  1. GNOME 44 桌面引导游览

Ubuntu 23.04 包含 GNOME 44 桌面环境。虽然缺乏 Windows 和 macOS 桌面的复杂性,GNOME 提供了一个简洁且直观的桌面环境,包含了窗口化环境的所有基本功能,且可以快速学习,具有额外的优势。

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

6.1 安装 GNOME 桌面

如果使用了 Ubuntu Desktop 镜像进行 Ubuntu 23.04 安装,GNOME 桌面将已安装并且每次系统启动时会自动启动。

如果安装的是 Ubuntu 服务器配置,则系统中不会包含 GNOME 桌面相关的包。在没有显示器的服务器系统中,安装图形桌面环境的想法可能显得多余。然而,值得注意的是,也可以远程访问 GNOME 桌面,因此,即使在所谓的“无头”服务器(即没有显示器、键盘和鼠标的服务器)上,安装 GNOME 桌面包仍然可能是有益的。本书的 “Ubuntu 23.04 使用 Vino 进行远程桌面访问” 章节将详细讲解如何建立远程桌面访问。

如果安装配置中没有包含 GNOME 桌面,可以随时使用以下命令安装:

第六章:apt install ubuntu-gnome-desktop

安装完成后,下次系统重启时,桌面登录界面将会出现。

6.2 GNOME 44 桌面概览

下图 图 6-1 显示了典型的、刚启动的 GNOME 桌面会话的外观,尚未启动任何其他程序或进行配置更改。

主桌面区域(标记为 A)是当启动应用程序和工具时,窗口会出现的地方。

屏幕顶部的栏(B)被称为顶部栏,其中包括活动菜单(C)、日期和时间,以及一系列按钮和图标,包括网络状态、音量、电池电量以及其他状态和帐户设置:

图 6-1

当前在桌面上运行的应用程序的应用菜单也会出现在顶部栏中。例如,图 6-2 展示了终端应用的应用菜单:

图 6-2

根据应用程序的不同,应用窗口栏中可能会显示一个包含附加选项的菜单。例如,图 6-3 展示了终端应用的内建菜单:

图 6-3

通过右键点击停靠栏中的应用程序图标,还可以打开另一个菜单,如图 6-4 所示:

图 6-4

6.3 启动活动

应用程序和工具可以通过停靠栏启动,如图 6-5 所示:

图 6-5

默认情况下,停靠栏会显示一组预定义的常用应用程序图标,并且还会包含当前运行的应用程序图标。如果应用程序正在运行,图标左侧会有一个点标记;如果有多个实例正在运行,每个实例的左侧都会出现一个点。

要启动应用程序,只需点击停靠栏中的图标。

要查找停靠栏中未包含的应用程序,可以选择“显示应用程序”(在图 6-5 中标记为 A),显示可浏览的应用程序列表,如图 6-6 所示:

图 6-6

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

除了浏览应用程序,还可以通过搜索栏进行搜索,搜索栏在点击顶部栏的“活动”后会出现,如图 6-7 所示:

图 6-7

在搜索框中输入文本时,可能匹配的结果列表会逐渐细化。

要将应用程序添加到停靠栏以便更方便地访问,找到应用程序的图标,右键点击它,选择“添加到收藏夹”选项:

图 6-8

要从停靠栏中移除应用程序,右键点击停靠栏中的图标,选择“从收藏夹中移除”。

6.4 管理窗口

与其他桌面环境类似,GNOME 中的应用程序在窗口中运行。当多个应用程序窗口打开时,按下 Super + Tab 键盘快捷键会显示切换面板(图 6-9),允许选择不同的窗口作为当前活动窗口(Super 键通常是 Windows 键,或者在 Mac 键盘上是 Cmd 键):

图 6-9

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

图 6-10

要在切换器中的图标之间向后循环,使用 Shift + Tab 键盘快捷键。

要最大化窗口以填充整个屏幕,请点击标题栏并将窗口拖动到屏幕顶部。要将窗口恢复到原始大小,请点击标题栏并将其向下拖动。或者,简单地双击标题栏可以在窗口大小之间切换。同样,将窗口拖动到屏幕的左侧或右侧会使窗口填充屏幕的一半。

6.5 使用工作区

应用程序窗口出现的屏幕区域称为工作区,GNOME 允许配置多个工作区。要查看当前工作区,请点击顶部栏中的活动(如图 6-1 中标记为 C 的区域)或按键盘上的 Super 键来显示以下屏幕:

图 6-11

上图中标记为 A 的区域是当前选定的工作区。点击标记为 B 和 C 的区域将分别选择并显示前一个和下一个工作区。中心工作区面板(A)显示当前活动的应用程序窗口。将鼠标指针悬停在一个窗口上,将显示一个关闭按钮,可以用来退出该窗口。要将窗口从一个工作区移动到另一个工作区,请显示工作区面板并将应用程序窗口拖放到目标工作区。当一个窗口被添加到空白工作区时,工作区面板会增加另一个空白工作区,从而允许创建多个工作区。

工作区缩略图(D)提供了一种方便的方式来在工作区之间切换,尤其在处理多个工作区时非常有用。

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

"显示应用程序"屏幕还提供了当前工作区的访问,下面是图 6-12 所示:

图 6-12

6.6 日历和通知

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

图 6-13

6.7 桌面设置

要访问桌面设置,请点击顶部栏最右侧的按钮,显示图 6-14 中所示的菜单:

图 6-14

菜单提供了快速访问常见设置的功能,如系统节能模式、桌面主题、音量和当前网络连接。电源按钮可让您注销桌面,或重启或关机系统。点击菜单左上角的按钮可以截取屏幕截图。显示齿轮图标的按钮位于截图按钮的右侧,点击该按钮可打开 GNOME 设置应用程序。

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

图 6-15

上面图 6-14 中显示的菜单还包括切换用户、调整音量、更改 WiFi 网络、以及注销、重启或关机的选项。

6.8 自定义 Dock

dock 的大小、位置和行为可以通过设置应用程序进行更改,方法是在图 6-16 中所示的 Ubuntu Desktop 选项中选择:

图 6-16

位置可以设置为屏幕的任意一侧,同时图标大小可以用来减小 dock 的尺寸。最后,如果启用了自动隐藏 dock 选项,则当鼠标指针移动到当前 dock 所在的屏幕边缘时,dock 会自动消失。

6.9 安装 Ubuntu 软件

与 macOS、Windows、iOS 和 Android 等其他操作系统类似,Ubuntu 也有一个“应用商店”,即 Ubuntu 软件工具。通常,图标会放置在 dock 中,如图 6-17 所示,并显示有更新的应用程序数量:

图 6-17

加载完成后,该工具会提供一份可供安装的应用程序列表,按类别、推荐和编辑器选择分组。也可以搜索可用应用程序的库来查找特定的项目:

图 6-18

要安装应用程序,只需在 Ubuntu 软件窗口中选择它并点击安装按钮:

图 6-19

6.10 超越基本自定义

GNOME 桌面设计上是一个简洁且无干扰的环境,定制选项较少。然而,这并不意味着无法对桌面进行额外的更改。事实上,GNOME 项目开发了一个名为 GNOME Tweaks 的工具,专门用于此目的。要安装这个工具,请打开 Ubuntu 软件工具,搜索并安装 GNOME Tweaks 应用程序。安装并启动后,Tweaks 对话框将如下所示:

图 6-20

现在可以选择多种选项来定制桌面。事实上,选项太多,无法在本章中一一介绍,因此请在继续阅读下一章之前,花些时间尝试这些设置。

6.11 总结

Ubuntu 包含了 GNOME 44 桌面环境,可以在初始安装时包含,或在后期安装。与大多数其他桌面环境不同,GNOME 旨在提供一个简洁且易于使用的窗口用户界面。GNOME 桌面的关键区域包括顶部栏、活动概览和任务栏。此外,GNOME 支持多个工作区,可以保持运行中的应用程序有序,并且保持屏幕整洁。设置应用程序内也提供了多种配置选项,包括桌面背景设置、音频、网络配置和 WiFi 网络选择。

7. Cockpit Web 界面概述

尽管配备了最新的 Linux 桌面环境,Ubuntu 实际上是一个服务器操作系统。因此,大多数 Ubuntu 部署将是到远程物理服务器或作为云基础虚拟机实例。这些系统通常在没有键盘、鼠标或显示器的情况下运行,只能通过网络连接上的命令提示符进行直接访问。这在远程位置进行系统管理方面带来了挑战。虽然通过远程访问命令行和桌面环境确实可以实现很多功能,但必须有一个一致和协调的解决方案来执行类似 Ubuntu 这样的企业级操作系统上必须每天执行的管理和监控任务。

Cockpit 基于 Web 的管理界面提供了这些功能。本章将介绍如何安装、配置和访问 Cockpit 界面,同时还提供了 Cockpit 的主要特性概述,其中许多将在后续章节中更详细地介绍。

7.1 Cockpit 概述

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

在幕后,Cockpit 使用相同的工具执行通常在命令行工作时使用的任务,并自动更新以反映系统其他位置发生的更改。这使得 Cockpit 可以与其他管理工具和技术一起使用,而无需担心其中一种方法会覆盖另一种方法。Cockpit 还可以配置为访问多个服务器,允许通过单个浏览器会话同时管理和监控多台服务器。

Cockpit 默认安装了广泛的工具,并允许根据需要安装额外的扩展插件。Cockpit 还设计成可以使用 HTML 和 JavaScript 的组合来创建自己的扩展,以添加缺失或自定义功能。

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

7.2 安装和启用 Cockpit

在 Ubuntu 上通常不会默认安装 Cockpit,但可以通过几个简单的步骤进行设置和启用。第一步是安装 Cockpit 软件包如下:

第七章:apt 安装 cockpit

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

systemctl enable --now cockpit.socket

最后,如果系统启用了防火墙,您需要在防火墙上打开必要的端口,以允许远程浏览器连接到 Cockpit(有关防火墙的详细信息,请参阅章节 “Ubuntu 23.04 防火墙基础”)。

如果启用了 ufw:

ufw allow 9090

如果启用了 firewalld:

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-2 所示:

图 7-2

要提升您的权限,请点击有限访问按钮,并在提示时输入密码:

图 7-3

登录后,Cockpit 将显示概览屏幕。

7.4 概览

概览屏幕提供了当前系统的概览,包括对 CPU、内存、存储和网络活动性能指标的访问。此屏幕还包括有关系统的信息,包括底层硬件、主机名、系统时间以及系统软件是否是最新的。此处还提供了重启或关闭系统的选项。

图 7-4 例如,显示了 Cockpit 界面的概览页面:

图 7-4

有关特定类别的更多信息,请点击相应的链接。例如,图 7-5 显示了系统性能历史屏幕:

图 7-5

7.5 日志

当选择日志类别时,Cockpit 会显示 systemd 日志的内容。选择一个日志条目将显示完整的日志消息。日志条目按最新的排在最上面,并提供过滤日志的菜单,可以根据时间段和消息严重性进行筛选。

图 7-6

7.6 存储

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

图 7-7

7.7 网络

网络屏幕提供有关各种网络相关配置和服务的信息,包括网络接口和防火墙设置。此外,它还允许进行配置更改,例如创建网络桥接或设置虚拟网络:

图 7-8

7.8 帐户

选择此选项查看当前系统上配置的用户帐户,并为其他用户创建帐户。用户管理的主题将在后面的章节“管理 Ubuntu 23.04 用户和组”中讨论:

图 7-9

单击现有帐户以查看详细信息并进行更改。用户帐户详细信息页面还可以用于查看和向用户帐户添加公钥 SSH 密钥,以便远程访问服务器,如章节“在 Ubuntu 23.04 上配置基于 SSH 密钥的身份验证”中所述。

7.9 服务

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

图 7-10

服务的主题将在章节“管理 Ubuntu 23.04 systemd 单元”中详细讨论。

7.10 应用程序

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

图 7-11

如果 Cockpit 界面中没有应用程序选项,可以按照以下步骤安装:

apt install cockpit-packagekit

7.11 虚拟机

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

图 7-12

虚拟机扩展默认未安装,但可以通过 Cockpit 应用程序屏幕添加,或者通过运行以下命令进行安装:

apt install cockpit-machines

使用 Ubuntu 进行虚拟化的内容从章节“虚拟化技术概述”开始介绍。

7.12 软件更新

如果系统有可用的软件更新,它们会列在这里,并可以从此屏幕进行安装:

图 7-13

如果 Cockpit 软件更新屏幕不可用,可以按以下方式进行安装:

apt install cockpit-packagekit

7.13 终端

正如其名称所示,终端屏幕提供了访问命令行提示符的功能:

图 7-14

7.14 连接多个服务器

Cockpit 可以配置为在一个会话中管理多个服务器。要将另一个主机添加到 Cockpit 会话中,点击图 7-15 中突出显示的按钮,显示“主机”面板:

图 7-15

点击“添加新主机”按钮,输入另一台系统的 IP 地址或主机名,并选择一个颜色,用以区分此服务器与之前添加到 Cockpit 中的其他服务器,然后点击“添加”按钮:

图 7-16

如果你是第一次连接到远程服务器,Cockpit 将要求你接受新的 SSH 密钥。接受密钥后,系统会提示你输入图 7-16 中指定用户名的密码。还可以选择设置并授权一个受密码保护的 SSH 密钥,以便下次访问第二个主机系统时能够实现自动登录:

图 7-17

要在主机之间切换,显示“主机”面板(图 7-15 上述)并选择所需的系统。

7.15 启用存储的指标

在标准安装中,Cockpit 不会保留超出图表所覆盖的短时间窗口之外的任何性能数据。要保留 Cockpit 收集的数据,需要安装 Cockpit Co-Pilot(PCP)包。首先按以下方式安装 cockpit-pcp 包:

apt install cockpit-pcp

安装 cockpit-pcp 后,退出当前 Cockpit 会话并重新登录。

接下来,显示“性能指标”屏幕,点击“指标设置”按钮,显示图 7-18 中所示的屏幕,打开“收集指标”选项,并点击“保存”:

图 7-18

在 Cockpit 收集数据并经过足够时间后,指标信息将按小时区块显示,如图 7-19 所示:

图 7-19

7.16 小结

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

8. 在 Ubuntu 23.04 上使用 Bash Shell

学习如何使用 Ubuntu 和 Linux 发行版的一个关键部分是掌握 Shell 环境的操作。虽然 Linux 自带的图形桌面环境如 GNOME 提供了一个用户友好的操作界面,但 Shell 环境提供的功能、灵活性和自动化远远超过任何图形桌面工具能够实现的水平。Shell 环境还为在没有桌面环境时与操作系统进行交互提供了途径,这在使用如 Ubuntu 这样的基于服务器的操作系统或系统无法完全启动的损坏系统时尤为常见。

因此,本章旨在提供 Ubuntu 上默认 Shell 环境的概述(特别是 Bash Shell)。

8.1 什么是 Shell?

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

多种 Shell 环境在这些年来相继被开发出来。第一个广泛使用的 Shell 是 Bourne Shell,由 Bell Labs 的 Stephen Bourne 编写。

另一个早期的创造是 C Shell,它与 C 编程语言在语法上有一些相似之处,并引入了如命令行编辑和历史记录等可用性增强功能。

Korn Shell(由 Bell Labs 的 David Korn 开发)基于 Bourne Shell 和 C Shell 提供的功能。

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

8.2 获取 Shell 访问权限

在 GNOME 桌面环境中,可以通过选择顶部栏中的“活动”选项,输入“Terminal”在搜索栏中搜索,然后点击 Terminal 图标,从终端窗口访问 Shell 提示符。

例如,当使用 SSH 远程登录到 Ubuntu 服务器时,用户会看到一个 Shell 提示符。本章标题为“在 Ubuntu 23.04 上配置基于 SSH 的身份验证”,将介绍使用 SSH 访问远程服务器的详细信息。当启动一个没有安装桌面环境的服务器系统时,用户在物理控制台终端或远程登录会话完成登录过程后,Shell 会立即被加载。

8.3 在提示符处输入命令

命令在 shell 命令提示符下通过键入命令并按回车键输入。虽然有些命令执行时不会显示任何信息,但大多数命令在返回提示符之前会显示某种输出。例如,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(或向下箭头)可用于前后滚动浏览先前输入的命令。当历史记录中显示出所需的命令时,按回车键执行它。

另一种选择是输入‘!’字符,后跟要重复执行的命令的前几个字符,再按回车键。

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 被定向到文件,错误信息仍然会出现在终端中。通常这是期望的行为,但如果需要,也可以使用 '2>' 操作符将 stderr 定向到其他地方:

$ ls dkjfnvkjdnf 2> errormsg

命令执行完成后,errormsg 文件将包含一个错误信息,报告名为 dkjfnvkjdnf 的文件未找到。

stderr 和 stdout 都可以使用 &> 操作符定向到同一个文件:

$ 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 环境的熟练,你可能会经常输入带有相同参数的命令。例如,你可能经常使用带有 l 和 t 选项的 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=demo-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 在命令提示符下输入的命令所搜索的目录,以及搜索的顺序。新安装的 Ubuntu 系统中,用户账户的 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

2023 年 3 月 29 日 星期三 12:39:20 PM 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”,是一个特殊的字符序列,表示脚本执行所需解释器的路径位于行的下一个项目(在本例中,sh 可执行文件位于 /bin)。如果你想使用其他解释器,比如 /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 小结

在本章《Ubuntu Essentials》中,我们简要介绍了 Bash Shell 环境。在图形桌面环境的世界中,很容易忘记操作系统的真正功能和灵活性往往只能通过退出用户友好的桌面界面,进入 Shell 环境来发挥。而且,熟悉 Shell 是管理和维护没有安装桌面的服务器系统或在系统损坏到无法启动桌面或 Cockpit 界面时进行修复的必要条件。

Shell 的功能远远超出了本章所涵盖的范围。如果你是 Shell 新手,我们强烈建议你查阅更多资源。一旦熟悉了这些概念,你会很快发现,在终端窗口中使用 Shell 执行许多任务比在桌面上通过菜单和对话框操作要更快速。

9. 管理 Ubuntu 23.04 用户和组

在安装 Ubuntu 时,安装程序创建了一个 root 或超级用户账户,并要求配置密码。安装程序还提供了创建系统用户账户的机会。我们应该记住,Ubuntu 是一个企业级的、多用户、多任务操作系统。因此,为了充分利用 Ubuntu 的功能,可能需要为多个用户提供系统访问权限。每个用户应该拥有自己的用户账户登录、密码、主目录和权限。

用户进一步被分配到组中,以便更容易地管理,这些组可以有不同级别的权限。例如,您可能有一组在会计部门工作的用户。在这种环境中,您可以创建一个 accounts 组,并将所有会计部门的用户分配到该组。

本章将介绍在 Ubuntu 系统中添加、删除和管理用户及组的步骤。可以使用命令行工具、Cockpit Web 界面以及桌面设置应用来管理 Ubuntu 上的用户和组。在本章中,我们将探讨这些用户管理方法。

9.1 从命令行管理用户

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

第九章:adduser john

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

adduser --home /users/johnsmith john

adduser 命令在创建账户时会提示输入密码。此密码可以通过 passwd 命令稍后更改:

passwd john

正在更改用户 john 的密码。

新密码:

重新输入新密码:

passwd:所有认证令牌已成功更新。

可以使用 deluser 工具通过命令行删除现有用户。虽然这将删除账户,但用户的文件和数据将保留在系统中:

deluser john

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

deluser --remove-home john

Ubuntu 系统上的所有用户都是一个或多个组的成员。默认情况下,新用户会被添加到与用户同名的私有组(在上述示例中,为用户 john 创建的账户是一个名为 john 的私有组的成员)。但是,作为管理员,组织用户到更合乎逻辑的组中是很有意义的。例如,所有销售人员可能属于销售组,会计人员可能属于会计组,依此类推。新组可以使用命令行工具 groupadd 添加,例如:

groupadd accounts

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

usermod -G accounts john

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

usermod -G accounts,sales,support john

请注意,上述命令会将用户从未列出但当前属于的辅助组中移除。要保留当前的组成员身份,请使用 -a 标志来追加新的组成员身份:

usermod -aG accounts,sales,support john

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

groupdel accounts

请注意,如果要删除的组是任何用户的主组或初始组,则无法删除该组。在删除组之前,必须先删除该用户或使用 usermod 命令将其分配到新主组。可以使用 usermod -g 选项将用户分配到新主组:

usermod -g sales john

groupdel accounts

运行 groups 命令以查找用户所属的组。例如:

$ groups john

john : accounts support

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

adduser john sudo

一旦加入 sudo 组,用户就可以使用 sudo 执行其他受限任务,如下所示:

apt update

Hit:1 http://us.archive.ubuntu.com/ubuntu jammy InRelease

Hit:2 http://security.ubuntu.com/ubuntu jammy-security InRelease

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

允许 sudo 组中的成员运行所有命令

%sudo ALL=(ALL) ALL

要禁用所有 sudo 组成员的 sudo 权限,请按如下方式注释掉第二行:

允许 sudo 组中的成员运行所有命令

%sudo ALL=(ALL) ALL

要允许 sudo 组成员使用 sudo 而无需输入密码(出于安全原因,不建议这样做),请按如下方式修改 sudoers 文件:

不输入密码的同样操作

%sudo ALL=(ALL) NOPASSWD: ALL

在后台,这些命令只是修改系统上的 /etc/passwd、/etc/group 和 /etc/shadow 文件。

9.2 使用 Cockpit 进行用户管理

如果系统已安装并启用了 Cockpit Web 界面(该主题在“Cockpit Web 界面概述”章节中讨论),则可以在下图中的账户屏幕上执行多个用户和组管理任务,图 9-1 如下所示:

图 9-1

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

图 9-2

要修改用户账户,请从主屏幕中选择该账户并修改账户详细信息:

图 9-3

此屏幕允许进行各种操作,包括锁定或解锁账户、修改密码或强制用户设置新密码。此外,如果选择“服务器管理员”选项,用户将被添加到 sudo 组,并允许使用 sudo 执行管理任务。还提供一个按钮可删除系统中的用户。

如果用户通过带有密钥加密的 SSH 连接远程访问系统,可以在此屏幕中添加用户的公钥。关于 SSH 访问和身份验证的内容将在后续的《在 Ubuntu 23.04 上配置基于 SSH 密钥的身份验证》中详细介绍。

9.3 使用设置应用进行用户管理

通过 GNOME 桌面设置应用提供了第三种用户账户管理选项。可以通过点击 GNOME 桌面右上角的图标并选择设置选项来访问此应用,如图 9-4 所示:

图 9-4

当主设置屏幕出现时,点击左侧导航面板中的“用户”选项。默认情况下,设置将被锁定,无法对系统中的用户账户进行任何更改。要解锁设置应用,请点击下方图 9-5 中的“解锁”按钮,并输入您的密码。请注意,只有以具有 sudo 权限的用户身份登录时,才能解锁设置:

图 9-5

一旦应用解锁,点击“添加用户...”以显示下图中的对话框(见图 9-6):

图 9-6

如果需要,可以选择管理员选项为新用户分配 sudo 访问权限。接下来,输入用户的全名和用户名,并立即设置密码,或者允许用户在首次登录账户时设置密码。输入信息后,点击“添加”按钮创建账户。

可以随时通过在“用户”界面中选择相应的图标查看、修改或删除现有用户的设置,如图 9-7 所示。还可以查看用户的登录活动。请注意,在对账户进行任何更改之前,需要再次解锁设置应用。

图 9-7

9.4 小结

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

  1. 管理 Ubuntu 23.04 systemd 单元

要精通 Ubuntu 系统管理,理解 systemd 单元的概念至关重要,特别是对两种特定类型的了解:目标和服务。本章提供了对 Ubuntu 支持的不同 systemd 单元的基本概述,并介绍了如何配置在运行中的 Linux 系统后台运行的众多服务。

10.1 理解 Ubuntu systemd 目标

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

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

对于熟悉旧版 Ubuntu 的用户,systemd 目标替代了旧的运行级别系统。

10.2 理解 Ubuntu systemd 服务

服务是一个进程,通常在后台运行,提供特定的功能。例如,sshd 服务是一个后台进程(也称为守护进程),它提供对系统的安全 shell 访问。不同的 systemd 目标被配置为根据目标要提供的功能自动启动不同的服务集合。

目标和服务是 systemd 单元的类型,本章稍后将对此进行详细讨论。

10.3 Ubuntu systemd 目标描述

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

• poweroff.target - 该目标会关闭系统。你不太可能希望将其作为默认目标。

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

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

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

• reboot.target - 重启系统。由于显而易见的原因,这通常不是你希望设置为默认目标的目标。

除上述目标外,系统还包含大约 70 个其他目标,其中许多是上述主目标使用的子目标。例如,在后台,multi-user.target 还会启动一个名为 basic.target 的目标,而 basic.target 会启动 sockets.target 单元,该单元对于不同进程间的通信至关重要。这确保了在启动过程中,所有 multi-user.target 所依赖的服务也会被启动。

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

第十章:systemctl list-dependencies

例如,图 11-1 显示了图形目标(完整列表包含超过 140 个目标和服务,要求一个功能完备的多用户系统)的一部分 systemd 单元依赖关系:

图 10-1

列表呈现为层次结构树,展示了某些依赖项如何具有自己的子依赖项。例如,滚动到列表底部,可以发现图形目标依赖于一个名为 cloud-init.target 的云相关服务,而该服务又有自己的服务依赖项:

图 10-2

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

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

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

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

若要了解 systemd 单元的更多详细状态信息,请使用 systemctl status 命令并跟随单元名称,如下所示:

systemctl status systemd-machine-id-commit.service

○ systemd-machine-id-commit.service - 提交瞬态的机器 ID 到磁盘

已加载:已加载 (/usr/lib/systemd/system/systemd-machine-id-commit.service; static)

活跃:非活动(已死)

Condition: 启动条件失败,时间:2023-03-30 08:41:05 EDT,16 分钟前

└─ ConditionPathIsMountPoint=/etc/machine-id 未满足

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

10.4 确定和配置默认目标

当前 Ubuntu 系统的默认目标可以通过 systemctl 命令识别,如下所示:

systemctl get-default

multi-user.target

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

systemctl set-default graphical.target

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

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

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

10.5 理解 systemd 单元和单元类型

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

单元文件的类型由文件名扩展名表示,具体见下表 表 10-1:

单元类型 文件扩展名 类型描述
服务 .service 系统服务。
目标 .target systemd 单元组。
自动挂载 .automount 文件系统自动挂载点。
设备 .device 内核识别的设备文件。
挂载 .mount 文件系统挂载点。
路径 .path 文件系统中的文件或目录。
范围 .scope 外部创建的进程。
切片 .slice 管理系统进程的层级组织单元组。
快照 .snapshot systemd 管理器的保存状态。
套接字 .socket 进程间通信套接字。
交换 .swap 交换设备或交换文件。
定时器 .timer systemd 定时器。

表 10-1

请注意,目标单元类型与其他类型不同,它包含一组系统的 systemd 单元,如服务或其他目标。

10.6 动态更改当前目标

如前所述的 systemctl set-default 命令指定了系统下次启动时将使用的目标,但不会更改当前系统的状态。要动态切换到其他目标,请再次使用 systemctl 命令,使用 isolate 选项后跟目标名称。例如,要在不重启的情况下将当前系统切换到图形目标,可以使用以下命令:

systemctl isolate graphical.target

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

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

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

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

apt install apache2

配置好 Web 服务器后,下一步将是检查 apache2 服务单元的状态,以确认它是否在安装过程中被激活:

systemctl status apache2.service

● apache2.service - Apache HTTP 服务器

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

活跃:已激活(运行中),自 2023-07-17 14:01:13 UTC 起;40 秒前

文档:https://httpd.apache.org/docs/2.4/

主 PID:22328(apache2)

任务:55(限制:4517)

内存:4.7M

CPU:24ms

CGroup: /system.slice/apache2.service

├─22328 /usr/sbin/apache2 -k start

├─22329 /usr/sbin/apache2 -k start

└─22330 /usr/sbin/apache2 -k start

请注意,服务状态可能会显示为已加载但未激活,这是因为它在首次安装时由供应商预设为禁用。要启动一个未激活的服务,可以使用以下命令:

systemctl start apache2.service

在上述示例输出中,状态指示该服务已禁用。这意味着,下次系统重启时,apache2 服务将不会自动启动,必须由系统管理员手动启动。

要配置一个服务,每次系统启动时自动启动,必须按如下方式启用它:

systemctl enable apache2.service

当前正在运行的服务可以随时按如下方式停止:

systemctl stop apache2.service

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

在后台,systemctl 通过在 /etc/systemd/system 文件夹中的目标下创建符号链接,将依赖项添加到目标。例如,multi-user.target 单元在 /etc/systemd/system 中有一个名为 multi-user.target.wants 的文件夹,里面包含指向位于 /usr/lib/systemd/system 中所有依赖的 systemd 单元的符号链接。审查此文件夹将显示与前面章节中 systemctl list-dependencies 命令列出的依赖项之间的关联。

要配置一个服务,使其不再作为目标依赖项自动启动,可以按如下方式停用它:

systemctl disable apache2.service

此命令将从 .wants 目录中删除到 apache2.service 单元文件的符号链接,这样它就不再是依赖项,因此在系统下次启动时不会被启动。

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

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

systemctl mask apache2.service

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

systemctl unmask apache2.service

10.8 在 Cockpit 中操作 systemd 单元

除了本章中概述的命令行技术外,还可以通过 Cockpit 基于 Web 的界面查看和管理 systemd 单元。例如,假设已按照《Cockpit Web 界面概述》一章中的说明安装并设置了 Cockpit,可以通过登录 Cockpit 并在左侧导航面板中选择服务选项(如图 10-3 中标记的 A),访问系统中 systemd 单元的列表:

图 10-3

标记为 B 的选项行在标记为 C 的主区域中显示特定类型的单元,在该区域中,每个单元的当前状态会列在状态列中。

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

图 10-4

10.9 总结

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

11. Ubuntu 软件包管理和更新

新安装的 Ubuntu 系统很可能不会包含执行其预期任务所需的所有软件包。即使安装了所有必需的软件,也几乎可以肯定,在系统的生命周期内,许多软件包会发布更新的版本。在某些情况下,您需要确保这些最新的软件包版本已安装,以便修复错误和安全漏洞。

本章介绍了 Ubuntu 上软件管理的基本概念,解释了这些问题是如何解决的,并探索了软件仓库和软件包的概念,同时介绍了如何列出、安装和移除构成功能性 Ubuntu 系统的软件包。

11.1 软件仓库

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

当 Ubuntu 首次安装时,会根据安装阶段选择的软件选项安装一些不同的软件包。然而,一旦系统启动并运行后,仍然可以根据需要安装额外的软件。通常,所有属于 Ubuntu 的软件(即不是由第三方供应商提供的软件)都是通过高级包管理工具(apt)命令下载并安装到系统中的。正如我们在前面的章节中看到的,这通常包括在命令提示符下发出类似以下的命令:

第十一章:apt install apache2

当发出这样的命令时,请求的软件会从远程仓库下载并安装到本地系统。默认情况下,Ubuntu 配置为从多个不同的仓库下载软件:

•main - 包含由 Ubuntu 官方支持、测试和更新的核心软件包集。

•restricted - 用于硬件设备的专有驱动程序,这些设备没有开源等效驱动程序。

•universe - 包含 Ubuntu 团队在 Canonical 公司没有正式支持的包。然而,这些包由 Ubuntu 社区维护,并包含一些在主仓库中不可用的包。

•multiverse - 可能由于版权或其他法律问题,这些包无法符合 Ubuntu 发布的开源许可条款。

当前在 Ubuntu 系统上启用的仓库列表包含在 /etc/apt/sources.list 文件中,可以将其加载到编辑器中进行查看和修改。该文件可以手动加载到编辑器中,或者使用可用编辑器之一通过以下命令进行编辑:

apt edit-sources

该文件的前几行通常会引用主仓库和受限仓库,例如:

deb http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted

在上述示例中,列表被配置为允许从主仓库和限制仓库下载软件包。宇宙和多元仓库的条目也会被包含在文件中:

注意:来自此仓库的软件可能未经过测试。

该仓库的内容并不像主发布版本中的那样广泛,但它包括了

某些应用程序的更新版本可能提供有用的功能。

另外,请注意,回溯库中的软件将不会进行任何审核。

或来自 Ubuntu 安全团队的更新。

deb http://us.archive.ubuntu.com/ubuntu/ lunar-backports main restricted universe multiverse

要禁用某个仓库以使其不再用于下载软件包,只需通过在行前加上“#”字符来注释掉该行:

deb http://ports.ubuntu.com/ubuntu-ports/ lunar-backports main restricted universe multiverse

除了标准仓库外,还有许多第三方仓库。如果你需要使用其中之一,只需将其条目添加到 sources.list 文件中。例如,合作伙伴仓库可以按如下方式添加到 sources.list 文件:

deb http://archive.canonical.com/ubuntu lunar partner

修改后,运行以下命令以提交更改:

apt update

11.2 使用软件和更新管理软件仓库

作为使用命令行的替代方案,可以通过 GNOME 桌面环境中的软件和更新应用来配置仓库。要启动此应用,按下键盘上的特殊键(在 Windows 键盘上为 Windows 键,在 macOS 上为命令键,在 Chromebook 上为带有放大镜的键),并在搜索栏中输入“Software & Updates”。在结果面板中点击相应的图标以启动应用。或者,打开终端窗口并运行以下命令:

$ update-manager

当应用程序加载时,点击图 11-1 中所示的设置按钮:

图 11-1

在设置页面中,启用或禁用在“从互联网下载”标题下列出的所需仓库:

图 11-2

要启用合作伙伴仓库,选择图 11-3 中所示的“其他软件”选项卡:

图 11-3

要添加其他第三方仓库,点击“添加...”按钮,并在弹出的对话框中输入仓库信息:

图 11-4

11.3 使用 APT 管理软件包

apt 工具提供了一种直接从命令行执行大多数软件包管理任务的方法。在本节中,我们将探讨一些更常用的 apt 命令行选项。

Ubuntu 系统保持一份最新的软件包信息的本地副本,因此建议在执行任何其他 apt 操作之前,首先更新此列表,如下所示:

apt 更新

apt 操作中最常见的一项活动是执行软件包安装:

apt 安装 package_name

同样,已安装的软件包可以使用 remove 选项从系统中移除:

apt 移除 package_name

当以这种方式移除一个软件包时,关联的配置文件会保留在系统上。这使得以后可以重新安装该软件包,而不会丢失任何自定义配置设置。要在删除过程中,或即使在删除后,也删除这些文件,请使用 purge 选项:

apt 清除 package_name

要获取可安装的软件包列表,请按照以下方式使用 apt:

apt 列出

或者,要仅列出已安装的软件包,请使用带有 --installed 标志的 list 选项:

apt 列出 --installed

要检查某个特定软件包是否已安装在系统上,可以将 list 选项与软件包名称结合使用:

apt 列出 package_name

使用搜索选项列出所有符合特定标准的软件包。例如,要列出所有与 Apache Web 服务器相关的软件包:

apt 搜索 apache

要查找包含特定文件的软件包,请使用 apt-file 命令。例如,要列出包含名为 gimp 的文件的软件包名称:

apt-file --package-only 列出 gimp

要查看有关软件包的详细信息,请使用 show 选项运行 apt:

apt 显示 apache2

执行上述命令时的典型输出可能如下所示:

软件包:apache2

版本:2.4.52-1ubuntu4.5

优先级:可选

部门:web

来源:Ubuntu

维护者:Ubuntu 开发者 ubuntu-devel-discuss@lists.ubuntu.com

原始维护者:Debian Apache 维护者 debian-apache@lists.debian.org

错误: https://bugs.launchpad.net/ubuntu/+filebug

已安装大小:546 kB

提供:httpd,httpd-cgi

预依赖:init-system-helpers (>= 1.54~)

依赖:apache2-bin (= 2.4.52-1ubuntu4.5),apache2-data (= 2.4.52-1ubuntu4.5),apache2-utils (= 2.4.52-1ubuntu4.5),lsb-base,mime-support,perl:any,procps

推荐:ssl-cert

建议:apache2-doc,apache2-suexec-pristine | apache2-suexec-custom,www-browser,ufw

冲突:apache2.2-bin,apache2.2-common

替代:apache2.2-bin, apache2.2-common

主页:https://httpd.apache.org/

任务:lamp-server

下载大小:97.8 kB

APT-手动-安装:是

APT 来源:http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 软件包

描述:Apache HTTP 服务器

Apache HTTP 服务器项目的目标是构建一个安全、高效且符合标准的可扩展 HTTP 服务器,作为开源软件。

可扩展的 HTTP 服务器,作为符合标准的开源软件。

结果长期以来一直是互联网上最受欢迎的网页服务器。

.

安装此软件包将导致完整安装,包括

配置文件、初始化脚本和支持脚本。

11.4 执行更新

在基础操作系统和已安装的软件包的生命周期内,多个更新将发布以解决问题并增加功能。要从命令行手动下载并安装任何待处理的更新,第一步是使用 apt 的更新选项更新存储在本地系统上的包信息:

apt update

一旦包信息更新完成,就可以执行升级操作。此操作将从 sources.list 文件中配置的存储库下载当前安装包的所有更新,并将其安装到系统中:

apt upgrade

作为命令行的替代方法,可以使用“软件和更新”GNOME 桌面应用程序来更新系统。如果有更新可用,显示如图 11-5 所示的对话框,其中提供了查看可用更新信息和执行升级的选项:

图 11-5

11.5 启用自动更新

前一节讲解了如何手动安装软件包升级。Ubuntu 系统也可以配置为自动安装升级。这可以通过命令行或“软件和更新”工具来配置。

在“软件和更新”工具中,按照前述步骤打开设置屏幕并点击“更新”标签页,显示如图 11-6 所示的屏幕:

图 11-6

选择系统检查更新的频率(每日、每隔一天、每周等)。接下来选择在更新可用时要执行的操作(仅下载、下载并安装,或在桌面上显示通知)。你还可以配置更新程序在新版本的 Ubuntu 可用时通知你。

要从命令行配置自动更新,请按照以下步骤操作:

1. 安装 unattended-upgrades 包:

apt install unattended-upgrades

2. 编辑 /etc/apt/apt.conf.d/50unattended-upgrades 文件并找到以下行:

.

.

"\({distro_id}ESMApps:\){distro_codename}-apps-security";

"\({distro_id}ESM:\){distro_codename}-infra-security";

// "\({distro_id}:\){distro_codename}-updates";

// "\({distro_id}:\){distro_codename}-proposed";

// "\({distro_id}:\){distro_codename}-backports";

.

.

3. 移除要自动安装更新的存储库类型的 // 注释标记。

4. 编辑 /etc/apt/apt.conf.d/20auto-upgrades 文件,并声明系统检查更新的频率(以天为单位):

APT::Periodic::Update-Package-Lists "1";

APT::Periodic::Download-Upgradeable-Packages "1";

APT::Periodic::AutocleanInterval "0";

APT::Periodic::Unattended-Upgrade "1";

4. 执行干运行更新,确保设置有效:

unattended-upgrades --dry-run --debug

配置自动更新几天后,检查日志文件以确认更新是否按计划进行:

cat /var/log/unattended-upgrades/unattended-upgrades.log

11.6 总结

Ubuntu 操作系统包含成千上万的软件包,这些软件包从主仓库、受限仓库、宇宙仓库、多元宇宙仓库、合作伙伴仓库和第三方仓库中下载并安装。

软件包通过高级软件包工具(apt)或其他几种图形化桌面工具进行安装,并从 sources.list 文件中定义的仓库下载。

除了安装和卸载软件包外,apt 还可以用于升级这些软件包,获取最新的更新。这些软件升级可以手动执行,也可以配置为自动更新。

  1. Ubuntu Snap 包管理

前一章探讨了使用高级包管理工具(APT)在 Ubuntu 系统上安装和更新软件包。近年来,Canonical 公司旗下的 Ubuntu 团队开发了一种新的包管理系统——Snap。虽然目前没有官方计划完全用 Snap 替代 APT,但现在可以安装为“Snap”格式的包的数量正在不断增加。

本章的目标是介绍 Snap 系统,突出其相对于 APT 系统的主要优势,并概述如何使用 snap 命令行工具安装和管理基于 Snap 的软件包。

12.1 使用 Snap 管理软件

apt 工具安装的软件是通过 .deb 文件打包的。使用 apt 安装的软件包通常会依赖其他软件包,这些依赖项也需要安装才能正常运行。在安装过程中,apt 还会下载并安装这些附加的包依赖项。

假设有一个依赖于特定图像库的图形设计应用程序。在安装过程中,apt 除了安装图形应用包外,还会安装包含所依赖库的包。现在,假设用户决定安装一个不同的图形工具,该工具也依赖于相同的图形库。通常情况下,这不会是问题,因为这两个应用程序将共享相同的库,但如果这两个应用程序依赖于该库的不同版本,就可能出现问题。因此,安装第二个应用程序可能会导致第一个应用程序无法正常工作。

apt 和 .deb 包的另一个限制是,很难在系统上并行安装同一工具或应用程序的两个不同版本。例如,用户可能希望保留图形应用程序的 1.0 版本,同时尝试最新的 2.0 版本的测试版。在尝试了 2.0 版本后,用户可能希望移除 1.0 版本,只保留新版本安装,而这项任务使用 apt 很难实现。

Snap 系统专门设计用来解决这些类型的不足。Snap 工具安装的 .snap 包含所有软件运行所需的库和资源。这避免了将依赖项作为独立的包单独安装的需求。一旦安装了 Snap,它会被放置在一个独立的目录中,这样依赖项就不会与其他包共享。例如,我们假设的图形应用程序,每个应用程序都拥有开发者所使用的精确版本的图像库副本,这些副本无法被删除、替换成不兼容的版本或被其他包安装覆盖。

当然,使用 Snap 会导致包文件更大,从而增加下载时间、减慢安装速度,并占用更多的磁盘空间。然而,这些不足通常被 Snap 包的优势所弥补。

Snap 还支持渠道的概念,允许应用开发者发布同一应用的不同版本。Snap 渠道是实现同一软件多个版本并行安装的机制。

12.2 基本 Snap 命令

尽管许多软件包仍以 .deb 格式提供,并通过 apt 安装,但现在以 Snap 格式提供的应用和工具数量正在迅速增加。事实上,Ubuntu 软件工具中列出的所有软件(在本章“GNOME 3 桌面引导式导览”中有所提及)都是通过 Snap 打包和安装的。基于 Snap 的软件也可以使用 snap 命令行工具安装,本节将介绍其基础知识。

要列出某一特定软件类别下可用的 Snap 软件包,请运行类似以下命令:

第十二章:snap find "image editor"

名称 版本 发布者 备注 概要

gimp 2.10.18 snapcrafters - GNU 图像处理程序

paintsupreme-3d 1.0.41 braindistrict - PaintSupreme 3D

.

.

上述命令将列出所有可供下载和安装的 Snap 软件包,这些软件包与图像编辑相关。一个这样的结果将是 GIMP 图像编辑器。有关 GIMP Snap 的详细信息如下:

snap info gimp

name: gimp

summary: GNU 图像处理程序

publisher: Snapcrafters

store-url: https://snapcraft.io/gimp

contact: https://github.com/snapcrafters/gimp/issues

license: GPL-3.0+

description: |

无论你是平面设计师、摄影师、插画师还是科学家,GIMP 都能为你提供

使用精密的工具完成你的工作。你可以通过 GIMP 进一步提高你的生产力

得益于许多定制选项和第三方插件。

该 Snap 由 Snapcrafters 社区维护,并不一定得到上游开发者的认可或

官方维护。

上游项目: https://www.gimp.org/

snapcraft.yaml 构建定义:

https://github.com/snapcrafters/gimp/blob/master/snap/snapcraft.yaml

snap-id: KDHYbyuzZukmLhiogKiUksByRhXD2gYV

channels:

latest/stable: 2.10.30 2022-08-19 (393) 546MB -

latest/candidate: ↑

latest/beta: ↑

latest/edge: 2.10.32 2022-08-23 (399) 547MB -

preview/stable: –

preview/candidate: –

preview/beta: –

preview/edge: 2.99.10 2022-08-17 (397) 650MB -

snap find 命令还可以用来通过名称查找特定软件包,并列出提供类似功能的其他软件包。例如,搜索 VLC 媒体播放器应用时,也会列出类似的软件包:

snap find vlc

名称 版本 发布者 备注 概要

vlc 3.0.18 videolan - 终极媒体播放器

orion-desktop 2.0.0 keshavnrj - Linux 桌面上的完整种子下载客户端和流媒体工具

gridplayer 0.4.3 vzhd1701 - 侧边播放多个视频

mjpg-streamer 2.0 ogra - UVC 网络摄像头流媒体工具

audio-recorder 3.0.5+rev1432+pkg-7b07 brlin - 一款免费的 Linux 音频录制工具(极其不稳定)

ustreamer 5.41 pgentili - 轻量级且快速的 MJPEG-HTTP 流媒体工具

snap list 命令行选项可用于获取系统上已安装的 snap 软件包列表:

snap list

Name Version Rev Tracking Publisher Notes

bare 1.0 5 latest/stable canonical base

canonical-livepatch 10.6.0 235 latest/stable canonical -

core 16-2.59.5 15511 latest/stable canonical core

core20 20230622 1974 latest/stable canonical base

core22 20230703 817 latest/stable canonical base

firefox 115.0-2 2850 latest/stable/… mozilla -

gnome-3-38-2004 0+git.efb213a 143 latest/stable/… canonical -

gnome-42-2204 0+git.ff35a85 120 latest/stable canonical -

.

.

要安装 snap 软件包(例如,安装 Remmina 远程桌面工具),请使用 snap 命令并带上 install 选项,后接要安装的软件包名称:

snap install remmina

要卸载一个 snap 软件包,只需在运行 snap 时指定软件包名称并使用 remove 选项:

snap remove remmina

12.3 使用 Snap 频道

如果在安装时没有指定频道,snap 会默认选择稳定频道。这确保了安装的软件是最新的可靠版本。如果要从其他频道进行安装,可以先使用 snap info 选项查看当前可用的频道:

snap info remmina

name: remmina

summary: 远程桌面客户端

.

.

channels:

latest/stable: v1.4.29 2022-12-20 (5599) 146MB -

latest/candidate: ↑

latest/beta: ↑

latest/edge: v1.4.31+git102.f5485fcfd 2023-07-17 (5925) 144MB -

从上述输出中我们可以看到,尽管 Remmina 应用的稳定版本是 v1.4.3+git13.688f5f75,但在 edge 频道中提供了一个更新的版本。

当然,候选(candidate)、测试版(beta)和前沿(edge)频道提供的软件版本逐渐不稳定(称为风险级别),但如果你希望尝试软件包即将发布的早期功能,可以从更高风险的频道安装。例如:

snap install --channel=edge remmina

频道选择也可以简写为 --stable、--candidate、--beta 或 --edge,例如:

snap install --edge remmina

如果软件包已经安装,可以使用 switch 选项来更改其风险级别:

snap switch channel=edge remmina

这将更改 snap 跟踪的指定软件包的频道。可以使用 snap info 命令来查看当前跟踪的软件包频道:

snap info remmina

name: remmina

.

.

tracking: latest/edge

.

.

仅运行 snap switch 命令并不会立即更新软件包以使用新的频道。要理解如何操作,可以先了解 snap 刷新计划。

12.4 Snap 刷新计划

snap 系统包括一个名为 snapd 的后台服务,负责根据其跟踪的频道刷新已安装的 snap。默认情况下,snapd 会按固定间隔(通常是每天四次)执行刷新操作。要查看上次刷新和下次刷新时间,可以运行以下命令:

snap refresh --time

timer: 00:00~24:00/4

last: 今天 07:23 EDT

next: 今天 14:25 EDT

上述输出还包括计时器信息,表示刷新将在每个 24 小时内执行四次:

.

.

timer: 00:00~24:00/4

.

.

snap 命令也可以用于强制刷新所有已安装的 snap 包,方法如下:

snap refresh

或者,要刷新特定的包:

snap refresh remmina

要将一个包切换到不同的频道,而无需等待下次 snapd 服务刷新,只需运行以下 snap refresh 命令,指定目标频道:

snap refresh remmina --channel=edge

snap 系统还提供了一组可修改的属性,用于调整 snapd 使用的刷新计划:

•refresh.timer: 存储当前的刷新计划和频率。

•refresh.hold: 用于将刷新操作延迟到指定的日期和时间(以 RFC 3339 格式)。

•refresh.metered: 当网络连接通过计量连接(例如移动数据连接)时,暂停刷新操作。

•refresh.retain: 用于配置每个 snap 安装的版本保留数量。

例如,要安排在工作日的 1:00am 到 2:00am 之间进行刷新:

snap set system refresh.timer=mon-fri,1:00-2:00

类似地,以下命令将配置每天两次的刷新,分别发生在早上 6:00 到 7:00 和晚上 10:00 到 11:00 之间:

snap set system refresh.timer=6:00-7:00,22:00-23:00

关于计时器格式和语法的完整解释可以在以下网址找到:

snapcraft.io/docs/timer-string-format

在更改计时器后,请确保按以下方式检查设置:

snap refresh --time

timer: mon-fri,1:00-2:00

last: 今天 07:23 EDT

next: 明天 01:00 EDT

要暂停刷新操作,必须指定恢复刷新的日期和时间,格式为 RFC 3339 格式,详细信息可以在以下网址找到:

tools.ietf.org/html/rfc3339

总结来说,日期和时间应使用以下格式:

YYYY-MM-DDTHH:MM.SS

例如,要为位于纽约的系统指定直到 2020 年 10 月 12 日 3:20am 的暂停,日期和时间应格式化为:

2020-10-12T03:20:50.0-05:00

请注意,由于纽约使用东部标准时间(EST),它与协调世界时(UTC-5:00)有 5 小时的时差。格式化日期和时间后,可以使用以下命令设置暂停:

snap set system refresh.hold="2020-10-12T03:20:50.0-05:00"

要检查当前的 hold 设置,请使用 snap 命令和 system get 选项:

snap get system refresh.hold

2020-10-12T03:20:50.0-04:00

要删除 hold,请简单地将属性的值指定为 null:

snap set system refresh.hold=null

refresh.retain 属性可以设置为 0 到 20 之间的任何值,例如:

snap set system refresh.retain=10

最后,在系统使用计量连接时暂停刷新更新,请设置 refresh.metered 属性如下所示:

snap set system refresh.metered=hold

与 hold 属性一样,通过将属性的值指定为 null 来禁用此设置:

snap set system refresh.metered=null

12.5 Snap 服务

值得注意的是,一些 snap 包含其自己的服务,这些服务在安装包时在后台运行(类似于“管理 Ubuntu systemd 单元”章节中描述的 systemd 服务)。要获取当前在系统上运行的 snap 服务列表,请执行带有 services 选项的 snap 命令:

snap services

服务启动当前说明

remmina.ssh-agent enabled active -

上述输出表明,Remmina 安全 Shell 代理 snap 服务当前已启用并处于活动状态。要停止或停用服务,可以使用以下 snap 命令:

snap start remmina.ssh-agent

snap stop remmina.ssh-agent

类似地,snap enable 和 disable 选项可用于控制服务是否在系统启动时自动启动:

snap enable remmina.ssh-agent

snap disable remmina.ssh-agent

如果 snap 服务生成日志文件,则可以如下查看该文件:

snap logs remmina.ssh-agent

仍然可以使用 systemctl 命令管理 snap 服务。这通常涉及以 “snap.” 为前缀的服务名称。例如:

systemctl status snap.remmina.ssh-agent

12.6 概要

直到最近,所有 Ubuntu 软件包都存储在 .deb 文件中,并使用高级打包工具(APT)进行安装。越来越多的软件包现在可以使用 Snap 进行安装,这是由 Canonical 公司开发的软件包管理系统。与 apt 软件包不同,snap 将一个软件包的所有依赖关系捆绑到一个单独的 .snap 文件中。这确保软件包是自包含的,具有其自身的所有运行所需的库和资产的副本。这避免了依赖于同一共享资产和库的不同版本的软件包之间的潜在冲突。Snap 系统还允许并行安装同一软件包的不同版本。Ubuntu 软件工具中列出的所有软件都作为 snap 软件包提供。此外,可以使用 snap 在命令行安装、删除和管理软件包。

  1. Ubuntu 23.04 网络管理

很难想象一个没有至少一个网络连接的 Ubuntu 系统,更难以想象一个如此孤立的系统如何具有多大实际用途。简单的事实是,Ubuntu 被设计为通过网络和互联网连接提供企业级服务。因此,学习如何管理 Ubuntu 系统的一个关键部分就是学习如何配置和管理系统上安装的网络接口。

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

13.1 NetworkManager 简介

NetworkManager 是一个服务和工具集,专门设计用于简化 Linux 系统的网络配置管理,它是 Ubuntu 默认的网络管理服务。

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

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

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

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

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

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

尽管在 Ubuntu 系统上有几种管理网络环境的方法,本章将重点介绍 nmcli 命令。虽然当你能够访问桌面环境或启用了 Cockpit 时,图形工具无疑很有帮助,但了解命令行界面对于只有命令提示符可用的情况至关重要。此外,图形工具(包括 Cockpit)仅包括 nmcli 工具的一部分功能。最后,一旦熟悉了 NetworkManager 和 nmcli,这些技能在使用更直观的工具选项时将很容易转化。图形工具选项则不然。如果你只使用过 nm-connection-editor,举例来说,使用 nmcli 可能会更加困难。

13.2 安装和启用 NetworkManager

对于大多数 Ubuntu 安装,NetworkManager 应该默认已安装。使用 apt 命令检查是否需要安装:

第十三章:apt -qq list network-manager

network-manager/lunar,now 1.42.4-1ubuntu2 amd64 [已安装,自动]

如果需要,按如下方式安装该软件包:

apt install network-manager

一旦安装了软件包,NetworkManager 守护进程需要启用,以便它在每次系统启动时自动启动:

systemctl enable NetworkManager

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

systemctl start NetworkManager

systemctl status NetworkManager

● NetworkManager.service - 网络管理器

已加载:已加载(/lib/systemd/system/NetworkManager.service;已启用;厂商预设:已启用)

活动状态:活动(运行中),自 2023-07-16 12:46:48 EDT 起运行;24 小时前

文档:man:NetworkManager(8)

主 PID:725(NetworkManager)

任务:3(限制:4352)

内存:11.9M

CPU:5.018s

CGroup:/system.slice/NetworkManager.service

└─725 /usr/sbin/NetworkManager --no-daemon

13.3 基本 nmcli 命令

nmcli 工具作为 NetworkManager 软件包的一部分安装,可以使用以下语法从命令行执行:

nmcli [选项] 对象

在上述语法中,Object 将是 general、networking、radio、connection、monitor、device 或 agent 之一,可以通过该单词的几个字母缩写(例如,con,或者仅使用字母 c,表示 connection)来简写。例如,以下所有命令都会输出与设备对象相关的帮助信息:

nmcli device help

nmcli dev help

nmcli d help

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

nmcli general status

STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN

已连接 完整 启用 启用 启用 启用

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

nmcli dev status

设备 类型 状态 连接

eno1 以太网已连接 eno1

wlp0s26u1u2 wifi 已连接 zoneone

virbr0 桥接 已连接 virbr0

lo 回环 未管理 --

virbr0-nic tun 未管理 --

输出也可以通过使用 -p(美化)选项来修改,以使输出更适合人类查看:

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:未管理:

状态输出显示系统安装了两个物理设备,一个以太网设备和一个 WiFi 设备。

桥接(virbr)条目是用于为虚拟机提供网络的虚拟设备(虚拟化的相关内容将在《虚拟化技术概述》章节中讲解)。最后,回环接口是一个特殊的虚拟设备,允许系统与自身进行通信,通常用于进行网络诊断。

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

以下命令显示有关系统中配置的连接的信息:

nmcli con show

NAME UUID TYPE DEVICE

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

上述输出显示 WiFi 设备(wlp0s26u1u2)已连接到名为 zoneone 的无线网络,而以太网设备(eno1)则连接到名为 eno1 的网络连接。除了 zoneone,NetworkManager 还列出了另外两个 WiFi 连接,分别是 zonetwo 和 zonethree,但目前没有设备连接到这两个网络。

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

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 57584sec preferred_lft 57584sec

.

.

ip 命令将输出系统中所有设备的信息。例如,上述输出显示 WiFi 设备已分配 IP 地址 192.168.1.121。

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

nmcli con show -a

NAME UUID TYPE DEVICE

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

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

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

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

nmcli device wifi connect zonetwo -ask

密码:

-ask 标志使得 nmcli 提示用户输入 WiFi 网络的密码。如果需要在命令行中包含 WiFi 密码(尤其在脚本中执行命令时非常有用),可以使用 password 选项:

nmcli device wifi connect zonetwo password

nmcli 工具也可以用来扫描可用的 WiFi 网络,方法如下:

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.<属性名称> <设置>

13.4 处理连接配置文件

到目前为止,我们已经探索了如何使用连接,但没有解释如何配置连接。连接的配置被称为连接配置文件,并存储在 /etc/NetworkManager/system-connections 目录中的文件中,该文件的内容可能如下所示:

ls /etc/NetworkManager/system-connections

zoneone.nmconnection eno1.nmconnection

zonethree.nmconnection zonetwo.nmconnection

举例来说,考虑 eno1.nmconnection 文件的内容:

id=eno1

uuid=efc69a99-17a3-3636-b68f-bfcc56a73844

type=ethernet

autoconnect-priority=-999

interface-name=eno1

timestamp=1679678184

[ethernet]

[ipv4]

method=auto

[ipv6]

addr-gen-mode=eui64

method=auto

[proxy]

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

nmcli con reload

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

nmcli dev status

设备 类型 状态 连接

en01 以太网已连接 eno1

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

NetworkManager 自动检测到该设备,激活了它,并将其分配给名为“有线连接 1”的连接。这是一个默认连接,我们无法对其进行配置控制,因为在 /etc/NetworkManager/system-connections 中没有它的接口配置文件。因此,接下来的步骤是删除“有线连接 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

创建连接后,将在 /etc/NetworkManager/system-connections 目录中添加名为 dyn_ip.nmconnection 的文件。

或者,要创建一个名为 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) 已成功添加。

对应的 static_ip.nmconnection 文件将如下所示:

[connection]

id=static_ip

uuid=41eca181-381c-4d12-b6c9-30446d4e29d1

type=ethernet

interface-name=eno0

[ethernet]

[ipv4]

address1=192.168.1.200/24,192.168.1.1

method=manual

[ipv6]

addr-gen-mode=default

method=auto

[proxy]

添加新连接的命令可以稍作修改,以同时分配 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

13.5 交互式编辑

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

nmcli con edit

有效的连接类型:6lowpan, 802-11-olpc-mesh (olpc-mesh), 802-11-wireless (wifi), 802-3-ethernet (ethernet), adsl, bluetooth, bond, bridge, 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> 设置连接.interface eno1

nmcli> 设置 connection.autoconnect yes

nmcli> 设置 ipv4.method 自动

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

nmcli> 设置 ipv6.method 自动

nmcli> 保存

保存连接时设置 'autoconnect=yes',这可能会导致连接立即激活。

你仍然想保存吗? (yes/no) [yes] 是

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

nmcli> 退出

下面的记录修改了之前创建的 static_ip 连接配置文件,使用了一个与最初指定的不同的静态 IP 地址:

nmcli con edit 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 reload

使用交互模式时,了解工具的详细使用方法非常有用,可以通过在 nmcli > 提示符下输入 help 或 ? 来访问内置的广泛帮助系统:

nmcli> ?


---[ 主菜单 ]---

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

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

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

描述 [.] :: 描述属性

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

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

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

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

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

帮助/? [] :: 打印此帮助

nmcli :: nmcli 配置

quit :: 退出 nmcli


13.6 配置 NetworkManager 权限

除了使在 Ubuntu 上管理网络更方便外,NetworkManager 还允许为连接指定权限。例如,以下命令将连接配置限制为 root 用户以及名为 john 和 caitlyn 的用户账户:

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

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

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

13.7 总结

NetworkManager 服务负责在 Ubuntu 上进行网络管理。NetworkManager 将网络视为由网络接口设备和连接组成。网络设备可以是物理以太网或 WiFi 设备,或者是虚拟机客户机使用的虚拟设备。连接表示设备连接的网络,并通过连接配置文件进行配置。配置文件将定义包括连接是否具有静态或动态 IP 地址、网络使用的任何网关的 IP 地址,以及连接是否应在每次系统启动时自动建立等设置。

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

  1. Ubuntu 23.04 防火墙基础

防火墙是保护单个计算机系统或计算机网络免受外部攻击(通常来自互联网连接)的重要组成部分。任何直接连接到互联网的计算机都应该运行防火墙,以防止恶意活动。同样,任何内部网络也必须在它与外部互联网连接之间配置某种形式的防火墙。

Ubuntu 提供了强大的防火墙技术,名为内置的 iptables。关于如何配置 iptables,可以写成整本书,实际上也已经有很多书籍讨论这一话题。如果你想了解 iptables,推荐以下资源:

www.linuxtopia.org/Linux_Firewall_iptables/index.html

本章将介绍一些防火墙、TCP/IP 端口和服务的基本概念。Ubuntu 上的防火墙配置将在“Ubuntu 22.04 防火墙配置与 firewalld”和 “使用 gufw 和 ufw 配置 Ubuntu 防火墙”章节中进行讨论。

14.1 了解端口和服务

目前使用的主要网络通信协议是 TCP/IP。这是互联网使用的协议,因此它已经取代了许多曾经流行的局域网(LAN)协议。

TCP/IP 定义了总共 65,535 个端口,其中 1023 个被视为知名端口。需要理解的是,这些端口不是物理端口(即网络电缆连接的地方),而是每个网络连接上的虚拟端口,应用程序和服务可以通过这些端口在 TCP/IP 网络连接中进行通信。实际上,流行的网络客户端和服务使用的端口数量仅占知名端口组中的一个更小子集。

操作系统可以提供多个不同的 TCP/IP 服务。该章节末尾的表格提供了这些服务的完整列表。常见的服务包括用于运行安全 Web 服务器的 HTTPS,用于文件传输的 FTP,用于提供安全远程登录访问和文件传输的 SSH,以及用于传输电子邮件消息的 SMTP。每个服务都会分配到一个标准的 TCP/IP 端口。例如,HTTPS 分配给端口 443,而 SSH 通信则发生在端口 22 上。

14.2 安全化端口和服务

保护服务器的一个重要部分是定义角色,并根据这些角色确定应该启用哪些服务和端口。例如,一个仅作为 Web 服务器的服务器应该只运行 HTTPS 服务(可能还包括 SSH 以进行远程管理访问)。所有其他服务应该禁用,并且最好从操作系统中完全移除(这样可以增加攻击者重新启用服务的难度)。

系统安全化涉及从操作系统中删除任何不必要的服务,并确保通过防火墙屏蔽与非必要服务相关的端口。定义哪些端口可以访问以及在什么情况下可以访问的规则是通过 iptables 确定的。

许多操作系统默认安装并激活了多个服务。在安装新操作系统之前,必须仔细规划安装过程。这项规划包括决定哪些服务是不需要的,以及识别哪些服务在默认情况下已经安装并启用。新操作系统的部署不应匆忙进行。系统上可用的服务和开放端口越少,攻击者的攻击面和机会也就越小。

14.3 Ubuntu 服务与 iptables 规则

默认情况下,刚安装的 Ubuntu 系统没有定义任何 iptables 规则来限制端口访问。可以在终端窗口中执行以下命令来查看当前的 iptables 设置:

第十四章:iptables -L

链 INPUT(策略:ACCEPT)

目标 协议 选项 源 目的地

链 FORWARD(策略:ACCEPT)

目标 协议 选项 源 目的地

链 OUTPUT(策略:ACCEPT)

目标 协议 选项 源 目的地

如上面的输出所示,目前没有定义任何规则。虽然这看起来像是一个不安全的配置,但需要记住,刚安装的 Ubuntu 系统默认也没有运行太多服务,这使得端口对潜在攻击者来说是无用的。例如,在新安装的 Ubuntu 系统上访问 Web 服务器是不可能的,因为默认情况下没有安装或运行任何 Web 服务器服务。一旦系统上的服务开始激活,就需要通过定义 iptables 规则来建立防火墙策略。

定义 iptables 规则有几种方法,包括使用命令行工具和配置文件。例如,要阻止从 IP 地址 192.168.2.76 访问端口 25(用于 SMTP 邮件传输协议),可以在终端窗口中输入以下命令:

iptables -A INPUT -s 192.168.2.76 -p tcp --destination-port 25 -j DROP

如果我们现在检查当前的规则,我们会看到以下规则已列出:

iptables -L

链 INPUT(策略:ACCEPT)

目标 协议 选项 源 目的地

DROP tcp -- 192.168.2.76 anywhere tcp dpt:smtp

链 FORWARD(策略:ACCEPT)

目标 协议 选项 源 目的地

链 OUTPUT(策略:ACCEPT)

目标 协议 选项 源 目的地

该规则随后可以按如下方式删除:

iptables -D INPUT -s 192.168.2.76 -p tcp --destination-port 25 -j DROP

鉴于 iptables 的复杂性,开发了几种用户友好的配置工具来简化规则创建过程。一个这样的工具是 firewall-cmd 命令行工具,相关内容将在“Ubuntu 22.04 使用 firewalld 配置防火墙”一章中讲解。

14.4 知名端口与服务

在深入讨论更复杂的防火墙规则之前,首先值得花时间概述一下 Ubuntu 系统可以提供的一些关键服务及其对应的端口号:

端口 分配 描述
20 FTP 文件传输协议(数据)- 文件传输协议提供了一个在网络连接的计算机系统之间传输特定文件的机制。传输通常使用 ftp 客户端执行。大多数现代网页浏览器也可以浏览并下载远程 FTP 服务器上的文件。FTP 使用 TCP(而不是 UDP)来传输文件,TCP 被认为是一种高度可靠的传输机制。FTP 不加密数据,因此不被视为安全的文件传输协议。建议使用安全复制协议(SCP)和安全文件传输协议(SFTP)来代替 FTP。
21 FTP 文件传输(控制)- 传统上,FTP 有两个分配的端口(端口 20 和端口 21)。端口 20 最初被认为是数据传输端口,而端口 21 则被分配用于通信控制信息。然而,在现代实现中,端口 20 很少使用,所有通信都发生在端口 21 上。
22 SSH 安全外壳 - 安全外壳提供了一个安全的、加密的远程登录会话,可以通过 TCP/IP 网络访问主机。远程访问的原始机制是 Telnet 协议。然而,由于 Telnet 以明文传输数据,因此强烈建议使用安全外壳,它会加密所有通信,包括登录和密码凭证。SSH 还提供了一个机制,通过安全复制协议(SCP)可以安全地传输文件,并且还是安全文件传输协议(SFTP)的基础。SSH 还取代了 rsh 和 rlogin 客户端。
23 Telnet Telnet - Telnet 是一个终端仿真协议,可以通过 TCP/IP 连接登录到远程系统。访问是基于文本的,允许用户在远程主机上输入命令提示符,远程主机显示的文本将在本地 Telnet 客户端上显示。Telnet 既不加密密码,也不加密客户端和服务器之间传输的文本。因此,强烈建议避免使用 Telnet。大多数现代系统会关闭端口 23,并禁用 Telnet 服务,以防止其使用。应该使用 SSH 来代替 Telnet。
25 SMTP 简单邮件传输协议 - SMTP 定义了电子邮件消息从一个网络主机发送到另一个网络主机的机制。SMTP 是一种简单的协议,要求接收主机的邮件服务始终可用。通常,接收主机会将传入的邮件存储在一个排队队列中,供收件人通过 POP3 或 IMAP 协议访问。此外,SMTP 使用 TCP 传输协议来确保消息的无误传递。
53 DNS 域名系统 - TCP/IP 网络中用于将主机名和完全限定域名(FQDN)转换为 IP 地址的服务。
69 TFTP 简单文件传输协议 - TFTP 是文件传输协议(FTP)的精简版。它的命令集减少,且不支持身份验证。TFTP 的最显著特点是它使用 UDP 进行数据传输。这导致了高速传输,但也因此缺乏数据可靠性。TFTP 通常用于无盘工作站的网络启动。
80 HTTP 超文本传输协议 - HTTP 用于从 Web 服务器将文本、图形和多媒体内容下载到 Web 浏览器。它定义了浏览器与服务器之间的命令和控制机制,规定了客户端请求和服务器响应。HTTP 基于 TCP 传输协议,因此是一种面向连接的协议。
110 POP3 邮局协议 - POP3 协议是一种从服务器存储和检索传入电子邮件的机制。在大多数企业环境中,传入邮件会存储在电子邮件服务器上,然后在用户检查邮件时下载到运行在用户桌面或笔记本上的电子邮件客户端。然而,POP3 会将所有新邮件下载到客户端,并不允许用户选择下载哪些邮件、查看邮件头或仅下载邮件的部分内容。因此,IMAP 协议正在逐渐取代 POP3 的使用。
119 NNTP 网络新闻传输协议 - 负责向 Usenet 新闻服务器(即托管在远程服务器上的新闻组和讨论论坛)发布和检索消息的协议。NNTP 在 OSI 协议栈的应用层上运行,并使用 TCP 来确保无误地检索和传输消息。
123 NTP 网络时间协议 - 一种设计用来将计算机时钟与外部时间源同步的协议。通过此协议,操作系统或应用程序可以从远程 NTP 服务器请求当前时间。远程 NTP 服务器通常基于核时钟提供的时间。NTP 对确保网络中所有系统设置为相同、准确的时间非常重要。尤其在安全场景中,当例如文件在客户端或服务器上的访问或修改时间出现争议时,NTP 的作用尤为关键。
143 IMAP4 互联网邮件访问协议,第 4 版 - IMAP4 是一种先进且安全的电子邮件检索协议。IMAP 类似于 POP3,允许用户访问存储在电子邮件服务器上的邮件。然而,IMAP 包含许多附加功能,例如选择性下载邮件、查看邮件头、搜索邮件以及仅下载邮件的部分内容。此外,IMAP4 使用身份验证,并完全支持 Kerberos 认证。
161 SNMP 简单网络管理协议 - 提供了一种机制,允许网络管理员收集有关网络设备(如集线器、桥接器、路由器和交换机)的信息。SNMP 协议使运行在网络设备上的代理能够将其状态传递给中央管理者,并反过来允许管理者将新的配置参数发送给设备代理。代理还可以进一步配置,以在发生某些事件(称为陷阱)时通知管理者。SNMP 使用 UDP 来发送和接收数据。
443 HTTPS 超文本传输协议安全 - 标准的 HTTP(不安全)协议以明文传输数据(即没有加密,且任何可能拦截流量的人都能看到)。虽然这对于大多数网页浏览目的来说是可以接受的,但当需要从浏览器向 Web 服务器传输机密信息,如信用卡详细信息时,这构成了严重的安全风险。HTTPS 通过使用安全套接层(SSL)来解决这一问题,通过加密的数据在客户端和服务器之间传输。
2049 NFS 网络文件系统 - 最初由 Sun Microsystems 开发,随后广泛应用于整个行业,NFS 允许通过网络让远程系统上的文件系统像本地磁盘驱动器一样被另一系统访问。NFS 广泛应用于基于 UNIX 和 LINUX 的系统。微软 Windows 的后续版本也可以访问基于 UNIX 和 LINUX 系统上的 NFS 共享文件系统。

表 14-1

14.5 总结

新安装的 Ubuntu 系统通常被认为是安全的,因为系统端口上没有运行服务。然而,一旦系统开始配置以供使用,就需要确保通过实施防火墙来保护系统。在配置防火墙时,理解各种端口和对应服务非常重要。

有多种防火墙选项,其中最基本的是命令行配置 iptables 防火墙接口。通过 firewalld 可以获得更直观和高级的选项,下一章将介绍这些选项。

  1. 使用 gufw 和 ufw 配置 Ubuntu 防火墙

在上一章,我们查看了 Ubuntu 系统上的端口和服务。我们还简要地了解了 Ubuntu 上的 iptables 防火墙规则,包括从命令行创建一些非常简单的规则。在本章中,我们将介绍一种更用户友好的 iptables 配置方法,使用两个名为 gufw 和 ufw 的工具。正如我们所看到的,gufw 和 ufw 提供了对进出网络流量和连接的高度控制,而无需理解低级的 iptables 语法。

15.1 gufw 和 ufw 概述

Ubuntu 附带了一个名为 ufw 的软件包,它是 Uncomplicated Firewall(简易防火墙)的缩写。该软件包提供了一个命令行接口,用于管理和配置基于 Netfilter iptables 的防火墙规则。gufw 工具提供了一个用户友好的图形界面,旨在使防火墙管理成为可能,而无需在命令行中发出 ufw 命令。

15.2 在 Ubuntu 上安装 gufw

尽管 ufw 默认安装在 Ubuntu 中,但 gufw 软件包并未安装。因此,要安装 gufw,请打开终端窗口(Ctrl-Alt-T),并在提示符下输入以下命令:

第十五章:apt install gufw

15.3 运行和启用 gufw

安装完成后,通过在 GNOME 桌面中按下 Alt-F2 并在“运行命令”文本框中输入 gufw 来启动 gufw。首次启动时,防火墙可能会被禁用,如图 15-1 所示。

要启用防火墙,请将状态开关(A)移至开启位置。默认情况下,主面板(D)将显示 gufw 首页,其中包含有关该工具的一些基本信息。选择按钮行(C)中的选项将更改面板中显示的信息。例如,选择“规则”按钮以添加、删除和查看规则。

gufw 工具提供了一小组预配置的配置文件,适用于工作、家庭和公共环境。要更改配置文件并查看设置,请从菜单(B)中选择配置文件。要修改现有配置文件,从菜单中选择它,并使用 Incoming 和 Outgoing 菜单更改选择。要配置特定规则,请显示规则屏幕,并根据需要添加、删除和修改规则。然后,这些规则将应用于当前选定的配置文件。

图 15-1

当前选择的配置文件决定了防火墙如何处理在没有任何特定策略规则的情况下的流量。例如,默认情况下,Home 配置文件被设置为拒绝所有传入流量并允许所有传出流量。这些默认的策略设置可以通过 Incoming:和 Outgoing:菜单(E)进行更改。

默认策略的例外通过创建额外规则来定义。例如,使用“Home”配置文件拒绝传入流量时,需要添加规则以允许某些可接受的传入连接。这样的规则在安全社区中被称为白名单。

另一方面,如果将传入策略更改为“允许所有流量”,则所有传入流量都会被允许,除非为必须阻止的特定类型的连接创建了规则。这些规则,毫无疑问,被称为黑名单。黑名单/白名单方法同样适用于传入和传出连接。

15.4 创建新配置文件

虽然可以修改预定义的配置文件,但通常更有意义的是创建一个或多个配置文件来根据您的具体需求配置防火墙。通过选择“编辑”->“偏好设置...”菜单选项来创建新配置文件,弹出对话框如图 15-2 所示:

图 15-2

要添加新配置文件,请点击位于配置文件列表下方的“+”按钮。一个名为“Profile 1”的新配置文件将出现在列表中。要为配置文件提供更具描述性的名称,双击该条目进入编辑模式并输入新名称:

图 15-3

配置文件创建并命名后,点击“关闭”按钮返回主屏幕,从配置文件菜单中选择它并打开状态切换开关:

图 15-4

选择自定义配置文件后,可以设置一些自定义规则来覆盖默认的传入和传出设置。

15.5 添加预配置的防火墙规则

新规则通过点击“规则”按钮,然后点击位于规则面板底部的“+”按钮创建,如图 15-5 所示:

图 15-5

一旦选择,对话框将显示图 15-6,并且预配置选项卡被选中。预配置面板允许选择匹配特定应用程序和服务的规则。例如,可以通过选择应用程序菜单中的条目,并相应地选择策略和方向菜单来限制或允许来自 Skype 和 BitTorrent 等工具的流量。

为了帮助查找特定的应用程序或服务,可以使用类别和子类别菜单来过滤显示在应用程序菜单中的项。或者,只需在应用程序过滤器字段中输入应用程序或服务名称,以过滤菜单项:

图 15-6

“策略”菜单提供了以下选项来控制所选应用程序或服务的流量:

• 允许 – 该端口的流量被允许。

• 拒绝 – 该端口上的流量不被允许。请求的系统不会收到拒绝通知。数据包将被直接丢弃。

• 拒绝 - 该端口上的流量不被允许。数据包被丢弃,且请求系统会收到拒绝通知。

• 限制 – 如果相同的 IP 地址在 30 秒内尝试建立 6 次或更多连接,则拒绝连接。

一旦定义了规则,点击“添加”按钮将实现该规则,关闭添加规则对话框,新的规则将在 gufw 工具的主屏幕中列出(包括 IPv4 和 IPv6 协议的规则):

图 15-7

要删除规则,在列表中选择它,然后点击对话框底部的“-”按钮。同样,可以通过选择现有规则并点击“-”按钮右侧的齿轮按钮来编辑规则。

15.6 添加简单防火墙规则

而预配置的规则允许根据众所周知的服务和应用程序配置防火墙,添加规则对话框的简单选项卡则允许通过引用相应的 TCP/IP 端口来简单地定义进出规则。已知应用程序和服务使用的端口仅代表可供应用程序使用的端口的一个小子集,并且可能需要为其定义防火墙规则。例如,一个第三方应用程序可能使用端口 5700 与远程服务器进行通信。如果是这种情况,则可能需要使用简单面板允许此特定端口的流量:

图 15-8

该规则可以配置为过滤 TCP、UDP 或两种流量类型。此外,可以将端口指定为单个端口号,或指定一个端口范围,起始端口和结束端口通过冒号分隔(例如,1000:1500 将规则应用于 1000 到 1500 之间的所有端口)。另外,也可以输入与该端口相关联的服务名称(例如,https 或 ssh)。

15.7 添加高级规则

到目前为止,我们只看过控制阻止流量类型的规则(例如,阻止端口 22 上的传入流量),不考虑流量的来源或目的地。然而,通常情况下,需要定义规则来基于 IP 地址或 IP 地址范围允许或拒绝流量。

为了举个例子,假设本地系统的 IP 地址为 192.168.0.102。可以配置防火墙仅允许来自 IP 地址为 192.168.0.105 的系统通过端口 22 访问。例如,为了实现这一点,“高级设置”面板中的“来源”字段应设置为请求连接的系统的 IP 地址(在本例中为 192.168.0.105)。

To: 字段提供了指定连接目标系统的 IP 地址和端口的选项。在此示例中,这将是本地系统(192.168.0.102)的端口 22。To: IP 地址实际上是可选的,可以留空:

图 15-9

假设默认的传入策略仍然设置为“拒绝”或“拒绝连接”,上述规则将仅允许来自 IP 地址为 192.168.0.105 的远程系统通过端口 22 访问本地系统。来自其他 IP 地址系统的 SSH 访问尝试将失败。请注意,如果目标系统是本地系统,则可以将 To: IP 地址字段留空。

上述对话框中的插入字段允许将新规则插入到现有规则列表中的指定位置,从而允许您控制规则在防火墙中应用的顺序。

还可以通过使用 IP 地址位掩码指定地址范围。例如,要为从 192.168.0.1 到 192.168.0.255 的 IP 地址范围创建规则,应将 IP 地址输入到 From: 字段中,格式为 192.168.0.0/24。

同样,要指定一个涵盖 IP 地址范围从 192.168.0.1 到 192.168.0.30 的规则,应该使用位掩码 27,即 192.168.0.0/27。

一个有用的计算器,用于识别每个位掩码值所涵盖的地址范围,可以在网上找到,网址是 subnet-calculator.com

15.8 使用 ufw 从命令行配置防火墙

通过图形化 gufw 工具提供的所有防火墙配置选项也可以通过底层的命令行使用 ufw 命令进行配置。

要启用或禁用防火墙:

ufw enable

ufw disable

可以使用 status 选项获取防火墙的当前状态:

ufw status

状态:活动

到 动作 来自


22 ALLOW 192.168.86.30

要获取更多详细的状态信息,请将上述命令与 verbose 选项结合使用:

ufw status verbose

状态:活动

日志:开启(完整)

默认:拒绝(传入),允许(传出),拒绝(路由)

新配置文件:跳过

到 动作 来自


22 ALLOW IN 192.168.86.30

上例中的输出显示,防火墙的默认策略是拒绝所有传入和路由连接,同时允许所有传出连接。要更改这些默认设置,请使用带有 default 选项的 ufw 命令,语法如下:

ufw default <策略> <方向>

例如,要默认启用所有传入连接:

ufw default allow incoming

要允许或阻止特定端口的流量,请使用以下语法:

ufw <策略> <端口号>/<可选协议>

例如,要允许端口 30 上的 TCP 和 UDP 传入流量:

ufw allow 30

同样,要拒绝端口 5700 上的传入 TCP 流量:

ufw deny 5700/tcp

规则也可以通过引用与端口对应的服务名称来声明。例如,要启用端口 22 上的 SSH 访问:

ufw allow ssh

与 gufw 工具一样,ufw 也允许控制来自特定外部 IP 地址的访问。例如,要允许来自 IP 地址 192.168.0.20 的所有传入流量:

ufw allow from 192.168.0.20

要特别拒绝来自某个 IP 地址的流量:

ufw deny 192.168.0.20

要将 IP 地址 192.168.0.20 的访问限制为仅端口 22:

ufw allow from 192.168.0.22 to any port 22

要进一步限制 IP 地址的访问仅限 TCP 数据包,请使用以下语法:

ufw allow from 192.168.0.20 to any port 22 proto tcp

新规则在现有规则列表中的位置可以通过使用 insert 选项来声明。例如,要创建一个新规则并将其插入到规则列表的第 3 位:

ufw insert 3 allow from 192.168.0.123 to any port 2

要显示带有关联编号的规则列表:

ufw status numbered

状态:激活

To Action From


[ 1] 22 允许进入 192.168.86.30

[ 2] 30 允许进入 任何地方

[ 3] 22 允许进入 192.168.0.123

[ 4] 5700/tcp 拒绝进入 任何地方

[ 5] 22/tcp 允许进入 任何地方

[ 6] 任何地方 允许进入 192.168.0.20

[ 7] 22 允许进入 192.168.0.4

[ 8] 30 (v6) 允许进入 任何地方 (v6)

[ 9] 5700/tcp (v6) 拒绝进入 任何地方 (v6)

[10] 22/tcp (v6) 允许进入 任何地方 (v6)

在确定了规则分配的号码后,可以使用该号码将规则从防火墙中移除:

ufw delete 4

要获取 ufw 工具的完整功能列表,可以运行带有–help参数的命令:

ufw help

防火墙活动的日志记录可以通过使用命令行选项来启用和禁用:

ufw logging on

ufw logging off

也可以声明 ufw 执行的日志记录量,包括在开启日志记录时选择低、中、高或完全设置,例如:

ufw logging on low

ufw 日志文件可以在以下位置找到:

/var/log/ufw.log

使用 reload 选项重新启动防火墙并重新加载所有当前设置:

ufw reload

最后,要将防火墙重置为默认设置(从而移除所有现有规则和设置):

ufw reset

15.9 总结

任何连接到其他系统的计算机,无论是通过内部网络还是通过互联网连接,都应该实现某种形式的防火墙,以减轻攻击的风险。Ubuntu 提供的简单防火墙(ufw)提供了一种简单但有效的防火墙,允许通过命令行或图形化的 gufw 工具定义基本规则。本章概述了启用防火墙和配置防火墙规则的基础知识。

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

所有的 Linux 发行版都提供某种形式的防火墙解决方案。在 Ubuntu 中,这种防火墙形式是前一章节中介绍的简化防火墙(Uncomplicated Firewall)。本章节将介绍一种更高级的防火墙解决方案——firewalld,它适用于 Ubuntu。

16.1 firewalld 简介

firewalld 最初为基于 Red Hat 的 Linux 发行版开发,它使用一组规则来控制传入的网络流量,并定义哪些流量应该被阻止,哪些流量应该允许通过到系统。firewalld 建立在一个更复杂的防火墙工具 iptables 之上。

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

与常见的安全实践一致,默认的 firewalld 安装配置会阻止所有访问,只有 SSH 远程登录和系统用于获取动态 IP 地址的 DHCP 服务被允许(这两个服务对于系统管理员在安装完成后能访问系统是必不可少的)。

在 Ubuntu 上配置防火墙的关键元素是区域、接口、服务和端口。

16.1.1 区域

默认情况下,firewalld 会安装一系列预配置的区域。区域是一组预先配置的规则,可以随时应用到系统上,以便快速为特定场景实现防火墙配置。例如,block 区域会阻止所有传入流量,而 home 区域则施加较少的限制,假设系统运行在一个更安全的环境中,预计该环境会具有较高的信任级别。系统可以添加新的区域,也可以修改现有的区域,来增加或移除规则。区域也可以完全从系统中删除。表 16-1 列出了在 Ubuntu 系统中默认提供的区域集:

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

表 16-1

要查看区域的特定设置,请参阅位于系统 /usr/lib/firewalld/zones 目录中的相应 XML 配置文件。例如,以下列出了 public.xml 区域配置文件的内容:

Public

用于公共区域。你不信任网络上的其他计算机不会对你的计算机造成损害。只接受选定的传入连接。

16.1.2 接口

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

16.1.3 服务

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

16.1.4 端口

尽管在添加 firewalld 规则时可以引用常见的 TCP/IP 服务,但也会出现需要允许特定端口的传入连接的情况,这些端口并未分配给任何服务。可以通过添加引用特定端口的规则来实现这一点,而不是使用服务。

16.2 检查 firewalld 状态

firewalld 服务在所有 Ubuntu 安装中通常默认未安装和启用。可以通过以下命令检查服务的状态:

第十六章:systemctl status firewalld

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

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

活动状态:活动(运行中),自 2023-07-17 19:21:53 UTC 起运行;16 秒前

文档:man:firewalld(1)

主 PID:27151 (firewalld)

任务:2(限制:4517)

内存:24.0M

CPU:244ms

CGroup:/system.slice/firewalld.service

└─27151 /usr/bin/python3 /usr/sbin/firewalld --nofork --nopid

Jul 17 19:21:53 demoserver systemd[1]: 正在启动 firewalld - 动态防火墙守护进程...

Jul 17 19:21:53 demoserver systemd[1]: 已启动 firewalld - 动态防火墙守护进程。

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

apt install firewalld

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

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

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

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

firewall-cmd --reload

要使更改永久生效,必须使用 --permanent 命令行选项。永久更改直到 firewalld 服务重新加载时才会生效,但在手动更改之前会一直保持。

16.3.1 确定和更改默认区域

要确定默认区域(换句话说,除非特别选择其他区域,否则所有接口将分配到该区域),可以按如下方式使用 firewall-cmd 工具:

firewall-cmd --get-default-zone

公共

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

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

成功

16.3.2 显示区域信息

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

firewall-cmd --get-zones

屏蔽 dmz 丢弃 外部 家庭 内部 公共 可信 工作

获取当前激活的区域列表及其分配的接口,如下所示:

firewall-cmd --get-active-zones

外部

接口:eth0

内部

接口:eth1

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

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

home (已激活)

target: 默认

icmp 阻止反转:否

接口:eth0

源:

服务:cockpit dhcpv6-client http mdns samba-client ssh

端口:

协议:

伪装:否

转发端口:

源端口:

icmp 阻止:

丰富规则:

使用以下命令列出当前可用于包含在 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

16.3.3 添加和删除区域服务

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

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

成功

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

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

成功

要验证服务是否已永久添加,请确保在请求服务列表时包括 --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

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

16.3.5 创建新区域

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

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

成功

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

firewall-cmd --reload

成功

16.3.6 更改区域/接口分配

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

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

success

16.3.7 伪装

伪装在网络管理领域更为人知的术语是网络地址转换(NAT)。当使用 Ubuntu 系统作为计算机网络的互联网网关时,伪装允许所有内部系统在通过互联网通信时使用该 Ubuntu 系统的 IP 地址。这有助于隐藏任何系统的内部 IP 地址,避免外部恶意实体的攻击,并且无需为网络中的每台计算机分配公共 IP 地址。

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

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

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

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

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

16.3.9 实现端口转发

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

假设一台 Ubuntu 系统作为内部网络中计算机的防火墙,其中一台计算机配置为 Web 服务器。假设 Web 服务器的 IP 地址为 192.168.2.20,且该系统上托管的网站的域名记录配置了公共 IP 地址,该地址背后就是 Ubuntu 防火墙系统。当 HTTP 请求到达 80 端口时,作为防火墙的 Ubuntu 系统需要知道如何处理该请求。通过配置端口转发,可以将所有 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

16.4 使用 firewall-config 管理 firewalld

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

apt install firewall-config

启动时,主防火墙配置界面如图 16-1 所示:

图 16-1

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

A - 显示所有当前激活的接口及其分配的区域。要将接口分配到不同的区域,选择该接口,点击“更改区域”按钮,并从弹出的对话框中选择所需的区域。

B - 控制工具中显示的信息和所做的任何更改是应用于运行时规则还是永久规则。

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

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

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

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

firewall-config 工具简单直观,易于使用,并且允许在图形环境中执行许多 firewall-cmd 提供的任务。

16.5 总结

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

firewalld 服务使用区域的概念将一组防火墙规则进行分组,并包括一套预定义的区域,旨在满足不同的防火墙保护需求。这些区域可以修改以添加或删除规则,或者创建和配置全新的区域。系统上连接到网络或互联网的网络设备被称为接口。每个接口依次被分配到一个区域。与 firewalld 配合使用的主要工具是 firewall-cmd 命令行工具和 firewall-config 图形工具。

  1. 配置 Ubuntu 23.04 上的 SSH 密钥身份验证

当首次安装 Ubuntu 系统时,默认配置允许通过安全外壳(SSH)连接进行远程命令行访问。SSH 提供了对系统的密码保护和加密访问,适用于 root 账户以及安装过程中添加的其他用户。然而,这种安全级别不够,应该尽快升级为基于 SSH 密钥的身份验证。

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

17.1 安全外壳(SSH)概述

SSH 允许安全地远程访问系统,获得 shell 访问权限并进行文件和数据传输。基本的 SSH 配置由客户端(用于建立连接的计算机)和服务器(运行在要建立连接的系统上)组成。例如,用户可能会使用在 Linux、Windows 或 macOS 系统上运行的 SSH 客户端连接到在 Ubuntu 系统上运行的 SSH 服务器,以获得 shell 命令行提示符或执行文件传输。客户端和服务器之间的所有通信,包括输入的密码,都进行了加密,以防止外部方拦截数据。

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

17.2 SSH 密钥身份验证

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

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

在 SSH 密钥身份验证的情况下,主机保留私钥,而 SSH 客户端位于该主机上,公钥则保存在运行 SSH 服务器的系统上。因此,保护私钥至关重要,因为私钥的拥有者可以登录远程系统。作为额外的保护措施,私钥还可以加密并用密码保护,每次建立与服务器的连接时都必须输入该密码。

17.3 设置基于密钥的身份验证

设置基于密钥的 SSH 身份验证有四个步骤,概括如下:

  1. 生成公钥和私钥。

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

  3. 测试身份验证。

  4. 禁用服务器上的基于密码的身份验证。

本章的其余部分将详细介绍适用于 Linux、macOS 和 Windows 客户端操作系统的这些步骤。

17.4 安装和启动 SSH 服务

如果系统上尚未安装并运行 SSH 服务器,可以使用以下命令进行安装:

第十七章:apt install openssh-server

systemctl start ssh.service

systemctl enable ssh.service

17.5 基于 SSH 密钥的身份验证(适用于 Linux 和 macOS 客户端)

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

ssh-keygen

此命令将输出类似以下内容:

正在生成公钥/私钥 RSA 密钥对。

输入要保存密钥的文件(/home//.ssh/id_rsa):

按下回车键接受密钥文件的默认位置。这会将两个文件放入当前用户主目录下的 .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

如果私钥已加密并用密码短语保护,请在提示时输入该短语,以完成身份验证并建立对 Ubuntu 系统的远程访问:

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

上次登录:2023 年 3 月 31 日 星期五 14:29:28 来自 192.168.86.21

[neil@demosystem02 ~]$

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

按照当前配置,仍然可以通过较不安全的密码验证访问远程系统。一旦验证了基于密钥的身份验证有效,系统上将需要禁用密码身份验证。要了解如何更改此设置,请首先打开 /etc/ssh/sshd_config 文件并定位到以下行:

包含 /etc/ssh/sshd_config.d/*.conf

这告诉我们,sshd 配置设置由 /etc/ssh/sshd_config.d 目录中的文件控制。这些文件名必须以数字为前缀,并且具有 .conf 文件扩展名,例如:

01-permitrootlogin.conf

50-cloud.conf

数字前缀表示该文件相对于文件夹中其他文件的优先级,其中 01 是最高优先级。这确保了如果配置文件中包含与其他文件冲突的设置,优先级最高的文件始终会优先使用。

在 /etc/ssh/sshd_config.d 文件夹内,创建一个名为 02-nopasswordlogin.conf 的新文件,内容如下:

PasswordAuthentication no

保存文件并重新启动 sshd 服务以实现更改:

systemctl restart sshd.service

从此以后,只能通过 SSH 密钥身份验证远程访问系统,并且在这样做时,不需要输入密码。

17.6 管理多个密钥

在客户端系统上,通常会存在多个私钥,每个私钥提供对不同服务器的访问。因此,在建立连接时,可以选择特定的密钥,存在几种选择方式。例如,可以在启动 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

用户 neilsmyth

Host home

HostName 192.168.0.21

IdentityFile ~/.ssh/id_home

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

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

但是,现在该命令可以简化如下:

$ ssh work

配置文件选项的完整列表可以通过运行以下命令来查看:

$ man ssh_config

17.7 基于 SSH 密钥的 Windows 客户端身份验证

Windows 的最新版本包括一个子集的 OpenSSH 实现,这个实现被大多数 Linux 和 macOS 系统使用,作为 Windows PowerShell 的一部分。这使得可以从 Windows 客户端设置基于 SSH 密钥的身份验证,使用类似于上述 Linux 和 macOS 的步骤。

在 Windows 上,搜索“Windows PowerShell”并从结果中选择它。启动后,PowerShell 窗口将显示,如 图 17-1 所示:

图 17-1

如果你已经有来自另一个客户端系统的私钥,将 id_rsa 文件复制到 Windows 系统上名为 .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 需要安装到远程 Ubuntu 系统上。不幸的是,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 系统的公钥文件内容粘贴到该文件中。

如果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

公钥安装到服务器后,通过 PowerShell 窗口登录到服务器进行身份验证测试,例如:

PS C:\Users\neil.ssh> ssh -l neil 192.168.1.100

输入密钥‘C:\Users\neil.ssh\id_rsa’的密码短语:

当为所有帐户设置并验证了基于密钥的身份验证后,按照上一节末尾的说明,在 Ubuntu 系统上禁用密码验证。

17.8 使用 PuTTY 的 SSH 密钥验证

对于没有 OpenSSH 的 Windows 系统,或作为比使用 PowerShell 更灵活的替代方案,PuTTY 工具是广泛使用的替代工具。使用 PuTTY 的第一步是在需要 SSH 客户端的任何 Windows 系统上下载并安装它。PuTTY 是一个免费的实用程序,可以通过以下链接下载:

www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

下载与您的 Windows 系统(32 位或 64 位版本可选)匹配的 Windows 安装程序可执行文件,然后执行该安装程序以完成安装。

如果私钥已经存在于另一个系统上,请在当前用户的主文件夹中创建.ssh文件夹,并将私有id_rsa密钥复制到该文件夹中。

接下来,需要使用 PuTTYgen 工具将私钥文件转换为 PuTTY 私钥格式文件。通过在 Windows 开始菜单的搜索栏中输入“PuTTY Key Generator”来找到该工具并启动它:

图 17-2

启动后,点击位于操作部分的“加载”按钮,导航到之前复制到 .ssh 文件夹中的私钥文件(请注意,可能需要将文件类型过滤器更改为“所有文件 (.)”才能看到密钥文件)。找到后,选择该文件并将其加载到 PuttyGen 中。当提示时,输入最初用于加密文件的密码短语。私钥导入后,点击“保存私钥”按钮将其保存为 PuTTY 密钥文件。为了保持一致性,将密钥文件保存到 .ssh 文件夹中,但为其命名一个不同的名称,以便与原始密钥文件区分开。

从开始菜单启动 PuTTY,并在主屏幕中输入远程服务器的 IP 地址或主机名,然后选择左侧面板中的连接 -> SSH -> 身份验证 -> 凭据类别,如图 17-3 中所示:

图 17-3

点击“浏览”按钮,选择认证用的私钥字段旁边的按钮,导航到并选择之前保存的 PuTTY 私钥文件。然后,可选地,滚动到左侧面板的顶部,选择“会话”条目,在“保存的会话”字段中输入会话名称,然后点击“保存”按钮。这样可以将会话配置保存以供将来使用,而无需每次重新输入设置。

最后,点击“打开”按钮以建立与远程服务器的连接,在提示时输入用户名和密码短语,以完成身份验证。

17.9 使用 PuTTYgen 生成私钥

前一节探讨了在使用 PuTTY 时如何使用现有的私钥和公钥。如果密钥不存在,可以使用包括在 PuTTY 主安装包中的 PuTTYgen 工具来创建。

要创建新密钥,启动 PuttyGen 并点击图 17-4 中高亮显示的生成按钮:

图 17-4

将鼠标指针移动到指定位置以生成随机数据,然后输入一个可选的密码短语来加密私钥。一旦密钥生成完毕,使用“保存公钥”和“保存私钥”按钮将文件保存到适当的位置。如前一节所述,私钥可以与 PuTTY 一起使用。要在远程服务器上安装公钥,请按照前一节中关于在 Windows 上使用 PowerShell 配置 SSH 的步骤操作。

17.10 总结

任何远程访问 Ubuntu 系统的操作都必须以提供高水平安全性的方式进行。默认情况下,SSH 允许通过基于密码的身份验证进行远程系统访问。然而,这使得系统容易受到猜测密码或通过其他手段获取密码的攻击。因此,建议使用基于密钥的身份验证来保护系统访问。基于密钥的身份验证采用公钥加密技术,涉及公钥和私钥。当实现后,用户只有在使用与服务器上公钥匹配的私钥的客户端时,才能连接到服务器。作为附加的安全层,私钥也可以进行加密并设置密码保护。一旦实现了基于密钥的加密,服务器系统会被配置为禁用对不太安全的基于密码的身份验证的支持。

本章概述了 SSH 基于密钥的身份验证,并概述了在 macOS、Linux 和 Windows 上生成密钥、配置客户端,以及在 Ubuntu 服务器上安装和管理公钥的步骤。

  1. Ubuntu 23.04 使用 Vino 远程桌面访问

Ubuntu 可以配置为通过网络或互联网连接提供远程访问图形桌面环境。虽然默认情况下没有启用,但从网络或互联网上的其他系统显示和访问 Ubuntu 桌面相对简单。这可以在目标系统运行 Linux、Windows 或 macOS 的情况下实现。实际上,甚至有可供 Android 和 iOS 使用的应用程序,可以让你在几乎任何有数据信号的地方访问 Ubuntu 桌面。

远程桌面访问在多种场景中都非常有用。它使你或其他人能够从另一个计算机系统(无论是在同一网络上还是通过互联网)查看和互动你的 Ubuntu 桌面环境。例如,当你外出旅行时,如果需要在离开办公桌的情况下继续工作,远程桌面访问非常有用。它也适用于需要同事或 IT 支持人员访问你的桌面以解决问题的情况。

Ubuntu 远程桌面支持使用虚拟网络计算(VNC)或微软的远程桌面协议(RDP)进行连接。使用 RDP 的一个优势是,它使 Ubuntu 桌面更容易从 Windows 客户端访问。因此,本章将重点介绍如何在 Ubuntu 中配置和使用 RDP 远程桌面。

18.1 远程桌面访问类型

在开始之前,重要的是要理解,远程桌面访问基本上有两种类型。本章所讨论的方法适用于你主要使用 Ubuntu 作为桌面操作系统,并需要远程访问你常用的桌面会话。当配置完成后,你将接管桌面会话,并远程查看和控制它。

第二种选项适用于你需要在远程服务器系统上启动和访问一个或多个远程桌面会话的情况,无论远程系统是否连接了图形控制台。这允许你在远程系统的后台启动多个桌面会话,并通过网络或互联网连接查看和控制这些桌面。

18.2 安全与不安全的远程桌面访问

本章中,我们将介绍安全和不安全的远程桌面访问方法。假设你是在安全的内部网络环境下,从一台系统访问另一台系统,那么使用不安全的访问方法通常是安全的。另一方面,如果你计划通过任何公共网络远程访问你的桌面,你必须使用安全的访问方法,以避免系统和数据被泄露。

18.3 在 Ubuntu 上启用远程桌面访问

Ubuntu 的远程桌面由 Vino 包提供。Vino 是一个专门为 GNOME 桌面开发的远程桌面服务器。

启用远程访问的第一步是安装此包:

第十八章:apt install vino

安装完 Vino 后,下一步是在 GNOME 中启用远程桌面访问。首先打开设置应用程序,如图 18-1 所示:

图 18-1

在设置应用程序中,选择共享选项(图 18-2 中标记为 A):

图 18-2

打开共享开关(B),然后点击远程桌面选项(C),以显示如下所示的对话框(图 18-3):

图 18-3

远程桌面对话框提供以下配置选项来管理远程桌面访问:

•远程桌面 - 控制是否允许远程桌面访问。

•远程控制 - 如果启用,远程会话将能够使用鼠标和键盘与桌面环境进行交互。如果禁用此选项,远程会话将只能查看桌面。

•用户名和密码 - 远程访问桌面时需要的用户名和密码。

配置好设置后,关闭远程桌面和设置对话框。

18.4 连接到共享桌面

虽然远程桌面查看器有许多操作系统版本可供选择,但建议在从 Ubuntu 或其他基于 Linux 的系统进行连接时使用像 Remmina 这样的工具。Remmina 是一款用户友好的工具,具有图形界面,支持 Vino 使用的加密技术,以确保安全的远程连接。

Remmina 通常默认安装在 Ubuntu 上,但如有需要,可以通过以下方式安装:

apt install remmina

在远程 Linux 计算机上启动 Remmina,并将连接类型菜单(图 18-4 中标记为 A)更改为 RDP,然后在地址栏(B)中输入您希望连接的远程系统的 IP 地址或主机名(您也可以使用标记为 C 的按钮创建并保存连接):

图 18-4

要建立连接,按下键盘上的回车键开始连接过程。点击以接受证书,之后将显示第二个屏幕,要求输入桌面访问密码:

图 18-5

输入密码后,点击确定以访问远程屏幕:

图 18-6

18.5 从 Windows 连接

因为我们已经配置了 Vino 来使用 RDP,所以 Windows 客户端也可以通过微软的远程桌面连接应用程序访问 Ubuntu 桌面。在 Windows 系统上,启动远程桌面连接并点击右下角的“显示选项”按钮,以显示额外的配置设置。输入 Ubuntu 系统的主机名或 IP 地址,以及在本章之前配置的用户名:

图 18-7

点击连接按钮,当提示时,输入密码以访问 Ubuntu 桌面:

图 18-8

18.6 小结

可以通过使用虚拟网络计算(VNC)或远程桌面协议(RDP)来启用对 Ubuntu 系统 GNOME 桌面环境的远程访问。VNC 和 RDP 由远程服务器上的服务器和本地主机上的相应客户端组成,它们允许远程访问在服务器上运行的桌面实例。

GNOME 桌面的标准远程服务器解决方案是 Vino。安装完成后,可以通过使用远程桌面查看器(如 Remmina)从其他 Linux 系统建立远程桌面会话。当使用 RDP 时,Windows 和 Mac 系统也可以通过微软远程桌面连接应用程序访问该桌面。

  1. 显示 Ubuntu 23.04 应用程序的远程方法(X11 转发)

在上一章中,我们讨论了如何在远程计算机上显示整个 Ubuntu 桌面。虽然这种方法非常适合需要远程显示整个桌面的情况,但如果你只想显示单个应用程序,这可能有些过于复杂。因此,本章将介绍如何在远程系统上显示单个应用程序。

19.1 远程显示 Ubuntu 应用程序的要求

在运行一个应用程序并在另一个 Ubuntu 系统上显示时,有一些先决条件。首先,要显示应用程序的系统必须运行 X 服务器。如果系统是运行桌面环境的 Linux 或 UNIX 系统,则没有问题。然而,如果系统运行的是 Windows 或 macOS,则必须在其上安装 X 服务器,才能从远程系统显示应用程序。市场上有多种商业和免费的 Windows 基于的 X 服务器可以使用,网络搜索应能提供相关选项列表。

其次,运行应用程序的系统(与显示应用程序的系统不同)必须配置为允许 SSH 访问。关于如何在 Ubuntu 系统上配置 SSH 的详细信息,可以参阅章节 “在 Ubuntu 23.04 上配置基于 SSH 密钥的认证”。该系统还必须运行 X.org 的 X Window 系统,而非 Wayland。要在桌面中启用 X.org 系统,首先退出 Gnome 桌面,选择登录屏幕中的用户账户,然后点击屏幕右下角的设置按钮:

图 19-1

在登录时,选择菜单中的 GNOME on Xorg 选项。要恢复为 Wayland,重复这些步骤,并从登录屏幕的设置菜单中选择 Ubuntu 选项。

另一种方法是编辑 /etc/gdm3/custom.conf 文件,取消注释 WaylandEnable 行,如下所示,并重启系统:

第十九章:取消注释以下行,以强制登录屏幕使用 Xorg

WaylandEnable=false

一旦你重新登录到桌面,打开终端窗口并运行以下命令以确认 X.org 系统已启用:

$ echo $XDG_SESSION_TYPE

上述命令将根据当前配置输出 x11 或 wayland。

最后,必须配置 SSH 以允许 X11 转发。通过向用于转发的系统的 SSH 配置文件中添加以下指令来实现此目的。默认情况下,Ubuntu 的 /etc/ssh/sshd_config 文件包含一条指令,用于包含 /etc/ssh/sshd_config.d 目录中的所有配置文件:

Include /etc/ssh/sshd_config.d/*.conf

在 /etc/ssh/sshd_config.d 文件夹中创建一个名为 05_x11forwarding 的新文件,并编辑它以启用 X11Forwarding 属性,内容如下:

X11Forwarding yes

更改后,保存文件并重新启动 SSH 服务:

systemctl restart ssh

一旦满足上述要求,就可以远程显示基于 X 的桌面应用程序。请记住,并非所有 GNOME 应用程序都与 X11 转发兼容。如果某个应用程序不兼容,当你尝试使用 X11 转发运行它时,以下错误将出现:

因身份验证错误,X11 连接被拒绝。

19.2 远程显示 Ubuntu 应用

远程显示应用程序的第一步是转到要显示应用程序的系统。在此系统上,建立与远程系统的 SSH 连接,以便获得命令提示符。这可以通过使用 ssh 命令来实现。在使用 ssh 命令时,我们需要使用 -X 标志来告诉它,我们计划通过连接隧道传输 X11 流量:

$ ssh -X user@hostname

在上述示例中,user 是用于登录远程系统的用户名,hostname 是远程系统的主机名或 IP 地址。在登录提示符处输入密码,登录后运行以下命令以查看 DISPLAY 设置:

$ echo $DISPLAY

该命令应输出类似以下内容:

localhost:10.0

要显示应用程序,从命令提示符运行它。例如:

$ xclock

执行时,上述命令应在远程系统上运行 xclock,但在本地系统上显示用户界面。

19.3 受信 X11 转发

你还可以通过向 05_x11forwarding 文件中添加以下行并重新启动 ssh 服务器来启用受信 X11 转发:

ForwardX11Trusted yes

受信 X11 转发比不受信转发稍微快一些,但由于未启用 X11 安全控制,它的安全性较低。使用受信 X11 转发时需要使用 -Y 标志:

$ ssh -Y user@hostname

19.4 压缩 X11 转发

在使用较慢的连接时,可以通过使用 ssh -C 标志来压缩 X11 数据,以提高性能:

$ ssh -X -C user@hostname

19.5 在 Windows 上显示远程 Ubuntu 应用

要在 Windows 上显示基于 Ubuntu 的应用程序,必须在 Windows 系统上安装 SSH 客户端和 X 服务器。本书之前在 《在 Ubuntu 23.04 上配置基于 SSH 的身份验证》 一章中介绍了如何在 Windows 上安装和使用 PuTTY 客户端。如果你还没有在 Windows 系统上安装 PuTTY,请参考本章。

就 X 服务器而言,有几种选择,但流行的选择似乎是 VcXsrv,它可以从以下网址免费下载:

sourceforge.net/projects/vcxsrv/

安装 VcXsrv X 服务器后,桌面和开始菜单中将出现名为 XLaunch 的应用程序。启动 XLaunch 并选择显示选项(最灵活的是“多窗口”选项,它允许每个客户端应用程序在自己的窗口中显示):

图 19-2

点击下一步按钮,继续完成剩余的界面,接受默认配置设置。在最后一个界面上,点击完成按钮以启动 X 服务器。如果出现 Windows Defender 对话框,请点击按钮允许访问所选的网络。

启动后,XLaunch 将出现在任务栏中,可以通过右键点击图标并选择退出...菜单选项来退出:

图 19-3

在安装并启动 X 服务器后,启动 PuTTY,并输入远程主机的连接信息,或者加载之前保存的会话配置。然而,在建立连接之前,需要启用 X11 转发。因此,在 PuTTY 主窗口中,向下滚动左侧面板的选项,展开 SSH 部分,选择 X11 选项,如 图 19-4 所示:

图 19-4

启用 图 19-5 中突出显示的启用 X11 转发复选框,返回会话屏幕,并打开连接(如果计划再次使用该会话,请提前保存):

图 19-5

在 PuTTY 会话窗口中登录到 Ubuntu 系统并运行桌面应用程序。经过短暂的延迟后,应用程序将出现在 Windows 桌面上并以独立窗口显示。应用程序打开的任何对话框也会以独立窗口的形式出现,就像在 Ubuntu GNOME 桌面上一样。例如,图 19-6 显示了 Ubuntu nm-connection-editor 工具在 Windows 11 系统上的显示:

图 19-6

19.6 总结

对于需要远程访问单个 Ubuntu 桌面应用程序而不是整个 GNOME 桌面的情况,X11 转发提供了一种轻量级的解决方案,用于远程显示图形应用程序。应用程序要显示的系统必须运行基于 X Window 系统的桌面环境(如 GNOME),或者安装并运行 X 服务器。一旦在远程服务器上启用 X11 转发,并使用 X11 转发选项从本地系统建立安全的 SSH 连接,大多数应用程序都可以在本地 X 服务器上远程显示。

20. 使用 NFS 在 Ubuntu 23.04 上共享文件与远程系统

Ubuntu 提供了两种机制,用于与网络上的其他系统共享文件和文件夹。一种方法是使用名为 Samba 的技术。Samba 基于 Microsoft Windows 文件夹共享,允许 Linux 系统使文件夹对 Windows 系统可访问,并从 Linux 访问 Windows 共享的文件夹。此方法也可以用于在其他 Linux 和 UNIX 系统之间共享文件夹,只要它们已安装并配置了 Samba 支持。这是异构网络环境中共享文件夹的最流行方法。使用 Samba 共享文件夹的内容在“在 Ubuntu 23.04 和 Windows 之间使用 Samba 共享文件”中有详细介绍。

另一种专门用于在 Linux 和 UNIX 系统之间共享文件夹的选项是使用网络文件系统(NFS)。NFS 允许一个 Linux 计算机上的文件系统通过网络连接被另一个 Linux 或 UNIX 系统访问。NFS 最初由 Sun Microsystems(现为 Oracle 公司的一部分)在 1980 年代开发,并且仍然是共享远程 Linux/UNIX 文件系统的标准机制。

NFS 与 Windows SMB 资源共享技术(由 Samba 使用)有很大不同。本章将探讨在 Ubuntu 与其他 UNIX/Linux 系统之间使用 NFS 进行网络共享文件夹的方法。

20.1 确保 NFS 服务在 Ubuntu 上运行

第一个任务是验证 NFS 服务是否已经在 Ubuntu 系统上安装并运行。您可以通过命令行或 Cockpit 界面来完成此操作。

首先,通过在终端窗口运行以下命令来安装 NFS 服务:

第二十章:apt install nfs-kernel-server

接下来,配置服务以便在启动时自动启动:

systemctl enable nfs-kernel-server

服务启用后,按照以下步骤启动服务:

systemctl start nfs-kernel-server

20.2 配置防火墙以允许 NFS 流量

接下来,防火墙需要配置为允许 NFS 流量。如果启用了简化防火墙(UFW),请运行以下命令以添加一条规则,允许 NFS 流量:

ufw allow nfs

另一方面,如果您使用的是 firewalld,请运行以下 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

20.3 指定要共享的文件夹

现在 NFS 已经运行,且防火墙已配置完成,我们需要指定 Ubuntu 文件系统中哪些部分可以被远程 Linux 或 UNIX 系统访问。这些设置可以在/etc/exports 文件中声明,必须修改该文件以通过 NFS 导出目录以供远程访问。该文件中导出行的语法如下:

() ()...

在上述行中, 被替换为要导出的目录, 被替换为授予访问权限的系统的名称或 IP 地址,而 代表对该访问施加的限制(只读、读写等)。如果需要,也可以在同一行中放置多个主机和选项条目。例如,以下行允许 IP 地址为 192.168.2.38 的主机对 /datafiles 目录进行只读访问:

/datafiles 192.168.2.38(ro,no_subtree_check)

允许使用通配符将导出应用于多个主机。例如,以下行允许所有外部主机对 /home/demo 目录进行读写访问:

/home/demo *(rw,no_subtree_check)

虽然大多数 Linux 发行版默认使用推荐的 no_subtree_check 设置,但 Ubuntu 实现的 NFS 要求在所有导出指令中包含 no_subtree_check 或 subtree_check。

本章中,我们将按如下方式配置 /etc/exports 文件:

/tmp *(rw,sync,no_subtree_check)

/vol1 192.168.86.42(ro,sync,no_subtree_check)

配置完成后,NFS 服务器维护的已导出文件系统表需要使用 exportfs 命令更新为最新的 /etc/exports 设置,如下所示:

exportfs -a

也可以使用 exportfs 工具从命令行查看当前的共享设置:

exportfs

上述命令将生成以下输出:

/vol1 192.168.86.42

/tmp

20.4 访问共享文件夹

共享文件夹可以通过客户端系统从命令行手动挂载来访问。但是,在尝试挂载远程 NFS 文件夹之前,必须先在客户端系统上安装 nfs-common 软件包:

apt install nfs-common

要从命令行挂载远程文件夹,打开终端窗口并创建一个目录,以便将远程共享文件夹挂载到该目录:

$ mkdir /home/demo/tmp

接下来,输入命令以使用远程 NFS 服务器的 IP 地址或主机名挂载远程文件夹,例如:

$ sudo mount -t nfs 192.168.86.24:/tmp /home/demo/tmp

远程的 /tmp 文件夹将被挂载到本地系统。挂载后,/home/demo/tmp 文件夹将包含远程文件夹及其所有内容。

在挂载远程 NFS 文件系统时,也可以指定选项。例如,以下命令挂载相同的文件夹,但将其配置为只读:

$ sudo mount -t nfs -o ro 192.168.86.24:/tmp /home/demo/tmp

20.5 在系统启动时挂载 NFS 文件系统

也可以通过编辑 /etc/fstab 文件来配置 Ubuntu 系统在每次启动时自动挂载远程文件系统。当加载到编辑器时,它可能类似于以下内容:

/dev/disk/by-id/dm-uuid-LVM-Qv7p2RxcHOSG6RjnkgR21xkhaCQ9NC / ext4 defaults 0 1

/boot 在 curtin 安装过程中位于 /dev/nvme0n1p2 上

/dev/disk/by-uuid/aa49b362-6c42-49a6-98ba-7a256a96b4b8 /boot ext4 defaults 0 1

/boot/efi 在 curtin 安装过程中位于/dev/nvme0n1p1 上

/dev/disk/by-uuid/576B-B5F5 /boot/efi vfat defaults 0 1

例如,要挂载一个位于 IP 地址为 192.168.86.24 的系统上的/tmp 文件夹,并将其挂载到本地路径为/home/demo/tmp 的文件夹(注意该文件夹必须已经存在),请在/etc/fstab 文件中添加以下行:

192.168.86.24:/tmp /home/demo/tmp nfs rw 0 0

下次系统重启时,远程系统上的/tmp 文件夹将挂载到本地的/home/demo/tmp 挂载点。此后,远程文件夹中的所有文件可以像位于本地硬盘驱动器上一样访问。

20.6 卸载 NFS 挂载点

一旦通过 NFS 挂载了远程文件系统,就可以使用 umount 命令和本地挂载点作为命令行参数来卸载。例如,以下命令将卸载我们的示例文件系统挂载点:

$ sudo umount /home/demo/tmp

20.7 在 Cockpit 中访问 NFS 文件系统

除了使用命令行在客户端挂载远程 NFS 文件系统外,还可以通过 Cockpit Web 界面进行挂载操作。假设 Cockpit 已经在客户端系统上安装和配置好,打开 Web 浏览器登录到 Cockpit 界面,然后从左侧导航面板中选择存储选项。如果没有列出存储选项,则需要安装 cockpit-storaged 软件包:

apt install cockpit-storaged

systemctl restart cockpit.socket

一旦 Cockpit 服务重启,重新登录到 Cockpit 界面,此时应能看到存储选项。

选择后,主存储页面将包含一个列出当前挂载的 NFS 文件系统的部分,如图 20-1 所示:

图 20-1

要挂载远程文件系统,请点击上图中突出显示的“+”按钮,并在弹出的对话框中输入远程 NFS 服务器和文件系统共享的相关信息,以及本地挂载点和必要的选项,然后点击添加按钮:

图 20-2

要修改、卸载或移除 NFS 文件系统共享,请在 NFS 挂载列表中选择相应的挂载(上图中的图 20-1)以显示下方图 20-3 所示的页面:

图 20-3

在此屏幕中,可以执行更改服务器、挂载点或卸载文件系统等任务。例如,选择移除选项将卸载文件系统,并从/etc/fstab 文件中删除该条目,确保下次系统重启时不再挂载。

20.8 小结

网络文件系统(NFS)是一个基于客户端/服务器的系统,最初由 Sun Microsystems 开发,它为 Linux 和 Unix 系统提供了一种通过网络共享文件系统的方式。NFS 允许客户端系统像访问本地文件系统一样访问和(根据权限)修改位于远程服务器上的文件。 本章提供了 NFS 的概述,并概述了使用命令行或 Cockpit 网页界面配置客户端和服务器系统的选项。

  1. 在 Ubuntu 23.04 和 Windows 之间使用 Samba 共享文件

尽管 Linux 在桌面市场上已有一定进展,但其起源和未来仍然是以服务器为主。因此,Ubuntu 作为文件服务器并不令人惊讶。Ubuntu 和 Windows 系统通常会在网络环境中并行使用。因此,一个常见的需求是让 Ubuntu 系统上的文件能够通过网络连接被 Linux、UNIX 和 Windows 系统访问。同样,存储在 Windows 系统上的共享文件夹和打印机也可能需要从 Ubuntu 系统访问。

Windows 系统使用服务器消息块(SMB)协议共享资源,如文件系统和打印机。为了让 Ubuntu 系统通过网络向 Windows 系统提供这些资源,反之亦然,它必须支持 SMB。这是通过一种叫做 Samba 的技术实现的。除了提供 Linux 和 Windows 系统之间的集成,Samba 还可以提供 Linux 系统之间的文件夹共享(作为前一章中涉及的 NFS 的替代方案)。

本章将介绍在 Ubuntu 系统上共享文件系统资源和打印机给远程 Windows 和 Linux 系统,以及从 Ubuntu 访问 Windows 资源的步骤。

21.1 从 GNOME 桌面访问 Windows 资源

在深入了解 Samba 共享的更多细节之前,值得注意的是,如果你仅仅是想从 GNOME 桌面访问 Windows 共享文件夹,那么 GNOME 文件应用程序已经提供了支持。文件应用程序位于仪表板中,如 图 21-1 所示:

图 21-1

启动后,选择左侧导航面板中的“其他位置”选项,然后在主面板中选择 Windows 网络图标以浏览可用的 Windows 资源:

图 21-2

21.2 Samba 和 Samba 客户端

Samba 允许将 Ubuntu 资源与 Windows 系统共享,同时也允许将 Windows 资源与 Ubuntu 系统共享。Ubuntu 使用 Samba 客户端访问 Windows 资源。另一方面,通过安装和配置 Samba 服务,Ubuntu 资源可以与 Windows 系统共享。

21.3 在 Ubuntu 上安装 Samba

在 Ubuntu 安装过程中使用的默认设置通常不会安装必要的 Samba 包。除非你特别请求安装 Samba,否则系统上不太可能已经安装 Samba。要检查是否安装了 Samba,可以打开终端窗口并运行以下命令,查看每个包是否有 [installed] 标记:

第二十一章:apt -qq list samba-common samba smbclient

任何缺失的包可以通过 apt 命令行工具安装:

apt install samba-common samba smbclient

21.4 配置 Ubuntu 防火墙以启用 Samba

接下来,保护 Ubuntu 系统的防火墙必须配置为允许 Samba 流量。如果你使用的是简单防火墙(ufw),请运行以下命令:

ufw allow samba

或者,如果你使用的是 firewalld,请按如下方式运行 firewall-cmd 命令:

firewall-cmd --permanent --add-port=

firewall-cmd --reload

在启动 Samba 服务之前,需要进行一些配置步骤,来定义 Ubuntu 系统在 Windows 系统中如何显示以及要与远程客户端共享的资源。大部分配置任务都发生在 /etc/samba/smb.conf 文件中。

21.5 配置 smb.conf 文件

Samba 是一个高度灵活且可配置的系统,提供了许多选项来控制 Windows 网络上资源的共享方式。不幸的是,这种灵活性可能导致 Samba 给人一种过于复杂的感觉。然而,实际上,典型的安装并不需要许多配置选项,设置基本配置的学习曲线相对较短。

在本章中,我们将介绍如何将 Ubuntu 系统加入 Windows 工作组,并设置一个目录作为共享资源,供特定用户访问。这种配置被称为独立的 Samba 服务器。更高级的配置,比如将 Samba 集成到活动目录环境中,也有提供,但这些超出了本书的范围。

配置 Samba 的第一步是编辑 /etc/samba/smb.conf 文件。

21.5.1 配置 [global] 部分

smb.conf 文件分为多个部分。第一部分是 [global] 部分,在这里可以指定适用于整个 Samba 配置的设置。虽然这些设置是全局性的,但每个选项可以在其他配置文件部分中被覆盖。

第一项任务是定义 Windows 工作组名称,Ubuntu 资源将在该工作组上共享。这个设置通过 [global] 部分中的 workgroup = 指令控制,默认配置如下:

workgroup = WORKGROUP

如果需要,首先将其更改为实际的工作组名称。

除了工作组设置外,其他设置表明这是一个独立的服务器,用户密码将保护共享资源。在继续配置要共享的资源之前,还需要在 [global] 部分添加其他参数,具体如下:

[global]

.

.

netbios name = LinuxServer

“netbios name” 属性指定了服务器在网络上如何被其他系统看到的名称。

21.5.2 配置共享资源

下一步是配置共享资源(换句话说,就是那些可以从 Windows 网络上的其他系统访问的资源)。为此,必须为该部分指定一个名称,用于在共享时引用。例如,如果我们计划共享我们 Ubuntu 系统中的 /sampleshare 目录,可以为该部分命名为 [sampleshare]。在这一部分中,可以配置各种选项。然而,在这个例子中,我们将定义要共享的目录,标明该目录既可浏览又可写入,并声明该资源为公共资源,以便访客用户可以访问:

[sampleshare]

注释 = 示例 Samba 共享

路径 = /sampleshare

可浏览 = 是

公共 = 是

可写 = 是

要限制对特定用户的访问,可以使用“valid users”属性,例如:

有效用户 = demo, bobyoung, marcewing

21.5.3 删除不必要的共享

smb.conf 文件预配置了共享打印机和系统中用户主文件夹的部分。如果这些资源不需要共享,可以注释掉相应的部分,让 Samba 忽略它们。在以下示例中,[homes] 部分已被注释掉:

.

.

[homes]

注释 = 主页目录

有效用户 = %S, %D%w%S

可浏览 = 否

只读 = 否

继承访问控制列表 = 是

.

.

21.6 创建 Samba 用户

任何需要访问 Samba 共享资源的用户都必须被配置为 Samba 用户,并分配密码。此任务可以通过 smbpasswd 命令行工具来实现。例如,假设需要让名为 demo 的用户能够从 Windows 系统访问我们 Ubuntu 系统中的 /sampleshare 目录。为了满足这一需求,我们必须将 demo 添加为 Samba 用户,方法如下:

smbpasswd -a demo

新的 SMB 密码:

重新输入新的 SMB 密码:

已添加用户 demo。

现在我们已经完成了一个基础 Samba 服务器的配置,接下来是测试我们的配置文件,然后启动 Samba 服务。

21.7 测试 smb.conf 文件

可以使用 testparm 命令行工具检查 smb.conf 文件中的设置是否有错误,方法如下:

testparm

从 /etc/samba/smb.conf 加载 smb 配置文件

已加载服务文件,正常。

允许弱加密

服务器角色: ROLE_STANDALONE

按回车查看您的服务定义的转储

全局参数

[global]

日志文件 = /var/log/samba/%m.log

netbios 名称 = LINUXSERVER

打印机配置名称 = cups

安全 = 用户

WINS 支持 = 是

idmap 配置 * : 后端 = tdb

cups 选项 = raw

[sampleshare]

注释 = 示例 Samba 共享

访客访问 = 是

路径 = /sampleshare

只读 = 否

[homes]

可浏览 = 否

注释 = 主页目录

继承访问控制列表 = 是

只读 = 否

有效用户 = %S %D%w%S

[printers]

可浏览 = 否

注释 = 所有打印机

创建掩码 = 0600

路径 = /var/tmp

可打印 = 是

.

.

21.8 启动 Samba 和 NetBIOS 名称服务

为了使 Ubuntu 服务器能够在 Windows 网络中运行,必须启动 Samba(SMB)和 NetBIOS 名称服务(NMB)服务。可选地,还可以启用这些服务,使它们在每次系统启动时自动启动:

systemctl enable smbd nmbd

systemctl start smbd nmbd

在尝试从 Windows 系统连接之前,使用 smbclient 工具验证共享是否已配置:

smbclient -U demo -L localhost

[WORKGROUP\demo]的密码:

共享名称 类型 注释


sampleshare 磁盘 示例 Samba 共享

print$ 磁盘 打印机驱动程序

IPC$ IPC IPC 服务(demoserver 服务器(Samba,Ubuntu))

demo 磁盘 主目录

HP_OfficeJet_Pro_9020_series_9F6907 打印机 HP_OfficeJet_Pro_9020_series

21.9 访问 Samba 共享

现在 Samba 资源已配置并且服务正在运行,是时候从 Windows 系统访问共享资源了。在与 Ubuntu 系统处于同一工作组的适当 Windows 系统上,打开 Windows 资源管理器,右键单击侧边栏中的“网络”项,显示如图 21-3 所示的菜单:

图 21-3

选择“映射网络驱动器...”菜单选项,显示如图 21-4 所示的对话框:

图 21-4

选择一个驱动器字母并输入 Samba 共享的路径。例如,假设服务器名称为 LinuxServer,Samba 用户名为 demo,则用户的主文件夹路径如下:

\LINUXSERVER\demo

启用“使用不同的凭据连接”复选框并点击完成。当网络凭据对话框出现时,输入先前通过 smbpasswd 命令分配的 Samba 用户名和密码:

图 21-5

连接建立后,新的 Windows 资源管理器对话框将显示共享的 Ubuntu 文件夹内容:

图 21-6

21.10 从 Ubuntu 访问 Windows 共享

如前所述,Samba 是一条双向通道,不仅允许 Windows 系统访问托管在 Ubuntu 系统上的文件和打印机,还允许 Ubuntu 系统访问 Windows 系统上的共享资源。这是通过使用在本章开始时安装的 samba-client 包来实现的。如果当前未安装,请通过终端窗口按如下方式安装:

apt install smbclient

可以通过 Ubuntu 桌面上的文件应用程序或通过命令行提示符使用 smbclient 和 mount 工具访问 Windows 系统上的共享资源。本节假设 Windows 系统已启用适当的网络共享设置。

要使用 GNOME 桌面访问 Windows 系统上的任何共享资源,请启动“文件”应用程序,并选择“其他位置”选项。这将显示如下所示的屏幕,包括 Windows 网络的图标(如果检测到):

图 21-7

选择“Windows 网络”选项将显示在网络上检测到的 Windows 系统,并允许访问任何共享资源。

图 21-8

或者,可以使用“连接到服务器”选项连接到特定系统。请注意,远程系统的名称或 IP 地址必须以smb://开头,并可以跟随特定共享资源的路径,例如:

smb://WinServer/Documents

没有桌面环境时,可以使用mount命令从命令行挂载远程 Windows 共享,并指定cifs文件系统类型。例如,以下命令将名为Documents的共享目录挂载到名为/winfiles的本地挂载点上,该共享位于名为WinServer的 Windows 系统上:

mount -t cifs //WinServer/Documents /winfiles -o user=demo

21.11 总结

在本章中,我们探讨了如何配置 Ubuntu 系统同时作为 Samba 客户端和服务器,允许与 Windows 系统共享资源。涵盖的主题包括安装 Samba 客户端和服务器软件包以及配置 Samba 作为独立服务器。此外,介绍了 SELinux 的基本概念以及提供 Samba 访问共享资源的步骤。

第二十二章

  1. 虚拟化技术概述

虚拟化是指在单一计算机系统上同时运行多个操作系统的能力。尽管这不一定是一个新概念,但虚拟化在近年来逐渐受到关注,因为它提供了一种充分利用服务器系统 CPU 和资源容量的方式,同时提供稳定性(即如果某个虚拟化的客机系统崩溃,主机和其他任何客机系统仍然能够继续运行)。

虚拟化还有助于在不配置双启动环境的情况下尝试不同的操作系统。例如,你可以在虚拟机中运行 Windows,而无需重新分区硬盘,关闭 Ubuntu,然后从 Windows 启动。相反,你启动一个虚拟化的 Windows 版本作为客机操作系统。同样,虚拟化允许你在 Ubuntu 系统中运行其他 Linux 发行版,实现对两个操作系统的同时访问。

在决定实现虚拟化的最佳方法时,清楚地了解当前可用的不同虚拟化解决方案至关重要。因此,本章的目的是概括地描述当前普遍使用的虚拟化技术。

22.1 客机操作系统虚拟化

客机操作系统虚拟化,也叫做基于应用程序的虚拟化,是最容易理解的概念。在这种场景中,物理主机计算机运行的是标准的未修改操作系统,如 Windows、Linux、UNIX 或 macOS。在这个操作系统上运行的是一个虚拟化应用程序,该程序的执行方式与其他任何应用程序(如文字处理器或电子表格)在系统上运行的方式基本相同。在这个虚拟化应用程序内,创建了一个或多个虚拟机,用来在主机计算机上运行客机操作系统。

虚拟化应用程序负责启动、停止和管理每个虚拟机,并实质上代表各个虚拟机控制对物理硬件资源的访问。虚拟化应用程序还进行一项叫做二进制重写的过程,这涉及扫描正在执行的客机系统的指令流,并将任何特权指令替换为安全的模拟指令。这使得客机系统认为它是在直接运行在系统硬件上,而不是在应用程序中的虚拟机内。

下图展示了基于客机操作系统的虚拟化:

图 22-1

如上图所示,来宾操作系统在虚拟化应用程序内以虚拟机的形式运行,而虚拟化应用程序则像其他应用程序一样运行在主机操作系统之上。来宾操作系统与底层主机硬件之间的多层抽象不利于虚拟机的高性能。然而,这种技术的优点是主机或来宾操作系统无需做任何修改,也不需要特殊的 CPU 硬件虚拟化支持。

22.2 虚拟机管理程序虚拟化

在虚拟机管理程序虚拟化中,虚拟机管理程序的任务是处理虚拟机的资源和内存分配,并为更高层次的管理和监控工具提供接口。基于虚拟机管理程序的解决方案分为 Type-1 和 Type-2 两种。

Type-2 虚拟机管理程序(有时称为托管虚拟机管理程序)作为软件应用程序安装,并运行在主机操作系统之上,通过协调对资源(如 CPU、内存和网络)的访问来为来宾虚拟机提供虚拟化功能。图 21-2 展示了使用 Type-2 虚拟机管理程序虚拟化的典型系统架构:

图 22-2

要理解 Type-1 虚拟机管理程序如何工作,首先需要了解 Intel x86 处理器架构。x86 系列 CPU 提供了一系列保护级别,称为环,其中代码可以执行。环 0 具有最高的特权,操作系统内核通常在该环中运行。在环 0 中执行的代码被认为是在系统空间、内核模式或主管模式下运行的。所有其他代码,如在操作系统上运行的应用程序,都是在权限较低的环中运行,通常是环 3。

与 Type-2 虚拟机管理程序不同,Type-1 虚拟机管理程序(也称为裸金属虚拟机管理程序或本地虚拟机管理程序)直接在主机系统的硬件上运行,处于环 0。由于虚拟机管理程序占据了 CPU 的环 0,任何在该系统上运行的来宾操作系统内核必须在权限较低的 CPU 环上运行。不幸的是,大多数操作系统内核是明确为在环 0 中运行而编写的,因为它们需要执行只有在该环中才可以完成的任务,如执行特权 CPU 指令和直接操作内存。近年来,已经提出了几种不同的解决方案,每种解决方案都将在下面描述:

22.2.1 半虚拟化

在准虚拟化下,来宾操作系统的内核被专门修改以便在虚拟机管理程序上运行。这通常涉及将仅能在 CPU 的环 0 中运行的特权操作替换为对虚拟机管理程序的调用(称为超调用)。虚拟机管理程序则代表来宾内核执行任务。不幸的是,这通常将支持范围限制为开源操作系统(如 Linux),这些操作系统可以自由修改,以及已经同意进行必要代码修改以面向特定虚拟机管理程序的专有操作系统。尽管存在这些问题,来宾内核能够直接与虚拟机管理程序通信,使得准虚拟化方法比其他虚拟化方法提供更高的性能。

22.2.2 完全虚拟化

完全虚拟化支持未修改的来宾操作系统。未修改指的是那些没有被修改以便在虚拟机管理程序上运行的操作系统内核,因此它们仍然像在 CPU 的环 0 中运行一样执行特权操作。在这种情况下,虚拟机管理程序提供 CPU 仿真,以处理和修改未修改的来宾操作系统内核所执行的特权和保护 CPU 操作。不幸的是,这一仿真过程需要时间和系统资源来操作,因此与准虚拟化提供的性能相比,其性能较差。

22.2.3 硬件虚拟化

硬件虚拟化利用了英特尔和 AMD 最新一代 CPU 中内建的虚拟化功能。这些技术分别称为 Intel VT 和 AMD-V,提供了运行未修改的来宾虚拟机所需的扩展,而不会像完全虚拟化的 CPU 仿真那样产生开销。简单来说,这些处理器在环 0 之上提供了一个额外的特权模式(环 -1),使得虚拟机管理程序可以在其中操作,从而将环 0 留给未修改的来宾操作系统。

下图说明了 Type-1 虚拟机管理程序的虚拟化方法:

图 22-3

如上图所示,除了虚拟机外,一个管理操作系统或管理控制台也运行在虚拟机管理程序上,允许系统管理员管理虚拟机。

22.3 虚拟机网络

虚拟机通常需要连接到网络才能发挥实际作用。一种选择是让虚拟机连接到运行在主机操作系统内的虚拟网络。在这种配置下,虚拟网络上的任何虚拟机都能看到彼此,但网络地址转换(NAT)提供了对外部网络的访问。当使用虚拟网络和 NAT 时,每个虚拟机在外部网络(即主机连接的网络)上使用主机系统的 IP 地址进行表示。这是 Ubuntu 上 KVM 虚拟化的默认行为,通常不需要额外配置。通常,默认情况下会创建一个名为 default 的虚拟网络,并由设备 virbr0 表示。

若要让来宾在外部网络上表现为独立的系统(即拥有自己的 IP 地址),它们必须配置为共享主机上的物理网络接口。实现这一点的最快方法是将虚拟机配置为使用“直接连接”网络配置选项(也称为 MacVTap),这将为来宾系统提供与主机相同网络上的 IP 地址。不幸的是,尽管这样可以让虚拟机访问网络中的其他系统,但在使用 MacVTap 驱动程序时,无法建立来宾与主机之间的连接。

更好的选择是配置主机系统上的网络桥接接口,让来宾连接到该接口。这将为来宾提供外部网络上的 IP 地址,同时也允许来宾与主机之间进行通信,具体内容可参考章节“创建 Ubuntu 23.04 KVM 网络桥接接口”。

22.4 小结

虚拟化是指在单个主机操作系统中运行多个来宾操作系统的能力。已经开发出了几种虚拟化方法,包括来宾操作系统虚拟化和虚拟机监控程序虚拟化。虚拟机监控程序虚拟化分为两类,称为 Type-1 和 Type-2。Type-2 虚拟化解决方案被归类为准虚拟化、完全虚拟化和硬件虚拟化,后者使用一些 Intel 和 AMD 处理器模型的特殊虚拟化功能。

虚拟机来宾操作系统在网络配置方面有几种选择,包括 NAT、直接连接(MacVTap)和网络桥接配置。

23.4 在 Ubuntu 23.04 上安装 KVM 虚拟化

早期版本的 Ubuntu 提供了两个虚拟化平台:基于内核的虚拟机(KVM)和 Xen。在最近的版本中,已移除对 Xen 的支持,只保留 KVM 作为 Ubuntu 随附的唯一虚拟化选项。除了 KVM 外,产品如 VMware 和 Oracle VirtualBox 等第三方解决方案也可用。然而,由于 KVM 已随 Ubuntu 提供,因此本教程将涵盖这一虚拟化解决方案。

在开始安装和运行 KVM 之前,值得讨论一下它如何与前一章中概述的各种虚拟化类型相适应。

23.1 KVM 概述

KVM 被归类为 Type-1 虚拟化解决方案,它通过 Intel VT 和 AMD-V 硬件虚拟化支持,提供对未修改的客户操作系统的完全虚拟化。

KVM 与许多其他 Type-1 解决方案的不同之处在于,它将宿主 Linux 操作系统转变为虚拟机监控器(Hypervisor),允许在运行完整的企业级宿主操作系统时实现裸金属虚拟化。

23.2 KVM 硬件要求

在继续本章之前,我们必须讨论在 KVM 环境中运行虚拟机的硬件要求。首先,KVM 虚拟化仅适用于某些类型的处理器。如前所述,这些处理器必须包括 Intel VT 或 AMD-V 技术。

要检查虚拟化支持,请在终端窗口中运行 lscpu 命令:

第二十三章:lscpu | grep Virtualization:

如果系统包含支持 Intel VT 的 CPU,上述命令将提供以下输出:

虚拟化:VT-x

或者,当检测到支持 AMD-V 的 CPU 时,将显示以下输出:

虚拟化:AMD-V

如果 CPU 不支持虚拟化,上述 lscpu 命令将不会显示任何输出。

请注意,尽管上述命令仅报告处理器是否支持各自的功能,但并不表示该功能是否已在 BIOS 中启用。因为在实际操作中,大多数系统的 BIOS 默认情况下通常禁用虚拟化支持。因此,在继续本教程之前,您应检查 BIOS 设置,确保启用了适当的虚拟化技术。

与双启动环境不同,虚拟化环境涉及在单台计算机系统上同时运行两个或更多完整的操作系统。这意味着系统必须有足够的物理内存、磁盘空间和 CPU 处理能力,以便平行地容纳所有这些系统。因此,在开始配置和安装过程之前,请检查 Ubuntu 和您选择的客户操作系统的最低系统要求,并验证您的宿主系统是否有足够的资源来满足两个系统的要求。

23.3 为 KVM 虚拟化准备 Ubuntu

与 Xen 不同,KVM 不需要运行特定版本的内核来提供支持。因此,通过安装 KVM 内核模块,KVM 支持已经可以与标准内核一起使用,从而无需安装并从特殊内核启动。

然而,为了避免冲突,如果系统上当前正在运行启用了 Xen 的内核,请重启系统并从启动菜单中选择一个非 Xen 内核,然后继续本章其余内容。

仅在 Ubuntu 操作系统安装过程中明确选择时,才会默认安装设置和维护 KVM 虚拟化系统所需的工具。要从命令提示符安装 KVM 工具,在终端窗口中执行以下命令:

apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils

如果您有访问图形桌面环境的权限,建议安装 virt-manager 包:

apt install virt-manager

23.4 验证 KVM 安装

在继续之前,值得检查 KVM 安装是否正确工作。当 KVM 安装并运行时,两个模块将已加载到内核中。可以通过在终端窗口中运行 lsmod 命令来验证这些模块是否存在:

lsmod | grep kvm

假设安装成功,以上命令应该生成类似以下的输出:

kvm_intel 438272 0

kvm 1138688 21 kvm_intel

请注意,如果系统包含 AMD 处理器,kvm 模块可能会显示为 kvm_amd 而非 kvm_intel。

安装过程还应已配置 libvirtd 守护进程在后台运行。再次使用终端窗口,运行以下命令以确保 libvirtd 正在运行:

systemctl status libvirtd

● libvirtd.service - 虚拟化守护进程

已加载:已加载 (/lib/systemd/system/libvirtd.service; 启用; 厂商预设>

活跃:活跃(运行中),自 2023-07-19 11:15:13 EDT 起;21 小时前

如果该进程未运行,按照以下步骤启动:

systemctl enable --now libvirtd

systemctl start libvirtd

如果桌面环境可用,通过选择“活动”并在搜索框中输入“virt”来运行 virt-manager 工具。当虚拟机管理器图标出现时,点击它以启动。加载后,管理器应该如下面的图示所示:

图 23-1

如果没有列出 QEMU/KVM 条目,选择文件 -> 添加连接菜单选项,在随后的对话框中选择 QEMU/KVM 虚拟化程序,然后点击连接按钮:

图 23-2

如果管理器当前未连接到虚拟化进程,请右键点击列出的条目并从弹出菜单中选择“连接”。

23.5 总结

KVM 是一种类型为 1 的虚拟化解决方案,通过支持 Intel VT 和 AMD-V 硬件虚拟化技术,实现对未修改的客户操作系统的完全虚拟化。它是 Ubuntu 默认的虚拟化解决方案,并且可以在任何具有适当处理器支持的 Ubuntu 系统上快速轻松地安装。安装并启用 KVM 支持后,接下来的章节将概述在 Ubuntu 主机上安装和管理虚拟机的一些选项。

  1. 使用 Cockpit 在 Ubuntu 23.04 上创建 KVM 虚拟机

基于 KVM 的虚拟机可以通过使用 virt-install 命令行工具、virt-manager GUI 工具或 Cockpit Web 控制台的虚拟机模块轻松在 Ubuntu 上配置。本章将使用 Cockpit 在 Ubuntu 主机上安装 KVM 客户操作系统。本章名为“使用 virt-manager 在 Ubuntu 23.04 上创建 KVM 虚拟机”将介绍使用 virt-manager 工具创建新虚拟机。

下一章“使用 virt-install 和 virsh 创建 KVM 虚拟机”将介绍使用命令行方法创建虚拟机。

24.1 安装 Cockpit 虚拟机模块

默认情况下,虚拟机模块可能不会包含在标准的 Cockpit 安装中。如果已安装并配置 Cockpit,可以按以下步骤安装虚拟机模块:

第二十四章:apt install cockpit-machines

安装后,下次登录 Cockpit 界面时,虚拟机选项(在图 24-1 中标记为 A)将出现在导航面板中:

图 24-1

24.2 在 Cockpit 中创建虚拟机

要在 Cockpit 中创建虚拟机,请点击图 24-1 中标记为 B 的创建虚拟机按钮,以显示创建对话框。

在对话框中,输入机器名称,并选择安装介质的形式,是通过 URL 访问的 ISO 文件,还是本地文件系统路径,或者选择供应商和操作系统类型信息,并选择下载操作系统选项,在安装过程中自动下载安装镜像。

另外,还需指定用于操作系统安装的虚拟磁盘驱动器的大小以及分配给虚拟机的内存量:

图 24-2

点击创建和编辑按钮来构建虚拟机。创建过程完成后,从列表中选择新虚拟机,以显示配置详细信息,如图 24-3 所示:

图 24-3

如在“虚拟化技术概述”中所述,KVM 提供了几种网络配置选项。要查看和更改虚拟机的网络设置,请滚动到虚拟机概述屏幕的网络接口部分,并点击编辑按钮:

图 24-4

在弹出的对话框中,可以使用网络类型菜单更改网络连接的类型,例如,从虚拟网络(NAT)更改为直接连接(MacVTap)或桥接到局域网。

24.3 开始安装

要启动新的虚拟机并从指定的安装介质安装客户操作系统,请点击概览页面顶部的安装按钮。Cockpit 将启动虚拟机并更新控制台视图,其中将显示客户操作系统屏幕:

图 24-5

如果安装失败,请检查消息以查看在打开安装映像时是否发生错误。这通常是因为 QEMU 模拟器以名为 qemu 的用户身份运行,而该用户没有访问 ISO 安装映像所在目录的权限。为了解决这个问题,打开终端窗口(或如果系统是远程的,则使用 SSH 连接),切换到 ISO 映像文件所在的位置,并将 libvirt-qemu 用户添加到父目录的访问控制列表(ACL),命令如下:

cd /path/to/iso/directory

setfacl -m u:libvirt-qemu:x ..

做出此更改后,请按如下方式检查设置:

getfacl ..

file: ..

owner: demo

group: demo

user::rwx

user:libvirt-qemu:--x

group::r-x

mask::r-x

other::---

做出这些更改后,请再次点击安装按钮以完成安装。

要完成安装,在控制台视图中与屏幕交互,就像在物理硬件上安装操作系统一样。如果控制台太小,无法显示整个客户操作系统屏幕,请点击右上角的扩展按钮。

还可以使用 virt-viewer 工具从 Cockpit 浏览器会话之外连接并显示虚拟机的图形控制台。要在 Ubuntu 系统上安装 virt-viewer,请运行以下命令:

apt install virt-viewer

virt-viewer 工具也可以用于 Windows 系统,并可以从以下网址下载:

virt-manager.org/download/

要连接到运行在本地主机上的虚拟机,请运行 virt-viewer,并从弹出的对话框中选择要连接的虚拟机:

图 24-6

上述命令将列出基于系统的虚拟机。要列出并访问基于会话的客户机,请按照如下方式启动 virt-viewer:

$ virt-viewer --connect qemu:///session

另外,也可以指定虚拟机名称,完全跳过选择对话框,例如:

virt-viewer demo-vm-guest

要通过 SSH 将 virt-viewer 实例连接到远程主机上运行的虚拟机,可以使用以下命令:

$ virt-viewer --connect qemu+ssh://@/system

例如:

$ virt-viewer --connect qemu+ssh://root@192.168.1.122/system demo_vm_guest

使用此技术时,需要注意在连接完全建立之前,系统将提示输入两次用户密码。

虚拟机创建完成后,Cockpit 界面可以监控该虚拟机,并执行重启、关机或删除客户系统等任务。在磁盘面板中还可以选择一个选项,将磁盘添加到虚拟机配置中。

24.4 存储卷与存储池的使用

创建虚拟机时,通常会有至少一个虚拟磁盘驱动器。这些虚拟磁盘驱动器的镜像文件存储在存储池中。存储池可以是本地文件系统中的现有目录、文件系统分区、物理磁盘设备、逻辑卷管理(LVM)卷组,甚至是远程网络文件系统(NFS)。

每个存储池被划分为一个或多个存储卷。存储卷通常是单个镜像文件,每个文件代表一个虚拟磁盘驱动器,但它们也可以是物理磁盘分区、整个磁盘驱动器或 LVM 卷组的形式。

当通过前述步骤创建虚拟机时,默认的存储池也被创建来存储虚拟机镜像。这个默认存储池占用根文件系统的空间,并且可以在 Cockpit 虚拟机界面中通过选择面板顶部标记为 C 的存储池选项来查看,如图 24-1 所示。

选择后,下面将显示一个界面,如图 24-7 所示,其中包含当前系统上配置的存储池列表:

图 24-7

在上面的例子中,默认的存储池位于根文件系统上,并将虚拟机镜像存储在/var/lib/libvirtd/images 目录中。要查看存储池中包含的存储卷,选择图 24-8 中突出显示的存储卷标签:

图 24-8

在演示虚拟机的例子中,存储卷采用名为 demo-vm-guest.qcow2 的镜像文件形式。此外,存储池还包括一个包含安装 ISO 镜像的存储卷。要查看某个虚拟机使用的存储卷,可以返回到主虚拟机 Cockpit 界面,选择该虚拟机,然后滚动到磁盘面板,如图 24-9 所示:

图 24-9

尽管使用默认存储池进行测试和早期实验是可以接受的,但建议为一般虚拟化使用创建额外的存储池。要创建新的存储池,在 Cockpit 中显示存储池界面并点击“创建存储池”按钮,弹出如图 24-10 所示的对话框:

图 24-10

在上述示例中,正在创建一个名为 MyPool 的新存储池,使用的是挂载为/MyPool 的文件系统分区(磁盘驱动器、分区和挂载点的主题将在本章后面名为“将新磁盘驱动器添加到 Ubuntu 23.04 系统”的部分中介绍)。创建完成后,存储池将列在 Cockpit 存储池屏幕中,并且可以包含存储卷,随着新虚拟机的创建而添加。

24.5 小结

本章概述了如何使用基于网页的 Cockpit 界面来创建和管理基于 KVM 的虚拟机。Cockpit 界面的优点是不需要访问运行在主机系统上的桌面环境。另一种选择是使用下一章中介绍的 virt-manager 图形工具。

  1. 在 Ubuntu 23.04 上使用 virt-manager 创建 KVM 虚拟机

上一章探讨了如何使用 Cockpit web 工具在 Ubuntu 上创建 KVM 虚拟机。鉴于一旦虚拟机 Cockpit 扩展完全实现,virt-manager 可能会被停用,本章将介绍如何使用此工具创建新的虚拟机。

25.1 启动虚拟机管理器

如果尚未安装,请按照以下步骤安装 virt-manager 包:

第二十五章:apt install virt-manager

接下来,在终端窗口中运行 virt-manager 命令启动虚拟机管理器。一旦加载完成,虚拟机管理器将在显示以下屏幕之前提示输入当前活动用户的密码:

图 25-1

主屏幕列出了系统上当前运行的虚拟机。

默认情况下,管理器应已连接到系统的 libvirtd 实例。如果没有,右键点击列表中的条目,选择弹出菜单中的“连接”来连接到主机系统。

要管理基于会话的虚拟机,请选择“文件” -> “添加连接...” 菜单选项,以显示 图 25-2 中所示的对话框:

图 25-2

从 Hypervisor 菜单中选择 QEMU/KVM 用户会话,并在此对话框中点击“连接”按钮。返回主 virt-manager 屏幕时,QEMU/KVM 会话应如上所示在 图 25-1 中列出。

要创建虚拟系统,请点击新建虚拟机按钮(工具栏中的最左侧按钮),以显示新虚拟机向导的第一个屏幕。在“名称”字段中,为虚拟系统输入一个合适的描述性名称。在此屏幕上,还需要选择安装来宾操作系统的媒体位置。这可以是 CD 或 DVD 驱动器、可供本地主机访问的 ISO 镜像文件、使用 HTTP、FTP、NFS 或 PXE 的网络安装,或者来自现有虚拟机的磁盘映像:

图 25-3

25.2 配置 KVM 虚拟系统

点击“前进”将显示一个寻找安装过程额外信息的屏幕。所显示的屏幕和所需信息将取决于在初始屏幕上的选择。例如,如果选择了 CD、DVD 或 ISO,这个屏幕将要求提供 ISO 文件或物理媒体设备的具体位置。此屏幕还会根据指定的安装媒体尝试识别来宾操作系统的类型和版本(例如,Windows 版本或 Linux 发行版)。如果无法识别,请关闭“从安装媒体/源自动检测”选项,输入操作系统名称的前几个字符,并从可能的匹配项列表中选择一个选项:

图 25-4

配置好这些设置后,点击“前进”按钮来配置 CPU 和内存设置。最佳设置将取决于主机中 CPU 的数量和物理内存的大小,以及与新虚拟机并行运行的其他应用程序和虚拟机的需求:

图 25-5

在下一屏幕上,可以选择创建指定大小的镜像磁盘,选择已有的卷,或创建指定格式的存储卷(如 raw、vmdk、ISO 等)。除非你有特定需求需要使用某种格式(例如,可能需要使用 vmdk 格式,以便将来迁移到基于 VMware 的虚拟化环境),或需要使用专用磁盘或分区,否则通常只需在此屏幕上指定大小即可:

图 25-6

如果使用默认设置,虚拟机将使用默认存储池中的存储卷作为虚拟磁盘驱动器。若要使用在前一章节中创建的自定义存储池“我的存储池”,请在点击“管理...”按钮之前启用“选择或创建自定义存储”选项。

在存储卷对话框中,选择左侧面板中的“我的存储池”条目,然后在主面板中点击 + 按钮以创建新的存储卷:

图 25-7

请注意,对话框左下角的 + 按钮也可以用来创建新的存储池,作为使用 Cockpit 界面的替代方法。

在配置屏幕中(图 25-8),命名存储卷,选择卷的大小,然后点击“完成”按钮以创建存储卷并将其分配给虚拟机:

图 25-8

配置好这些设置后,选择新建的存储卷并点击“选择存储卷”按钮。然后,再次点击“前进”按钮。最后一个屏幕会显示配置的摘要。请检查显示的信息。也可以使用高级选项来更改虚拟机的虚拟网络配置,如图 25-9 所示:

图 25-9

25.3 启动 KVM 虚拟机

点击“完成”按钮开始创建过程。虚拟化管理器将创建磁盘并配置虚拟机,然后启动客体系统。最后,新虚拟机会出现在主 virt-manager 窗口中,状态显示为“运行中”,如图 25-10 所示:

图 25-10

默认情况下,虚拟机的控制台应该出现在虚拟机查看器窗口中。要查看运行中的虚拟机控制台,确保在虚拟机列表中选择该虚拟机,并从工具栏选择“打开”按钮。虚拟机查看器应该准备好,安装过程即将开始:

图 25-11

从现在起,按照安装指示在 KVM 虚拟机中安装客操作系统。

25.4 总结

在 Ubuntu 主机系统上创建基于 KVM 的虚拟机有多种方法。本章使用 virt-manager 图形工具来创建、配置并运行一个客操作系统,包括创建新的存储卷。在掌握了这些基础知识后,下一章将介绍如何通过命令行创建虚拟机。

  1. 使用 virt-install 和 virsh 创建 KVM 虚拟机

在前面的章节中,我们探讨了如何在 Ubuntu 主机上使用 Cockpit 和 virt-manager 图形工具创建 KVM 客操作系统。本章将重点介绍如何使用 virt-install 和 virsh 命令行工具创建基于 KVM 的虚拟机。这些工具提供了与 virt-manager 和 Cockpit 选项相同的所有功能,并具有可在脚本中使用的额外优势,从而实现虚拟机创建的自动化。此外,virsh 命令允许根据包含在配置文件中的规范创建虚拟机。

提供 virt-install 工具是为了通过提供一组命令行选项来创建新的虚拟机。本章假设已经安装了必要的 KVM 工具。有关这些要求的详细信息,请阅读“在 Ubuntu 23.04 上安装 KVM 虚拟化”一章。

26.1 运行 virt-install 来构建 KVM 客操作系统

virt-install 工具接受一系列命令行参数,这些参数提供与正在创建的虚拟机相关的配置信息。一些命令行选项是必需的(明确要求提供名称、内存和磁盘存储),而其他选项则是可选的。

至少,virt-install 命令通常需要以下参数:

•--name - 分配给虚拟机的名称。

•--memory - 分配给虚拟机的内存量。

•--disk - 用于虚拟机存储的镜像文件的名称和位置。如果没有指定--import 选项以指示使用现有镜像文件,则此文件将在虚拟机创建过程中由 virt-install 创建。

•--cdrom 或 --location - 指定包含客操作系统安装介质的本地路径或远程 ISO 镜像的 URL。

使用 virt-install 时可用的所有参数的摘要可以在 man 页中找到:

$ man virt-install

26.2 一个 Ubuntu virt-install 命令示例

参考以上命令行参数列表,现在我们可以查看一个使用 virt-install 工具的命令行示例。

请注意,为了显示虚拟机并完成安装,virt-install 工具启动虚拟机后,必须连接 virt-viewer 实例到虚拟机。默认情况下,virt-install 会尝试在虚拟机启动后自动启动 virt-viewer。然而,如果 virt-viewer 不可用,virt-install 将等待直到建立 virt-viewer 连接。例如,virt-viewer 会话可能在主机系统的图形桌面上本地运行,或者可能从远程客户端建立连接,正如“在 Ubuntu 23.04 上使用 virt-manager 创建 KVM 虚拟机”一章中所述。

以下命令创建一个新的 KVM 虚拟机,配置为使用 KVM para-virtualization 运行 Ubuntu 来宾操作系统。它创建一个新的 10GB 磁盘映像,分配 2048MB 的内存给虚拟机,并为安装媒体 ISO 镜像配置一个虚拟 CD 设备:

第二十六章:virt-install --name demo_vm_guest --memory 2048 --disk path=/tmp/demo_vm_guest.img,size=10 --network network=default --cdrom /home/demo/iso/ubuntu-23.04-desktop-amd64.iso

在创建过程中,virt-install 命令会显示创建进度的状态更新:

启动安装...

分配 'demo_vm_guest.img' | 10 GB 00:00:01

运行图形控制台命令:virt-viewer --connect qemu:///system --wait demo_vm_guest

一旦来宾系统创建完成,virt-viewer 屏幕将显示加载自指定安装媒体的来宾操作系统安装程序:

图 26-1

从此处开始,按照来宾操作系统的标准安装程序进行操作。

26.3 从命令行启动和停止虚拟机

既然已经从命令行创建了虚拟机,理应在未来你也可能需要从命令行启动它。这可以通过 virsh 命令行工具实现,引用在创建时分配给虚拟机的名称。例如:

virsh start demo_vm_guest

同样,虚拟机也可以通过以下方式发送关机信号:

virsh shutdown demo_vm_guest

假设虚拟机未响应关机信号,并且没有开始进行优雅关机,则可以使用 destroy 指令销毁虚拟机(伴随数据丢失的风险):

virsh destroy demo_vm_guest

26.4 从配置文件创建虚拟机

virsh create 命令可以以配置文件的名称作为参数,用于基于该配置文件创建新的虚拟机。配置文件采用 XML 格式。创建配置文件的最简单方法是导出现有虚拟机的配置并对其进行修改以适应新虚拟机。这可以通过 virsh dumpxml 命令实现。例如,以下命令将虚拟机域名为 demo_vm_guest 的配置数据输出到名为 demo_vm_guest.xml 的文件中:

virsh dumpxml demo_vm_guest > demo_vm_guest.xml

文件生成后,加载到编辑器中以查看并更改新虚拟机的设置。

至少必须更改 和镜像文件路径 ,以避免与配置文件来源的虚拟机发生冲突。对于 UUID,可以删除文件中的这一行。

如果需要,虚拟化类型、内存分配和 CPU 数量等选项也可以进行更改。修改文件后,可以按照以下方式创建新的虚拟机:

virsh create demo_vm_guest.xml

26.5 总结

KVM 提供了 virt-installvirsh 命令行工具,作为使用 Cockpit 和 virt-manager 工具创建和管理虚拟机实例的快速高效替代方案。这些工具的优势在于可以在脚本中使用,自动化创建和管理虚拟机。virsh 命令还包括从基于 XML 的配置文件创建虚拟机实例的选项。

27. 创建 Ubuntu 23.04 KVM 网络桥接接口

默认情况下,Ubuntu 上的 KVM 虚拟化环境创建了一个虚拟网络,虚拟机可以连接到该网络。也可以使用 MacVTap 驱动程序配置直接连接。然而,正如在名为“虚拟化技术概述”的章节中所述,这种方法不允许主机和客户系统之间进行通信。

本章将介绍在 Ubuntu 上创建网络桥接的步骤,使得客户系统能够共享主机系统的一个或多个物理网络连接,同时仍然允许客户和主机系统之间进行通信。

在本章的其余部分,我们将解释如何为基于 KVM 的客户操作系统配置 Ubuntu 网络桥接。

27.1 获取当前网络管理器设置

可以使用 NetworkManager 命令行工具(nmcli)创建网络桥接。NetworkManager 默认安装并启用在 Ubuntu 系统中,负责检测并连接网络设备,并提供一个管理网络配置的接口。

可以通过以下命令显示当前主机系统上的网络连接列表:

第二十七章:nmcli con show

NAME UUID TYPE DEVICE

Wired connection 1 daae7adc-2a52-3fa0-9085-25748531e1b6 ethernet eno1

virbr0 299e0d95-4f39-4e65-aace-c7abbd8b018d bridge virbr0

vnet2 bcb3cd6e-dae4-4545-b98b-e8f90c86dadb tun vnet2

上面的输出显示,主机通过名为 eno1 的设备和名为 virbr0 的默认桥接接口建立了以太网网络连接,该桥接接口提供对 KVM 客户系统默认连接的基于 NAT 的虚拟网络的访问。

同样,以下命令可用于识别当前在系统上配置的设备(包括虚拟和物理设备):

nmcli device show

GENERAL.DEVICE: eno1

GENERAL.TYPE: ethernet

GENERAL.HWADDR: 00:23:24:52:52:57

GENERAL.MTU: 1500

GENERAL.STATE: 100 (connected)

GENERAL.CONNECTION: Wired connection 1

GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC>

WIRED-PROPERTIES.CARRIER: on

IP4.ADDRESS[1]: 192.168.86.39/24

IP4.GATEWAY: 192.168.86.1

IP4.ROUTE[1]: dst = 169.254.0.0/16, nh = 0.0.0.0, mt >

IP4.ROUTE[2]: dst = 192.168.86.0/24, nh = 0.0.0.0, mt>

IP4.ROUTE[3]: dst = 0.0.0.0/0, nh = 192.168.86.1, mt >

IP4.DNS[1]: 192.168.86.1

IP4.DOMAIN[1]: lan

IP6.ADDRESS[1]: fda8:b48c:1079:0:5f:670e:a693:9ae2/64

IP6.ADDRESS[2]: fda8:b48c:1079:0:c734:89bd:8384:992d/64

IP6.ADDRESS[3]: fda8:b48c:1079:0:ec7b:35d8:8253:3739/64

IP6.ADDRESS[4]: fe80::1e40:b04c:3de4:5fe0/64

IP6.GATEWAY: --

IP6.ROUTE[1]: dst = fda8:b48c:1079::/64, nh = ::, mt >

IP6.ROUTE[2]: dst = fe80::/64, nh = ::, mt = 1024

IP6.ROUTE[3]: dst = fd56:6a14:af59:1::/64, nh = fe80:>

GENERAL.DEVICE: virbr0

GENERAL.TYPE: bridge

GENERAL.HWADDR: 52:54:00:00:A8:CA

GENERAL.MTU: 1500

GENERAL.STATE: 100 (connected (externally))

GENERAL.CONNECTION: virbr0

GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveC>

IP4.ADDRESS[1]: 192.168.122.1/24

IP4.GATEWAY: --

IP4.ROUTE[1]: dst = 192.168.122.0/24, nh = 0.0.0.0, m>

IP6.GATEWAY: --

.

.

上面的部分输出表示执行命令的主机系统包含一个物理以太网设备(eno1)和一个虚拟桥接(virbr0)。

virsh 命令还可以用于列出当前系统上配置的虚拟网络:

virsh net-list --all

名称 状态 自动启动 持久化


默认 激活 是 是

当前,唯一存在的虚拟网络是 virbr0 提供的默认网络。现在已经获得了一些当前网络配置的基本信息,接下来的步骤是创建一个连接到物理网络设备的网络桥接(此例中为 eno1)。

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

br0 8680c281-6d49-4f76-93b1-902c42514ca5 桥接 br0

有线连接 1 126ab0e8-d4d3-3326-bd5e-1fea169c5635 以太网 eno1

virbr0 556042d4-2e5d-45fe-9c78-a24259e07265 桥接 virbr0

bridge-slave-eno1 e6ba8ead-8fa9-4434-a884-d39225ecda20 以太网 --

接下来的步骤是启动桥接接口。如果通过网络连接(即通过 SSH)进行桥接配置,这一步可能会有问题,因为必须先关闭当前的“有线连接 1”连接,才能启动桥接连接。这意味着在桥接连接启用并替代当前连接之前,现有连接将会丢失,可能导致无法访问远程主机。

如果你是远程访问主机系统,可以通过创建一个 shell 脚本来执行网络更改,从而避免此问题。这样可以确保在“有线连接 1”接口被关闭后,桥接接口会启用,允许你在更改完成后重新连接到主机。首先创建一个名为 bridge.sh 的 shell 脚本文件,包含以下命令:

!/bin/bash

nmcli con down "Wired connection 1"

nmcli con up br0

脚本创建完成后,可以按如下方式执行:

sh ./bridge.sh

当脚本执行时,当"有线连接 1"连接被断开时,连接将会丢失。然而,等待几秒钟后,一旦 br0 连接被激活,就应该能够重新连接到主机。请注意,在某些情况下,桥接接口可能会分配与系统先前分配的不同 IP 地址。尝试通过 ssh 重新连接时请牢记这一点。

如果你在本地主机上工作,这两个nmcli命令可以在终端窗口中运行,而不必担心失去连接:

nmcli con down "有线连接 1"

nmcli con up br0

一旦桥接启动并运行,连接列表现在应该包括桥接连接和桥接从属连接:

nmcli con show

NAME UUID TYPE DEVICE

br0 8680c281-6d49-4f76-93b1-902c42514ca5 bridge br0

virbr0 556042d4-2e5d-45fe-9c78-a24259e07265 bridge virbr0

bridge-slave-eno1 e6ba8ead-8fa9-4434-a884-d39225ecda20 ethernet eno1

有线连接 1 126ab0e8-d4d3-3326-bd5e-1fea169c5635 ethernet --

请注意,"有线连接 1" 连接仍然列出,但不再处于活动状态。要在请求列表时排除非活动连接,请使用--active标志:

nmcli con show --active

NAME UUID TYPE DEVICE

br0 8680c281-6d49-4f76-93b1-902c42514ca5 bridge br0

virbr0 556042d4-2e5d-45fe-9c78-a24259e07265 bridge virbr0

bridge-slave-eno1 e6ba8ead-8fa9-4434-a884-d39225ecda20 ethernet eno1

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

27.4 在虚拟机中使用桥接网络

要创建一个使用桥接网络的虚拟机,可以使用virt-install --network选项并指定 br0 桥接名称。例如:

virt-install --name demo_vm_guest --memory 1024 --disk path=/tmp/demo_vm_guest.img,size=10 --network network=br0 --cdrom /home/demo/ubuntu-23.04-desktop-amd64.iso

当客户操作系统运行时,它将出现在与主机系统相同的物理网络中,而不再处于基于 NAT 的虚拟网络中。

也可以通过编辑虚拟机,在 Cockpit 界面内选择桥接网络,找到网络接口部分,点击如图 27-1 所示的编辑按钮:

图 27-1

在结果界面的设置对话框中,将接口类型菜单更改为“桥接到 LAN”,并将源设置为 br0,如图 27-2 所示:

图 27-2

类似地,使用 virt-manager 工具创建新的虚拟机时,桥接网络将出现在网络选择菜单中:

图 27-3

要修改现有虚拟机以使用桥接网络,使用 virsh edit 命令。该命令将加载 XML 定义文件到编辑器中,在那里可以进行更改并保存:

virsh edit GuestName

默认情况下,文件将加载到 vi 编辑器中。要使用其他编辑器,可以更改 $EDITOR 环境变量,例如:

export EDITOR=gedit

要从默认虚拟网络更改,找到文件中的 部分,对于基于 NAT 的配置,它将如下所示:

或者,如果虚拟机使用的是直接连接,条目可能如下所示:

要使用桥接网络,在保存文件之前,将源网络属性更改为如下所示:

如果虚拟机已经在运行,变更将在重启后生效。

27.5 使用 nm-connection-editor 创建桥接网络

如果主机系统上可以进行本地或远程桌面访问,那么大部分桥接配置过程可以使用 nm-connection-editor 图形工具来完成。要使用此工具,可以在桌面中打开终端窗口并输入以下命令:

nm-connection-editor

当工具加载完成后,将出现图 27-4 中所示的窗口,列出当前配置的网络连接(实际上与执行 nmcli con show 命令的输出相同):

图 27-4

要创建一个新的连接,请点击窗口左下角的‘+’按钮。然后,在弹出的对话框中(图 27-5),从菜单中选择 Bridge 选项:

图 27-5

选择 Bridge 选项后,点击创建按钮以进入桥接配置界面。首先将连接和接口名称字段都更改为 br0,然后点击位于桥接连接列表右侧的添加按钮,如图 27-6 所示:

图 27-6

在连接类型对话框中(图 27-7),将菜单设置更改为 Ethernet,然后点击创建按钮:

图 27-7

现在会弹出另一个对话框,需在此对话框中配置桥接从属连接。在此对话框中,从设备菜单中选择桥接要连接的物理网络(例如 eno1):

图 27-8

点击保存按钮以应用更改,并返回到编辑 br0 对话框(如上所示图 27-6)。在此对话框中,点击保存按钮以创建桥接。返回主窗口后,新创建的桥接和从属连接应列出在其中:

图 27-9

只需关闭原来的“Wired connection 1”连接,然后按照前一章节中描述的步骤启动 br0 连接(如果主机是远程访问的,记得在 shell 脚本中执行这些步骤):

nmcli con down "Wired connection 1"

nmcli con up br0

同时,如同使用命令行工具创建桥接时所做的那样,还需要将该桥接添加到 KVM 网络配置中。为此,请重复上述“声明 KVM 桥接网络”部分中的步骤。完成此步骤后,桥接已准备好供来宾虚拟机使用。

27.6 小结

默认情况下,KVM 虚拟机连接到一个虚拟网络,该网络使用 NAT 提供对主机系统所连接网络的访问。如果要求来宾使用自己的 IP 地址出现在网络中,则需要将其配置为共享主机系统的物理网络接口。本章介绍了如何使用 nmcli 或 nm-connection-editor 工具创建网络桥接接口来实现这一点。

28. 使用 virsh 命令行工具管理 KVM

在前面的章节中,我们已经涵盖了在 Ubuntu 上安装和配置基于 KVM 的客户操作系统。本章将探讨 virsh 工具的一些额外功能,这些内容在之前的章节中没有覆盖,且将展示如何从命令行管理基于 KVM 的客户操作系统。

28.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 RHEL9VM 正在运行

9 CentOS9VM 正在运行

virsh # 启动 FedoraVM

域 FedoraVM 已启动

virsh # list

Id 名称 状态


8 RHEL9VM 正在运行

9 CentOS9VM 正在运行

10 FedoraVM 正在运行

virsh#

virsh 工具支持广泛的命令,完整的命令列表可以通过使用 help 选项获取:

virsh help

每个命令的语法详细信息可以通过在 help 指令后指定命令来获取:

virsh help restore

名称

restore - 从文件中恢复一个域的保存状态

概述

restore [--bypass-cache] [--xml ] [--running] [--paused]

描述

恢复一个域。

选项

[--file] 要恢复的状态

--bypass-cache 恢复时避免使用文件系统缓存

--xml 包含目标更新 XML 的文件名

--将域恢复到运行状态

--暂停将域恢复到暂停状态

在本章剩余部分,我们将更详细地查看这些命令。

28.2 列出客户系统状态

可以随时使用 virsh 工具的 list 选项查看 Ubuntu 虚拟化主机上客户系统的状态。例如:

virsh list

上述命令将显示包含每个客户系统信息的行,类似于以下内容:

virsh # list

Id 名称 状态


8 RHEL9VM 正在运行

9 CentOS9VM 正在运行

10 FedoraVM 正在运行

28.3 启动客户系统

可以使用 virsh 工具结合 start 选项来启动来宾操作系统,后面跟上要启动的来宾操作系统的名称。例如:

virsh start myGuestOS

28.4 关闭来宾系统

virsh 工具的 shutdown 选项,如其名称所示,用于关闭来宾操作系统:

virsh shutdown guestName

请注意,shutdown 选项允许来宾操作系统在收到指令时进行有序关闭。为了立即停止一个来宾操作系统,可以使用 destroy 选项(但存在文件系统损坏和数据丢失的风险):

virsh destroy guestName

28.5 暂停和恢复来宾系统

可以使用 virsh 工具的 suspend 和 resume 选项来暂停和恢复来宾系统。例如,要暂停特定的系统:

virsh suspend guestName

同样,要恢复暂停的系统:

virsh resume guestName

如果主机系统重启,暂停的会话将会丢失。此外,需要注意的是,暂停的系统仍然会占用内存。因此,为了保存一个会话,使其不再占用内存并且能够恢复到其精确状态(即使重启后),必须保存和恢复来宾。

28.6 保存和恢复来宾系统

运行中的来宾操作系统可以通过 virsh 工具进行保存和恢复。当保存时,来宾操作系统的当前状态会被写入磁盘并从系统内存中移除。保存的系统之后可以随时恢复(包括在主机系统重启后)。

要保存来宾:

virsh save guestName path_to_save_file

要恢复已保存的来宾操作系统会话:

virsh restore path_to_save_file

28.7 重启来宾系统

要重启来宾操作系统:

virsh reboot guestName

28.8 配置分配给来宾操作系统的内存

要配置分配给来宾操作系统的内存,请使用 virsh 命令的 setmem 选项。例如,以下命令将分配给来宾系统的内存减少到 256MB:

virsh setmem guestName 256

请注意,可接受的内存设置必须在当前域可用的内存范围内。可以使用 setmaxmem 选项来增加此内存。

28.9 总结

virsh 工具提供了多种选项,用于创建、监控和管理来宾虚拟机。正如本章所述,该工具可以在命令行模式或交互模式下使用。

第二十九章

29. Linux 容器简介

前几章介绍了虚拟化的概念,重点讨论了使用 KVM 创建和管理虚拟机。本章将介绍一种相关的技术——Linux 容器。尽管虚拟机和容器之间有一些相似之处,但本章将概述它们之间的主要区别,并介绍 Linux 容器的概念和优势。本章还将介绍一些 Ubuntu 容器管理工具。掌握了容器的基础知识后,下一章将通过一些实际示例来展示如何在 Ubuntu 上创建和运行容器。

29.1 Linux 容器与内核共享

简单来说,Linux 容器是虚拟化的一种轻量级替代方案。虚拟机包含并运行整个客户操作系统,处于虚拟化环境中。虚拟机则运行在类似于虚拟机管理程序的环境上,该管理程序负责管理对主机系统物理资源的访问。

容器通过使用一种叫做内核共享的概念来工作,这种概念利用了 Linux 和 UNIX 操作系统的架构设计。

要理解内核共享和容器是如何工作的,首先需要了解 Linux 或 UNIX 操作系统的两个主要组件。操作系统的核心是内核。简而言之,内核处理操作系统与物理硬件之间的所有交互。第二个关键组件是根文件系统,其中包含操作系统正常运行所需的所有库、文件和工具。利用这一结构,容器每个都有自己的根文件系统,但共享主机操作系统的内核。这个结构在下图的架构图中得到了说明,图 29-1。

这种资源共享得以实现,是因为内核能够动态地将当前的根文件系统(一个叫做“chroot”或“更改根”的概念)切换到不同的根文件系统,而无需重启整个系统。Linux 容器本质上是这一能力的扩展,结合了容器运行时,后者的职责是提供一个接口,用于在主机系统上执行和管理容器。目前有多种容器运行时可供选择,包括 Docker、lxd、containerd 和 CRI-O。

图 29-1

29.2 容器的用途和优势

容器的主要优势在于它们比虚拟化所需的资源开销少得多,这使得在单台服务器上可以同时运行多个容器实例。它们能够根据需求迅速且高效地启动和停止。此外,容器在主机系统上本地运行,提供了虚拟机无法比拟的性能水平。

容器还具有高度的可移植性,可以轻松地在系统之间迁移。结合 Docker、OpenShift 和 Kubernetes 等容器管理系统,能够在跨多个服务器和云平台的大规模环境中部署和管理容器,甚至可以运行成千上万的容器。

容器常用于为应用程序创建轻量级的执行环境。在这种情况下,每个容器提供一个独立的环境,包含应用程序及其运行所需的所有运行时和支持文件。然后,该容器可以部署到任何其他支持容器执行的兼容主机系统,并且不必担心目标系统可能没有为应用程序配置必要的运行时环境——所有应用程序的依赖项都已包含在容器中。

容器在弥合开发与生产环境之间的差距时也非常有帮助。通过在容器中进行开发和质量保证工作,可以将容器传递给生产环境并安全启动,因为应用程序运行在与开发和测试时相同的容器环境中。

容器还促进了大规模复杂解决方案的模块化部署方法。与其将应用程序开发为单一的庞大实体,不如使用容器将应用程序设计为多个相互作用的模块组,每个模块运行在一个独立的容器中。

容器的一个潜在缺点是,客体操作系统必须与共享的内核版本兼容。例如,无法在 Linux 系统中运行 Microsoft Windows 容器。也无法让为 2.6 版本内核设计的 Linux 客户系统共享 2.4 版本的内核。然而,这些要求并不是容器设计的初衷。这些限制不应被视为缺点,而应被看作是容器在提供简单、可扩展和可靠的部署平台方面的关键优势。

29.3 Ubuntu 容器工具

Ubuntu 提供了若干工具来创建、检查和管理容器。主要工具如下:

•buildah – 一个用于构建容器镜像的命令行工具。

•podman – 一个基于命令行的容器运行时和管理工具,执行诸如从远程仓库下载容器镜像以及检查、启动和停止镜像等任务。

•skopeo – 一个命令行工具,用于转换容器镜像、在镜像仓库之间复制镜像以及检查存储在仓库中的镜像,无需下载镜像。

•runc – 一个轻量级的容器运行时,用于从命令行启动和运行容器。

•OpenShift – 一个企业级的容器应用程序管理平台,包含命令行工具和基于 Web 的工具。

上述所有工具都符合开放容器倡议(OCI),这是一个旨在确保容器在竞争工具和平台之间遵循相同标准的规范集合。

29.4 Ubuntu Docker 注册表

尽管 Ubuntu 提供了一套旨在替代 Docker 提供的工具,这些工具在构建容器时仍需要访问 Ubuntu 镜像。为此,Ubuntu 团队在 Docker Hub 中维护了一套 Ubuntu 容器镜像。Docker Hub 是一个由多个仓库组成的在线容器注册表,每个仓库包含可供下载的各种容器镜像,以便在构建容器时使用。仓库中的镜像每个都被分配一个仓库标签(例如 21.04、20.10、23.04、latest 等),可以在执行镜像下载时引用。以下是 Docker Hub 中包含的 Ubuntu 23.04 镜像的 URL:

docker://docker.io/library/ubuntu:23.04

除了从 Docker 和其他第三方主机注册表下载(在容器术语中称为“拉取”)容器镜像外,您还可以使用注册表存储自己的镜像。这可以通过托管您自己的注册表来实现,或者利用现有的服务,例如 Docker、Amazon AWS、Google Cloud、Microsoft Azure 和 IBM Cloud 提供的服务,当然,还有许多其他选择。

29.5 容器网络

默认情况下,容器通过容器网络接口(CNI)桥接网络堆栈连接到网络。在桥接配置中,运行在服务器上的所有容器都属于同一个子网,因此它们可以相互通信。容器还通过桥接主机系统的网络连接连接到外部网络。同样,主机可以通过虚拟网络接口(通常命名为 podman0)访问容器,该接口已作为容器工具安装的一部分创建。

29.6 总结

Linux 容器提供了虚拟化的轻量级替代方案,并利用 Linux 和 Unix 操作系统的结构。Linux 容器共享主机操作系统的内核,每个容器都有自己的根文件系统,其中包含文件、库和应用程序。因此,容器具有高度的效率和可扩展性,并提供了一个理想的平台,用于构建和部署模块化的企业级解决方案。此外,还有多种工具和平台可用于构建、部署和管理容器,包括第三方解决方案以及 Ubuntu 提供的工具。

30. 在 Ubuntu 上使用容器

现在,上一章已涵盖了 Linux 容器的基础,本章将演示如何使用 Podman、Skopeo 和 Buildah 工具在 Ubuntu 上创建和管理容器。本章的目的是让你在结束时能更清楚地了解如何在 Ubuntu 上创建和管理容器,并为继续探索 Linux 容器的强大功能打下知识基础。

30.1 安装容器工具

在开始使用容器之前,第一步是安装前一章中列出的所有容器工具,使用以下命令:

第三十章:apt install curl

. /etc/os-release

sh -c "echo 'deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /' > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list"

curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -

apt install curl

apt install podman skopeo buildah

30.2 拉取容器镜像

在此示例中,将从注册表中拉取最新的 Ubuntu 版本。然而,在拉取镜像之前,可以使用 skopeo 工具获取关于镜像仓库的信息,例如:

$ skopeo inspect docker://docker.io/ubuntu

{

"名称": "docker.io/library/ubuntu",

"摘要": "sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d",

"RepoTags": [

"10.04",

"12.04.5",

"12.04",

"12.10",

"13.04",

"13.10",

"14.04.1",

"14.04.2",

"14.04.3",

"14.04.4",

"14.04.5",

"14.04",

"14.10",

"15.04",

.

.

],

"创建时间": "2023-06-28T08:42:50.42500211Z",

"Docker 版本": "20.10.21",

"标签": {

"org.opencontainers.image.ref.name": "ubuntu",

"org.opencontainers.image.version": "22.04"

},

"架构": "arm64",

"操作系统": "linux",

"层": [

"sha256:5af00eab97847634d0b3b8a5933f52ca8378f5f30a2949279d682de1e210d78b"

],

"环境": [

"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

]

}

例如,要拉取最新的 Ubuntu 镜像:

$ podman pull docker://docker.io/ubuntu:latest

正在尝试拉取 docker.io/library/ubuntu:latest...

正在获取镜像源签名

正在复制 blob 5af00eab9784 完成

正在复制配置 37f7489146 完成

正在将清单写入镜像目标

存储签名

37f74891464b2067aacbde60d9e2888e002af047a0d5dfc0b06b701928e0b473

通过请求 podman 列出所有本地镜像来验证镜像是否已存储:

$ podman images

仓库 标签 镜像 ID 创建时间 大小

docker.io/library/ubuntu latest 4e5021d210f6 3 周前 66.6 MB

关于本地镜像的详细信息可以通过运行 podman inspect 命令获取:

$ podman inspect ubuntu:latest

该命令应输出与本章前面对远程镜像执行的 skopeo 命令相同的信息。

30.3 在容器中运行镜像

从注册中心拉取的镜像是一个完全可操作的镜像,已经可以在容器中运行而无需修改。要运行该镜像,使用 podman run 命令。在这种情况下,将指定 –rm 选项,表示我们希望在容器中运行该镜像,执行一个命令后让容器退出。在本例中,将使用 cat 工具输出容器根文件系统中 /etc/passwd 文件的内容:

$ podman run --rm ubuntu:latest cat /etc/passwd

root❌0:0:root:/root:/bin/bash

daemon❌1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin❌2:2:bin:/bin:/usr/sbin/nologin

sys❌3:3:sys:/dev:/usr/sbin/nologin

sync❌4:65534:sync:/bin:/bin/sync

games❌5:60:games:/usr/games:/usr/sbin/nologin

man❌6:12👨/var/cache/man:/usr/sbin/nologin

lp❌7:7:lp:/var/spool/lpd:/usr/sbin/nologin

mail❌8:8:mail:/var/mail:/usr/sbin/nologin

news❌9:9:news:/var/spool/news:/usr/sbin/nologin

uucp❌10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

proxy❌13:13:proxy:/bin:/usr/sbin/nologin

www-data❌33:33:www-data:/var/www:/usr/sbin/nologin

backup❌34:34:backup:/var/backups:/usr/sbin/nologin

list❌38:38:Mailing List Manager:/var/list:/usr/sbin/nologin

irc❌39:39:ircd:/var/run/ircd:/usr/sbin/nologin

gnats❌41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin

nobody❌65534:65534:nobody:/nonexistent:/usr/sbin/nologin

_apt❌100:65534::/nonexistent:/usr/sbin/nologin

比较容器内 /etc/passwd 文件的内容与宿主系统上的 /etc/passwd 文件,注意到它缺少宿主机上所有额外的用户,这表明 cat 命令是在容器环境中执行的。同时注意到容器启动、执行命令并退出,整个过程仅用了几秒钟。与启动一个完整操作系统、执行任务并关闭虚拟机所需的时间相比,你会开始理解容器的速度和效率。

要启动一个容器、保持其运行并访问其 shell,可以使用以下命令:

$ podman run --name=mycontainer -it ubuntu:latest /bin/bash

root@4b49ddeb2987:/#

在这种情况下,使用了一个额外的命令行选项来将容器命名为“mycontainer”。虽然这是可选的,但这样可以使容器更容易识别,并且作为使用自动生成的容器 ID 的替代方式来引用容器。

在容器运行时,可以在另一个终端窗口中运行 podman,查看系统上所有容器的状态。

$ podman ps -a

容器 ID 镜像 命令 创建时间 状态 端口 名称

4b49ddeb2987 docker.io/library/ubuntu:latest /bin/bash 大约一分钟前 启动 大约一分钟前 mycontainer

要在主机中执行容器中的命令,只需使用 podman exec 命令,引用正在运行的容器的名称以及要执行的命令。例如,以下命令将在名为 mycontainer 的容器中启动第二个 bash 会话:

$ podman exec -it mycontainer /bin/bash

root@4b49ddeb2987:/#

请注意,尽管上述示例引用了容器名称,但通过 podman ps -a 命令列出的容器 ID 也可以达到相同的结果:

$ podman exec -it 4b49ddeb2987 /bin/bash

root@4b49ddeb2987:/#

或者,podman attach 命令也可以附加到正在运行的容器并访问 shell 提示符:

$ podman attach mycontainer

root@4b49ddeb2987:/#

一旦容器启动并运行,任何额外的配置更改都可以进行,软件包也可以像其他 Ubuntu 系统一样安装。

30.4 管理容器

一旦启动,容器将继续运行,直到通过 podman 停止它,或者启动容器时执行的命令退出。例如,在主机上运行以下命令,将导致容器退出:

$ podman stop mycontainer

或者,在容器的最后一个 bash shell 中按下 Ctrl-D 键序列,将导致 shell 和容器同时退出。一旦退出,容器的状态将相应地变化:

$ podman ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

4b49ddeb2987 docker.io/library/ubuntu:latest /bin/bash 6 分钟前 已退出 (127) 大约一分钟前 mycontainer

虽然容器不再运行,但它仍然存在,并且包含所有对配置和文件系统所做的更改。如果你安装了软件包、进行了配置更改或添加了文件,这些更改将保留在“mycontainer”中。要验证这一点,只需按照以下步骤重新启动容器:

$ podman start mycontainer

启动容器后,使用 podman exec 命令再次执行容器内的命令,如之前所述。例如,再次获取访问 shell 提示符的权限:

$ podman exec -it mycontainer /bin/bash

正在运行的容器也可以通过 podman pause 和 unpause 命令进行暂停和恢复,如下所示:

$ podman pause mycontainer

$ podman unpause mycontainer

30.5 将容器保存为镜像

一旦容器的来宾系统配置完成,你很有可能会想要创建并运行多个此类容器。为此,需要将容器保存为镜像并存储到本地,以便可以用作其他容器实例的基础。这可以通过使用 podman commit 命令结合容器的名称或 ID,以及将保存镜像的名称来实现,例如:

$ podman commit mycontainer myubuntu_image

一旦镜像已保存,检查它是否出现在本地仓库的镜像列表中:

$ podman images

仓库 标签 镜像 ID 创建时间 大小

localhost/myubuntu_image latest 8ad685d49482 47 秒前 66.6 MB

docker.io/library/ubuntu latest 4e5021d210f6 3 周前 66.6 MB

保存的镜像现在可以用来创建与原始镜像相同的其他容器:

$ podman run --name=mycontainer2 -it localhost/myubuntu_image /bin/bash

30.6 从本地存储中删除镜像

要从本地存储中删除一个不再需要的镜像,只需运行 podman rmi 命令,引用 podman images 命令输出的镜像名称或 ID。例如,要删除在上一节中创建的名为 myubuntu_image 的镜像,可以按如下方式运行 podman:

$ podman rmi localhost/myubuntu_image

请注意,在删除镜像之前,基于该镜像的任何容器必须先被删除。

30.7 删除容器

即使容器已退出或已停止,它仍然存在,并可以随时重新启动。如果不再需要某个容器,可以在容器停止后使用 podman rm 命令删除它,方法如下:

podman rm mycontainer2

30.8 使用 Buildah 构建容器

Buildah 允许从现有容器、镜像或完全从头开始构建新的容器。Buildah 还包括挂载容器文件系统的功能,这样可以从主机访问并修改容器内容。

例如,以下 buildah 命令将从 Ubuntu Base 镜像构建容器(如果该镜像尚未从注册表中拉取,buildah 会在创建容器之前下载它):

$ buildah from docker://docker.io/library/ubuntu:latest

运行此命令的结果将是一个名为 ubuntu-working-container 的容器,已准备好运行:

$ buildah run ubuntu-working-container cat /etc/passwd

30.9 小结

本章通过使用 podman、skopeo 和 buildah 工具,演示了在 Ubuntu 上创建和管理 Linux 容器的过程。

31. 设置 Ubuntu 23.04 网页服务器

Apache 网页服务器是构成 Ubuntu 操作系统的许多软件包之一。Ubuntu 的可扩展性和韧性使其成为托管最繁忙网站的理想平台。

本章将解释如何使用 Apache 配置 Ubuntu 系统作为网页服务器,包括安全(HTTPS)和不安全(HTTP)配置。

31.1 配置 Ubuntu 网页服务器的要求

要设置您自己的网站,您需要一台计算机(或云服务器实例)、操作系统、网页服务器、域名、名称服务器和 IP 地址。

如前所述,Ubuntu 支持 Apache 网页服务器,一旦操作系统启动并运行,Apache 就可以轻松安装。此外,您可以通过任何域名注册服务注册域名。

如果您在云实例上运行 Ubuntu,提供商分配的 IP 地址将在服务器概述信息中列出。然而,如果您托管自己的服务器并且互联网服务提供商(ISP)分配了静态 IP 地址,您必须将您的域名与该地址关联。这是通过使用名称服务器来实现的,所有域名注册服务都会提供此服务。

如果您没有静态 IP 地址(即您的互联网服务提供商(ISP)为您提供一个经常变化的动态地址),您可以使用几种免费的动态 DNS(DDNS 或简称 DynDNS)服务将您的动态 IP 地址映射到您的域名。

一旦您配置了域名和名称服务器,下一步就是安装并配置您的网页服务器。

31.2 安装 Apache 网页服务器软件包

当前版本的 Ubuntu 通常不会默认安装 Apache 网页服务器。要检查服务器是否已经安装,请运行以下命令:

第三十一章:apt -qq list apache2

如果 apt 生成类似以下的输出,则表示 Apache 服务器已经安装:

apache2/lunar,now 2.4.55-1ubuntu2 amd64 [已安装]

如果 apt 输出中没有列出该软件包或没有包含[已安装]状态,请在命令提示符下运行以下命令以进行 Apache 安装:

apt install apache2

31.3 配置防火墙

在启动和测试 Apache 网页服务器之前,防火墙需要修改,以允许网页服务器与外部通信。默认情况下,HTTP 和 HTTPS 协议分别使用 80 和 443 端口,因此,根据使用的协议,可能需要打开其中一个或两个端口。如果您的 Ubuntu 系统受到 Uncomplicated Firewall(UFW)的保护,可以使用以下命令仅启用不安全的网页流量(HTTP):

ufw 允许 Apache

仅启用安全(HTTPS)流量:

ufw 允许 'Apache Secure'

或者,可以按照以下步骤同时启用安全和不安全的网页流量:

ufw 允许 'Apache Full'

如果您使用的是 firewalld,可以使用以下命令打开 HTTP 和 HTTPS 端口。在打开端口时,请务必指定适用于面向互联网的网络连接的防火墙区域:

firewall-cmd --permanent --zone= --add-port=80/tcp

firewall-cmd --permanent --zone= --add-port=443/tcp

打开必要的端口后,务必重新加载防火墙设置:

firewall-cmd --reload

在云托管服务器上,可能还需要在云控制台中为服务器实例启用相应的端口。请查阅云提供商的文档了解操作步骤。

31.4 端口转发

假设承载 web 服务器的 Ubuntu 系统位于一个由防火墙保护的网络中(防火墙运行在另一台计算机上,或者是具有内建防火墙保护的路由器或无线基站)。在这种情况下,您必须配置防火墙将端口 80 和 443 转发到您的 web 服务器系统。执行此操作的机制在不同的防火墙和设备之间有所不同,因此请查阅文档以了解如何配置端口转发。

31.5 启动 Apache Web 服务器

一旦安装了 Apache 服务器并配置了防火墙,下一步是验证服务器是否在运行,并在必要时启动它。

要检查 Apache 服务的状态,可以在命令提示符下输入以下命令:

systemctl status apache2

如果上述命令显示 apache2 服务未运行,可以通过命令行启动它,如下所示:

systemctl start apache2

如果希望 Apache httpd 服务在系统启动时自动启动,请运行以下命令:

systemctl enable apache2

31.6 测试 Web 服务器

安装完成后,下一步是验证 web 服务器是否正在运行。

如果您可以访问服务器的桌面环境(无论是本地还是远程),请启动 Web 浏览器并在地址栏输入 http://127.0.0.1(127.0.0.1 是回环网络地址,指示系统连接到本地计算机)。如果一切设置正确,浏览器应加载 图 31-1 中显示的测试页面:

图 31-1

如果桌面环境不可用,请从与服务器位于同一局域网的另一台系统连接,或者如果服务器托管在远程位置,则使用分配给系统的外部 IP 地址。

31.7 配置 Apache Web 服务器以适应您的域名

设置 Web 服务器的下一步是为你的域名配置它。首先进入 /etc/apache2 目录,该目录包含多个文件和子目录。主要配置文件名为 apache2.conf,它作为组织位于子目录中的模块化配置文件的中心点。例如,apache2.conf 文件包括一行,导入位于 sites-enabled 文件夹中的配置设置:

包括虚拟主机配置:

IncludeOptional sites-enabled/*.conf

类似地,apache2.conf 文件会导入 ports.conf 文件,该文件定义了 Apache 服务器监听网络流量的端口。

要在 Ubuntu 上配置网站域名,首先进入 /etc/apache2 目录。在此目录中,你会找到两个子目录,sites-available 和 sites-enabled。进入 sites-available 目录。在该目录下,你将找到一个默认文件,可作为你自己网站的模板。

将默认文件复制到一个新文件中,文件名应与您的域名匹配。例如:

cp 000-default.conf myexample.conf

使用你喜欢的编辑器编辑你的 myexample.com 文件,它将显示如下:

<VirtualHost *:80>

ServerName 指令设置请求方案、主机名和端口

服务器用来识别自己的。这在创建时使用

重定向 URL。在虚拟主机的上下文中,ServerName

指定请求的 Host: 头部中必须出现的主机名

匹配此虚拟主机。对于默认虚拟主机(此文件),

该值并不决定性,因为它作为最后的备用主机使用。

然而,你必须为任何进一步的虚拟主机显式设置它。

ServerName www.example.com

ServerAdmin webmaster@localhost

DocumentRoot /var/www/html

可用的日志级别:trace8,...,trace1,debug,info,notice,warn,

错误,严重,警报,紧急。

也可以为特定的模块配置日志级别

模块,例如:

LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined

对于来自 conf-available/ 的大多数配置文件,它们是

无论全局启用还是禁用,都可以

为特定虚拟主机包含一行。例如:

以下行仅为此主机启用 CGI 配置

在通过 “a2disconf” 全局禁用后

Include conf-available/serve-cgi-bin.conf

ServerAdmin 指令定义了一个管理员电子邮件地址,供希望联系你网站管理员的人使用。将此地址更改为一个适当的电子邮件地址,以便他人可以联系到你:

ServerAdmin webmaster@myexample.com

接下来,需要取消 ServerName 指令的注释(也就是说,去掉 ‘#’ 字符前缀)并进行定义,以便 Web 服务器知道这个配置文件指的是哪个虚拟主机:

ServerName myexample.com

在下一阶段,我们需要使用 DocumentRoot 指令定义网站文件的位置。传统上,使用 /var/www/domain-name:

DocumentRoot /var/www/myexample.com

完成更改后,我们需要启用该站点,方法如下:

a2ensite myexample.conf

该命令在 sites-available 目录中的 myexample.conf 文件和 sites-enabled 文件夹之间创建一个符号链接。

启用站点后,运行以下命令来禁用默认测试站点:

a2dissite 000-default.conf

接下来,创建 /var/www/myexample.com 目录,并在其中放置一个 index.html 文件。例如:

<title>示例网页</title> <body>

欢迎来到 MyExample.com

</body>

进行这些更改后,运行 apache2ctl 命令来检查配置文件是否存在错误:

apache2ctl configtest

语法正确

如果没有报告错误,重新加载 Apache web 服务器,确保其加载我们新的设置:

systemctl reload apache2

最后,通过打开浏览器窗口并使用域名而非 IP 地址访问该站点来检查服务器配置是否有效。加载的网页应该是上面创建的 index.html 文件中定义的内容。

31.8 安全网站基础知识

本章中创建的 web 服务器和网站使用 HTTP 协议并通过 80 端口进行通信,因此被认为是不安全的。问题在于 web 服务器与客户端(通常是用户的 web 浏览器)之间的流量是明文传输的。换句话说,数据是未加密的,容易被拦截。虽然对于一般的网页浏览来说这不是问题,但在执行如登录网站或传输敏感信息(如身份信息或信用卡细节)等任务时,这种问题就变得非常严重。

现在,网站通常要求使用 HTTPS,它通过使用安全套接字层(SSL)或传输层安全性(TLS)来建立 web 服务器与客户端之间的安全加密通信。这种安全性是通过公钥、私钥、会话加密和证书的组合来实现的。

要支持 HTTPS,网站必须拥有由受信任的证书颁发机构(CA)颁发的证书。当浏览器连接到安全网站时,web 服务器会返回一个网站的 SSL 证书副本,其中也包含网站的公钥副本。浏览器随后会与受信任的证书颁发机构一起验证证书的真实性。

如果证书有效,浏览器将使用服务器发送的公钥来加密会话密钥并将其传递给服务器。服务器使用私钥解密会话密钥,并向浏览器发送加密的确认信息。完成此过程后,浏览器和服务器将使用会话密钥加密所有后续的数据传输,直到会话结束。

31.9 配置 Apache 以支持 HTTPS

默认情况下,Apache 服务器不包括实现安全 HTTPS 网站所需的模块。因此,第一步是按照以下步骤在服务器系统上启用 Apache mod_ssl 模块:

a2enmod ssl

安装完成后,重启 apache2 以加载新模块到 Apache 服务器中:

systemctl restart apache2

使用以下命令检查模块是否已加载到服务器中:

apache2ctl -M | grep ssl_module

ssl_module(共享)

一旦安装了 ssl 模块,请重复本章前一部分中的步骤,为网站创建配置文件,这次使用 sites-available/default-ssl.conf 文件作为站点配置文件的模板。

假设模块已安装,下一步是为网站生成 SSL 证书。

31.10 获取 SSL 证书

网站的证书必须从证书颁发机构(CA)获得。有多种选择,价格也各异。然而,最好的选择是从 Let’s Encrypt 获取免费的证书,网址如下:

letsencrypt.org/

从 Let’s Encrypt 获取证书需要安装并运行 Certbot 工具。该工具会扫描服务器上的 Apache 配置文件,并提供为系统上配置的任何虚拟主机生成证书的选项。然后,它会生成证书,并将虚拟主机条目添加到 Apache 配置文件中,以适应相应的网站。

按照 Let’s Encrypt 网站上的步骤,在您的 Ubuntu 系统上下载并安装 Certbot,然后按如下方式运行 certbot 工具以生成并安装证书:

certbot --apache

在请求电子邮件地址并寻求服务条款同意后,Certbot 会列出在 httpd.conf 文件中找到的域名,并允许选择一个或多个网站以安装证书。然后,Certbot 会执行一些检查,然后获取并安装证书到系统中:

您希望为哪些名称启用 HTTPS?


1: www.myexample.com


选择适当的数字,数字之间用逗号和/或空格分隔,或保持输入为空

按空白键选择所有显示的选项(按 ‘c’ 取消):1

正在获取新证书

执行以下挑战:

http-01 挑战 for www.myexample.com

等待验证...

清理挑战

在 /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/apache2/sites-available 目录中创建一个名为 myexample-le-ssl.conf 的新文件,该文件包含为每个已生成证书的域名创建的安全虚拟主机条目,并使站点启用,使得该文件的链接出现在/etc/apache2/sites-enabled 目录中。这些条目将类似于以下内容:

<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

Include /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 配置,并且希望在稍后再切换,可以选择“不重定向”选项。否则,通常建议进行 HTTPS 重定向。

证书安装完成后,可以在浏览器中访问以下网址进行测试(将 myexample.com 替换为您的域名):

www.ssllabs.com/ssltest/analyze.html?d=www.myexample.com

如果证书配置成功,SSL Labs 报告将提供一个高评分,如图 31-2 所示:

图 31-2

作为最后的测试,打开浏览器窗口,并使用 https://前缀访问您的域名。页面应该像之前一样加载,浏览器应显示浏览器和服务器之间的连接是安全的(通常通过地址栏中的挂锁图标来表示,点击该图标可获取更多信息):

图 31-3

31.11 总结

一个 Ubuntu 系统可以通过安装 Apache 网络服务器来托管网站。可以在 Ubuntu 上部署不安全的(HTTP)和安全的(HTTPS)网站。安全的网站使用安全套接字层(SSL)或传输层安全性(TLS)来建立加密通信,通过公钥、私钥和会话加密以及由受信任的证书颁发机构签发的证书,在 Web 服务器和客户端之间进行通信。

32. 配置 Ubuntu 23.04 Postfix 邮件服务器

除了充当 Web 服务器外,邮件也是 Ubuntu 系统的主要用途之一,尤其是在商业环境中。鉴于邮件的重要性和普及性,对于一些人来说,发现 Linux 系统上的邮件结构竟然如此复杂,着实令人惊讶。这种复杂性常常让 Ubuntu 新手感到不知所措。

好消息是,许多复杂性存在是为了让有经验的邮件管理员能够为大规模企业安装实现复杂配置。然而,对于大多数 Linux 管理员来说,设置一个基本的邮件系统是相对简单的,这样用户就可以发送和接收电子邮件。

本章将解释基于 Linux 的邮件配置基础,并逐步配置一个基本的邮件环境。为了提供基础知识,我们将把邮件系统的复杂性留给更高级的书籍。

32.1 邮件系统的结构

一个完整的邮件系统由多个组件构成。以下是每个组件的简要描述:

32.1.1 邮件用户代理

典型的用户可能最熟悉系统的这一部分。邮件用户代理(MUA),即邮件客户端,是用于编写、发送和阅读电子邮件的应用程序。任何在计算机上编写并发送过邮件的人,都使用过某种类型的邮件用户代理。

在 Linux 上,典型的图形化邮件用户代理(MUA)有 Evolution、Thunderbird 和 KMail。对于那些偏好基于文本的邮件客户端的人,还有更传统的 Pine 和 mail 工具可供选择。

32.1.2 邮件传输代理

邮件传输代理(MTA)是邮件系统的一部分,负责将电子邮件消息从一台计算机传输到另一台计算机(无论是在同一局域网内,还是通过互联网传输到远程系统)。一旦正确配置,大多数用户只有在需要重新配置时,才会直接与他们选择的 MTA 进行交互。Linux 上有许多 MTA 选择,包括 Sendmail、Postfix、Fetchmail、Qmail 和 Exim。

32.1.3 邮件投递代理

另一个通常对用户隐藏的基础设施部分是邮件投递代理(MDA),它在后台执行邮件传输代理与邮件客户端(MUA)之间的邮件过滤。最常见的 MDA 形式是垃圾邮件过滤器,用于在邮件到达用户的邮件客户端(MUA)收件箱之前,去除所有不需要的电子邮件消息。常见的 MDA 包括 Spamassassin 和 Procmail。需要注意的是,一些邮件用户代理应用程序(如 Evolution、Thunderbird 和 KMail)包含自己的 MDA 过滤功能。而其他一些如 Pine 和 Basla 的应用程序则没有。这可能会让 Linux 初学者感到困惑。

32.1.4 SMTP

SMTP 是简单邮件传输协议(Simple Mail Transport Protocol)的缩写。电子邮件系统使用此协议将邮件从一个服务器传输到另一个服务器。这一协议是 MTA 用来相互通信并交换消息的语言。

32.1.5 SMTP 中继

SMTP 中继是一种协议,允许外部 SMTP 服务器发送电子邮件,而不需要托管本地的 SMTP 服务器。通常,这涉及使用像 Mailjet、SendGrid 或 MailGun 这样的服务。这些服务避免了配置和维护自己的 SMTP 服务器,并且通常提供额外的好处,如分析功能。

32.2 配置 Ubuntu 邮件服务器

许多系统使用 Sendmail MTA 来传输电子邮件消息;在许多 Linux 发行版中,这是默认的邮件传输代理。不幸的是,Sendmail 是一个复杂的系统,对于初学者和有经验的用户来说,都可能难以理解和配置。它的受欢迎程度也在下降,因为与许多新型 MTA 相比,Sendmail 在处理电子邮件消息时被认为较慢。

现在许多系统管理员使用 Postfix 或 Qmail 来处理电子邮件。与 Sendmail 相比,这两者的配置更简单,速度也更快。

因此,本章将重点介绍 Postfix 作为 MTA,因其简便性和流行性。然而,如果你更喜欢使用 Sendmail,许多书籍专门讨论这一主题,能够更深入地讲解本章节无法覆盖的内容。

本章的第一步将介绍如何配置 Ubuntu 系统作为完整的邮件服务器。后续章节还将介绍使用 SMTP 中继服务的步骤。

32.3 Postfix 安装前步骤

安装 Postfix 之前的第一步是确保 Sendmail 没有在系统上运行。可以使用以下命令检查:

第三十二章:systemctl status sendmail

如果没有安装 Sendmail,工具将显示类似以下的消息:

单元 sendmail.service 找不到。

如果系统上正在运行 Sendmail,在安装和配置 Postfix 之前,必须先停止它。要停止 Sendmail,可以运行以下命令:

systemctl stop sendmail

下一步是确保在系统重启时,sendmail 不会自动重新启动:

systemctl disable sendmail

Sendmail 已被关闭,并配置为在系统启动时不自动启动。可选择性地,如果要完全从系统中移除 Sendmail,可以运行以下命令:

apt remove sendmail

32.4 防火墙/路由器配置

由于发送和接收电子邮件涉及网络连接,因此防火墙必须配置为允许 SMTP 流量。如果 firewalld 已启用,可以使用 firewall-cmd 工具,如下所示:

firewall-cmd --permanent --add-service=smtp

或者,如果启用了 ufw,可以使用以下命令配置它以允许 SMTP 流量:

ufw allow Postfix

配置任何其他防火墙或路由器以允许 25、143 和 587 端口的连接,并根据需要为这些端口配置端口转发到邮件服务器上的相应端口,这也是至关重要的。

完成这些初步步骤后,我们现在可以安装 Postfix。

32.5 在 Ubuntu 上安装 Postfix

默认情况下,Ubuntu 安装过程会为大多数配置安装 Postfix。要验证 Postfix 是否已安装,可以使用以下 apt 命令:

apt -qq list postfix

如果 apt 报告 Postfix 未安装,您可以通过以下方式进行安装:

apt install postfix

apt 工具将下载并安装 Postfix,并在 /etc/passwd 文件中配置一个特殊的 Postfix 用户。

32.6 配置 Postfix

Postfix 的主要配置设置位于 /etc/postfix/main.cf 文件中。/etc/postfix 目录包含一个名为 main.cf.proto 的模板文件,您可以将其用作邮件系统配置的基础。互联网上有许多资源提供关于 Postfix 的详细信息,因此本节将重点介绍启动邮件服务所需的基本选项。尽管 apt 安装过程中会设置一些基本配置选项,但它往往会漏掉一些设置,或者对其他设置做出错误猜测,因此请仔细检查 main.cf 文件。

main.cf 文件中的关键选项如下:

myhostname = mta1.domain.com

mydomain = domain.com

myorigin = $mydomain

mydestination = \(myhostname, localhost.\)mydomain, localhost, $mydomain

inet_interfaces = $myhostname

mynetworks = 子网

其他设置要么已由安装过程为您设置,要么仅在您想配置更复杂的邮件系统时才需要。

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

在这个例子中,将属性设置为 subnet,这样与服务器在同一局域网中的其他系统可以通过 SMTP 中继发送邮件。相比之下,外部系统则被阻止这样做:

mynetworks = subnet

32.7 配置 DNS MX 记录

当你在注册商处注册并配置你的域名时,DNS 设置中会预先配置几个默认值。其中之一就是所谓的邮件交换(MX)记录。这个记录定义了发送到你域名的电子邮件应当被发送到哪里,通常默认设置为注册商提供的邮件服务器。如果你托管了自己的邮件服务器,MX 记录应该设置为你的域名或邮件服务器的 IP 地址。进行此更改的步骤取决于你的域名注册商,但通常涉及编辑域名的 DNS 信息,并添加或编辑现有的 MX 记录,使其指向你的邮件服务器。

32.8 在 Ubuntu 系统上启动 Postfix

一旦 /etc/postfix/main.cf 文件已配置正确的设置,现在是时候启动 postfix 了。这可以通过命令行如下完成:

systemctl start postfix

如果 postfix 已经在运行,确保使用以下命令加载配置更改:

systemctl reload postfix

要配置 postfix 在系统启动时自动启动,请运行以下命令:

systemctl enable postfix

postfix 进程现在应该已经启动。验证一切正常的最佳方法是检查你的邮件日志。通常该日志文件位于 /var/log/maillog 中,并且现在应该包含如下输出的条目:

Mar 25 11:21:48 demo-server postfix/postfix-script[5377]: 启动 Postfix 邮件系统

Mar 25 11:21:48 demo-server postfix/master[5379]: 守护进程已启动 -- 版本 3.3.1,配置文件 /etc/postfix

只要没有错误信息被记录,你就成功安装并启动了 postfix,准备好测试 postfix 配置。

32.9 测试 Postfix

测试 Postfix 配置的一个简单方法是通过系统中的本地用户之间发送电子邮件。要进行快速测试,请使用 mail 工具,方法如下(其中 name 和 mydomain 分别替换为系统中的用户名和您的域名):

mail name@mydomain.com

当提示时,输入电子邮件的主题,然后键入消息正文。要发送电子邮件,按 Ctrl-D。例如:

mail demo@mydomain.com

主题:测试电子邮件

这是一条测试消息。

EOT

如果 mail 工具不可用,可以通过以下方式安装:

apt install mailutils

重新运行 mail 命令,这次使用另一个用户,并验证消息是否已发送和接收:

$ mail

"/var/mail/demo": 1 条消息 1 条新邮件

N 1 demo Wed Apr 15 15:30 13/475 测试电子邮件

?

如果消息没有出现,请检查日志文件 (/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/mail.log 文件以了解任何错误的解释。

32.10 通过 SMTP 中继服务器发送邮件

SMTP 中继服务是配置邮件服务器处理外发电子邮件消息的替代方案。如前所述,提供几种服务,大多数可以通过在网上搜索“SMP 中继服务”找到。大多数这些服务要求您以某种方式验证您的域,并提供 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

服务重新启动后,请尝试使用邮件工具或您喜欢的邮件客户端发送和接收邮件。

32.11 总结

完整的端到端邮件系统包括邮件用户代理(MUA)、邮件传输代理(MTA)、邮件投递代理(MDA)和 SMTP 协议。Ubuntu 提供了几种 MTA 解决方案选项,其中比较流行的是 Postfix。本章概述了如何在 Ubuntu 系统上安装、配置和测试 postfix 作为邮件服务器,并使用第三方 SMTP 中继服务器发送和接收电子邮件。

  1. 在 Ubuntu 23.04 系统中添加新硬盘驱动器

用户和系统管理员遇到的第一个问题之一是,系统需要更多的磁盘空间来存储数据。幸运的是,磁盘空间现在是最便宜的 IT 商品之一。在本章及下一章中,我们将讨论如何配置 Ubuntu 使用新安装的物理或虚拟磁盘提供的空间。

33.1 挂载的文件系统或逻辑卷

在 Ubuntu 系统上配置新硬盘有两种方式。一种直接的方法是,在新硬盘上创建一个或多个 Linux 分区,在这些分区上创建 Linux 文件系统,然后将它们挂载到特定的挂载点以便访问。本章将介绍这种方法。

另一种方法是将新空间添加到现有的卷组中,或者创建一个新的卷组。当 Ubuntu 安装时,会创建一个名为的卷组。在这个卷组中有三个逻辑卷,分别是 root、home 和 swap,用于存储/和/home 文件系统以及交换分区。我们可以通过将新硬盘配置为卷组的一部分,来增加现有逻辑卷的可用磁盘空间。例如,使用这种方法,我们可以通过将新硬盘上的部分或全部空间分配给 home 卷,来增加/home 文件系统的大小。这个话题将在“向 Ubuntu 23.04 卷组和逻辑卷中添加新磁盘”中详细讨论。

33.2 查找新硬盘

本教程假设已经安装了一个新的物理或虚拟硬盘,并且操作系统可以识别该硬盘。添加后,操作系统应该会自动检测到新硬盘。通常,系统中的磁盘驱动器会被分配以以 hd、sd 或 nvme 开头的设备名称,后面跟一个字母表示设备编号。第一个设备可能是/dev/sda,第二个是/dev/sdb,依此类推。

以下是一个典型系统的输出,系统只连接了一个磁盘驱动器并通过 SATA 控制器连接:

第三十三章:ls /dev/sd*

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

这表明由/dev/sda 表示的硬盘驱动器被分成了两个分区,分别由/dev/sda1 和/dev/sda2 表示。

以下是安装第二块硬盘后,来自相同系统的输出:

ls /dev/sd*

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

新的硬盘已被分配到设备文件/dev/sdb。该硬盘没有显示任何分区(因为我们还没有创建分区)。

到此为止,我们可以在新硬盘上创建分区和文件系统,并将其挂载以便访问,或者将硬盘作为物理卷添加到卷组中。如果执行前者,请继续阅读本章;否则,请阅读“向 Ubuntu 23.04 卷组和逻辑卷中添加新磁盘”以了解如何配置逻辑卷。

33.3 创建 Linux 分区

下一步是在新磁盘上创建一个或多个 Linux 分区。这可以通过使用 fdisk 工具来完成,该工具接受要分区的设备作为命令行参数:

fdisk /dev/sdb

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

变更仅会保存在内存中,直到您决定写入它们。

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

设备不包含已识别的分区表。

使用磁盘标识符 0x64d68d00 创建了一个新的 DOS 磁盘标签。

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

要查看磁盘当前的分区,请输入 p 命令:

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

磁盘 /dev/sdb:14.46 GiB,15525216256 字节,30322688 扇区

磁盘型号:USB 2.0 FD

单位:1 * 512 = 512 字节

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

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

磁盘标签类型:dos

磁盘标识符:0x64d68d00

从上面的 fdisk 输出可以看出,磁盘当前没有分区,因为它之前未使用。下一步是在磁盘上创建一个新分区,可以通过输入 n(表示新分区)和 p(表示主分区)来完成:

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

分区类型

p 主分区(0 个主分区,0 个扩展分区,4 个空闲分区)

e 扩展分区(逻辑分区的容器)

选择(默认 p):p

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

在这个例子中,我们只打算创建一个分区,即分区 1。接下来,我们需要指定分区的起始和结束位置。由于这是第一个分区,我们需要它从第一个可用扇区开始,并且由于我们想使用整个磁盘,因此指定最后一个扇区作为结束位置。请注意,如果您希望创建多个分区,可以按扇区、字节、千字节或兆字节来指定每个分区的大小:

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

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

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

创建了一个新的 'Linux' 类型的分区 1,大小为 14.5 GiB。

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

现在我们已指定分区,接下来需要使用 w 命令将其写入磁盘:

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

分区表已被更改。

正在调用 ioctl() 重新读取分区表。

正在同步磁盘。

如果我们现在再次查看设备,我们会看到新分区以 /dev/sdb1 可见:

ls /dev/sd*

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

下一步是在新分区上创建文件系统。

33.4 在 Ubuntu 磁盘分区上创建文件系统

我们现在已安装新磁盘,它在 Ubuntu 上可见,我们在磁盘上配置了一个 Linux 分区。接下来的步骤是在该分区上创建一个 Linux 文件系统,以便操作系统可以用它来存储文件和数据。创建文件系统的最简单方法是使用 mkfs.xfs 工具:

apt install xfsprogs

umount /dev/sdb1

mkfs.xfs -f /dev/sdb1

meta-data=/dev/sdb1 isize=512 agcount=4, agsize=947520 blks

= sectsz=512 attr=2, projid32bit=1

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

= reflink=1 bigtime=1 inobtcount=1

data = bsize=4096 blocks=3790080, 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 是一种高性能的文件系统,是 Ubuntu 的默认文件系统类型,并在并行 I/O 性能和日志使用方面具有多个优势。

33.5 日志文件系统概述

日志文件系统在每次磁盘写入过程中都会保持一个日志或记录,记录文件系统的变化,这些日志可以用来快速重建由于系统崩溃或断电等事件导致的文件系统损坏。

使用日志文件系统有几个优点。首先,存储在磁盘驱动器上的数据大小和容量在这些年来已经呈指数增长。非日志文件系统的问题在于,发生崩溃后必须运行 fsck(文件系统一致性检查)工具。fsck 工具会扫描整个文件系统,验证所有条目,并确保块被正确分配和引用。如果它发现损坏的条目,它将尝试修复问题。这里有两个问题。首先,fsck 工具并不总是能够修复损坏,你最终会得到存储在 lost+found 目录中的数据。应用程序使用这些数据,但系统不再知道它来自哪里。另一个问题是时间问题。在一个庞大的文件系统上完成 fsck 过程可能需要很长时间,可能会导致不可接受的停机时间。

另一方面,日志文件系统在每次写入时都会将信息记录到磁盘上的日志区(日志和日志区不必在同一设备上)。这本质上是一个“提交意图”,用于将数据写入文件系统。记录的信息量是可配置的,范围从不记录任何内容到记录所谓的“元数据”(即所有者、日期戳信息等),再到记录“元数据”以及将写入文件的数据块。日志更新后,系统将实际数据写入相应的文件系统区域,并标记一个条目表示数据已提交。

崩溃后,可以使用日志文件迅速将文件系统恢复上线,从而将原本需要几分钟的 fsck 过程缩短为几秒钟,并且大大减少数据丢失或损坏的机会。

33.6 挂载文件系统

现在我们已经在新磁盘的 Linux 分区上创建了新的文件系统,我们需要将其挂载以便访问和使用。为此,我们需要创建一个挂载点。挂载点只是一个目录或文件夹,文件系统将在其中挂载。对于本示例,我们将创建一个/backup 目录,以匹配我们的文件系统标签(尽管这些值不需要匹配):

mkdir /backup

然后,文件系统可以通过 mount 命令手动挂载:

mount /dev/sdb1 /backup

运行不带任何参数的 mount 命令将显示当前挂载的所有文件系统(包括我们新添加的文件系统):

mount

proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)

.

.

/dev/sdb1 on /backup type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

33.7 配置 Ubuntu 自动挂载文件系统

为了设置系统,使新的文件系统在启动时自动挂载,需要在/etc/fstab 文件中添加一条条目。fstab 条目的格式如下:

这些条目可以总结如下:

- 文件系统将被挂载到的设备。

- 作为文件系统挂载点的目录。

- 文件系统类型(如 xfs、ext4 等)

- 附加的文件系统挂载选项,例如,使文件系统只读或控制是否可以由任何用户挂载文件系统。运行 man mount 查看完整的选项列表。将此值设置为 defaults 将使用文件系统的默认设置(rw, suid, dev, exec, auto, nouser, async)。

- 指定文件系统的内容是否应包括在 dump 工具执行的任何备份中。此设置很少使用,可以通过设置为 0 来禁用。

- 系统崩溃后是否通过 fsck 检查文件系统,以及文件系统检查的顺序。对于像 XFS 这样的日志文件系统,应将其设置为 0,以表示不需要检查。

以下示例展示了一个 fstab 条目,用于自动挂载我们位于/dev/sdb1 分区上的/backup 分区:

/dev/sdb1 /backup xfs defaults 0 0

现在,每次系统重启时,/backup 文件系统将自动挂载。

33.8 使用 Cockpit 添加磁盘

除了使用本章概述的命令行工具进行存储操作外,还可以使用 Cockpit Web 控制台配置新的存储设备。要查看当前的存储配置,请登录 Cockpit 控制台并选择“存储”选项,如图 33-1 所示:

图 33-1

要找到新添加的存储,滚动到存储页面的底部,直到“磁盘”部分出现在视野中(注意,“磁盘”部分也可能位于屏幕的右上角):

图 33-2

在上面的图示中,新的驱动器是 15.5 GB 的驱动器。选择新驱动器以显示如图 33-3 所示的驱动器界面:

图 33-3

点击创建分区按钮,并使用对话框指定分配给此分区的空间大小、文件系统类型(推荐使用 XFS)、以及可选的标签、文件系统挂载点和挂载选项。请注意,如果新分区没有使用所有可用空间,可以向驱动器添加其他分区。要更改如文件系统是否为只读或是否在启动时挂载等设置,请在挂载选项部分更改设置:

图 33-4

选择好设置后,点击创建分区按钮以提交更改。在创建过程完成后,新的分区将被添加到磁盘中,相应的文件系统将被创建并挂载到指定的挂载点,/etc/fstab 文件也会做出相应的更改。

33.9 小结

本章介绍了如何将物理或虚拟磁盘驱动器添加到现有的 Ubuntu 系统中。这是一个相对简单的过程,确保新驱动器已被操作系统检测到,在驱动器上创建一个或多个分区,然后在这些分区上创建文件系统。虽然 Ubuntu 提供了多种文件系统类型,但通常推荐使用 XFS。一旦文件系统准备好,可以使用 mount 命令将其挂载。为了使新创建的文件系统在系统启动时自动挂载,可以向/etc/fstab 配置文件中添加条目。

  1. 向 Ubuntu 23.04 卷组和逻辑卷添加新磁盘

在上一章中,我们了解了如何向 Ubuntu 系统添加新的磁盘驱动器,创建分区和文件系统,并挂载该文件系统以访问磁盘。创建固定分区和文件系统的替代方法是使用逻辑卷管理(LVM)来创建逻辑磁盘,这些逻辑磁盘由一个或多个物理磁盘、虚拟磁盘或分区的空间组成。使用 LVM 的优势在于,可以在不将数据分散到多个文件系统中的情况下,向逻辑卷中添加或删除空间。

让我们以基于 Ubuntu 的服务器的根(/)文件系统为例。没有 LVM 时,操作系统安装时该文件系统会被创建为特定大小。如果安装了新的磁盘驱动器,则无法将任何空间分配给 / 文件系统。唯一的选择是为新磁盘创建新的文件系统,并将其挂载到特定的挂载点。在这种情况下,新的文件系统会有充足的空间,但 / 文件系统仍然几乎已满。唯一的选择是将文件移动到新的文件系统上。使用 LVM 时,可以将新磁盘(或其一部分)分配给包含 home 文件系统的逻辑卷,从而动态扩展可用空间。

在本章中,我们将了解为 Ubuntu 系统的 home 文件系统添加新磁盘空间的步骤,包括如何向卷组和逻辑卷中添加额外的空间。

34.1 逻辑卷管理(LVM)概述

LVM 提供了一种灵活的高级磁盘空间管理方法。与每个磁盘驱动器被划分为固定大小的分区并在其上创建固定大小的文件系统不同,LVM 提供了一种将磁盘空间分组为逻辑卷的方法,这些逻辑卷可以轻松调整大小和移动。此外,LVM 允许管理员通过为不同的用户组分配独立的卷组或逻辑卷,来仔细控制分配给不同用户的磁盘空间。当最初分配给卷的空间耗尽时,管理员可以在不将用户文件移动到其他文件系统的情况下添加更多空间。

LVM 由以下组件组成:

34.1.1 卷组(VG)

卷组是包含一个或多个逻辑卷和物理卷的高级容器。

34.1.2 物理卷(PV)

物理卷代表存储设备,如磁盘驱动器或其他存储介质。

34.1.3 逻辑卷(LV)

逻辑卷相当于一个磁盘分区,并且与磁盘分区一样,可以包含一个文件系统。

34.1.4 物理扩展(PE)

每个物理卷(PV)被划分为相同大小的块,称为物理扩展。

34.1.5 逻辑扩展(LE)

每个逻辑卷(LV)被划分为相同大小的块,称为逻辑扩展。

假设我们正在创建一个名为 VolGroup001 的新卷组。该卷组需要物理磁盘空间才能运行,因此我们分配了三个磁盘分区/dev/sda1、/dev/sdb1 和/dev/sdb2。这些将成为 VolGroup001 中的物理卷。然后,我们将在包含这三个物理卷的卷组中创建一个名为 LogVol001 的逻辑卷。

如果我们在 LogVol001 中用尽空间,我们将添加更多磁盘分区作为物理卷,并将它们分配给卷组和逻辑卷。

34.2 获取逻辑卷信息

作为 Ubuntu 中使用 LVM 的示例,我们将通过一个示例来向标准 Ubuntu 安装的/文件系统添加空间。为了应对根分区大小的灵活性需求,Ubuntu 将/文件系统设置为逻辑卷(称为 ubuntu_lv),并将其放入名为 ubuntu-vg 的卷组中。然而,在对 LVM 设置进行任何更改之前,首先必须收集信息。

运行 mount 命令将输出有关多个挂载点的信息,包括以下关于 home 文件系统的条目:

/dev/mapper/ubuntu--vg-ubuntu--lv 在 / 类型 ext4(读写,relatime)

可以使用 vgdisplay 命令获取关于卷组的信息:

第三十四章:vgdisplay

--- 卷组 ---

VG 名称 ubuntu-vg

系统 ID

格式 lvm2

元数据区域 1

元数据序列号 2

VG 访问 读写

VG 状态 可调整大小

最大 LV 0

当前 LV 1

打开 LV 1

最大 PV 0

当前 PV 1

活跃 PV 1

VG 大小 <295.04 GiB

PE 大小 4.00 MiB

总 PE 75529

分配 PE / 大小 75529 / <295.04 GiB

空闲 PE / 大小 0 / 0

VG UUID IIGC9W-1UBx-fajE-SMoK-rUdn-qw8E-0omd5P

如上例所示,ubuntu-vg 卷组的物理扩展大小为 4.00 MiB,并且总共有 295.04GB 可供分配给逻辑卷。目前,已分配 75529 个物理扩展,等于总容量。因此,我们必须添加一个或多个物理卷,以增加分配给 ubuntu-vg 卷组中任何逻辑卷的空间。vgs 工具也有助于快速显示系统中卷组的可用空间概况:

vgs

VG #PV #LV #SN 属性 大小 空闲空间

ubuntu-vg 1 1 0 wz--n- <295.04g 0

可以使用 lvdisplay 命令获取关于卷组中逻辑卷的信息:

lvdisplay

--- 逻辑卷 ---

LV 路径 /dev/ubuntu-vg/ubuntu-lv

LV 名称 ubuntu-lv

VG 名称 ubuntu-vg

LV UUID DaPi0C-vwvy-UudI-aUJQ-mFqx-rIhZ-rT7uHH

LV 写访问 读写

LV 创建主机,时间 ubuntu,2023-07-26 15:42:23 -0400

LV 状态 可用

打开 1

LV 大小 <295.04 GiB

当前 LE 75529

段 1

分配继承

预读扇区 自动

  • 当前设置为 256

块设备 253:0

如上所示,ubuntu-vg 卷组中 295.04 GiB 的空间已分配给逻辑卷 ubuntu-lv(用于/文件系统)。

现在我们知道了哪些空间被使用,通常了解哪些设备提供这些空间(换句话说,哪些设备作为物理卷被使用)是有帮助的。要获取此信息,我们需要运行 pvdisplay 命令:

pvdisplay

--- 物理卷 ---

PV 名称 /dev/sda3

VG 名称 ubuntu-vg

PV 大小 <295.04 GiB / 不可用 4.00 MiB

可分配是(但已满)

PE 大小 4.00 MiB

总 PE 75529

空闲 PE 0

已分配 PE 75529

PV UUID mdde89-ZZS8-6ila-qoZy-ofLp-zxEq-dhifen

很明显,逻辑卷 ubuntu-vg 控制的空间是通过位于/dev/sda2 上的物理卷提供的。

现在我们更了解我们的 LVM 配置,可以向卷组和其中包含的逻辑卷添加空间。

34.3 从命令行向卷组添加额外空间

就像在之前的步骤中获取有关 Ubuntu 系统当前逻辑卷管理配置的信息一样,也可以从命令行对该配置进行更改。

在本章的剩余部分,我们假设系统中已添加新磁盘,并且操作系统将其识别为/dev/sdb。我们还假设这是一个没有现有分区的新磁盘。如果存在现有分区,应该先备份它们,然后使用 fdisk 工具删除磁盘上的分区。例如,假设/dev/sdb 设备包含如下两个分区:

fdisk -l /dev/sdb

磁盘 /dev/sdb: 14.46 GiB, 15525216256 字节, 30322688 扇区

磁盘型号:USB 2.0 FD

单位:以 512 字节为单位的扇区

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

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

磁盘标签类型:dos

磁盘标识符:0x4c33060b

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

/dev/sdb1 2048 30322687 30320640 14.5G 83 Linux

一旦这些分区上的文件系统被卸载,它们可以如下删除:

fdisk /dev/sdb

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

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

使用写入命令时请小心。

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

已选择分区 1

分区 1 已删除。

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

分区表已更改。

调用 ioctl()重新读取分区表。

正在同步磁盘。

在进入下一步之前,移除/etc/fstab 文件中与这些文件系统相关的任何条目,以免系统在下次重启时尝试挂载它们。

一旦磁盘准备就绪,下一步是使用 pvcreate 命令将其转换为物理卷(如果存在 DOS 签名,也会擦除它):

pvcreate /dev/sdb

警告:在/dev/sdb 的偏移量 510 处检测到 DOS 签名。是否擦除?[y/n]: y

正在擦除/dev/sdb 上的 DOS 签名。

物理卷“/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 命令将其添加到卷组(在此案例中为 ubuntu-vg)中:

vgextend ubuntu-vg /dev/sdb

卷组 "ubuntu-vg" 成功扩展

新的物理卷现在已被添加到卷组中,并准备分配给逻辑卷。为此,我们运行 lvextend 工具,提供希望扩展的大小。在此案例中,我们希望将根逻辑卷的大小扩展 14 GB。请注意,我们需要提供逻辑卷的路径,可以通过 lvdisplay 命令获得(在此案例中为 /dev/ubuntu-vg/ubuntu-lv):

lvextend -L+14G /dev/ubuntu-vg/ubuntu-lv

逻辑卷 ubuntu-vg/ubuntu-lv 的大小从 <295.04 GiB (75529 extents) 更改为 <309.04 GiB (79113 extents)。

逻辑卷 ubuntu-vg/ubuntu-lv 成功调整大小。

最后一步是调整位于逻辑卷上的文件系统的大小,以使用额外的空间。执行此操作的方法将取决于文件系统类型,可以使用以下 df 命令并检查 Type 列来识别:

df -T /

文件系统类型 1K-块 使用 已用 可用 使用% 挂载点

/dev/mapper/ubuntu--vg-ubuntu--lv ext4 303396024 22139044 265772260 8% /

如果 / 使用 XFS 文件系统格式化,则可以使用 xfs_growfs 工具来调整大小:

xfs_growfs /

另一方面,如果文件系统类型是 ext2、ext3 或 ext4,则应使用 resize2fs 工具来执行文件系统调整大小:

resize2fs /dev/ubuntu-vg/ubuntu-lv

调整大小完成后,文件系统将扩展以使用新磁盘驱动器提供的额外空间。所有这些操作都在不移动任何文件或重新启动服务器的情况下完成。就系统上的用户而言,除了磁盘空间变多了,其他一切都没有变化。

34.4 总结

卷组和逻辑卷为 Ubuntu 系统中的物理存储设备提供了一个抽象层,提供了一种灵活的方式来分配由多个磁盘驱动器提供的空间。这使得可以动态地进行磁盘空间分配和更改,而无需重新分区磁盘驱动器并在文件系统之间移动数据。本章概述了卷组、逻辑卷和物理卷的基本概念,并演示了如何使用命令行工具来管理这些内容。

  1. 添加和管理 Ubuntu 交换空间

维护 Ubuntu 系统性能的一个重要部分是确保有足够的交换空间,以满足系统的内存需求。因此,本章的目标是提供 Ubuntu 交换管理的概述。

35.1 什么是交换空间?

计算机系统有有限的物理内存,供操作系统使用。当操作系统开始接近可用内存的上限时,它通过将内存页面写入磁盘来释放空间。当操作系统需要这些页面时,它们会被重新读取到内存中。为此任务分配的磁盘区域称为交换空间。

35.2 Ubuntu 推荐的交换空间

Ubuntu 推荐的交换空间取决于多个因素,包括系统的内存大小、对内存的工作负载以及系统是否需要支持休眠。当前的 Ubuntu 交换空间指南如下:

安装的 RAM 大小 推荐的交换空间大小 如果启用休眠,推荐的交换空间大小
1GB 1GB 2GB
2GB 1GB 3GB
3GB 2GB 5GB
4GB 2GB 6GB
5GB 2GB 7GB
6GB 2GB 8GB
8GB 3GB 11GB
12GB 3GB 15GB
16GB 4GB 32GB
24GB 5GB 48GB

表 35-1

对于内存配置超过 24GB 的系统,请参考以下网页获取交换空间指南:

help.ubuntu.com/community/SwapFaq

当系统进入休眠状态时,当前的系统状态会写入硬盘,主机关闭电源。随后,当机器重新开机时,系统的状态会从硬盘恢复。这与挂起不同,挂起时系统状态存储在 RAM 中,机器进入睡眠状态,此时系统 RAM 保持供电,而其他设备则关闭。

35.3 确认当前交换空间使用情况

可以通过多种方式识别 Ubuntu 系统当前使用的交换空间。一个选项是输出 /proc/swaps 文件:

第三十五章:cat /proc/swaps

文件名 类型 大小 已用 优先级

/swap.img 文件 3778556 836928 -2

另外,可以使用 swapon 命令:

swapon

名称 类型 大小 已用 优先级

/swap.img 文件 3.6G 817.3M -2

要查看与系统总可用内存相比的交换空间大小,可以使用 free 命令:

free

总计 已用 空闲 共享 缓冲/缓存 可用

Mem: 3779672 2554028 451216 809132 1839908 1225644

交换: 3778556 836928 2941628

35.4 向 Ubuntu 系统添加交换文件

可以通过创建一个文件并将其指定为交换空间来向系统添加额外的交换空间。首先使用 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

名称 类型 大小 已用 优先级

/swap.img 文件 3.6G 832.5M -2

/newswap 文件 1.9G 0B -3

可以使用 swapoff 工具动态移除交换空间,方法如下:

swapoff /newswap

最后,修改 /etc/fstab 文件,在系统启动时自动添加新的交换空间,通过添加以下行:

/newswap swap swap 默认 0 0

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

名称 类型 大小 已用 优先级

/swap.img 文件 3.6G 832.5M -2

/dev/sdb1 分区 8G 0B -3

再次,/etc/fstab 文件可能会被修改,在启动时自动添加交换分区,方法如下:

/dev/sdb1 swap swap 默认 0 0

35.6 向 Ubuntu LVM 交换卷添加空间

在使用逻辑卷管理(LVM)的系统中,如果交换空间配置为逻辑卷,除了通过文件或磁盘分区添加交换空间外,还可以扩展用于交换空间的逻辑卷。

第一步是使用 lvdisplay 工具识别当前可用的交换空间量以及用于交换空间的卷组和逻辑卷(有关 LVM 的更多信息,请参见标题为“将新磁盘添加到 Ubuntu 23.04 卷组和逻辑卷”的章节):

lvdisplay

.

.

--- 逻辑卷 ---

LV 路径 /dev/ubuntu-vg/swap_1

LV 名称 swap_1

VG 名称 ubuntu-vg

LV UUID nJPip0-Q6dx-Mfe3-4Aao-gWAa-swDk-7ZiPdP

LV 写访问权限 读/写

LV 创建主机,时间 ubuntu,2020-01-13 13:16:18 -0500

LV 状态 可用

打开 2

LV 大小 5.00 GiB

当前逻辑扩展块 1280

段 1

分配继承

预读扇区 自动

  • 当前设置为 256

块设备 253:1

显然,交换位于一个名为 swap_1 的逻辑卷上,且该逻辑卷是名为 ubuntu-vg 的卷组的一部分。下一步是验证卷组中是否有可分配给交换卷的可用空间:

vgs

VG #PV #LV #SN 属性 大小 空闲空间

ubuntu-vg 2 3 0 wz--n- 197.66g <22.00g

如果可用空间足够满足额外的交换需求,则关闭交换并扩展交换逻辑卷,以便使用尽可能多的可用空间来满足系统的交换需求:

lvextend -L+8GB /dev/ubuntu-vg/swap_1

逻辑卷 ubuntu_vg/swap_1 成功调整大小。

接下来,重新格式化交换卷并重新启用交换:

mkswap /dev/ubuntu-vg/swap_1

mkswap: /dev/ubuntu-vg/swap_1: 警告:正在擦除旧的交换签名。

正在设置交换空间版本 1,大小 = 12 GiB(12754874368 字节)

无标签,UUID=241a4818-e51c-4b8c-9bc9-1697fc2ce26e

swapon /dev/ubuntu-vg/swap_1

修改完成后,检查交换空间是否已增加:

swapon

名称 类型 大小 已使用 优先级

/dev/dm-1 分区 12G 0B -2

35.7 将交换空间添加到卷组

在上一节中,我们扩展了交换逻辑卷以使用已经在卷组中可用的空间。如果卷组中没有可用空间,则需要先添加空间才能扩展交换。

首先检查卷组的状态:

vgs

VG #PV #LV #SN 属性 大小 空闲空间

ubuntu-vg 1 2 0 wz--n- <73.75g 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 ubuntu-vg /dev/sdb

卷组 "ubuntu-vg" 扩展成功

此时,vgs 命令应报告将 10 GB 空间添加到卷组:

vgs

VG #PV #LV #SN 属性 大小 空闲空间

ubuntu-vg 2 2 0 wz--n- 83.74g <10.00g

现在,既然附加的空间已经可用,交换逻辑卷可以扩展以利用这些空间。首先,使用 swapoff 工具关闭交换:

swapoff /dev/ubuntu-vg/swap_1

接下来,扩展逻辑卷以使用新空间:

lvextend -L+9.7GB /dev/ubuntu-vg/swap_1

将大小四舍五入至物理扩展的边界:9.70 GiB。

逻辑卷 ubuntu-vg/swap_1 的大小从 980.00 MiB(245 个扩展)变更为 10.66 GiB(2729 个扩展)。

逻辑卷 ubuntu-vg/swap_1 成功调整大小。

在逻辑卷上重新创建交换:

mkswap /dev/ubuntu-vg/swap_1

mkswap: /dev/ubuntu-vg/swap_1: 警告:正在清除旧的交换签名。

设置交换空间版本 1,大小 = 10.7 GiB(11446251520 字节)

无标签,UUID=447fb9e5-5473-4f2c-96f8-839b1457d3ed

接下来,重新启用交换:

swapon /dev/ubuntu-vg/swap_1

最后,使用 swapon 命令验证交换空间是否已成功添加到系统:

swapon

NAME TYPE SIZE USED PRIO

/dev/dm-1 分区 10.7G 0B -2

35.8 总结

交换空间是几乎所有操作系统中不可或缺的组成部分,特别是在内存资源紧张的情况下。通过将部分内存交换到磁盘,系统能够继续运行,并满足其上运行的进程和应用程序的需求。

Ubuntu 提供了一套指南,推荐根据系统中安装的 RAM 大小分配磁盘交换空间。在这些建议不足的情况下,可以向系统添加额外的交换空间,通常不需要重启。正如本章所述,交换空间可以以文件、磁盘或磁盘分区的形式添加,或者通过扩展已配置为交换空间的现有逻辑卷来实现。

36. Ubuntu 23.04 系统与进程监控

运行和管理 Ubuntu 系统的一个重要部分是监控系统的总体健康状况,涉及内存、交换、存储和处理器的使用情况。这包括了解如何检查和管理在后台运行的系统和用户进程。本章将介绍一些工具和实用程序,用于监控 Ubuntu 系统上的系统资源和进程。

36.1 管理进程

即使 Ubuntu 系统看起来空闲,许多系统进程仍会在后台悄悄运行,以保持操作系统的正常运作。例如,当你执行命令或启动应用时,用户进程会被启动,并在相关任务完成后停止。

要获取在单个终端或命令提示符会话中当前运行的所有活动用户进程列表,可以使用以下 ps 命令:

$ ps

PID TTY TIME CMD

10395 pts/1 00:00:00 bash

13218 pts/1 00:00:00 ps

ps 命令的输出显示,在当前终端窗口或命令提示符会话中有两个用户进程在运行,一个是输入命令的 bash shell,另一个是 ps 命令本身。

要列出当前用户的所有活动进程,请使用带有 -a 标志的 ps 命令。该命令会列出与用户关联的所有正在运行的进程,无论它们运行在哪个终端窗口(例如,其他终端窗口中运行的进程):

$ ps -a

PID TTY TIME CMD

5442 tty2 00:00:00 gnome-session-b

6350 pts/0 00:00:00 sudo

6354 pts/0 00:00:00 su

6355 pts/0 00:00:00 bash

9849 pts/2 00:00:00 nano

9850 pts/1 00:00:00 ps

如上面显示的输出所示,用户正在运行与 GNOME 桌面、shell 会话、nano 文本编辑器和 ps 命令相关的进程。

要列出特定用户的进程,请使用带有 -u 标志并跟随用户名的 ps 命令:

第三十六章:ps -u john

PID TTY TIME CMD

914 ? 00:00:00 systemd

915 ? 00:00:00 (sd-pam)

970 ? 00:00:00 gnome-keyring-d

974 tty1 00:00:00 gdm-x-session

.

.

注意,每个进程都会被分配一个唯一的进程 ID,可以通过发送终止(TERM)信号来停止该进程,例如使用 kill 命令。例如:

$ kill 13217

使用 TERM 信号结束进程的优点是,它允许进程优雅地退出,可能会保存原本会丢失的数据。

如果标准的终止信号无法终止进程,可以重复执行带有 -9 选项的 kill 命令。该命令会发送 KILL 信号,应该能够终止即使是冻结的进程,但不会给进程机会优雅地退出,可能会导致数据丢失:

$ kill -9 13217

要列出系统上运行的所有进程(包括所有用户进程和系统进程),请执行以下命令:

$ ps -ax

PID TTY STAT TIME COMMAND

1 ? Ss 0:22 /usr/lib/systemd/systemd rhgb --switched-root

2 ? S 0:00 [kthreadd]

3 ? I< 0:00 [rcu_gp]

4 ? I< 0:00 [rcu_par_gp]

5 ? I< 0:00 [netns]

要列出所有进程并包含有关进程所有权、CPU 和内存使用的信息,请执行带有 -aux 选项的 ps 命令:

$ ps -aux

用户 PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 2 0.0 0.0 0 0 ? S 09:59 0:00 [kthreadd]

root 3 0.0 0.0 0 0 ? I< 09:59 0:00 [rcu_gp]

root 4 0.0 0.0 0 0 ? I< 09:59 0:00 [rcu_par_gp]

root 5 0.0 0.0 0 0 ? I< 09:59 0:00 [netns]

root 7 0.0 0.0 0 0 ? I< 09:59 0:00 [kworker/0:0H-events_highpri]

root 9 0.0 0.0 0 0 ? I< 09:59 0:00 [kworker/0:1H-events_highpri]

.

.

demo 9788 0.1 1.4 763248 50480 ? Ssl 15:05 0:00 /usr/libexec/gnome-terminal-serv

demo 9814 0.0 0.1 224108 5664 pts/2 Ss 15:05 0:00 bash

demo 9849 0.0 0.0 222412 3588 pts/2 S+ 15:06 0:00 nano

demo 9873 0.0 0.1 233416 6280 pts/1 R+ 15:08 0:00 ps -aux

一个 Linux 进程可以启动自己的子进程(称为生成),从而在进程之间形成父子关系。要查看进程树,可以使用 ps 命令并添加 -H 选项。下面是执行 ps -aH 命令时部分进程树的输出:

$ ps -aH

PID TTY TIME CMD

10036 pts/3 00:00:00 ps

6350 pts/0 00:00:00 sudo

6354 pts/0 00:00:00 su

6355 pts/0 00:00:00 bash

5442 tty2 00:00:00 gnome-session-b

进程信息也可以通过 GNOME 桌面环境中的系统监视器工具查看。可以通过在桌面环境中搜索“System Monitor”来启动此工具,或者通过以下命令行启动:

$ gnome-system-monitor

一旦启动了系统监视器,选择位于工具栏中的“进程”按钮,以列出系统上运行的进程,如下所示图 36-1:

图 36-1

要更改列出的进程(例如,列出所有进程或仅列出自己的进程),请使用图 36-2 中所示的菜单:

图 36-2

要筛选进程列表,请点击标题栏中的搜索按钮,并在搜索框中输入进程名称:

图 36-3

要显示有关特定进程的更多信息,请从列表中选择该进程,然后点击对话框右下角的按钮(标记为 A,如图 36-4 所示):

图 36-4

当点击按钮时,类似于上图中标记为 B 的对话框将出现。选择列表中的一个进程,并点击“结束进程”按钮(C)以终止它。

要监控 CPU、内存、交换空间和网络使用情况,请点击标题栏中的资源按钮,以显示如图 36-5 所示的屏幕:

图 36-5

同样,选择“文件系统”工具栏按钮可以查看系统上已使用的存储空间的汇总信息:

图 36-6

36.2 实时系统监控与 top

正如“Cockpit Web 界面概述”一章所述,Cockpit Web 界面可以执行基本的系统监控。上一节也解释了如何使用 GNOME 系统监视器工具来监控进程和系统资源。本章还探讨了如何使用 ps 命令来获取 Ubuntu 系统上运行的进程快照。然而,ps 命令并不能提供系统上进程和资源使用的实时视图。top 命令是一个理想的工具,能够从命令提示符下实时监控系统资源和进程。

运行时,top 会列出系统上运行的进程,并按系统资源使用情况排名(资源需求最多的进程位于最上面)。屏幕的上部显示内存和交换空间的使用情况,以及所有 CPU 核心的 CPU 数据。所有这些输出都会不断更新,允许实时监控系统:

图 36-7

要将显示信息限制为属于特定用户的进程,可以使用 -u 选项并跟随用户名启动 top

$ top -u john

要查看 top 命令的完整功能列表,请按键盘上的 'h' 键或参考手册页面:

$ man top

36.3 命令行磁盘和交换空间监控

可以通过 Cockpit 和 GNOME 系统监视器监控磁盘空间。然而,要从命令行识别磁盘使用情况,df 命令提供了一个有用且快速的概览:

要查看当前的交换空间和内存使用情况,可以运行 free 命令:

free

总计 已用 空闲 共享 缓存/缓存 可用

内存:3823720 879916 1561108 226220 1382696 2476300

要持续监控内存和交换空间的变化,可以使用带有 -s 选项的 free 命令,指定每次更新之间的延迟时间(请注意,top 工具可能提供一种更好的方式来实时查看这些数据):

$ free -s 1

内存:3823720 879472 1561532 226220 1382716 2476744

交换空间:2097148 0 2097148

总计 已用 空闲 共享 缓存/缓存 可用

内存:3823720 879140 1559940 228144 1384640 2475152

交换空间:2097148 0 2097148

.

.

要从命令行监控磁盘 I/O,可以考虑使用 iotop 命令,它可以通过以下方式安装:

apt install iotop

安装并执行后(iotop 必须以系统管理员权限运行),该工具将显示按进程划分的实时磁盘 I/O 列表:

图 36-8

36.4 总结

即使是一个看似什么也没做的系统,后台也会有许多系统进程在运行。用户在系统上执行的操作将导致额外的进程被启动。进程还可以生成自己的子进程。每个进程都会占用一些系统资源,包括内存、交换空间、处理器周期、磁盘存储和网络带宽。本章介绍了一组工具,可以用来监控正在运行的系统中的进程和系统资源,并在必要时终止可能影响系统性能的异常进程。

posted @ 2025-07-04 15:40  绝不原创的飞龙  阅读(89)  评论(0)    收藏  举报