如何增加交换文件的大小而不在终端中删除它?

Dav*_*ave 120 command-line storage swap files

有没有办法增加我现有的“交换文件”而不必销毁和重新创建它?我想将我的交换空间从 1GB 增加到 2GB。目前它是这样设置的:

$ sudo swapon -s
Filename                Type        Size    Used    Priority
/swapfile               file        1048572 736640  -1
$ ls -lh /swapfile
-rw------- 1 root root 1.0G Nov  9  2016 /swapfile
Run Code Online (Sandbox Code Playgroud)

我正在使用 Ubuntu 14.04。

Rav*_*ina 154

首先禁用交换文件:

sudo swapoff /swapfile
Run Code Online (Sandbox Code Playgroud)

现在让我们增加交换文件的大小:

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc
Run Code Online (Sandbox Code Playgroud)

上面的命令将在交换文件的末尾附加 1GiB 的零字节。

将文件设置为“交换文件”:

sudo mkswap /swapfile
Run Code Online (Sandbox Code Playgroud)

启用交换:

sudo swapon /swapfile
Run Code Online (Sandbox Code Playgroud)

  • @heynnema 不会`fallocate` 制作稀疏文件吗?`swapon` 联机帮助页说稀疏交换文件是有问题的(特别提到 `fallocate`)。 (15认同)
  • `sudo fallocate -l 2G /swapfile` 可能比 dd 更安全(虽然它不保留原始交换文件),并且它还需要一个 `sudo chmod 600 /swapfile`。 (8认同)
  • @heynnema 不,`mkswap` 联机帮助页还说这些文件不应包含任何漏洞。 (3认同)
  • @muru **猜我错了:-)** 每次我读到如何在 17.04 开始创建 /swapfile 时,他们都使用了fallocate。我想我们只能使用“磁盘销毁器”了! (3认同)

mur*_*uru 82

您应该添加一个新的交换文件,而不是调整现有文件的大小,因为这样做不会产生任何费用。要调整交换文件的大小,您必须首先禁用它,这会将交换内容驱逐到 RAM,这会增加 RAM 的压力,甚至可能会召唤 OOM 杀手(更不用说您可能会在几分钟内颠簸磁盘)。多个交换文件不是问题,设置另一个交换文件非常容易。与添加另一个交换文件相比,调整交换文件的大小实际上没有任何好处。

dd if=/dev/zero of=/some/file count=1K bs=1M
mkswap /some/file
sudo chown root:root /some/file
sudo chmod 600 /some/file
sudo swapon /some/file
Run Code Online (Sandbox Code Playgroud)

  • +1 如果您稍后决定需要返回磁盘空间,这种方法还可以轻松断开其中一个交换文件的连接。 (4认同)
  • 并且 `count=1K` 给出了一个 1G 的文件吗?计数是块大小,是吗?那可以是 512/4096?还是我的数学错了? (3认同)
  • 这确实需要标记为正确答案。哇,好厉害! (3认同)
  • «因为这样做不会花费你什么» 除了冬眠。«挂起映像不能跨越多个交换分区和/或交换文件。它必须完全适合一个交换分区或一个交换文件。[» https://wiki.archlinux.org/index.php/Power_management/Sus​​pend_and_hibernate (3认同)
  • 实际来源:«问:swsusp(到磁盘)是只使用一个交换分区还是可以使用多个交换分区(将它们聚合到一个逻辑空间中)?A:只有一个交换分区,抱歉。» https://www.kernel.org/doc/Documentation/power/swsusp.txt (2认同)

bor*_*kon 23

您可以像我一样创建另一个交换文件:

  1. sudo fallocate -l 4G /swapfile
  2. sudo chmod 600 /swapfile
  3. sudo mkswap /swapfile
  4. sudo swapon /swapfile
  5. 验证它正在使用sudo swapon --show
    要使其永久添加到fstab文件中,请键入:
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

  • 从内核 5.7 开始,用 Fallocate 创建的交换文件并不总是有效,而 dd 是推荐的解决方案。例如:“sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress”。请参阅 https://man.archlinux.org/man/swapon.8#Files_with_holes (3认同)
  • 请注意,应该使用 `fallocate` 来创建文件,因为它会创建一个稀疏文件。见`人mkswap` (2认同)

Gab*_*les 13

(此答案自投反对票后完全重写)

选项 1(我的偏好):删除旧的交换文件并创建一个正确大小的新文件:

与其调整交换文件的大小,不如删除它并创建一个合适大小的新文件!

swapon --show  # see what swap files you have active
sudo swapoff /swapfile  # disable /swapfile
# Create a new 16 GiB swap file in its place (could lock up your computer 
# for a few minutes if using a spinning Hard Disk Drive [HDD], so be patient)
sudo dd if=/dev/zero of=/swapfile count=16 bs=1G
sudo mkswap /swapfile  # turn this new file into swap space
sudo chmod 0600 /swapfile  # only let root read from/write to it, for security
sudo swapon /swapfile  # enable it
swapon --show  # ensure it is now active
Run Code Online (Sandbox Code Playgroud)

如果您是第一次添加此交换文件,请确保它在您的/etc/fstab文件中,以便在每次重新启动后使交换文件再次可用。只需运行这两个命令:

# Make a backup copy of your /etc/fstab file just in case you
# make any mistakes
sudo cp /etc/fstab /etc/fstab.bak
# Add this swapfile entry to the end of the file to re-enable
# the swap file after each boot
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Run Code Online (Sandbox Code Playgroud)

来源:请参阅此处“第 4 步:使更改永久化”部分

选项 2:调整旧交换文件的大小:

通过@Ravexina接受的答案是正确的。然而,最初我并没有理解它的所有部分,所以我想包含更多的描述并解释更多的细节。见dd --helpman dd。我在这方面的一些学习也来自Bogdan Cornianu 的博客文章。我还在最后添加了一些命令,以展示如何在创建交换空间后验证它。

如何调整交换文件的大小:

在这里,我们将通过在其末尾写入 8 GiB ( Gibibytes ) 的零来增加现有交换文件的大小。

  1. 关闭仅使用这个交换文件(位于“ /swapfile ”):

     # Do this
     sudo swapoff /swapfile
    
     # NOT this, which unnecessarily disables all swap files or partitions
     # sudo swapoff --all
     # or
     # sudo swapoff -a
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过将所有零字节附加到它的末尾(而不是重写整个文件,这会更慢),将交换文件的大小增加 8 GiB:

     sudo dd if=/dev/zero of=/swapfile bs=1G count=8 oflag=append conv=notrunc
    
    Run Code Online (Sandbox Code Playgroud)
    • if = 输入文件

    • /dev/zero = 一个特殊的 Linux“文件”,每次读取它时只输出所有零字节

    • of = 输出文件

    • bs = 块大小

      • 在这里,1G代表 1 Gibibyte,或 GiB,它是“Gigabyte 的 base-2 版本,它是 base-10。根据man dd, G =1024*1024*1024bytes。这是我喜欢的文件大小,因为计算机和硬件内存都是 base-2。
      • 如果您想使用 1 GB 或 GB,这是“Gibibyte”的 base-10 版本,即 base-2,那么您必须改为使用1GB而不是1G. man dd显示GB =1000*1000*1000字节。
    • count= 块的乘数;写入的总内存将为count * bs.

    • oflag=append意味着附加到输出文件的末尾,而不是重写整个内容。见dd --helpman dd。来自dd --help

      append    append mode (makes sense only for output; conv=notrunc suggested)
      
      Run Code Online (Sandbox Code Playgroud)
    • conv=notrunc表示在“转换”文件时,“不截断输出文件”;dd --help,正如您在上面看到的,表明无论何时都推荐这样做oflag=append

    • 注意:如果你想重写整个交换文件而不是仅仅附加到它,你可以像这样创建一个 32 GiB 交换文件,例如:

        sudo dd if=/dev/zero of=/swapfile bs=1G count=32
      
      Run Code Online (Sandbox Code Playgroud)
  3. 使文件可用作交换

     sudo mkswap /swapfile
    
    Run Code Online (Sandbox Code Playgroud)
  4. 打开交换文件

     sudo swapon /swapfile
    
    Run Code Online (Sandbox Code Playgroud)
  5. (奖励/可选):确保您刚刚创建的这个交换文件现在正在使用中:

     swapon --show
    
    Run Code Online (Sandbox Code Playgroud)

    示例输出:

    $ swapon --show
    NAME      TYPE SIZE USED PRIO
    /swapfile file  64G 1.8G   -2
    
    Run Code Online (Sandbox Code Playgroud)

    您还可以使用这两个命令查看一些内存/交换信息:

     # 1. Examine the /proc/meminfo file for entries named "swap", such 
     # as the "SwapTotal" line
     cat /proc/meminfo | grep -B 1000 -A 1000 -i swap
    
     # 2. Look at total memory (RAM) and swap (virtual memory) used
     # and free:
     free -h
    
    Run Code Online (Sandbox Code Playgroud)

参考:

  1. @Ravexina 的回答
  2. Bogdan Cornianu 的博客文章在这里:https ://bogdancornianu.com/change-swap-size-in-ubuntu/
  3. “如何在 Linux 上创建和使用交换文件”:https : //itsfoss.com/create-swap-file-linux/

  • 对于反对者,我只是大量重写了这个答案,以对其进行阐述并将新信息添加到现有答案中已经提供的知识库中。我认为它现在增加了价值。 (2认同)
  • 可靠的答案,清晰且有据可查。 (2认同)

小智 6

根据博客文章中 Arian Acosta 的建议,我在 Ubuntu 17.04 上取得了不错的结果。你可以用sudo fallocate -l 4G /swapfile你想要的任何数量的千兆字节来代替这里的 4G 。sudo fallocate -l 2G /swapfile以 TS为例。

一般而言,建议交换文件的大小是 RAM 量的 2 倍,但您可以根据需要调整大小。请记住,这不能替代内存,因为由于内容存储在磁盘中,因此性能要差得多。

我创建了一个简单的 bash 脚本,将交换文件增加到 4GB,并在 Ubuntu 16.04 上对其进行了测试。

这可以逐行或 bash 脚本运行,但我用它来进行无头安装。

#!/bin/bash
echo "====== Current Swap ======"
sudo swapon -s
echo "====== Turning Off Swap ======"
sudo swapoff /swapfile
echo "====== Allocating 4GB Swap ======"
sudo fallocate -l 4G /swapfile
echo "====== Making Swap ======"
sudo mkswap /swapfile
echo "====== Setting Permissions to Root Only  ======"
sudo chmod 600 /swapfile
echo "====== Turning On Swap ======"
sudo swapon /swapfile
echo "====== Current Swap ======"
sudo swapon -s
echo "====== Done! ======"
Run Code Online (Sandbox Code Playgroud)

  • 您应该在脚本中添加了一个参数,即要添加的 SWAP 数量,最后将其添加到 fstab。但是,我还是喜欢这个 (3认同)