如何禁用交换空间?

我在RAM中有一些敏感数据,我希望它们不要存储在磁盘上。如何禁用交换空间?
我的RAM足够多。如果RAM消耗过高,我不介意终止进程。如何禁用交换空间?
注意:我没有交换分区,并且这是在虚拟机(VMware)中运行的。

3即使你有很多的RAM,完全不使用交换空间并不是一个好主意(参见例如http://www.alexonlinux.com/swap-vs-no-swap)。根据你的需求,你可以考虑将交换分区放在一个dm-crypt安全设备上,这样写入其中的所有内容都会被加密。在这种情况下,你必须确保在加密卷可用之后启用交换空间,并在设备映射被禁用之前禁用它,当然了(我认为这在Ubuntu上是默认设置,但我不确定)。只需在网络上搜索“加密交换空间”就能找到许多指南。 - soulsource
2关于:http://askubuntu.com/questions/248158/how-do-i-setup-an-encrypted-swap-file 在你需要之前,你不需要交换空间。但是当你真正需要时,它就非常重要了。 - user459652
加密交换空间怎么样?/dev/mapper/cryptswap1 - user503925
类似的问题在ServerFault上:https://serverfault.com/q/684771 - drammock
8个回答

使用中
sudo swapoff -a  

通常关闭交换空间的方法是使用swapoff -a命令,重新打开交换空间可以使用swapon -a命令。 有关显式设备关闭交换空间的更多信息,请参考man swapoff

19这似乎在重新启动后无法持续? - ebyrob
41通常在/etc/fstab中进行对交换空间的永久更改。 - ubfan1
我们只需将这个复制到/etc/fstab吗? - Max
17不要交换。相反,在/etc/fstab中注释掉交换行。 - Torsten Bronger
你可以在其他答案中看到如何将其注释掉。 - Carolus
@ubfan1 这个解决方案如何处理因之前启用的交换空间而已存在于硬盘上的敏感数据?我认为这是问题提问者的主要关注点。请在此处查看我的答案。 - Elder Geek

你可以通过在/etc/fstab文件中注释掉(在行前面添加#)交换分区的条目来在重启后禁用交换。这样可以防止交换分区在重启后自动挂载。要一次性完成此操作,可以使用以下命令:
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

或者简单说:
sudo sed -i '/ swap / s/^/#/' /etc/fstab

现在你在/etc/fstab上的交换条目将类似于这样:
#UUID=xxxxxxxx-xxxx-xxxxx-xxx-xxxxxxxxxxx none            swap    sw              0       0

用您自己的特定数字和小写字母替换字母“x”。

2为什么你引用的UUID有一些具体的数字?它们应该对所有UUID都是相同的吗?我的分区UUID与你指定的数字没有任何巧合。 - Ruslan
6如果字段是由制表符(而不是空格)分隔的话,你的sed命令将无法正常工作。更好的写法是 sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab 附注:我还添加了#?以防止在行已被禁用时对/etc/fstab进行其他更改。 - Alek_A
这个问题如何处理可能已经存在于磁盘上的敏感数据,这是OP的主要关注点,基于这个问题。请查看我在这里的回答。 - Elder Geek
1我最喜欢这个。 - Vasantha Ganesh

sudo swapoff -a

以上命令仅在当前会话中禁用交换空间,您需要在/etc/fstab文件中注释掉交换分区。要做到这一点,只需在交换行的开头添加“#”(注释行)即可。步骤如下:

  1. 在终端中输入sudo gedit /etc/fstab打开fstab文件。

文件内容如下:

proc            /proc           proc    nodev,noexec,nosuid 0       0
/host/ubuntu/disks/root.disk /               ext4    loop,errors=remount-ro 0       1
/host/ubuntu/disks/swap.disk none            swap    loop,sw         0       0
#/dev/sda10 /media/ASD  vfat    defaults    0   0
#/dev/sda1  /media/98   vfat    defaults    0   0

只需在交换分区行的开头添加井号(#),使该行看起来如下所示: ``` #/host/ubuntu/disks/swap.disk none swap loop,sw 0 0 ```
重新启动您的计算机。

1无需重新启动...在Ubuntu 20.04中,可以实时进行定义新的交换空间或删除交换空间。 - Scott Stensland

这可能是个不太好的解决方案,不过我经常用它。 你只需简单地输入。
sudo -s
crontab -e

并添加

@reboot sudo swapoff -a  

因此,它将在启动时自动禁用。

22我希望不用多说,这是一个非常糟糕的方法。为什么要创建一个开机任务来“关闭”另一个选项,而不是编辑另一个文件以阻止它在第一次启动时被打开呢? - underscore_d
5也许不太美观,但并不差劲。如果你已经非常习惯使用crontab,那么这个解决方案会更容易上手,并且比简单地盲目复制其他用户在S.E.上告诉你如何操作/etc/fstab的方法更有意义。而且,即使在新电脑上,你仍然记得如何操作,而不必再次去搜索谷歌。我几乎不知道crontab是什么,对磁盘分区更加熟悉,但这个逻辑仍然成立。 - Nicholas Pipitone
2实际上,这可能是更好的解决方案。因为/etc/fstab的建议只适用于交换分区。而这个解决方案适用于Linux设置,无论它们使用分区还是交换文件。 - Nicholas Pipitone
4@NicholasPipitone /etc/fstab的解决方案同样适用于在/etc/fstab中挂载的交换文件。请参阅我在这里的答案:链接 - Elder Geek
1没有列出的 fstab 选项对我都不起作用。在我找到保持系统上交换空间 "活动" 的原因之前,这个选项就足够了。 - James

如果您对交换文件的内容有疑虑,您可以按照通常的方式使用sudo swapoff -a将其关闭,然后使用dd命令将交换设备填充为零或随机数据。
首先使用fstab中的内容找到您的交换文件或设备(less /etc/fstab)。
找到它并多次确认其位置,例如sda5或/swapfile(在Ubuntu 17.04(Zesty Zapus)及更高版本中,默认情况下将交换分区替换为交换文件)。
对于交换分区或驱动器(以/dev开头):执行“磁盘销毁器”命令(请谨慎使用), sudo dd if=/dev/zero of=swap,将单词swap替换为您在/etc/fstab中找到的交换设备或文件
以填充它为零或

sudo dd if=/dev/random of=swap再次将单词swap替换为在/etc/fstab中找到的交换设备或文件

以填充随机数据。

对于交换文件(仅带有路径前缀),您可以使用sudo rm /path/to/swapfile简单删除该文件,但最好按照上述描述填充它以垃圾数据,这样下次打开交换时就会:

swapon -a

系统会愉快地再次使用它。如果你有足够的内存,可能根本不需要交换空间。执行以下命令:
free

当系统负载较重时,查看使用情况以进行判断。
如果您确定永久不需要交换空间(用于休眠或其他用途),您可以像这里建议的那样,在fstab中注释掉该行。

free


进入终端并执行以下命令:gnome-disks。它并未安装在所有发行版中。如果没有安装,请按照打印的指示进行安装,然后再试一次。在左侧窗格中寻找带有“swap”字样的设备。它通常具有与您的物理内存相同的大小。点击方形按钮以禁用它。使用您的 root 密码验证此更改。
屏幕截图:

Enter image description here

在系统监视器应用程序(gnome-system-monitor)中,您会看到它将交换区报告为“不可用”。交换区已被禁用,但并未删除。您可以在将来轻松地重新启用它。删除交换空间不会对我的系统造成任何损害,但如果您决定将来需要它(休眠),则会给自己带来更多工作量。
为了防止它在启动时挂载,您应该进入gnome-disks的“编辑挂载选项...”并取消选中“启动时挂载”。

1你认为这个回答解决了用户对于在交换分区上存放敏感数据的担忧吗?能告诉我们原因吗? - Elder Geek
1用户的主要观点是询问如何禁用交换空间。如果您拥有敏感数据,最好使用预启动加密。 - user170544
1我非常尊重地不同意。当我阅读问题时,我首先看到的是第一句话:“我在内存中有一些敏感数据,我希望它们不要保存在磁盘上。” 我相信这是他最关心的问题,这也是他为什么以此开始的原因。无论如何,我相信我的回答涵盖了他问题的每个方面。请将其视为一个有用的例子。 - Elder Geek

将文件/etc/fstab中的交换条目所在行中的defaults替换为sw,noauto
/dev/mapper/centos-swap swap  swap    sw,noauto        0 0

(对于您来说,路径/dev/mapper/centos-swap可能不同)。

现在重新启动后,请检查输出,您的交换空间将不会被挂载:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3791         100        3408           8         282        3483
**Swap:             0           0           0**

禁用交换空间

运行以下命令以禁用交换空间:

sudo swapoff -a

现在删除交换文件:

sudo rm /swap.img

它是安全的,而且不需要重新启动。