如何永久关闭交换?

Ale*_* Li 90 swap

交换让我的系统变得迟钝,关闭它会让一切变得更顺畅。我有 3.5 GB 的内存。

我知道如何通过sudo swapoff -a在终端中输入来关闭交换,但这仅适用于当前会话,因为在重新启动后交换会重新打开。有没有办法永久关闭交换?

ter*_*don 137

我可以建议一个更安全的方法吗?你永远不知道什么时候交换可以让你免于崩溃。虽然交换确实会减慢您的计算机速度,但如果您使用的程序会占用您所有的 RAM,那么具有交换功能可以使您免于硬重启。当计算机开始交换时,您会注意到并能够杀死有问题的应用程序。

因此,而不是完全禁用掉,只需确保您的操作系统互换非常罕见。这由 中的vm.swappiness设置控制/etc/sysctl.conf。Ubuntu 的默认设置是60如果我没记错的话,这在大多数情况下太多了,即使 RAM 仍然可用,也会导致您开始交换。如果您降低此值,您将能够保持交换的安全线,同时仅将其用于紧急情况。所以,打开文件:

sudo nano /etc/sysctl.conf
Run Code Online (Sandbox Code Playgroud)

并将这一行添加到其中:

vm.swappiness=10
Run Code Online (Sandbox Code Playgroud)

如果这仍然太多,请将 10 更改为 1。现在,重新启动后,您只会在绝对必要时进行交换,您可以简单地忘记它。

  • 只是添加到“更安全的方法”论点:当您没有交换并且系统内存不足时,将调用 Linux OOM(内存不足)杀手。这将根据“不良”分数选择一个进程,然后...杀死它(终止、关闭),应用程序没有机会保存其更改、清理等。因此,如果您关闭交换并用完内存,如果重要进程在 OOM 杀手的眼中得分不佳,您很可能会失去工作。因此,只有当您*确信*您永远*不会*耗尽内存时,才应该关闭交换。 (20认同)
  • 这实际上并没有回答这个问题。完全禁用交换在具有 16GB 或 32GB RAM 的系统上很有意义。在内存占用应用程序的情况下,额外的几 GB 交换不会有任何好处,而大量交换(例如 20GB)会占用大量硬盘驱动器/SSD 空间。此外,用 32GB 的 RAM 休眠是_不__有趣的_。 (13认同)
  • 对于某些设置,一旦用完物理 RAM 并开始交换,系统就会开始“吸泥”并变得无法使用。是的,理论上你可以进入并杀死罪犯,但是当在 UI 中改变焦点需要 20 多分钟,甚至需要更长时间才能通过 SSH 获得密码提示时,OOMing 最终成为最佳选择(随后是一个艰难的选择)重新启动,然后进入并解决问题)。 (9认同)
  • @Reid 值得指出,显然,如果交换空间也用完,也会发生同样的事情。 (6认同)
  • @mchid 当 UI 如此冻结以至于更改 Windows 需要 5 分钟,并且等待命令执行需要 10 分钟时,您建议的解决方案是不可行的。如果您确切地知道自己在做什么,则需要足够长的时间,但如果您必须运行多个命令才能找到最严重的内存违规者,则可以将该时间乘以 3。例如,您的 drop_caches 命令创建 3 个进程(echo、sudo、 tee),当您的系统交换时,这可能需要很长时间。顺便说一句,我不是在开玩笑。我的交换位于速度较慢的硬盘上,在不进行硬重启的情况下从 OOM 恢复大约需要一个小时。 (2认同)
  • @mchid 我的问题“解决方案”是关闭交换。就我个人而言,我宁愿让进程崩溃,也不愿让系统完全锁定。“如果你的系统正在交换,你不应该有任何问题”,这就是我的观点:我确实有问题,而且有很多问题。ZRAM 在当时是一个好主意,但实际上它弊大于利。而“在遇到麻烦之前运行命令”要求我不断关注系统内存。这不是我或大多数人使用计算机的方式,他们也不应该这样做。该设备为我服务,而不是相反。 (2认同)

ani*_*uia 53

在 /etc/fstab 中找到与交换相关的行,并对其进行注释。我的是这样的:

UUID=6880a28d-a9dc-4bfb-ba47-0876b50e96b3 /               ext4    errors=remount-ro 0       1
UUID=7350e6f2-e3a7-4d80-9a95-8741c7db118f /home           ext4    defaults        0       2
UUID=E2E26AD1E26AAA0D /media/windows  ntfs    defaults,umask=007,gid=46 0       0

# Swap a usb extern (3.7 GB):
#/dev/sdb1 none swap sw 0 0
Run Code Online (Sandbox Code Playgroud)

您可以使用 gedit 编辑此文件。先备份一下,以防万一:

sudo cp /etc/fstab /etc/fstab_backup
gksu gedit /etc/fstab
Run Code Online (Sandbox Code Playgroud)

只需在swap所在行的开头添加#,然后重新启动计算机。

或者

尝试在/etc/fstab文件中注释掉交换条目的命令行方式,

sudo sed -i.bak '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
Run Code Online (Sandbox Code Playgroud)


Zib*_*bri 28

错误.. 如果 systemd 在任何驱动器上找到一个 SWAP 分区,它无论如何都会自动挂载它。奇怪的是没有人提到 systemd。无论如何,解决方案非常简单;要永久禁用交换,您必须:

  1. swapoff -a
  2. 编辑/etc/fstab和评论任何存在的交换条目(您可以跳过此步骤 2,没有步骤 2 的步骤 3 可能对您有用)。
  3. 运行:(sudo systemctl mask "dev-sdXX.swap" 其中 XX 是交换分区。注意,您应该在单元名称周围使用引号,以防名称有转义字符/反斜杠。对所有可能的分区执行此操作也很有用,以便如果任何其他分区上有交换分区驱动器它不会被安装。)

和平出来。

  • 获胜的第 3 名!! (3认同)
  • sudo systemctl unmask dev-sdXX.swap (3认同)

mda*_*acu 17

只需从 fstab 中删除条目(或在行前使用 # 对其进行注释)并重新启动。查找其中包含“swap”一词的行。

sudo nano /etc/fstab
Run Code Online (Sandbox Code Playgroud)

  • 这个也可以,但我认为最好评论该行而不是完全删除它,以防万一您想恢复更改。 (12认同)

小智 6

补充Zibri 的答案

\n
    \n
  • swapoff -a将暂时禁用所有交换。
  • \n
  • 如果您有一些交换/etc/fstab,只需将它们注释掉并重新启动即可。
  • \n
  • 就我而言(OdroidMC1+Armbian),交换由 systemctl 控制。要查找责任人,请使用systemctl --type swap.
  • \n
\n

例子:

\n
# systemctl --type swap\n\nUNIT           LOAD   ACTIVE SUB    DESCRIPTION                                                                                                                                                                     \ndev-zram1.swap loaded active active /dev/zram1                                                                                                                                                                      \n\nLOAD   = Reflects whether the unit definition was properly loaded.\nACTIVE = The high-level unit activation state, i.e. generalization of SUB.\nSUB    = The low-level unit activation state, values depend on unit type.\n\n1 loaded units listed. Pass --all to see loaded but inactive units, too.\nTo show all installed unit files use \'systemctl list-unit-files\'.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 通过使用 ing 来禁用masksysctl
  • \n
\n
# systemctl mask dev-zram1.swap\n\nCreated symlink /etc/systemd/system/dev-zram1.swap \xe2\x86\x92 /dev/null.\n
Run Code Online (Sandbox Code Playgroud)\n