在Linux创建和使用swap文件以替代swap分区

Linux中Swap Space(交换空间)概念和Windows的虚拟内存相似,即把一部分硬盘空间划分出来作为虚拟内存使用,当内存容量不足时候就会使用它。

一般Linux发行版会在磁盘专门划分并格式化一个交换分区(Swap Partition,下称swap分区)使用,好处是作为swap space时磁盘空间连续,坏处是后期分区调整大小复杂。

不过Linux其实也支持创建和使用交换文件(swap file,下称swap文件)来作为swap space(Windows pagefile.sys:这个我熟)。Ubuntu 17.04开始也默认使用swap文件而非swap分区。好处是swap文件可以随时以任意大小创建和销毁多个,坏处是效率相对差一些【2】(但在ssd时代已经不明显),另外测试覆盖度明显不及swap分区,5.12-rc1时甚至出现了开启swap文件后导致数据丢失问题【1】【6】,不过现在已经修复了。

另外如果要使用休眠(Hibernate)功能,也不建议使用swap文件,最好使用swap分区【3】。使用Btrfs文件格式也不建议使用swap文件,尤其是linux内核5.0以下禁止使用,否则会产生数据丢失问题【4】【5】。

那么如何创建和挂载swap文件呢?

备注:以下命令行均需要root身份

第一步,创建swap文件。

注意:使用dd速度较慢,一般使用fallocate。

以下假设在/root目录创建32GB的swapfile:

fallocate -l 32G /root/swapfile

第二步,更改swap文件权限。

chown root:root /root/swapfile
chmod 0600 /root/swapfile

第三步,格式化swap文件

mkswap /root/swapfile

第四步,启用swap文件

swapon /root/swapfile

第五步,验证swap文件是否启用

swapon --show

正常的话会看到如下内容:

NAME TYPE SIZE USED PRIO
/root/swapfile file 32G 0B -2

如果想在开机时持久化载入,则需要修改/etc/fstab文件,然后加入如下挂载条目:

/root/swapfile none swap sw 0 0

修改/etc/fstab文件后可以用如下命令生效swap文件挂载:

swapon -a

如果不想使用swap文件了,则先使用swapoff卸载:

swapoff /root/swapfile

然后清除/etc/fstab文件内的挂载条目(如果有),最后删除即可:

rm /root/swapfile

参考信息:

【1】A warning about 5.12-rc1 [LWN.net]:https://lwn.net/Articles/848265/
【2】https://askubuntu.com/questions/904372/swap-partition-vs-swap-file
【3】https://askubuntu.com/questions/6769/hibernate-and-resume-from-a-swap-file
【4】https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate#Hibernation_into_swap_file
【5】https://wiki.archlinux.org/title/Btrfs#Swap_file
【6】https://www.reddit.com/r/linux4noobs/comments/mlwgk6/swap_file_vs_swap_partition/

本页永久链接:https://www.orztip.com/?p=748&article_title=linux-swap-space-use-swap-file-vs-swap-partition