如何在 Linux 中创建交换内存

要在 Linux 中创建交换文件,请在存储上准备一个文件,用 mkswap 初始化它,然后使用 swapon 激活它。交换空间有助于减轻内存压力,但其速度比 RAM 慢,并且不能解决所有内存不足的问题,也不能保证程序的正常运行。

什么是交换?

Swap 是一个空间,它允许将部分正在使用的内存页放置到存储中。你可以使用磁盘文件或单独的分区。本文解释了如何添加文件,示例中的 2GiB 仅用于练习用途。所需的大小应根据 RAM、工作负载、可用空间以及是否使用休眠来确定。

系统可能已经在使用 swap。使用以下命令检查当前激活的项目和内存状态。

swapon --show
free -h

在 swapon --show 中检查名称、大小和使用情况,并在 free -h 的 Swap 行查看总使用量。即使增加了 swap,如果频繁访问存储,性能仍可能下降。如果内存持续不足,也应考虑工作负载和 RAM 扩展。

开始前要检查的事项

以下步骤是一个使用 GNU 工具和 util-linux 的 Linux 示例,其中根文件系统为常见的 ext4 并且有足够的空闲空间。需要管理员权限。容器或托管服务器可能会限制交换空间的激活,因此请先检查操作策略。

findmnt -T / -o TARGET,FSTYPE,SOURCE,OPTIONS
df -h /

检查文件系统类型和可用空间。除了 2 GiB 的交换文件外,还要为正常操作留出足够的空闲空间。如果该文件或符号链接已存在,请不要使用示例路径 /swap-manualfactory。重新初始化或覆盖现有的交换文件可能会导致数据丢失和正在运行系统的问题。

Btrfs 有与写时拷贝和快照相关的单独限制,因此不要直接应用下面的 ext4 操作步骤。有关 Btrfs 特定的创建方法和条件,请查看 Btrfs 交换文件文档 。网络文件系统或其他文件系统可能也有不同的支持条件。

创建和激活交换文件

以下是在 /swap-manualfactory 不存在时创建 2GiB 文件的示例。如果目标已存在,GNU dd 中的 conv=excl 将会失败,从而防止覆盖。如果操作失败或被中断,请不要进行下一步;请检查原因和生成的文件。

sudo dd if=/dev/zero of=/swap-manualfactory bs=1M count=2048 conv=excl status=progress

如果命令成功,检查文件大小和路径,将其设置为仅管理员可读写,然后将其初始化为交换区。mkswap 会修改指定的文件,因此一定要确认路径是你刚创建的文件。

sudo ls -lh /swap-manualfactory
sudo chmod 600 /swap-manualfactory
sudo mkswap /swap-manualfactory

只有在每一步都成功后才执行下一步。使用下面的命令激活后,确认新路径出现在列表中。

sudo swapon /swap-manualfactory
swapon --show
free -h

显示的文件大小可能与创建的文件大小不完全匹配,这可能是由于交换文件头和其他因素造成的。如果 swapon 失败,请检查错误,并且不要将其添加到启动设置中。交换文件不得有空洞,并且根据文件系统的不同,使用 fallocate 创建的文件可能不适用。 util-linux swapon 手册 解释了每种文件系统的约束。

启动后激活它

只有在成功激活后才向 /etc/fstab 添加项目。由于此文件还包含其他挂载设置,编辑前请先备份,并确保路径不会重复已有的交换条目。如果下面的备份路径已存在,请选择一个不同的新名称。

sudo cp -a -n /etc/fstab /etc/fstab.before-swap
sudo nano /etc/fstab

保持编辑器中的现有内容,并添加以下行,然后保存。如果你在其他名称下创建了示例路径,请使用实际路径。

/swap-manualfactory none swap defaults 0 0

保存后,再次检查文件内容,在可用的系统上,使用以下命令检查设置。此检查不能保证成功重启。

sudo findmnt --verify --verbose
sudo systemctl daemon-reload

daemon-reload 使使用 systemd 的系统重新加载已更改的设置。如果有验证错误,请更正它们,并确保没有意外更改其他条目。在适当的维护时间重启,然后使用 swapon --show 确认文件已重新激活。你也可以在 Red Hat Swap Management Documentation 中检查注册和验证程序。

停用并恢复

在关闭交换空间之前,请使用 swapon --show 和 free -h 检查使用情况和可用内存。如果没有足够的空间将正在使用的页面移动到其他内存或交换空间,禁用可能会失败或对系统造成压力。在系统运行时,请在确保可用容量和维护时间后再继续操作。

sudo swapoff /swap-manualfactory
swapon --show

确保目标项目不再位于活动列表中。为了防止它在启动时被重新激活,仅删除 /etc/fstab 中此操作添加的行,并且在 systemd 环境中,运行 sudo systemctl daemon-reload。要删除交换文件,请首先确认停用成功并已删除添加的配置行,然后仅删除你创建的文件。其他交换项目或现有设置保持不变。