如何增加交换空间?

我在Ubuntu中默认有250MB的交换空间,我想将其扩展到更大的尺寸。我需要800MB,我认为这将足以打开多个应用程序,而不必达到当前交换限制。我希望有人能帮助我。

3请打开Gparted,并在这里发布你所见的屏幕截图。 - Aaron Hill
如果您的交换分区可以扩展到相邻的未分配空间,则使用 gparted。如果没有这样的空间,可能是因为您的活动(引导)分区正在使用所有非交换空间,那么 gparted 将不允许您减小活动分区的大小以创建未分配空间。在这种情况下,您可以重新安装 Ubuntu 以创建更大的交换空间。 - H2ONaCl
9个回答

你可以随时创建一个交换文件来增加更多的交换空间。虽然在某些方面与交换分区不同,但它将非常简单和灵活。
在以下步骤中,将/media/fasthdd/swapfile.img更改为任何你喜欢的名称。例如,它也可以是/swap.img/media/fasthdd/swapfile.img只是一个示例文件名。如果你使用这个文件名,那么当然必须有一个具有足够空闲空间的目录/media/fasthdd/来存放你的新交换文件。
使用任何终端应用程序来运行以下步骤中的命令。所有命令都应以root权限运行。为此,你可以在每个命令的开头添加sudo,或者在运行命令之前运行sudo bash
  1. 创建一个空文件:

    这个文件将包含虚拟内存的内容,所以要根据你的需求创建足够大的文件。下面的命令将创建一个1GiB的文件,也就是为系统提供+1GiB的交换空间:

    dd if=/dev/zero of=/media/fasthdd/swapfile.img bs=1024 count=1M
    

    如果你想创建一个3GiB的文件,只需要将count的值改为count=3M。更多信息请参考man dd

  2. 制作交换文件系统:

    下面的命令将在你的新交换文件中创建一个"交换文件系统"。

    mkswap /media/fasthdd/swapfile.img
    
  3. 开机自动挂载:

    为了确保在计算机启动时激活新的交换空间,你应该将其添加到文件系统配置文件/etc/fstab中。将其添加到文件末尾是推荐的,因为其他文件系统(至少包含一个交换文件的文件系统)在我们访问任何文件之前必须以读写模式挂载。

    # 在/etc/fstab中添加以下行
    /media/fasthdd/swapfile.img swap swap sw 0 0
    
  4. 激活交换空间:

    你可以重新启动计算机,或者使用以下命令手动激活新的交换文件:

    swapon /media/fasthdd/swapfile.img
    

如果一切顺利,你应该看到有更多的交换空间可供使用。你可以使用以下命令来检查你的新交换空间,并确认它是否生效:
$ cat /proc/swaps
Filename                           Type       Size    Used    Priority
/media/fasthdd/swapfile.img        file       8388604 2724    -1

$ grep 'Swap' /proc/meminfo
SwapCached:         4772 kB
SwapTotal:       8388604 kB
SwapFree:        8355812 kB

7要编辑/etc/fstab,请在命令行中尝试以下操作:sudo gedit /etc/fstab - Ben
2如何停用新创建的交换文件? - Hossein
5明白,已经关闭了! - Hossein
如果我在这个位置找不到swapimage.img文件(而且系统中也没有其他地方有),该怎么办? - PaulD
@PaulD 它将被创建。实际上,您应该确保如果文件已经存在,则不需要该文件。dd 将覆盖现有文件。如果您想替换现有的交换文件,则应首先使用 swapoff 命令禁用它。 - Sampo Sarrala - codidact.org
6使用命令"swapon -s"来查看状态,而不是"cat /proc/swaps"。 另外,"free"命令也提供了交换空间使用信息。 - Paul M
2要编辑/etc/fstab,请在命令行中尝试以下操作:sudo nano /etc/fstab。这比使用sudo gedit /etc/fstab更安全。 - t0m
1swapon 对我因权限问题大声呵斥,但是通过 sudo chmod 0600 /media/fasthdd/swapfile.img 命令解决了这个问题。 - JBis
遇到“dd: failed to open '/media/fasthdd/swapfile.img': No such file or directory”错误?在/media/fasthdd手动创建了一个文件,但是无论是在之前还是之后都没有任何线索! - user3769778
1你被swapon骂了?我被mkswap骂了! - Jasha
这个陈述“_这将创建一个1GiB的文件,意味着为您的系统增加了+1GiB的交换空间_”是含糊不清的。它是指您最终拥有1GiB的总交换空间,还是将1GiB添加到您现有的交换分区中?问题说明他们已经有“250MB的交换空间”,但没有说它是一个分区还是一个文件。 - TommyPeanuts
@TommyPeanuts 这将增加+1GiB可用的交换空间。如果您使用不同的文件名重复此过程,它将再次增加另外+1GiB可用的交换空间,从而实现在不同存储设备之间轻松实现动态平衡。 - Sampo Sarrala - codidact.org
fstab(5) 里面不是说第二个字段应该是 none 吗? - Nick S

将交换空间调整为8GB

# Turn swap off
# This moves stuff in swap to the main memory and might take several minutes
sudo swapoff -a

# Create an empty swapfile
# Note that "1G" is basically just the unit and count is an integer.
# Together, they define the size. In this case 8GB.
sudo dd if=/dev/zero of=/swapfile bs=1G count=8

# Set the correct permissions
sudo chmod 0600 /swapfile

sudo mkswap /swapfile  # Set up a Linux swap area
sudo swapon /swapfile  # Turn the swap on

检查是否成功
grep Swap /proc/meminfo

使其永久生效(重启后仍有效)

将以下行添加到您的 /etc/fstab 文件的末尾:

/swapfile swap swap sw 0 0

35工作得像魔法一样顺利! - Philipp
没对我起作用 swapon:/swapfile:不安全的权限 0644,建议使用0600。 swapon:/swapfile:跳过 - 看起来有空洞。 - Uri
@Uri 听起来你需要执行 chmod 0644 /swapfile - Martin Thoma
可能。可能是因为我有ZFS... - Uri
3太好了,对我来说起作用了。 - matinict
我也会在开机时通过在/etc/fstab中添加以下内容来添加此交换文件:/swapfile swap swap sw 0 0(正如Sampo Sarrala所提到的)。 - Mitrakov Artem
非常完美,谢谢! - user615274
dd: 输入缓冲区的大小为1073741824字节(1.0 GiB),内存已耗尽。 - stiv
这对我来说是有效的,但当我重新启动计算机时,它会恢复到只有1GB的交换空间(尽管我的32GB /swapfile 仍然存在)。 - Garrett
7如丝般顺畅运行:D Ubuntu 20.04 LTS - Mohammed Ramadan
@Garrett 如果需要在你的/etc/fstab中注释掉另一个交换文件,请查看一下。 - Sir hennihau
那个 /swapfile 文件在哪里?万一我需要清理它呢? - Dimitris Sfounis
@Sirhennihau 我在 /etc/fstab 文件中有一行内容:/dev/mapper/vgubuntu-swap_1 none swap sw 0 0。我应该将这行注释掉然后再尝试这个解决方案吗? - Garrett
@Garrett 是的,请尝试将那个注释掉,然后再次按照这个答案中的步骤操作。 - Sir hennihau
@Sirhennihau,那个方法没有起作用,尽管现在的行为有所不同。重新启动后,与恢复到原来的约1GB交换空间不同,这次我根本没有交换空间了。当我执行grep SwapTotal /proc/meminfo时,返回的结果是SwapTotal: 0 kB。我的/etc/fstab文件当前的状态可以在这里找到。还有其他的想法吗? - Garrett
@Garrett 嗯,如果我看得没错的话,你已经禁用了旧的交换文件。现在你还需要在其中启用新的交换文件。所以你需要添加类似于 /swapfile swap swap sw 0 0 的内容(请参考原始答案)。确保指向正确的文件。这个答案还告诉你如何创建这个文件。 - Sir hennihau
@Sirhennihau 哎呀,好的,加上那行代码对我来说有效!(Ubuntu 20.04)此外,我注意到即使在 fstab 中没有注释掉上面的交换行 (/dev/mapper/vgubuntu-swap_1 none swap sw 0 0),它也可以正常工作。 - Garrett
@Garrett 很高兴我能帮到你!<3 - Sir hennihau
8/swapfile none swap sw 0 0比这个答案的建议/swapfile swap swap sw 0 0更可取,因为man fstab中提到(在/etc/fstab行的第二个字段):“对于交换分区,此字段应指定为`none'。” - Jasha
如果我将count=2会有效吗? - alper
6很好的回答。如果有人想知道是否应该将8GB作为交换文件大小,可以查看SwapFaq中的建议。简而言之:将交换文件大小与RAM容量匹配应该没问题。我最初有8GB的RAM,但只有2GB的交换文件大小,结果经常因为OOM而崩溃,所以我将交换文件增加到了8GB,完全按照这个回答的建议。我相信这是相当普遍的情况。 - Colm Bhandal
@ColmBhandal这个交换增加修复了崩溃问题吗?我也遇到了同样的问题,我将交换空间从2GB增加到8GB,但仍然会出现随机系统冻结。谢谢! - Radu Ursache
1@RaduUrsache 不能确定,但目前为止还不错。尝试使用 journalctl -u systemd-oomd 命令。请参考这里 - Colm Bhandal
你可以使用这个命令来显示进度状态,并避免出现"dd: warning: partial read"的警告:sudo dd if=/dev/zero iflag=fullblock of=/swapfile bs=8G count=8 status=progress - Fredrick Anyera M
在Ubuntu 20.04.5上运行得非常出色。 - Joshua Johns
在Ubuntu 22中执行最后一个命令时出现了“/swapfile: Permission denied”的错误。我还运行了“sudo chmod 0600 /swapfile”和尝试了“chmod 0644”。有任何想法是什么问题? - SIMMORSAL
我只有一个硬盘,出现了这个错误:mkswap: error: 交换区至少需要40 KiB,你有什么想法吗? - zheyuanWang
@SIMMORSAL 我遇到了 mkswap: cannot open /swapfile: Permission denied 的问题,原来是我使用了 mkswap /swapfile 而不是 sudo mkswap /swapfile(我忘记加上 sudo)。 - linker
太棒了!尽管sb=1GB让机器卡住了cough。我改成了sb=1MB:dd if=/dev/zero of=/swapfile bs=1M count=20000 在云主机上非常快速。 - Amanda

使用GUI方法增加交换分区的大小

增加交换分区大小的另一种方法是使用GParted分区编辑器。简而言之,您可以调整交换分区的大小,然后右键单击它并选择“启用交换”。

更容易的方法是启动gparted-live-disk或Ubuntu live disk(这样所有/dev/sda分区将被卸载)。如果您在18.04之前的某些版本中运行Ubuntu live disk,则可能需要通过运行以下命令安装gparted

sudo apt-get update
sudo apt-get install gparted && sudo gparted

只有在交换分区前后存在未分配空间时,才能增加交换分区的大小。如果交换分区下方或上方没有未分配空间(即我们试图与交换分区合并的空间),那么我们需要调整分区大小并获取该未分配空间。
案例1 - 交换分区前后存在未分配空间

GParted partitions

在上面的截图中,我有11.4 GB的未分配空间,在linux-swap之前,以及12.8 GB的未分配空间在交换分区之后。
要调整大小,请右键单击交换分区(这里是/dev/sda9),然后点击“调整/移动”选项。它会看起来像这样:
拖动滑块箭头左右移动,然后点击“调整/移动”按钮。您的交换分区将被调整大小。
案例2 - 未分配空间位于分区之间

enter image description here

在上面的截图中,我们想要将未分配空间添加到交换分区之间的是dev/sda7/dev/sda8。为了将未分配空间从那里移动到交换分区的正上方,我们需要按照以下简单步骤进行操作:
  • 右键点击/dev/sda8分区,选择调整大小/移动选项。

    enter image description here

  • 点击并将滑块移动到极左侧,这样刚好位于/dev/sda8分区上方的未分配空间将会出现在/dev/sda8下方。然后点击调整大小/移动按钮。

  • 现在,未分配空间就位于交换分区的正上方,就像情况1一样。现在按照情况1进行操作。


案例3 - 如果未分配的空间存在于扩展分区之外

enter image description here

我在扩展分区下方有18 GB的未分配空间。要将此空间添加到Linux交换分区(位于扩展分区内),我们需要按照以下步骤进行操作:
  • 右键单击扩展分区,选择调整大小/移动选项,如下所示:

    enter image description here

  • 点击并拖动箭头到极右侧,然后点击调整大小/移动,这样18 GB的未分配空间将出现在扩展分区底部。我已经有14.80 GB的未分配空间位于底部,现在18.34 GB与其相结合,形成了(18.34+14.80 GB)的未分配空间。

  • 现在,在交换分区下方有一个未分配空间,就像情况1一样,然后按照情况1进行操作。

注意:在执行上述操作之前,请不要忘记备份所有重要数据。


5很棒的GUI工具指南,完全值得加分。然而,也许应该提醒一下关于分区编辑可能涉及的潜在风险。一个简单的MBR备份指南或者链接到这样的指南将是一个很好的补充,错误可能不太可能发生,但成本可能会很高 + 备份MBR 不会占用太多时间和空间,当正确操作时可以节省大量的工作、空间和时间 - Sampo Sarrala - codidact.org
2不要忘记执行swapon命令,右键点击交换分区并选择swapon。 - user3752281
我们能否将未分配的空间从根分区(/)的一侧移动到另一侧,类似于案例2? - zean_7
如果交换分区已经存在(可能由于安装程序的设置愚蠢地只设置为1GB,而不考虑RAM的数量或可用的SSD),在调整大小之后并在swapon之前,您可能需要运行sudo mkswap /dev/mapper...。否则,操作系统仍然只会使用旧的交换空间量。 - Dan Dascalescu

如果你想为交换文件保留空间,而无需通过 dd 填充文件,你也可以使用 fallocate

man 页面中可以找到相关信息:

DESCRIPTION
   fallocate is  used to preallocate blocks  to a file.

   For filesystems  which support the  fallocate system
   call, this is done  quickly by allocating blocks and
   marking them  as uninitialized,  requiring no  IO to
   the data blocks. This is much faster than creating a
   file by filling it with zeros.

如果您已经定义了一个“swap”,您可以选择删除它或保留它,您的*nix系统将会管理它(通过定义“swapon”优先级可以更好地管理)。这在您希望将交换空间分散在不同设备、驱动器上时非常有用(根据它们的速度或其他自定义需求,参见StackExchange上的多个交换文件的目的是什么)。

使用简单的“fallocate”命令添加第二个交换文件

检查交换情况:

$ sudo swapon -s
Filename                Type        Size    Used    Priority
/swapfile               file        262140  246276  -1

创建4G交换文件

创建和激活交换文件的标准方法:

size="4G"
file_swap=/swapfile_$size.img
sudo touch $file_swap
sudo fallocate -l $size /$file_swap
sudo mkswap /$file_swap
sudo swapon -p 20 /$file_swap

一句话:
$ size="4G" && file_swap=/swapfile_$size.img && sudo touch $file_swap && sudo fallocate -l $size /$file_swap && sudo mkswap /$file_swap && sudo swapon -p 20 /$file_swap

使您的交换空间永久生效

在您的/etc/fstab文件中添加一行,以便在下次重启时初始化交换空间(我们还在此处更新了新创建的交换空间的优先级,并更新了旧交换文件的优先级)。

请注意,在您的/etc/fstab文件中,先前交换空间的优先级现在为10。

/swapfile    none    swap    sw,pri=10      0       0
/swapfile_4G.img     none    swap    sw,pri=20      0       0

重启后检查交换情况:
$ sudo swapon  -s
Filename       Type     Size        Used    Priority
/swapfile      file     262140      0       10
/swapfile_4G.img       file     4194300     0       20

删除一个交换空间(例如原始的256Mb)

编辑/etc/fstab

删除与要删除的交换空间相关的行。

删除该交换空间

删除并移除交换文件。

sudo swapoff /mnt/swapfile && sudo rm /mnt/swapfile

资源:


4fallocatedd更好,如果您的文件系统支持的话。那些一行代码仍然感觉难以阅读,如果这些能够分解为实际的命令,可能会更容易学习。 - Sampo Sarrala - codidact.org
4这是一个完美答案的例子,非常简单易懂,非常容易实施。在Ubuntu 18上运行得非常好。 - developer_hatch
非常好的回答,谢谢!只需要将sudo swapoff /mnt/swapfile && sudo rm /mnt/swapfile改为sudo swapoff /swapfile && sudo rm /swapfile,以匹配sudo swapon -s的结果。 - scott
swapon文档不鼓励使用fallocate。这里有一场讨论关于背后的原因。 - nocibambi
建议更改权限为0644或0600,以提高安全性。 - Talha Anwar

我发现以下视频非常有趣,是一种简单直接的方法来增加swapfile的大小。请查看这个短视频教程:如何在Ubuntu Linux上增加Swap | Linux Handbook (从这个视频中)以下是增加swap空间的方法(如果您的系统正在使用swapfile):
首先检查您的Linux系统的swap大小:
swapon --show

示例输出:

NAME      TYPE   SIZE USED PRIO
/swapfile file 797.2M   0B   -2

这个输出显示正在使用交换空间的大小和类型。在这里,交换类型是“文件”类型(也可以是分区类型)。Ubuntu默认使用swapfile,并且增加和减少其大小非常容易。
由于我们将修改swapfile,所以首先将其关闭。您可能会注意到该过程被多次终止。这是因为在关闭交换之前,系统会将其内容移动到主内存中,可能会导致主内存溢出。因此,如果以下命令被终止,请多次运行直到成功完成。您还可能遇到突然注销和/或其他进程可能会自动终止的情况。
sudo swapoff /swapfile

现在如果你运行swapon --show,它不会显示任何内容,因为它已经关闭。
现在改变交换空间的大小(我将其设置为4GB,对于n GB,请将其设置为nG):
sudo fallocate -l 4G /swapfile

现在,如果你检查文件,你会发现文件的大小增加了。要查看它:
ls -lh /swapfile

现在告诉Linux系统将此文件用作交换系统:
sudo mkswap /swapfile

这将清除旧的交换签名并使用新的签名。
现在要打开交换(因为我们最初关闭了交换空间):
sudo swapon /swapfile

完成!

现在使用swapon --showfree -h来查看变化。


2只需要说这篇写得非常好。它完美地解释了每一步骤,有验证步骤,并且它完美地运行。非常感谢你。 - Jacob

在我的情况下,我已经有一个交换文件,我原以为它是1GB大小的,但仔细看了一下,它只有256MB大,当我预编译我的Rails资源时,服务器会耗尽内存。
Errno::ENOMEM: Cannot allocate memory - nodejs

我按照这里描述的方法创建了我的交换文件: https://stackoverflow.com/a/34885004/784318
现在创建一个名为/swapfile的空文件的命令如下:
sudo dd if=/dev/zero of=/swapfile bs=1024 count=256k

现在要调整交换文件的大小,我需要按照以下简单步骤进行操作:
# Reboot the system to be able to switch swapping off
sudo reboot

# Turn swap off
sudo swapoff -a

# Delete the `/swapfile`
rm -f /swapfile

# Recreate the swapfile but with double file size memory
sudo dd if=/dev/zero of=/swapfile bs=1024 count=512k

# Turn swap back on
sudo swapon -s

# Change the permission to non-world-readable
sudo chown root:root /swapfile 
sudo chmod 0600 /swapfile

# Use the swap file
sudo mkswap /swapfile
sudo swapon /swapfile

文件创建于(536870912 / 1024 / 1024 = 512 MB):
ls -lia /swapfile 
768 -rw------- 1 root root 536870912 Apr 27 07:54 /swapfile
使用free -m命令,我可以看到文件现在是512 MB,正如预期的那样。

你不应该在删除单个文件时使用危险的 -r 标志与 rm 命令。仅使用 rm -f 就足够了。 - Sampo Sarrala - codidact.org
1@SampoSarrala 谢谢你提醒我,我已经相应地修改了脚本。 - Besi
@Besi 谢谢!这正是我需要的来增加我在我的Ubuntu 18.04 LTS系统上的交换文件大小。它完全按照你写的那样起作用。非常好的帮助!!! - B-radical
我喜欢这个解决方案,因为它是命令行的,不需要重新分区,并且还解释了如果已经存在交换文件应该怎么做。 - cxrodgers

如果你想调整交换分区的大小,而不想创建交换文件的话,那么
  1. 通过选择尝试Ubuntu启动Ubuntu安装媒体的实时会话

  2. 如果您使用Kubuntu、Lubuntu等,请打开GParted或其他分区管理器

  3. 禁用交换空间: enter image description here

  4. 通过缩小主分区(在我的情况下是/dev/sda2)来调整其大小

  5. 调整交换分区的大小,使其变大

  6. 使用相同的上下文菜单和Swapon按钮启用交换空间

  7. 重新启动到常规的Ubuntu会话

  8. 打开终端并查看交换空间的大小是否已更改:

     $ sudo swapon --show
     [sudo] password for user: 
     NAME      TYPE      SIZE   USED PRIO
     /dev/sda3 partition   2G 129.3M   -2
    
没有改变。要改变它,按照以下步骤进行:
9. 禁用交换空间: ``` $ sudo swapoff /dev/sda3 ```
10. 重新创建交换空间: ``` $ sudo mkswap /dev/sda3 mkswap: /dev/sda3: 警告:正在清除旧的交换签名。 设置交换空间版本1,大小为10 GiB(10788794368字节) 无标签,UUID=2e315546-04f7-4db6-8ca9-25f36f4ee960 ```
11. 启用交换空间: ``` $ sudo swapon /dev/sda3 ```
12. 检查交换空间的大小: ``` $ free -m 总计 已使用 可用 共享 缓存/高速缓存 可利用 内存: 15948 13008 301 670 2638 2006 交换空间: 10288 0 10288 ```
13. 检查交换分区的UUID: ``` blkid | grep swap ```
14. 在`/etc/fstab`文件中将交换分区的`UUID`替换为正确的值: ``` user@pc:~$ blkid | grep swap /dev/sda3: UUID="e434f979-8861-4bd3-888c-824de39d739a" TYPE="swap" PARTUUID="3ca528d4-db6c-4ed6-ae95-94729e3f609c" user@pc:~$ cat /etc/fstab | grep swap #UUID=add18f30-c662-4e5c-bfc7-62f4d012fb2e none swap sw 0 0 UUID=e434f979-8861-4bd3-888c-824de39d739a none swap sw 0 0 ``` 我刚刚注释了旧记录,并使用`blkid`命令输出的正确`UUID`创建了一个新记录。

1谢谢,它起作用了!但是在重新启动后,由blkid | grep swap返回的UUID发生了变化。所以我不得不将其更新为新的UUID。 - pumbo

如何添加交换文件
  1. 创建 .img 文件
    sudo dd if=/dev/zero of=/swap.img bs=1M count=1000
    

    注意!:bs=1M count=1000 ==> 1GB
    (bs * count = 以兆字节计的大小)

    其他示例:

    sudo dd if=/dev/zero of=/swap.img bs=10M count=100 
    
  2. 格式化 .img 文件
    sudo mkswap /swap.img
    
  3. 启用交换文件
    sudo swapon /swap.img
    
  4. 将交换文件添加到 fstab
    在 fstab (/etc/fstab) 中添加以下行:

    /swap.img   none            swap    sw              0       0
    

我通常会在交换分区上设置一个标签,例如“mkswap -L SWAP2”。 - Paul M
请注意:这个答案与Sampo Sarria的被接受/最受欢迎的答案相同,但是上下文更少,并且将img交换直接添加到根目录而不是/media/fasthdd。 - steel

我有zfs,这对我有效。
sudo zfs create -V 8G -b $(getconf PAGESIZE) -o logbias=throughput -o sync=always -o primarycache=metadata -o com.sun:auto-snapshot=false rpool/swap sudo mkswap -f /dev/zvol/rpool/swap sudo swapon /dev/zvol/rpool/swap 在/etc/fstab中,我添加了这行(使用制表符作为空格):
/dev/zvol/rpool/swap none swap discard 0 0