如何在Linux上创建和使用交换文件
本教程讨论了 Linux 中交换文件的概念,为什么使用它以及它相对于传统交换分区的优势。你将学习如何创建交换文件和调整其大小。
什么是 Linux 的交换文件?
交换文件允许 Linux 将磁盘空间模拟为内存。当你的系统开始耗尽内存时,它会使用交换空间将内存的一些内容交换到磁盘空间上。这样释放了内存,为更重要的进程服务。当内存再次空闲时,它会从磁盘交换回数据。我建议阅读这篇文章,了解 Linux 上的交换空间的更多内容。
传统上,交换空间是磁盘上的一个独立分区。安装 Linux 时,只需创建一个单独的分区进行交换。但是这种趋势在最近几年发生了变化。
使用交换文件,你不再需要单独的分区。你会根目录下创建一个文件,并告诉你的系统将其用作交换空间就行了。
使用专用的交换分区,在许多情况下,调整交换空间的大小是一个可怕而不可能的任务。但是有了交换文件,你可以随意调整它们的大小。
最新版本的 Ubuntu 和其他一些 Linux 发行版已经开始 默认使用交换文件。甚至如果你没有创建交换分区,Ubuntu 也会自己创建一个 1GB 左右的交换文件。
让我们看看交换文件的更多信息。
检查 Linux 的交换空间
在你开始添加交换空间之前,最好检查一下你的系统中是否已经有了交换空间。
你可以用Linux 上的 free 命令检查它。就我而言,我的戴尔 XPS有 14GB 的交换容量。
<span class="pln">free </span><span class="pun">-</span><span class="pln">h</span>
<span class="pln"> total used free shared buff</span><span class="pun">/</span><span class="pln">cache available</span>
<span class="typ">Mem</span><span class="pun">:</span><span class="pln"> </span><span class="lit">7.5G</span><span class="pln"> </span><span class="lit">4.1G</span><span class="pln"> </span><span class="lit">267M</span><span class="pln"> </span><span class="lit">971M</span><span class="pln"> </span><span class="lit">3.1G</span><span class="pln"> </span><span class="lit">2.2G</span>
<span class="typ">Swap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">14G</span><span class="pln"> </span><span class="lit">0B</span><span class="pln"> </span><span class="lit">14G</span>
free
命令给出了交换空间的大小,但它并没有告诉你它是真实的交换分区还是交换文件。swapon
命令在这方面会更好。
<span class="kwd">swapon</span><span class="pln"> </span><span class="pun">--</span><span class="pln">show</span>
<span class="pln">NAME TYPE SIZE USED PRIO</span>
<span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">nvme0n1p4 partition </span><span class="lit">14.9G</span><span class="pln"> </span><span class="lit">0B</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span>
如你所见,我有 14.9GB 的交换空间,它在一个单独的分区上。如果是交换文件,类型应该是 file
而不是 partition
。
<span class="kwd">swapon</span><span class="pln"> </span><span class="pun">--</span><span class="pln">show</span>
<span class="pln">NAME TYPE SIZE USED PRIO</span>
<span class="pun">/</span><span class="pln">swapfile </span><span class="kwd">file</span><span class="pln"> </span><span class="lit">2G</span><span class="pln"> </span><span class="lit">0B</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span>
如果你的系统上没有交换空间,它应该显示如下内容:
<span class="pln">free </span><span class="pun">-</span><span class="pln">h</span>
<span class="pln"> total used free shared buff</span><span class="pun">/</span><span class="pln">cache available</span>
<span class="typ">Mem</span><span class="pun">:</span><span class="pln"> </span><span class="lit">7.5G</span><span class="pln"> </span><span class="lit">4.1G</span><span class="pln"> </span><span class="lit">267M</span><span class="pln"> </span><span class="lit">971M</span><span class="pln"> </span><span class="lit">3.1G</span><span class="pln"> </span><span class="lit">2.2G</span>
<span class="typ">Swap</span><span class="pun">:</span><span class="pln"> </span><span class="lit">0B</span><span class="pln"> </span><span class="lit">0B</span><span class="pln"> </span><span class="lit">0B</span>
而 swapon
命令不会显示任何输出。
在 Linux 上创建交换文件
如果你的系统没有交换空间,或者你认为交换空间不足,你可以在 Linux 上创建交换文件。你也可以创建多个交换文件。
让我们看看如何在 Linux 上创建交换文件。我在本教程中使用 Ubuntu 18.04,但它也应该适用于其他 Linux 发行版本。
步骤 1:创建一个新的交换文件
首先,创建一个具有所需交换空间大小的文件。假设我想给我的系统增加 1GB 的交换空间。使用fallocate
命令创建大小为 1GB 的文件。
<span class="kwd">sudo</span><span class="pln"> fallocate </span><span class="pun">-</span><span class="pln">l </span><span class="lit">1G</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
建议只允许 root
用户读写该交换文件。当你尝试将此文件用于交换区域时,你甚至会看到类似“不安全权限 0644,建议 0600”的警告。
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">chmod</span><span class="pln"> </span><span class="lit">600</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
请注意,交换文件的名称可以是任意的。如果你需要多个交换空间,你可以给它任何合适的名称,如 swap_file_1
、swap_file_2
等。它们只是一个预定义大小的文件。
步骤 2:将新文件标记为交换空间
你需要告诉 Linux 系统该文件将被用作交换空间。你可以用 mkswap 工具做到这一点。
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">mkswap</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
你应该会看到这样的输出:
<span class="typ">Setting</span><span class="pln"> up swapspace version </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">size</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1024</span><span class="pln"> </span><span class="typ">MiB</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1073737728</span><span class="pln"> bytes</span><span class="pun">)</span>
<span class="kwd">no</span><span class="pln"> label</span><span class="pun">,</span><span class="pln"> UUID</span><span class="pun">=</span><span class="lit">7e1faacb</span><span class="pun">-</span><span class="pln">ea93</span><span class="pun">-</span><span class="lit">4c49</span><span class="pun">-</span><span class="pln">a53d</span><span class="pun">-</span><span class="pln">fb40f3ce016a</span>
步骤 3:启用交换文件
现在,你的系统知道文件 swapfile
可以用作交换空间。但是还没有完成。你需要启用该交换文件,以便系统可以开始使用该文件作为交换。
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">swapon</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
现在,如果你检查交换空间,你应该会看到你的 Linux 系统会识别并使用它作为交换空间:
<span class="kwd">swapon</span><span class="pln"> </span><span class="pun">--</span><span class="pln">show</span>
<span class="pln">NAME TYPE SIZE USED PRIO</span>
<span class="pun">/</span><span class="pln">swapfile </span><span class="kwd">file</span><span class="pln"> </span><span class="lit">1024M</span><span class="pln"> </span><span class="lit">0B</span><span class="pln"> </span><span class="pun">-</span><span class="lit">2</span>
步骤 4:让改变持久化
迄今为止你所做的一切都是暂时的。重新启动系统,所有更改都将消失。
你可以通过将新创建的交换文件添加到 /etc/fstab
文件来使更改持久化。
对 /etc/fstab
文件进行任何更改之前,最好先进行备份。
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">cp</span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">fstab </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">fstab</span><span class="pun">.</span><span class="pln">back</span>
现在将以下行添加到 /etc/fstab
文件的末尾:
<span class="pun">/</span><span class="pln">swapfile none swap sw </span><span class="lit">0</span><span class="pln"> </span><span class="lit">0</span>
你可以使用命令行文本编辑器手动操作,或者使用以下命令:
<span class="kwd">echo</span><span class="pln"> </span><span class="str">'/swapfile none swap sw 0 0'</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">tee</span><span class="pln"> </span><span class="pun">-</span><span class="pln">a </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">fstab</span>
现在一切都准备好了。即使在重新启动你的 Linux 系统后,你的交换文件也会被使用。
调整 swappiness 参数
swappiness
参数决定了交换空间的使用频率。swappiness
值的范围从 0 到 100。较高的值意味着交换空间将被更频繁地使用。
Ubuntu 桌面的默认的 swappiness
是 60,而服务器的默认 swappiness
是 1。你可以使用以下命令检查 swappiness
:
<span class="kwd">cat</span><span class="pln"> </span><span class="pun">/</span><span class="pln">proc</span><span class="pun">/</span><span class="pln">sys</span><span class="pun">/</span><span class="pln">vm</span><span class="pun">/</span><span class="pln">swappiness</span>
为什么服务器应该使用低的 swappiness
值?因为交换空间比内存慢,为了获得更好的性能,应该尽可能多地使用内存。在服务器上,性能因素至关重要,因此 swappiness
应该尽可能低。
你可以使用以下系统命令动态更改 swappiness
:
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">sysctl</span><span class="pln"> vm</span><span class="pun">.</span><span class="pln">swappiness</span><span class="pun">=</span><span class="lit">25</span>
这种改变只是暂时的。如果要使其永久化,可以编辑 /etc/sysctl.conf
文件,并在文件末尾添加swappiness
值:
<span class="pln">vm</span><span class="pun">.</span><span class="pln">swappiness</span><span class="pun">=</span><span class="lit">25</span>
在 Linux 上调整交换空间的大小
在 Linux 上有几种方法可以调整交换空间的大小。但是在你看到这一点之前,你应该了解一些关于它的事情。
当你要求系统停止将交换文件用于交换空间时,它会将所有数据(确切地说是内存页)传输回内存。所以你应该有足够的空闲内存,然后再停止交换。
这就是为什么创建和启用另一个临时交换文件是一个好的做法的原因。这样,当你关闭原来的交换空间时,你的系统将使用临时交换文件。现在你可以调整原来的交换空间的大小。你可以手动删除临时交换文件或留在那里,下次启动时会自动删除(LCTT 译注:存疑?)。
如果你有足够的可用内存或者创建了临时交换空间,那就关闭你原来的交换文件。
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">swapoff</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
现在你可以使用 fallocate
命令来更改文件的大小。比方说,你将其大小更改为 2GB:
<span class="kwd">sudo</span><span class="pln"> fallocate </span><span class="pun">-</span><span class="pln">l </span><span class="lit">2G</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
现在再次将文件标记为交换空间:
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">mkswap</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
并再次启用交换文件:
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">swapon</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
你也可以选择同时拥有多个交换文件。
删除 Linux 中的交换文件
你可能有不在 Linux 上使用交换文件的原因。如果你想删除它,该过程类似于你刚才看到的调整交换大小的过程。
首先,确保你有足够的空闲内存。现在关闭交换文件:
<span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">swapoff</span><span class="pln"> </span><span class="pun">/</span><span class="pln">swapfile</span>
下一步是从 /etc/fstab
文件中删除相应的条目。
最后,你可以删除该文件来释放空间: