系统安装后如何添加交换空间?

我在Ubuntu安装过程中没有创建交换分区。后来,我释放了一些空间并创建了一个交换分区。现在每次启动后,我都需要手动打开gparted,右键点击交换分区以启用“swapon”选项。
如何在启动时自动启用交换分区?
另外,如果我没有创建交换分区,还有其他选择吗?

1http://askubuntu.com/questions/299417/does-it-make-sense-to-create-swap-partitions-for-new-installations-nowadways/299441#299441 - Qasim
在尝试解决您的问题时,请注意'/etc/fstab'不仅用于交换内存,还管理着您的主要挂载点。因此,请谨慎编辑它。 - Khalil Youssefi
9个回答

您需要编辑/etc/fstab并添加新的交换分区。
sudo nano /etc/fstab

你需要添加一行看起来像这样的代码
UUID=735b3be3-779c-4d21-a944-b033225f3ab4 none   swap    sw      0       0

你可以使用以下命令获取UUID。

sudo blkid /dev/sda3

/dev/sda3替换为适当的设备名称;为了查看适当的设备名称,我们可以使用lsblk命令 - 如此处所述。

相关:


需要帮助解决/etc/fstab的问题,我得到的输出是:bash: /etc/fstab: 权限被拒绝。 - Ashu_FalcoN
1使用sudo gedit /etc/fstab - user323419
3要找到合适的设备名称:sudo fdisk -l(来源:http://askubuntu.com/questions/182446/how-do-i-view-all-available-hdds-partitions),然后寻找类型:Linux swap。 - NumesSanguis
1sudo blkid /dev/sda4 对我来说没有输出(sda4是一个新创建的分区,代码为82h,fdisk显示它是一个"Linux swap / Solaris"分区)。 - Egor Skriptunoff
我需要UUID吗?为什么不直接使用/dev/sda3呢? - Elvis Dukaj
1@elvis.dukaj,使用设备名称也是完全可以的。它们基本上表示两个不同的事情。一个是使用具有确切UUID的卷(这个UUID会在另一次mkswap运行时更改),另一个是使用磁盘/dev/sda的主分区号3。一些人更喜欢UUID,因为即使设备名称的分配发生变化,UUID仍然保持不变。所以这就是为什么差异很重要的原因。但是如果您确定不会重新分区驱动器,那么/dev/sda3同样安全可用。 - 0xC0000022L
这还不够。按照其他答案中详细说明的方法使用swapon和update-initramfs命令。需要降低评分。另外还有一个关于RESUME设备配置可能引起问题的问题。请参考此链接:https://askubuntu.com/questions/1060917/swap-from-partition-to-file-now-get-no-matching-swap-device-is-available - RichieHH
我有两个UUID,一个是UUID,另一个是PARTUUID。它们是不同的,我应该使用哪一个? - Qian Chen
你需要使用LiveUSB来完成这个操作吗?还是在已启动的操作系统中执行也是安全的? - Liso
你可以从gparted中获取信息,并在那里读取UUID。然后你可以将其复制/粘贴到fstab中。 - David C.

在安装完成后创建一个交换分区,需要先创建一个空分区。这个分区不应该有任何空洞。然后可以使用以下命令格式化该分区:
sudo mkswap /dev/sdX

/dev/sdX替换为你的分区。将此分区挂载为交换分区。
sudo swapon -U UUID

UUID是从此处读取的/dev/sdX的UUID。

blkid /dev/sdX

将您的新交换文件绑定到/etc/fstab中,添加以下行:
UUID=xxx    none    swap    sw      0   0

如果你想要使用交换空间来进行休眠,那么你需要在/etc/initramfs-tools/conf.d/resume中更新UUID,内容为RESUME=UUID=xxx。别忘了执行$ sudo update-initramfs -u完成以上步骤:如果你没有多余的分区,也可以创建一个交换文件。这个答案给出了如何创建并在启动时启用交换文件的方法。

就目前而言,我有一个带有两个分区的SSD,但我想再创建一个第三个分区。如果我有一个主要的ext4分区用于保存操作系统和文件,我能否将其中的2GB划分为一个新的分区?这个主要分区有足够的空闲空间,所以不应该是个问题。 - dustin
2请使用gparted来调整您的分区大小。 - NumesSanguis
列出所有分区及相关详细信息的命令:lsblk -e7 -o "NAME,PTTYPE,FSTYPE,SIZE,LABEL,PARTLABEL,PATH,PHY-SEC,VENDOR,UUID" - Silver Moon

如果您不想或者不确定如何创建交换分区,您可以创建一个与分区相同工作方式的交换文件。以下是使用终端的步骤:
  1. 创建一个空文件(1K * 4M = 4 GiB)。

    sudo mkdir -v /var/cache/swap
    cd /var/cache/swap
    sudo dd if=/dev/zero of=swapfile bs=1K count=4M
    sudo chmod 600 swapfile
    
  2. 将新创建的文件转换为交换空间文件。

    sudo mkswap swapfile
    
  3. 启用文件进行分页和交换。

    sudo swapon swapfile
    

    通过 swapon -stop 进行验证:

    top -bn1 | grep -i swap
    

    应该显示类似于:KiB Swap: 4194300 total, 4194300 free 的行。

    要禁用,请使用 sudo swapoff swapfile 命令。

  4. 将其添加到 fstab 文件中,以便在下次系统启动时保持持久性。

    echo "/var/cache/swap/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
    
  5. 通过以下方式重新测试启动时的交换文件:

    sudo swapoff swapfile
    sudo swapon -va
    

    注意:上述命令会重新检查 fstab 文件的语法,否则您的 Linux 可能无法正常启动。


21非常感谢您提供的唯一使用交换文件而不是交换分区的答案。在这种情况下,我无法创建一个分区。这些命令运行得很好。 - Sarel Botha
3对于那些需要更大交换空间的用户,将count=4M增加到XM,以适应X GiB的交换空间。以防有人错过这一点。 - saurabheights
我对第五步不确定。为什么要关闭交换分区进行测试呢? - khatchad
1@RaffiKhatchadourian 在最后重新测试有助于检查fstab文件的语法(防止任何拼写错误),否则Linux可能无法正确启动,导致重大的启动问题,特别是在远程服务器上。 - kenorb
1啊,我明白了。你需要在重新启动之前这样做。我被“开机启动”这个词搞糊涂了。 - khatchad
2这对于远程VPS来说非常好,因为磁盘实际上是一个虚拟设备,你无法控制分区。谢谢! - ColinM
使用fallocate,而不是dd - eri

有一种使用gparted的图形方式来完成这个操作(如果你想要分配为swap的空间来自一个未挂载/未使用的分区)。

运行Gparted:

sudo gparted

如果您尚未安装,请使用以下方式进行安装。
sudo apt-get install gparted

一旦gparted运行起来:
  1. 通过右键点击任何未分配的块并点击“新建”来分配分区
  2. 将分区格式化为“linux-swap”
  3. 右键点击分区并点击“swapon”
完成后,您的分区名称旁边应该有一个钥匙图标。

6要使其永久生效,您仍需按照@user4124的回答编辑fstab文件。 - Madura Pradeep
3问题已经说了他们会这样做。 - Chai T. Rex
2这根本没有回答问题。 - mook765
@mook765,问题是“我如何在系统安装后添加交换空间?” 这个回答非常完美地解答了这个问题。 - salsbury
@MaduraPradeep 不确定为什么,在按照这些指南在Ubuntu 16.04上操作后,我没有必要编辑fstab。 - salsbury
这对于未分配的块非常有效,但大多数情况下都是尝试从根安装分区添加交换分区。这是真实的情况,并且这个问题不适用,因为您无法编辑正在使用的分区。此外,如果您从Live USB启动并更改分区,然后尝试重新进入系统,可能会遇到麻烦,因为您已更改了分区顺序。 - Joshua Robison
@JoshuaRobison 我觉得你不应该假设最坏的情况。也许对答案进行修改就足够了。 - Danfoa

linux.com只需创建交换文件,因为这样更灵活,您可以动态调整交换存储的数量和大小。 这还允许您将交换分区移出系统磁盘,从而使系统更快。此外,如果您使用多个交换空间,请将它们的使用优先级调整为相同的值,这样就可以使用轮询方式在其中写入,从而使速度提升更多。
附注:我会使用UUID而不是设备名称,因为如果您不小心将USB存储器留在USB插槽中并简单地拔下并重新插入SATA电缆,很容易改变设备顺序 - 您不需要太担心哪个驱动器连接在哪里。

这是最有帮助的回答,因为它不需要重新分区硬盘。太遗憾了,当你在新机器上安装Ubuntu时,默认情况下它不会创建交换空间! - Ernie

你必须在/etc/fstab中定义一个交换文件系统。它应该包含类似的一行内容。
UUID=67682d1b-a1d8-4377-a3dd-67340c141619 none            swap    sw              0       0

当然,你需要用你设备的标识符替换UUID的值。


怎样才能得到它? - user13593
3你可以使用设备名称,比如/dev/sda1(不需要UUID)。 - Adam Byrtek

(将sdax中的"x"替换为交换分区号,例如:sda5)

将"xxx"替换为UUID号码,例如:67682d1b-a1d8-4377-a3dd-67340c141619)


su(提供密码以获取root权限)
blkid /dev/sdax(获取UUID) mkswap /dev/sdax(格式化交换分区) swapon -U xxx
nano /etc/fstab(编辑fstab) UUID=xxx none swap sw 0 0 (输入并保存此文本以使交换永久化) (然后关闭fsantab)
nano /etc/initramfs-tools/conf.d/resume(创建“resume”文件并保存此文本以使用休眠/恢复) RESUME=UUID=xxx(按Ctrl+X关闭nano)->(按Y保存)
重新启动机器
登录后,您现在可以测试休眠/恢复功能了

这是一个关于如何在Ubuntu上创建Ram Drive的全面教程。 不幸的是...截图无法通过剪切和粘贴显示出来... 稍后我会添加它们,但它们并不是必需的。

首先,您需要为您的ram驱动器创建空间。 我有一个双启动系统,只有32GB的硬盘。我的Ubuntu实际上安装在SD卡上(是的,真正的安装而不是Live Casper)。我的交换区也在SD卡上,可能很快就会磨损。我查找了如何更改交换区,并找到了这篇文章,但不喜欢其中的答案,所以在进行更改时制作了一个教程。

如果您只想增加或减少交换分区的大小,您只需要通过您喜欢的分区管理器增加或减少分区即可。Ubuntu已经知道去哪里,并且与大小无关。 如果您想更改位置或创建新的交换区,请继续阅读。 首先,您需要缩小硬盘以提供交换区的空间。如果您要缩小带有Windows系统的磁盘,则最好使用Windows来缩小磁盘(它了解自己的东西)。如果您使用纯Ubuntu,则尝试使用Live Ubuntu USB 来调整大小。

Windows调整大小说明:

备份您的系统,并对驱动器进行碎片整理。 右键单击开始栏。 选择磁盘管理。 右键单击正确的驱动器。 选择收缩。 输入正确的数量。 如果您使用Ubuntu,请确保使用Ubuntu工具。 为了完成分配,我将使用一个可启动的Ubuntu Live USB,其中包含GParted。对于任何原因,使用Live USB是使用Gparted的最佳方式,您应该有一个来自您的第一次安装或制作一个方便携带的USB。 由于没有足够的空间,不允许输入2000,尽管我已经“碎片整理”了驱动器(我不相信Windows真的进行了碎片整理)。通过一些试验,我被允许输入1000。然后我再次尝试了1000,它起作用了。这让我剩下了1.95GB,对于我的小学数学来说已经足够接近了。
格式化分区。
现在我已经准备好使用gparted将该空间格式化为适当的交换驱动器。 如果你正在Windows和Ubuntu之间切换,一定要在点击“电源”和“关机”时按住Shift键。这非常重要,特别是当你在另一个操作系统中处理“C”驱动器的细节时。如果你是双启动,你应该已经知道在正常情况下Windows会进行伪关机。有些人已经禁用了“快速启动”。我在我的系统(Windows 10)上没有这个选择,必须使用Shift键,感谢我的朋友Google。如果你使用Live USB启动,并且无法挂载“C”驱动器(通过点击它),那么你没有完全正确地关机。重新加载Windows并再次使用Shift键关机。
现在你已经进入Ubuntu Live模式,请阅读以下内容:

如果你是纯粹的Ubuntu用户,并且没有在Windows中缩小分区。你将使用gParted中的调整大小选项。如果你已经缩小了驱动器,请不要执行调整大小步骤。你可以在Dash栏中输入GParted并很快找到该应用程序。右键单击要调整大小的驱动器。

现在我们将把未分配的空间格式化为分区驱动器:

之前:

我不知道该怎么办,所以我查看了我的SD卡上的以前的Ram驱动器。它被格式化为Linux Swap。所以我也将我最近缩小的新分配格式化为Linux Swap。
我对主分区和警告通知都说了好,结果成功了!

正在格式化分区

格式化和新分区之后

巧合的是,旧的交换分区在sd卡上被称为mmblk1p5,而新的交换分区也是p5,前面有mmblk0。你的可能是p6或p7,不用担心。

mmblk0 是物理磁盘,p 是该物理磁盘上的分区。而 mmblk01 是另一个物理磁盘,等等。(这是我的SD卡) 在继续工作之前,我再次打开Windows确保Windows仍然能够启动。如果你懒得或者使用纯Ubuntu机器,你不需要执行这一步骤。如果它破坏了Windows,我可能会清除Windows并在该磁盘上进行全新安装Ubuntu(包括交换分区)。如果我破坏了系统,我就不需要再执行任何步骤,因为我可以在新安装中分配交换分区。一切顺利,Windows成功启动。现在你可以在Windows磁盘管理器中看到新的分区:(右键单击开始菜单以获取磁盘管理)

现在将交换分区附加到引导程序中

之前对这个问题的回答实际上包含了不必要且复杂的swapon/off命令。我们只需要找到正确的文件,并将交换分区指向新的分区。 同样,如果你只调整了分区大小,你不需要做任何操作。它已经设置好了以找到该分区。大小会自动完成。

如果你更改了分区或者正在创建第一个交换分区,请阅读以下内容:

让我告诉你,这是我第一次做这个。我不是一个UNIX极客,更喜欢使用图形界面工具。我正在学习,并且在进行本教程时保持乐观。到目前为止一切都很顺利。
在你的系统根目录下有一个名为etc的文件夹。在该文件夹中有一个名为fstab的文件(无扩展名)。你需要用超级用户"su"权限编辑这个文件。在此之前,我们需要获得使用Live USB创建的新Swap分区的UUID。 输入sudo su 现在你已经进入了超级用户模式。你可以做任何事情(包括抹掉自己的存在)。
输入blkid并查找新Swap分区的UUID。我在下面看到了我的,并加以标记:
不要关注PartUID。
现在,其他人会说输入:
sudo gedit /etc/fstab

然而,我尝试了那个方法,但没有找到正确的文件(请留言)。所以我只是输入gedit并以简单的图形界面方式打开它(成功!)。由于我已经处于超级用户模式(sudo su),我在Gedit中拥有根权限,可以在更改后保存文件。太棒了!在更改或损坏任何内容之前,请将fstab另存为名为... fstab.bak的备份。
通过使用简单的图形界面方式创建备份,并选择熟悉的“另存为”,并将"bak"添加到文件fstab.bak中。检查是否存在带有.bak扩展名的文件。极客们会告诉你使用终端的cp命令,但我们这些新手在第一次使用时可能无法找到文件。就像任何文字处理软件一样,在执行“另存为”命令后,当前文件现在是fstab.bak。打开之前的真实文件,然后关闭备份文件。 仔细检查以确保您正在编辑没有扩展名的真实fstab文件。如果您编辑备份文件,重新启动时将不会发生任何事情,而且您的备份副本也不会是原始文件的真正备份。
我的原始的 fstab 文件看起来是这样的:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/mmcblk1p6 during installation
UUID=a611601a-6ea8-4e34-9859-42a2470cac29 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/mmcblk0p1 during installation
UUID=00F2-C0CE  /boot/efi       vfat    umask=0077      0       1
# swap was on /dev/mmcblk1p5 during installation
UUID=8fb20159-62e4-41a3-8550-791c7a66c328 none            swap    sw              0       0

最后一行(我给你标红了),包含了在启动时可能使用的原始交换信息。从之前的blkid命令中,我可以看到我的新驱动器UUID。通过在终端中突出显示文本并右键点击选择复制,将该短语粘贴到另一个没有su权限的编辑器中作为草稿本(您可以使用Libre Office,极客们可以使用nano)。这一步可以帮助您轻松获得正确的文本,而无需引号,以便您可以轻松地粘贴到fstab文件中。您希望尽可能少更改此文件。
New UUID
UUID="709ea197-e6fb-428b-9c1f-4b258452b10c"

所以,我的新UUID在上面以红色列出。我只需要更改交换分区的uuid即可。如果您没有交换分区,请复制上述fstab文件中的我的行,然后添加先前blkid命令的正确uuid。(请选择正确的uuid!)
如果这是您的第一行交换分区,请确保包括完整的带有额外内容的行。
none            swap    sw              0       0

不要太担心准确的间距问题。
我的新文件看起来是这样的:注意,我还在我的更改上面添加了一条注释 #字符表示它是一条注释。
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/mmcblk1p6 during installation
UUID=a611601a-6ea8-4e34-9859-42a2470cac29 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/mmcblk0p1 during installation
UUID=00F2-C0CE  /boot/efi       vfat    umask=0077      0       1
# swap was on /dev/mmcblk1p5 during installation  NOW changed to mmcblk0p5
UUID= 709ea197-e6fb-428b-9c1f-4b258452b10c  none            swap    sw              0       0

不要复制引号。在=符号后面不要有空格。

保存你的文件。

再次打开它,只是为了确保你的更改已保存。 关闭gedit和终端,使用危险的su权限,这样极客们会责骂你(因为这很容易工作...也很容易破坏东西)。

重新启动并祈祷好运!

我重新启动了,然后通过查看系统性能应用程序来检查我的交换是否正常工作。 我仍然有一个交换驱动器!但是它是新的还是旧的呢?我无法验证我的新驱动器是否真的加载了,因为新的驱动器和旧驱动器的大小相同。因此,我输入了:swapon(只输入SWAPON,它将只为您列出交换:安全)。现在我在mmblk0p5上看到了我的新驱动器,这与我在fstab上做的UUID工作相匹配。我的32GB主驱动器生效了:


这是一个来自一个从未做过这个的新手用户的教程。我制作这个教程的一半原因是为了让帮助我们的极客们(谢谢你们)能够看到如何帮助新手用户。我怀疑之前的答案是误导性的,所以决定在完成工作时制作一个教程...通过猜测其他有用的答案,我得出结论,我只需要编辑fstab文件并重新启动即可。一切都很顺利,我仍然拥有Windows 10,并且尚未清除我的系统。如果有人知道如何将Windows的pagefile.sys共享为Linux的交换文件,我会很感兴趣,因为在我的32GB机器上硬盘空间非常昂贵,其中2GB被用于Windows的交换文件。

如果您安装了新的空白磁盘,那么需要在其上创建交换分区。
显示分区: $ sudo fdisk -l 磁盘 /dev/sdb: 4.1 GiB, 4420796416 字节, 8634368 扇区 单位:扇区,大小:1 * 512 = 512 字节 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节
创建交换分区: $ sudo fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.31.1)。 更改将仅在内存中保留,直到您决定写入它们。 在使用写入命令之前,请小心。
设备不包含已识别的分区表。 创建了一个新的带有磁盘标识符 0xbf65f113 的 DOS 磁盘标签。
命令(m 获取帮助):m 帮助:
DOS (MBR) a 切换可引导标志 b 编辑嵌套的 BSD 磁盘标签 c 切换 DOS 兼容性标志
通用 d 删除分区 F 列出空闲未分区空间 l 列出已知的分区类型 n 添加新分区 p 打印分区表 t 更改分区类型 v 验证分区表 i 打印有关分区的信息
杂项 m 打印此菜单 u 更改显示/输入单位 x 额外功能(仅限专家)
脚本 I 从 sfdisk 脚本文件加载磁盘布局 O 将磁盘布局转储到 sfdisk 脚本文件
保存并退出 w 将表写入磁盘并退出 q 不保存更改而退出
创建新标签 g 创建一个新的空 GPT 分区表 G 创建一个新的空 SGI (IRIX) 分区表 o 创建一个新的空 DOS 分区表 s 创建一个新的空 Sun 分区表
命令(m 获取帮助):n 分区类型 p 主分区(0 个主分区,0 个扩展分区,4 个空闲) e 扩展分区(逻辑分区的容器) 选择(默认 p):p 分区号(1-4,默认为 1): 起始扇区(2048-8634367,默认为 2048): 最后扇区,+ 扇区或 + 大小{K、M、G、T、P}(2048-8634367,默认为 8634367):
创建了一个新的类型为“Linux”,大小为 4.1 GiB 的分区。
命令(m 获取帮助):t 选择的分区为 1 十六进制代码(输入 L 列出所有代码):L
0 空 24 NEC DOS 81 Minix / 旧 Linux bf Solaris 1 FAT12 27 隐藏的 NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX 根 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX 用户 3c PartitionMagic 84 OS/2 隐藏或 c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux 扩展 c7 Syrinx 5 扩展 41 PPC PReP 引导 86 NTFS 卷集 da 非文件系统数据 6 FAT16 42 SFS 87 NTFS
在下面添加一行并保存文件。
UUID=e2c53e87-c32c-4230-8405-25b471af6524 none  swap    0

检查交换空间 sudo free -m 总计 已使用 空闲 共享 缓存/缓冲区 可用 内存: 1993 203 1271 6 518 1635 交换空间: 4214 0 4214 完成。