AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 927854
Accepted
Dave
Dave
Asked: 2017-06-22 12:55:33 +0800 CST2017-06-22 12:55:33 +0800 CST 2017-06-22 12:55:33 +0800 CST

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

  • 772

有没有办法增加我现有的“交换文件”而不必破坏和重新创建它?我想将交换空间从 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

我正在使用 Ubuntu 14.04。

command-line
  • 6 6 个回答
  • 130724 Views

6 个回答

  • Voted
  1. Best Answer
    Ravexina
    2017-06-22T13:57:34+08:002017-06-22T13:57:34+08:00

    首先禁用交换文件:

    sudo swapoff /swapfile
    

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

    sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 oflag=append conv=notrunc
    

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

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

    sudo mkswap /swapfile
    

    启用交换:

    sudo swapon /swapfile
    

    在生产系统上,如果您的操作系统不允许您禁用交换文件,sudo swapoff /swapfile并且您会收到类似于以下内容的消息:

    swapoff failed: Cannot allocate memory
    

    然后您可能会考虑拥有多个交换文件或创建一个新的较大的文件,对其进行初始化,然后删除旧的较小的文件。

    • 193
  2. muru
    2017-06-22T17:41:45+08:002017-06-22T17:41:45+08:00

    您应该添加一个新的交换文件,而不是调整现有交换文件的大小,因为这样做不需要任何费用。要调整交换文件的大小,您必须首先禁用它,这会将交换内容驱逐到 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
    

    此命令创建一个大小为 1 GB 的文件。count是文件的大小,以块大小为单位,由bs标志设置,以字节为单位。此处,bs设置为1M(= 2^20 字节,1 兆字节 (MiB)),当乘以1K(= 1024) 时为 1 GiB(1 千兆字节)。

    • 98
  3. borekon
    2018-05-23T13:20:42+08:002018-05-23T13:20:42+08:00

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

    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
    • 28
  4. Gabriel Staples
    2019-10-01T01:01:33+08:002019-10-01T01:01:33+08:00

    (这个答案自downvote以来完全重写)

    关于fallocatevs的注释dd

    在我们继续之前,我想指出一些答案fallocate用于为文件分配空间,而不是dd. 不要那样做。使用dd. @muru在这里和这里指出了一些重要的点。虽然fallocate速度要快得多,但它可能会创建带有孔的文件。我认为这仅仅意味着空间不连续,这对交换文件不利。我把它fallocate想象成创建一个 C 风格的内存链表的意思,而dd创建一个 C 数组连续的内存块。交换文件需要一个连续的块。通过将二进制零从伪文件dd逐字节复制到它生成的新文件中来做到这一点。/dev/zero

    man swapon还声明不要使用fallocate,dd而是使用。这是引用(强调添加):

    笔记

    您不应该swapon在有孔的文件上使用。这可以在系统日志中看到

    swapon: swapfile has holes.
    

    内核中的交换文件实现期望能够直接写入文件,而无需文件系统的帮助。 这是在文件系统(如or fallocate(1))上的预分配文件(例如 )和写时复制文件系统(如XFSext4btrfs.

    建议使用dd(1)并/dev/zero避免 XFS 和 ext4 上的漏洞。

    并且来自man mkswap(强调添加):

    请注意,交换文件不得包含任何漏洞。使用cp(1)创建文件是不可接受的。fallocate(1) 在支持预分配文件的文件系统(例如XFS或 ext4)或写时复制文件系统(例如btrfs )上也不会使用 。 建议 在这些情况下使用dd(1)和。在将交换文件添加到写时复制文件系统之前,/dev/zero请阅读注意事项。swapon(8)

    因此,使用dd,而不是 fallocate,来创建交换文件。

    选项 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
    

    如果您是第一次添加此交换文件,请确保它在您的/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
    

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

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

    @Ravexina接受的答案是正确的。但是,最初我并不了解它的所有部分,所以我想包含更多描述并解释更多细节。见dd --help和man 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
      
    2. 通过将所有零字节附加到交换文件的末尾(而不是重写整个文件,这会更慢),将交换文件的大小增加 8 GiB:

       sudo dd if=/dev/zero of=/swapfile bs=1G count=8 oflag=append conv=notrunc
      
      • if= 输入文件

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

      • of= 输出文件

      • bs= 块大小

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

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

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

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

          sudo dd if=/dev/zero of=/swapfile bs=1G count=32
        
    3. 使文件可用作交换

       sudo mkswap /swapfile
      
    4. 打开交换文件

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

       swapon --show
      

      样本输出:

      $ swapon --show
      NAME      TYPE SIZE USED PRIO
      /swapfile file  64G 1.8G   -2
      

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

       # 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
      

    参考:

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

    也可以看看:

    1. 我的答案是我使用上述有关增加交换文件大小的信息来解决内存不足的 Bazel 构建错误:Stack Overflow: java.lang.OutOfMemoryError when running bazel build
    • 24
  5. Denis Trofimov
    2018-06-26T01:15:26+08:002018-06-26T01:15:26+08:00

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

    一般来说,交换文件的推荐大小是 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! ======"
    
    • 6
  6. user9869932
    2020-03-30T09:06:27+08:002020-03-30T09:06:27+08:00

    您可能还想检查权限。执行此操作的其他方法:

    # check your swap
    free
    
    # turn off swap
    sudo swapoff /swapfile
    
    # To create the SWAP file, you will need to use this.
    sudo fallocate -l 4G /swapfile  # same as "sudo dd if=/dev/zero of=/swapfile bs=1G count=4"
    
    # Secure swap.
    sudo chown root:root /swapfile
    sudo chmod 0600 /swapfile
    
    # Prepare the swap file by creating a Linux swap area.
    sudo mkswap /swapfile
    
    # Activate the swap file.
    sudo swapon /swapfile
    
    # Confirm that the swap partition exists.
    sudo swapon -s
    
    # check your swap again
    free
    
    • 1

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve