有没有办法增加我现有的“交换文件”,而不必销毁并重新创建它?我想将交换空间从 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。
答案1
首先禁用交换文件:
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
然后,您可以考虑使用多个交换文件或创建一个新的更大的文件,初始化它,然后删除旧的较小的文件。
答案2
您应该添加一个新的交换文件,而不是调整现有交换文件的大小因为这样做不需要花费你任何钱。要调整交换文件的大小,您必须先禁用它,这会将交换内容移至 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 GB)。
答案3
(自从反对以来,这个答案被完全重写)
fallocate
关于vs 的注释dd
在我们继续之前,我想指出一些答案使用fallocate
为文件分配空间,而不是dd
。不要这么做。使用dd
。 @muru指出了一些要点这里和这里。虽然fallocate
速度快得多,但它可能会创建有漏洞的文件。我认为这只是意味着空间不连续,这对交换文件不利。我将其想象为fallocate
创建一个 C 样式的内存链接列表,而dd
创建一个 C 数组连续的内存块。交换文件需要一个连续的块。dd
通过将伪文件中的二进制零逐字节复制/dev/zero
到它生成的新文件中来实现这一点。
man swapon
还指出不是使用fallocate
,并改用dd
。以下是引文(强调部分已添加):
笔记
您不应该
swapon
在有洞的文件上使用。这可以在系统日志中看到swapon: swapfile has holes.
内核中的交换文件实现希望能够直接写入文件,而无需文件系统的协助。 这是个问题在文件系统(如或
fallocate(1)
)上的预分配文件(例如 )以及写时复制文件系统(如XFS
ext4
btrfs
。建议使用XFS 和 ext4
dd(1)
并/dev/zero
避免出现漏洞。
以及man mkswap
(强调添加):
请注意,交换文件不能包含任何漏洞。使用
cp(1)
创建文件是不允许的。在支持预分配文件的文件系统上使用 也是不允许的fallocate(1)
,例如西弗斯或者 ext4或者在写时复制文件系统上文件系统。 在这些情况下,建议使用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)
# (Ex: on 15 May 2023, this took 3 min 3 sec on a 5400 RPM 750 GB
# model HGST HTS541075A9E680 SATA 2.6, 3.0Gb/s HDD in an old laptop of mine)
time 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 来增大现有交换文件的大小(吉比字节)到其末尾。
仅关闭这一个交换文件的使用(位于“/交换文件“):
# Do this sudo swapoff /swapfile # NOT this, which unnecessarily disables all swap files or partitions # sudo swapoff --all # or # sudo swapoff -a
通过将所有零字节附加到交换文件末尾来将交换文件的大小增加 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(十进制)”的 2 进制版本。根据man dd
,是G =1024*1024*1024
字节。我喜欢用这种方式来设置文件大小,因为计算机和硬件内存都是以 2 为基数的。 - 如果您想要使用 1 千兆字节或 GB(即“Gibibyte”(以 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
使文件可用作交换文件
sudo mkswap /swapfile
启用交换文件
sudo swapon /swapfile
(奖励/可选):确保您刚刚创建的交换文件现在正在使用:
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
参考:
- @Ravexina 的回答
- Bogdan Cornianu 的博客文章如下:https://bogdancornianu.com/change-swap-size-in-ubuntu/
- “如何在 Linux 上创建和使用交换文件”:https://itsfoss.com/create-swap-file-linux/
也可以看看:
- 我的回答是使用上述有关增加交换文件大小的信息来解决内存不足的 Bazel 构建错误:Stack Overflow:运行 bazel build 时出现 java.lang.OutOfMemoryError
答案4
我按照 Arian Acosta 的建议在 Ubuntu 17.04 上取得了良好的效果博客文章。你可以将这里的 4G 替换sudo fallocate -l 4G /swapfile
为你想要的任何数量的 GB。例如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! ======"