交换分区与交换文件

我正在阅读Ubuntu 17.04的新更改,其中有一个引起了我的注意,即从传统的交换分区模式转换到新的交换文件模式进行新安装。
与使用交换分区相比,使用这种方式是否有一些好处,比如性能方面的优势、节省空间、更适应SSD和NVMe等现代硬件,或者其他一些方面?
另一个相关问题是,如何从交换分区迁移到交换文件?我猜想可以使用dd命令,但想要确认一下,因为在此之前我并不知道交换文件的方案。
最后,交换文件会对休眠产生影响吗?
当然,这些问题可能与用户具有大量RAM且很少使用交换空间的情况有关(我猜测)。所以,请确认这些信息将帮助我和其他有同样疑问的人。

关于相关问题:https://askubuntu.com/questions/903414/upgraded-to-17-04-how-do-i-destroy-my-swap-partition-and-live-17-04-to-the-full(如果有人回答的话) - muru
https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04 - 我不能说它有什么不同,真的不能。系统和以前一样正常工作(交换空间很少被使用)。 - user589808
以下是如何在文件中添加交换空间。在17.04版本中,该文件名为/swapfile。休眠可能会引起问题。 - Takkat
muru @CelticWarrior Takkat谢谢你们提供的链接和信息。确实非常有帮助。如果可能的话,Celtic,请您在AskUbuntu上添加具体的答案,以防万一。对于每个人来说,确保答案是最新的(不是2012年的,而是实际上是在2016-2017年,当整个交换文件问题开始出现时),这将非常有帮助,并避免在那段时间内发生的任何变化。 - Luis Alvarado
好主意 - 我更新了我的回答。 - Takkat
很抱歉,这个问题属于过于宽泛的范畴。 - Anwar
1如果您的根分区已加密,那么交换文件也会自动加密。无需进行任何特殊操作。因此,这对于普通用户来说是一种改进,他们可能会忘记加密交换文件。 - Maris B.
我成功让休眠功能运行起来了(通过一些额外的调整),但我的机器本来就是个烂摊子。 - Zanna
@Maris B. 昨天,我进行了一次全新的Ubuntu 18.04安装,包括一个交换分区。安装程序提示交换分区未加密,并且不允许我继续进行安装。直到那时,我才意识到交换文件的变化。 - Daniel
两者都是一样的,而且比zram还糟糕。所以现在最好使用zram,并保留一个较小的交换文件或分区,优先级较低。 - phuclv
1个回答

交换文件的主要优势在于它可以轻松调整大小,所以除非您对交换分区的大小不满意,否则没有太多转换的意义。您可以将交换移到加密分区以提高安全性,但也有其他加密交换的方法。
从传统上来说,由于多种原因,交换文件并不被鼓励使用。交换文件在 Linux v2.4 之前速度较慢(参考链接),如果在碎片化的文件系统上创建交换文件,可能仍然会比较慢。使用交换文件时,您可能更容易遇到内存错误,例如捉襟见肘的情况,即在释放一些内存之前无法分配更多内存,但是文件系统需要在您进行交换之前进行分配。几年前,使用交换文件进行休眠就因为类似的原因成为备受争议的新功能。很久以前,当文件系统还有点错误(且未被记录)时,在重要文件系统中进行大量写操作是不明智的,而您只需使用交换分区即可。作为传统默认选项,交换分区已经经过了更多的测试。预计 Canonical 认为这些问题现在不值得担心了。
现在不切换到交换文件的最大原因是“为什么修复不出现问题的东西”。如果您没有备份主分区,并意外删除了/home而不是交换分区,那将会很麻烦想要恢复它。
另一个不切换到交换文件的原因是,如果您使用btrfs,该在5.0内核之前不支持交换文件(除非通过慢速回环文件)。
即使您决定使用交换文件,除非空间不足,否则没有真正的必要删除交换分区。如果您愿意,可以同时使用两者。如果您决定删除交换分区,首先使用Ubuntu LiveCD启动,并选择“尝试而不安装”。然后在终端中运行“gparted”,删除交换分区,并调整剩余分区的大小(最好先备份)。
现在重新启动到常规的Ubuntu安装中,并创建交换文件。由于交换文件的优点是易于调整大小,您可能希望使用SwapSpace来管理交换文件的大小。
sudo apt install swapspace

您也可以按照以下说明手动创建一个交换文件:https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04

简而言之,您可以通过将以下内容粘贴到终端中来创建一个1G的交换文件

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show

如果这样可行的话,你可以通过执行以下操作使其永久化:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

嗯,需要引用……对于有关错误的文件系统论点,我不确定你要追溯到多久以前……至于“困境22”,内存杀手应该在一定程度上解决了这个问题——小的分配应该导致小的杀死,而且如果通过文件系统进行交换操作,我会很惊讶地发现没有为这种情况准备一个小缓冲区…… - taifwa
810多年前,一般的建议是将交换空间、/usr、/home和/var放在不同的分区上,这样如果其中一个分区损坏了,你可以从其他分区恢复。那可能是在日志记录变得普遍之前。文件系统仍然存在漏洞,但对于防范可能更好地花费在备份上,而且要确保备份存放在勒索软件无法触及的地方。 - gmatht
1@taifwa 我已经添加了一个链接到btrfs FAQ,其中他们不支持快速交换文件访问(因为他们不确定如何在没有损坏的情况下实现它),并且还附上了一个说明,即最大的原因是不要去修复本来就没有问题的东西。这样有帮助吗? - gmatht
好的观点,是的,这真的很有帮助。重新阅读后,我同意你的建议,如果现有设置没有问题,不要进行更改。至于新安装,我想这些天可能不会有太大区别。文件系统可能会有漏洞,因为每个软件都可能存在漏洞;但是我认为,在这种层面的讨论和考虑中,这些都不重要...正如你所指出的,Canonical可能认为这些漏洞只会在极端情况下出现。 - taifwa
对于btrfs的观点也很准确 - 我认为这个观点同样适用于任何可快照的文件系统,比如ZFS,还有LVM...就LVM而言,我认为专门为交换空间分配一个逻辑卷比使用交换文件更合理。 - taifwa
1@gmatht 嗯,你以非常好的方式涵盖了所有内容。如果你在接下来的几个月/年里发现有关交换文件的新信息,请通过更新这个答案告诉我们。谢谢你的努力和出色的工作。 - Luis Alvarado
顺便提一下,这并不仅限于交换文件,但是当文件系统需要分配空间时,OOM killer可能会引发竞争条件:https://lwn.net/Articles/627419/ - gmatht
如何禁用 swapfile 以仅使用交换分区? - yinon
我在这里阅读了:https://help.ubuntu.com/community/SwapFaq,希望它能有所帮助。 - yinon
无论是连续的交换文件还是分区,都没有性能优势,两者都被以相同的方式处理。 - mook765
@mook765经过讨论进行了调整。 - gmatht
除了性能方面,如果您的固态硬盘(SSD)上有一个频繁写入且可能有少量可用空间的交换分区,它的寿命是否会大大缩短? - Pablo Bianchi
4@PabloBianchi 可以这样做,但我现在更喜欢将交换分区放在SSD上。将交换分区放在旋转磁盘上可能会增加磁盘的磨损。现代SSD的耐久性与旋转硬盘相比并不会快得多。 - gmatht
@gmath - 这取决于你是否真的使用了Swap。如果你经常使用Swap,它可能会对SSD的寿命产生影响:比HDD更明显。 - ravery
自从内核5.0版本开始,btrfs支持交换文件。如果你希望对所有内容进行加密(除了ecryptfs的弃用和LUKS),关于交换文件的一些说明将会让生活更加便利。 - Pablo Bianchi
@PabloBianchi 你知道btrfs加密交换空间相比LUKS有什么优势吗? - gmatht
对于Ubuntu 14.04:sudo swapon --summary。 - jw_