如何安全地永久关闭交换并回收空间?(在Debian Jessie上)


48

我在我的SSD驱动器上安装了具有默认分区的Debian Jessie。我当前的磁盘分区如下所示:

我当前的磁盘分区如下所示

因为我有16GB的RAM,所以我认为我不需要swap。但是,由于我还有其他磁盘驱动器,因此我可以例如在其他驱动器之一上创建交换文件

您能告诉我应该采取什么步骤正确而永久地删除交换分区,以免它占用磁盘空间吗?我希望删除交换分区,因为我目前只有128GB SSD。

这是我每次尝试并重新启动的内容;这些步骤中的每一个都不是永久性的,或者没有做任何事情

  1. 使用swapoff实用程序:

    swapoff --all
    
  2. 使用GParted实用程序:

    右键单击交换分区,然后单击交换。

  3. 在以下文件中注释掉交换分区的UUID

    /etc/fstab
    
  4. 在以下文件中注释掉交换分区的UUID

    /etc/initramfs-tools/conf.d/resume
    
  5. 最后运行这些命令(以相反的顺序):

    update-grub
    
    update-initramfs -u
    

1
Swapoff仅禁用当前正在运行的系统的交换,要使其永久存在,应将其与从中删除相关条目结合使用/etc/fstab。完成此操作后,应该禁用交换功能,并且在下次启动时不要再次使用它。现在,如果要回收未使用的空间,则应该修改分区表并扩展主文件系统。请参阅我的答案以获取详细说明。
安德烈·伯瑞(AndréBorie)2015年

@ burian.vlastimil您可以发布整个帖子/etc/fstab吗?
安德烈·伯瑞(AndréBorie)2015年

@ burian.vlastimil请在您的问题中对其进行编辑,因为注释不会保留换行符。重新启动后fstab中的更改是否仍然存在,或者交换行是否未注释?
安德烈·博里

1
如果我可能会问这个问题,那么swap的目的是删除未使用的页面并防止系统内存不足。因此,正如SnakeDoc所建议的那样,具有512MB的交换总是好的。就个人而言,我的SSD没有交换分区,但在/目录中有交换文件。如果您选择这样做,请使用本教程来创建文件。至于交换分区,您可以启动实时USB并使用gparted删除该分区。不过,请确保更新grub。
2015年

4
@SnakeDoc-您通常不会出现内核恐慌,OOM处理程序将启动并杀死进程以释放内存(并且通常在确定要杀死的对象方面做得很好,通常会优先考虑以杀死更大和更新的进程)。我维护了大量没有交换的服务器,这些服务器在OOM上设置为紧急状态,而不是终止进程,因为服务器被配置为通常不会出现内存不足的情况,如果这样做,我希望它们紧急并重新启动而不是交换并放慢速度(或让OOM处理程序确定要终止的进程)
Johnny

Answers:


46

以root身份执行:

# swapoff -a

为了使更改永久生效,请编辑/etc/fstab并删除或注释掉交换条目。


@ burian.vlastimil,锁定是什么意思?您可以通过查看顶部的第一行来确认没有交换设备正在使用-它应该报告“ KiB Swap:total 0”。您还可以cat /proc/swaps-仅报告标题行。如果是这样,那么可以,您可以安全地删除交换分区-并扩大另一个分区-回收该空间-如果您想要的话。
maxschlepzig 2015年

@ burian.vlastimil,交换可能由您的initramfs启用,您可能必须删除resume内核选项(引用交换的UUID),即更新grub并重新生成initramfs(基本上执行与中的某些步骤相反的操作)SwapFaq)。
maxschlepzig 2015年

@ burian.vlastimil,您还可以/boot为该uuid grep配置grub的配置(在之下),并且可以解压缩initramsfs并对其内容进行grep以获得根本原因。确保执行不区分大小写的grep。
maxschlepzig

2
放进swapoff -a/etc/rc.local。其交换,因为当你开机几毫秒没有问题。配备16GB RAM的设备不会长时间写入任何内容。只需将交换空间留在那里(磁盘空间很便宜)并且不要更改 /etc/fstab
Skaperen 2015年

制作一个临时交换文件,然后您可以通过在关闭交换后删除文件来恢复空间
Skaperen 2015年

40
  1. 如果您打开了GParted,请关闭它。它的交换功能似乎不是永久的。

  2. 打开终端并成为rootsu); 如果已sudo启用,则还可以例如执行sudo -i; 查看man sudo所有选项):

    sudo -i
    
  3. 关闭特定的交换分区和/或所有交换

    swapoff --all
    
  4. 确保100%确保特定的交换分区分区已关闭:

    cat /proc/swaps
    
  5. 打开您熟悉此文件的文本编辑器,例如,nano如果不确定:

    nano /etc/fstab
    
  6. 注释掉/删除交换分区的UUID,例如:

    # UUID=1d3c29bb-d730-4ad0-a659-45b25f60c37d    none    swap    sw    0    0
    
  7. 打开您熟悉此文件的文本编辑器,例如,nano如果不确定:

    nano /etc/initramfs-tools/conf.d/resume
    
  8. 注释掉/删除先前标识的交换分区的UUID,例如:

    # RESUME=UUID=1d3c29bb-d730-4ad0-a659-45b25f60c37d
    
  9. 不要关闭终端,因为以后无论如何都会需要它。

注意:根据您是依靠CLI还是GUI,后续步骤会有所不同。


界面

  1. 从菜单中打开GParted,或者从我们打开的终端中更方便地打开:

    gparted
    
  2. 如果您没有安装它,则可以这样做;然后再次运行上一个命令:

    apt-get install gparted
    
  3. 从右上角的菜单中选择您的驱动器。

  4. 随着GParted在启动时重新激活交换分区,您将必须右键单击特定的交换分区,然后单击Swapoff->这将立即应用。

  5. 右键单击->删除以删除交换分区。您必须立即应用更改。

  6. 右键单击->调整大小/移动,调整主/其他分区的大小。您必须立即应用更改。

  7. 回到终端,让我们重新创建启动映像

    update-initramfs -u -k all
    
  8. 更新GRUB

    update-grub
    
  9. 如果您想测试机器是否启动,可以立即重启。


CLI

我将检查VM是否可以解决我的问题,然后将其共享。同时,请参见此答案


1
最完整,解释清楚。
benzkji

如果之后出现缓慢启动消息,请执行以下操作gave up waiting for suspend/resume device:在文件中/etc/initramfs-tools/conf.d/resume,不要只是禁用该行,而应将其替换为RESUME=none。(来源
tanius

17

注释/删除中的相关条目,/etc/fstab以防止在下次启动时重新启用该条目,然后重新启动或运行swapoff -a以禁用当前运行系统的交换分区的使用。

现在删除交换分区,将系统分区扩展到未使用的空间,然后扩展实际的文件系统。我不知道您的图形分区管理器是否可以完成所有这些操作,但是如果不能做到这一点,则可以使用fdiskand resize2fs

# fdisk /dev/sdX

# Display current partition table, copy/paste this output somewhere to be able to go back in case you screw up

Command (m for help): p
Device       Boot  Start    End Sectors Size Id Type
/dev/sda1        2048  22527   20480  10M ef EFI (FAT-12/16/32)
/dev/sda2       22528 186367  163840  80M 83 Linux
/dev/sda3      186368 204799   18432   9M 82 Linux swap / Solaris

# Delete the swap partition

Command (m for help): d
Partition number (1-3, default 3): 3
Partition 3 has been deleted.

# Delete the system partition

Command (m for help): d
Partition number (1,2, default 2): 2
Partition 2 has been deleted.

# Create a new system partition starting the same as the old one but ending a bit farther, at the end of the (now deleted) swap partition

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): 

Using default response p.
Partition number (2-4, default 2): 
# Enter the same start sector as the old part.
First sector (22528-204799, default 22528): 22528
# Enter the end sector of the old swap partition
Last sector, +sectors or +size{K,M,G,T,P} (22528-204799, default 204799): 204799

Created a new partition 2 of type 'Linux' and of size 89 MiB.

# Save the changes
Command (m for help): w
The partition table has been altered.

最后,我们扩展当前文件系统以利用新的可用空间(直到现在实际的文件系统还不知道我们已经为其基础分区添加了更多空间)。默认情况下,resize2fs除非给出固定大小,否则使用整个分区,因此除了分区块设备外,我们无需指定其他任何内容。可以在挂载分区的情况下在线完成文件系统的扩展(与收缩相对):

# resize2fs /dev/sda2

现在,您已经成功禁用了交换功能,并且无需重新启动即可收回未使用的空间。

请注意,Debian的过程有些不同,需要编辑更多文件。查看此答案以获取更多信息。


这对我不起作用。我有3个分区。一个用于/ boot,一个用于/以及交换。当我尝试创建新分区时,我只能创建16gb分区:/
Freedo

另外,至少对于基于Debian 9的发行版而言:必须partproberesize2fs命令之前运行,否则内核将不知道新的分区表,并且不会调整任何大小。
tanius

2

右键单击GParted中的交换分区,然后单击Swapoff。然后删除您的交换分区,将其从中删除/etc/fstab,然后重新生成initramfsgrub(可能是不必要的)。

如果交换分区不存在,则不应initramfs通过initramfs更新脚本将交换分区添加到。

根据这篇文章,以下是重新生成initramfs和的正确方法grub

update-initramfs -c -k <kernel>

update-grub

-2

您可以右键单击Gparted中的交换分区,然后选择swapoff选项。这是完成您所要求的相同任务的快速方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.