如何在Linux上创建交换文件

向Linux计算机添加交换空间,或增加已有的交换空间,而不会扰乱分区。我们将向您展示定制交换空间的简单方法。

交换文件与交换分区

在几种情况下,您可能需要增加Linux计算机的现有交换空间或添加新的交换空间。

可能您的交换空间经常以最大值或接近最大值运行。 在安装过程中很容易单击错误的选项,并且很容易无意中拒绝向系统添加交换空间。 也许您之前决定您有太多的随机存取存储器(RAM),不需要任何交换,并且您已经改变了主意。 有时,您会继承没有交换的系统的管理,原因是您永远无法发现。

所有这些问题的简单解决方案是将交换文件添加到您的计算机。这是一个特殊文件,预先分配并保留用作交换空间。交换文件将与您可能拥有的任何现有交换协同工作,无论是交换文件还是交换分区。

一度,与使用交换分区相比,使用交换文件会影响性能。随着机械(旋转)硬盘驱动器性能的提高和Linux操作系统内交换功能效率的提高,情况不再是这样了。事实上,一些Linux发行版现在默认创建交换文件,而不是交换分区。

当内存不足时,交换不仅仅是一种释放RAM的方法。这是一个运转良好的系统的重要组成部分。如果没有任何交换,内核将很难实现正常的内存管理。让我们看看添加一些交换空间的简单方法。

在我们开始之前:Btrf和SSD

有两点我们想快速讨论一下。

Btrfs文件系统对交换文件有某些警告。Btrfs想要以一种方式操作,而交换文件需要以另一种方式操作,这两者之间一度存在冲突,一些交换文件所依赖的功能没有实现,一些关于交换文件内的块编号的假设在Btrfs中并不成立,所以交换文件不被支持。

从内核5.0开始,您可以在Btrfs文件系统中拥有交换文件,前提是它们设置为满足以下要求:

没有写入时复制(NOCOW)文件。 它们没有被压缩。 它们不会跨越不同的硬盘驱动器。

大多数读者将使用默认的ext4文件系统,因此这对他们来说不是问题。

相关:您应该使用哪种Linux文件系统?

当固态驱动器(SSD)首次出现时,人们担心在文件系统写入频繁的情况下使用它们。人们被警告不要将交换空间放在SSD上,甚至要避免将系统记录到SSD。

如今,这已经不是什么问题了,而且许多正在销售的固态硬盘的预期寿命都会比大多数PC都要长。SSD上的交换文件比机械硬盘上的交换分区具有更好的性能。

相关:固态硬盘到底能持续多久?

正在检查现有交换空间

三思而后行。让我们检查一下您的计算机上有哪些交换空间可用。您可以用两种方法来完成这项工作,我们将同时使用这两种方法。free命令将显示已用内存和空闲内存。h(人类可读)选项将导致在显示内存值时自由使用敏感单位。

free -h

free的输出显示该计算机上没有配置交换空间。

在没有出现RAM和空闲RAM的情况下,从不讨论交换。因此,值得注意的是,空闲RAM是以237MB的形式给出的。不要将其误认为可用内存总量。该值由“可用”数字提供,即881MB。

Linux将空闲RAM用于自己的目的,如文件缓存和内核缓冲区。专用于此的RAM大小是“缓冲区/缓存”数字,为871MB。但这段记忆仍然被认为是“可用的”,并被计算为“可用”。“buf/cache”RAM的内容可以立即丢弃,并由需要一些内存的任何应用程序使用。

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

swapon --show

如果此命令没有输出,则没有配置交换。

如果这些命令显示已经配置了一些交换空间,那么现有交换空间的大小应该考虑到要创建的交换文件的大小。

我需要多少交换空间?

传统的回答是“两倍于你拥有的内存量”。但这是在计算机内存非常有限的时候创造出来的。随着RAM变得更便宜,程序和游戏对内存的要求越来越高,PC的规格也相应地进行了调整。如今,拥有32 GB内存的家用PC并不少见。如果您有32 GB的RAM,则不会分配64 GB的硬盘空间来交换空间。这显然太过分了。

你需要的互换数量是一个煽动性的话题,可以与“哪个是最好的编辑”相提并论。我们在Ubuntu交换常见问题中看到的关于这个话题的最明智的讨论之一。这是一种简短的常识性方法(尽管,像许多人一样,他们误解了swappy在Linux上的工作原理)。有一个方便的表格,其中显示了针对系统拥有的RAM以及是否将计算机休眠所需的推荐交换空间量。

好消息是,你选择什么价值并不重要。我们可以随时删除交换文件,并将其替换为更大的交换文件或更小的交换文件。或者,您可以只添加另一个交换文件。

从表中选择交换文件大小,并运行一段时间。监视系统对交换空间的使用情况。如果需要微调,则很容易进行更改。使用交换文件,这是两分钟的工作。将其与在活动的Linux计算机上调整分区进行比较。

相关:什么是Linux上的Swappness?(以及如何改变它)

创建交换文件

您不应该使用falocate命令来创建交换文件。这来自Swapon的手册页:

The swap file implementation in the kernel expects to be able to write to the file directly, without the assistance of the file system. This is a problem on files with holes or on copy-on-write files on file systems like Btrfs. Commands like cp(1) or truncate(1) create files with holes. These files will be rejected by swapon.  Preallocated files created by fallocate(1) may be interpreted as files with holes too depending of the filesystem. Preallocated swap files are supported on XFS since Linux 4.18.  The most portable solution to create a swap file is to use dd(1) and /dev/zero.

因此,虽然falocate速度更快,但我们将使用dd创建交换文件。用于研究本文的机器有2 GB的RAM。我们将创建一个1 GB的交换文件。

备选办法是:

if:输入文件。在本例中,我们使用/dev/zero,它将提供零字节流。 OF:输出文件。我们将在根目录中创建一个名为swapfile的文件。 BS:以字节为单位的块大小。这指定一次从输入文件读取和写入输出文件的字节数。 计数:要读写的块数。将此数字乘以bs值,即可得到文件大小。

sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576

创建文件时会提供一些统计信息。

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

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

ls /

准备交换文件

在使用交换文件之前,我们需要使用mkexchange命令准备交换文件。除了文件的路径和名称外,我们不需要为mkexchange提供任何参数:

sudo mkswap /swapfile

该文件已准备好用作交换文件。请注意有关文件权限的警告。我们需要更改这些设置,以便root用户是唯一可以读写交换文件的用户。

使用交换文件

默认权限太自由了,我们需要限制它们,以便只有超级用户才能使用交换文件。使用chmod更改文件权限:

sudo chmod 600 /swapfile

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

相关:如何在Linux上使用chmod命令

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

sudo swapon /swapfile

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

将交换文件添加到fstab

要确保您的交换文件在重新引导后可用,请将其添加到/etc/fstab文件。您可以使用您喜欢的任何文本编辑器,但我们将使用图形Gedit文本编辑器演示该过程。

sudo gedit /etc/fstab

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

/swapfile    none    swap    sw    0    0

这些字段包括:

文件系统:交换文件的路径和名称。 挂载点:该文件不像文件系统那样挂载,因此条目为“None”。 类型:这是“交换”。 选项:在引导时,将从一个引导脚本调用swapon-a命令(启动所有标记为交换的设备)。该选项告诉Linux将此条目视为应由swapon-a命令控制的交换资源。这里使用“DEFAULTS”是很常见的,因为一些Linux用户错误地认为这个字段被忽略了。正如我们将看到的,情况并非如此。因此,使用正确的选项是有意义的。 转储:可以设置为零。在这种情况下这是无关紧要的。 通过:此参数可以设置为零。在这种情况下这是无关紧要的。

保存更改并关闭编辑器。

相关:如何在Linux上编写fstab文件

检查交换使用情况

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

swapon --show

这些列包括:

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

交换空间优先级

每个交换空间都分配有优先级。如果您不提供,则会自动分配一个。自动分配的优先级始终为负值。可以手动分配的优先级范围为0到32767。优先使用优先级较高的交换资源。

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

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

/swapfile    none    swap    sw,pri=10    0    0

也就是说,将pri=10添加到Options字段,并用逗号与“SW”隔开。不要在“sw”、逗号和“pri=10”之间留任何空格。重新启动计算机并使用swapon--show命令:

swapon -- show

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

轻松交换空间

通过阐述和解释,我们可以像这样轻松、快速地创建一个新的交换文件:

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

让我们检查一下它是否起作用了:

swapon --show

如果希望永久删除,请将其放入/etc/fstab文件中。

砰。任务完成了。

相关文章