有没有办法增加我现有的“交换文件”而不必破坏和重新创建它?我想将交换空间从 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。
首先禁用交换文件:
现在让我们增加交换文件的大小:
上面的命令将在交换文件的末尾附加 1GiB 的零字节。
将文件设置为“交换文件”:
启用交换:
在生产系统上,如果您的操作系统不允许您禁用交换文件,
sudo swapoff /swapfile
并且您会收到类似于以下内容的消息:然后您可能会考虑拥有多个交换文件或创建一个新的较大的文件,对其进行初始化,然后删除旧的较小的文件。
您应该添加一个新的交换文件,而不是调整现有交换文件的大小,因为这样做不需要任何费用。要调整交换文件的大小,您必须首先禁用它,这会将交换内容驱逐到 RAM,这会增加 RAM 的压力,甚至可能会召唤 OOM 杀手(更不用说您可能会在几分钟内颠簸磁盘)。多个交换文件不是问题,设置另一个交换文件非常容易。与添加另一个交换文件相比,调整交换文件的大小实际上没有任何好处。
此命令创建一个大小为 1 GB 的文件。
count
是文件的大小,以块大小为单位,由bs
标志设置,以字节为单位。此处,bs
设置为1M
(= 2^20 字节,1 兆字节 (MiB)),当乘以1K
(= 1024) 时为 1 GiB(1 千兆字节)。您可以像我一样创建另一个交换文件:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
要使其永久添加一个文件到
fstab
文件类型:echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
(这个答案自downvote以来完全重写)
关于
fallocate
vs的注释dd
在我们继续之前,我想指出一些答案
fallocate
用于为文件分配空间,而不是dd
. 不要那样做。使用dd
. @muru在这里和这里指出了一些重要的点。虽然fallocate
速度要快得多,但它可能会创建带有孔的文件。我认为这仅仅意味着空间不连续,这对交换文件不利。我把它fallocate
想象成创建一个 C 风格的内存链表的意思,而dd
创建一个 C 数组连续的内存块。交换文件需要一个连续的块。通过将二进制零从伪文件dd
逐字节复制到它生成的新文件中来做到这一点。/dev/zero
man swapon
还声明不要使用fallocate
,dd
而是使用。这是引用(强调添加):并且来自
man mkswap
(强调添加):因此,使用
dd
,而不是fallocate
,来创建交换文件。选项 1(我的偏好):删除旧的交换文件并创建一个正确大小的新文件:
而不是调整交换文件的大小,只需将其删除并以适当的大小创建一个新文件!
如果您是第一次添加此交换文件,请确保它在您的
/etc/fstab
文件中,以便在每次重新启动后使交换文件再次可用。只需运行这两个命令:来源:请参阅此处的“第 4 步:永久更改”部分。
选项 2:调整旧交换文件的大小:
@Ravexina接受的答案是正确的。但是,最初我并不了解它的所有部分,所以我想包含更多描述并解释更多细节。见
dd --help
和man dd
。我在这方面的一些学习也来自Bogdan Cornianu 的博客文章。我还在最后添加了一些命令来展示如何在创建交换空间后对其进行验证。如何调整交换文件的大小:
在这里,我们将通过在其末尾写入 8 GiB ( Gibibytes ) 的零来增加现有交换文件的大小。
关闭仅使用这一个交换文件(位于“ /swapfile ”):
通过将所有零字节附加到交换文件的末尾(而不是重写整个文件,这会更慢),将交换文件的大小增加 8 GiB:
if
= 输入文件/dev/zero
= 一个特殊的 Linux“文件”,每次读取时它都会输出所有零字节of
= 输出文件bs
= 块大小1G
代表 1 Gibibyte 或 GiB,它是“Gigabyte”的 base-2 版本,它是 base-10。根据man dd
,G =1024*1024*1024
字节。这是我喜欢的文件大小,因为计算机和硬件内存都是 base-2。1GB
而不是1G
.man dd
显示GB =1000*1000*1000
字节。count
=块的乘数;写入的总内存为count * bs
.oflag=append
意味着追加到输出文件的末尾,而不是重写整个内容。见dd --help
和man dd
。来自dd --help
:conv=notrunc
表示“转换”文件时,“不要截断输出文件”;dd --help
,正如您在上面看到的那样,表明无论何时都建议这样做oflag=append
注意:如果你想重写整个交换文件而不是仅仅追加它,你可以像这样创建一个 32 GiB 的交换文件,例如:
使文件可用作交换
打开交换文件
(奖励/可选):确保您刚刚创建的这个交换文件现在正在使用中:
样本输出:
您还可以使用这两个命令查看一些内存/交换信息:
参考:
也可以看看:
根据博文中 Arian Acosta 的建议,我在 Ubuntu 17.04 上取得了不错的成绩。
sudo fallocate -l 4G /swapfile
你可以用你想要的任意数量的千兆字节来代替这里的 4G 。以 TS为例sudo fallocate -l 2G /swapfile
。您可能还想检查权限。执行此操作的其他方法: