如何在 Linux 上创建交换文件

为 Linux 系统增设或调整交换空间

本文将指导您如何在不修改现有分区的情况下,为 Linux 计算机增加或调整交换空间。我们将介绍几种简便的定制方法,让您轻松管理交换空间。

交换文件 vs. 交换分区

在多种情况下,您可能需要扩大现有的交换空间,或者为您的 Linux 系统增添新的交换空间。

  • 也许您的交换空间经常处于或接近最大使用率。
  • 安装过程中,您可能不小心选择了错误的选项,导致系统没有配置交换空间。
  • 又或许,您之前认为您拥有足够的 随机存取内存 (RAM),不需要交换空间,但现在改变了想法。
  • 有时,您可能会接手管理一个没有交换空间的系统,却不清楚原因。

针对上述问题,一个简单的解决方案是添加一个交换文件。 这是一个预先分配的特殊文件,专门用作交换空间。 交换文件会与您已有的任何交换空间(无论是交换文件还是交换分区)协同工作。

过去,与交换分区相比,使用交换文件可能会降低性能。 然而,随着机械硬盘驱动器性能的提升以及 Linux 操作系统中交换功能的优化,这种情况已不再存在。 事实上,现在一些 Linux 发行版默认创建交换文件,而非交换分区。

交换空间不仅仅是在内存不足时释放 RAM 的一种方式,更是系统稳定运行的关键。 如果没有交换空间,内核将难以进行有效的内存管理。 接下来,我们将探讨如何简单地增加交换空间。

特别提示:Btrfs 文件系统与 SSD

在深入探讨之前,有两点需要快速说明。

首先, Btrfs 文件系统 在使用交换文件方面存在一些注意事项。 曾经,写入时复制 (Copy-on-Write) 的特性与交换文件所需的运作方式不兼容。 交换文件所依赖的某些功能无法实现,同时一些关于交换文件中块编号的假设也不适用于 Btrfs。 因此,早期 Btrfs 系统不支持交换文件。

不过,自 Linux 内核 5.0 版本起,在满足以下要求的前提下,您 可以在 Btrfs 文件系统中使用交换文件

  • 必须是非写时复制(NOCOW)文件。
  • 不得被压缩。
  • 不能跨越不同的硬盘驱动器。

大多数用户使用的都是默认的 ext4 文件系统,所以这通常不会构成问题。

其次,在固态硬盘 (SSD) 刚推出时,人们曾担心频繁写入会缩短其寿命。 因此,大家普遍认为不应该在 SSD 上设置交换空间,甚至要避免系统日志记录到 SSD。

如今,这已不再是普遍的问题。 目前市售的许多 SSD 的预计寿命都足以满足大多数 PC 的使用需求。 此外,SSD 上的交换文件将比机械硬盘上的交换分区具有更好的性能。

检查当前交换空间

在进行任何操作之前,我们先来检查一下计算机上可用的交换空间。 我们将通过两种方式进行检查,并使用 freeswapon 命令。

free 命令会显示内存的使用和空闲情况。使用 -h (human-readable) 选项,可以更直观地显示内存值:

free -h

free 命令的输出结果显示,当前系统没有配置交换空间。

需要注意的是,这里的“可用”RAM 为 237 MB。 但这并不是指可用的 RAM 总量。 可用 RAM 总量由“available”数值 881 MB 提供。

Linux 系统会将空闲 RAM 用于文件缓存和内核缓冲区等目的。“buff/cache”数值(871 MB)代表了专门用于此用途的 RAM 量。 但这些内存仍然被认为是“可用”的,并且计入 “available” 值中。“buff/cache” 中的 RAM 可以立即被释放,并被任何需要内存的应用程序所使用。

另一种检查交换空间是否可用的方法是使用 swapon 命令。--show 选项不会对交换设置进行任何更改, 它仅提供统计数据。

swapon --show

如果此命令没有任何输出,则表示当前没有配置交换空间。

如果上述命令显示已配置了一些交换空间,那么在决定要创建的交换文件的大小时,应该考虑现有交换空间的大小。

我需要多大的交换空间?

传统观念认为交换空间应为“RAM 的两倍”。但这是在早期计算机的 RAM 非常有限的情况下提出的。 随着 RAM 变得越来越便宜,以及程序和游戏对内存的要求越来越高,PC 规格也随之调整。 现在,配备 32 GB RAM 的家用电脑很常见。 如果您有 32 GB 的 RAM,您不会需要分配 64 GB 的硬盘空间来作为交换空间。 这显然是过度的。

您所需的交换空间大小是一个颇具争议的话题,类似于“哪个编辑器最好”之争。 关于这个话题,我们看到的最合理的讨论之一来自 Ubuntu 交换空间常见问题解答。他们提出了一种简单且符合常理的方法(尽管,像许多人一样,他们对交换空间在 Linux 中的工作原理存在误解)。 他们提供了一个方便的表格,其中显示了根据系统内存大小推荐的交换空间大小,并考虑了是否需要休眠计算机。

好消息是,选择什么值其实并不重要。 我们随时可以删除一个交换文件,并用一个更大的文件替换它,甚至可以替换成一个较小的文件。 您还可以添加多个交换文件。

建议您参考 表格中的交换文件大小建议,并运行一段时间。 监控系统对交换空间的使用情况。 如果需要进行微调,可以轻松进行更改。 使用交换文件,只需要花费两分钟就可以完成。 与在正在运行的 Linux 计算机上调整分区相比,这要便捷得多。

创建交换文件

您不应该使用 fallocate 命令来 创建交换文件。 这是来自 swapon 手册页的说明:

内核中的交换文件实现方式要求可以直接写入文件,而无需文件系统的协助。
    
  这对于具有空洞的文件或在 Btrfs 等文件系统上写入时复制的文件来说是一个问题。
  cp(1)truncate(1) 等命令会创建具有空洞的文件。 这些文件将被 swapon 拒绝。
    
  通过 fallocate(1) 创建的预分配文件也可能被解释为具有空洞的文件,具体取决于文件系统。 自 Linux 4.18 起,XFS 支持预分配的交换文件。
    
  创建交换文件最通用的解决方案是使用 dd(1)/dev/zero

虽然 fallocate 速度更快,但我们将使用 dd创建交换文件。 用于测试的机器具有 2 GB 的 RAM。 我们将创建一个 1 GB 的交换文件。

以下是各个选项的含义:

  • if:输入文件。 在此示例中,我们使用 /dev/zero,它将提供一个零字节流。
  • of:输出文件。 我们将在根目录中创建一个名为 swapfile 的文件。
  • bs:块大小(以字节为单位)。 这指定了一次从输入文件读取和写入输出文件的字节数。
  • count:要读取和写入的块数。 将此数字乘以 bs 值即可得出文件大小。
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576

创建文件时会显示一些统计信息。

可以看到写入文件的块(记录)的数量、文件的大小、创建文件所用的时间和有效的数据传输速率。

使用 ls 命令查看根目录下的文件:

ls /

准备交换文件

我们需要使用 mkswap 命令 准备交换文件 才能使用。 除了文件的路径和名称外,我们不需要向 mkswap 提供任何参数:

sudo mkswap /swapfile

该文件已经准备好作为交换文件。 请注意有关文件权限的警告。 我们需要修改这些权限,以确保只有 root 用户可以读取和写入交换文件。

使用交换文件

默认权限过于宽松,我们需要限制它们,以确保只有 root 用户可以使用交换文件。 使用 chmod 命令更改文件权限:

sudo chmod 600 /swapfile

这将删除文件组成员和其他用户的访问权限,仅允许文件所有者 root 用户读取和写入文件。

我们需要使用 swapon 命令来告知 Linux 有一个新的交换文件可供使用。 我们只需要提供路径和文件名即可:

sudo swapon /swapfile

交换文件现在处于活动状态。

将交换文件添加到 fstab

为了确保您的交换文件在重启后仍然可用,请将其添加到 /etc/fstab 文件中。 您可以使用您喜欢的任何文本编辑器,但我们将使用图形 Gedit 文本编辑器来展示该过程。

sudo gedit /etc/fstab

我们需要添加到文件底部的行是:

/swapfile  none  swap  sw  0  0

这些字段的含义如下:

文件系统: 交换文件的路径和名称。
挂载点: 文件不像文件系统那样被挂载,所以条目是 “none”。
类型: 这是 “swap”。
选项: 在引导时,swapon -a(启动所有标记为交换的设备)将由引导脚本调用。此选项告知 Linux 将此条目视为应由 swapon -a 命令控制的交换资源。 这里使用“defaults”很常见,因为一些 Linux 用户错误地认为该字段被忽略。 但实际上并非如此。 所以使用正确的选项是有意义的。
dump: 可以设置为 0。在本例中无关紧要。
pass: 可以设置为 0。在本例中无关紧要。

保存更改并关闭编辑器。

检查交换空间使用情况

要查看您的交换空间是否正在使用,请使用带有 --show 选项的 swapon 命令:

swapon --show

这些列的含义如下:

名称: 交换分区或交换文件的名称。
类型: 交换设备的类型。
大小: 交换资源的大小。
已使用: 已使用的交换空间量。
prio: 该交换空间的优先级。

交换空间优先级

每个交换空间都被分配了一个优先级。 如果您不指定一个,系统会自动分配一个。 自动分配的优先级总是负数。 手动分配的优先级范围从 0 到 32767,具有较高优先级的交换资源将首先被使用。

如果多个交换空间具有相同的优先级,它们将交替使用,直到它们都被填满,然后系统才会寻找下一个最低优先级的交换空间。 如果您只有一个交换空间,那么优先级当然是无关紧要的。 但我们将更改创建的交换文件的优先级,以演示如何执行此操作。

要设置优先级,请将 pri=(优先级) 选项添加到 /etc/fstab 条目中。 编辑您添加到 /etc/fstab 的行,如下所示:

/swapfile  none  swap  sw,pri=10  0  0

即,将 pri=10 添加到选项字段中,并用逗号与 “sw” 分隔。 请勿在 “sw”、逗号和 “pri=10” 之间留有任何空格。 重新启动计算机,然后使用 swapon --show 命令:

swapon --show

此交换空间的优先级已提升到 10。这证明 /etc/fstab 条目中的选项字段并没有被忽略。

更便捷的交换空间管理方法

在了解了上述说明和解释之后,我们可以通过以下方法轻松快捷地创建一个新的交换文件:

sudo dd if=/dev/zero /of=/swapfile2 bs=1024 count=104857
sudo mkswap /swapfile2
sudo chmod 600 /swapfile2
sudo swapon /swapfile2

让我们检查一下它是否有效:

swapon --show

如果需要永久删除,请将其从 /etc/fstab 文件中移除。

至此,所有操作均已完成。