我无法在CentOS 7上启用交换空间


55

因此,我正在按照一个教程来安装OTRS,它是开源的票务请求系统。因此,要安装,它需要:4GB的交换空间。这是我使用的命令:

[root@ip-10-0-7-41 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       50G   14G   37G  27% /
devtmpfs        478M     0  478M   0% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   13M  484M   3% /run
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000
[root@ip-10-0-7-41 ~]# fallocate -l 4G /myswap
[root@ip-10-0-7-41 ~]# ls -lh /myswap
-rw-r--r--. 1 root root 4.0G Jul  8 08:44 /myswap
[root@ip-10-0-7-41 ~]# chmod 600 /myswap
[root@ip-10-0-7-41 ~]# mkswap /myswap
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=3656082a-148d-4604-96fb-5b4604fa5b2e
[root@ip-10-0-7-41 ~]# swapon /myswap
swapon: /myswap: swapon failed: Invalid argument

您可以在此处看到:无效的参数错误。我尝试了很多时间都没有启用它。请告诉我如何解决此错误。(我正在AWS Instance EC2上运行此CentOS 7)

[root@ip-10-0-7-41 ~]# df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
/dev/xvda1 xfs /

这是在什么文件系统上发生的?btrfs有机会吗?
schaiba

@schaiba您好,我编辑了我的问题。我认为文件系统是xfs。
一个

2
实际上,在XFS上最好使用dd。请记住,并非所有文件系统都支持交换,或者至少不是以相同的方式。
schaiba

@schaiba我对文件系统的类型不太了解。非常感谢。
一个

Answers:


102

问题fallocate(1)在于它使用文件系统ioctls来快速有效地进行分配,缺点是它没有物理分配空间,而swapon(2)syscall需要实际空间。参考:https : //bugzilla.redhat.com/show_bug.cgi?id=1129205

我的包装盒也曾遇到过这个问题。所以fallocate我没有使用,而是使用dd了链接提示

sudo dd if=/dev/zero of=/myswap count=4096 bs=1MiB

并与前方移动chmodmkswapswapon命令。答对了 !有效。


1
奇怪的是,经过fallocate处理的交换文件对我在Ubuntu 16.04.3 LTS上正常工作,但是在Red Hat Enterprise Linux Server 7.4版(Maipo)上失败并显示“交换失败:无效参数”。上面提供的dd命令确实适用于RedHat。两种操作系统之间必须有一些不同之处,才能使Fallocate在Ubuntu上运行。
Davidian1024 '18

解决方案适用于CentOS 7.5
NerdOfCode '18

dd似乎time dd if=/dev/zero of=/myswap count=4096 bs=1MiB需要花费14.003秒time fallocate -l 4G /swap3才能完成更多工作,而花费0.018秒就可以完成,但是它们生成的文件大小相同。我猜测fallocate不为零的方式复制dd功能以及swapon需要这些零。
Daniel Wisehart

swapon: /swapfile: read swap header failed: Invalid argument尝试swapon /swapfile在centos7 puppetenterprise服务器上收到此错误
Brian Thomas

@BrianThomas这听起来像是您在用dd创建文件后忘记在文件上运行mkswap。
jblaine

17

按照以下步骤,它可以在DigitalOcean的液滴上工作。我测试了 根据需要更改数量4096

yum install nano -y

sudo dd if=/dev/zero of=/swapfile count=4096 bs=1MiB
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

sudo nano /etc/fstab

添加此行:

/swapfile   swap    swap    sw  0   0

运行此命令

sudo sysctl vm.swappiness=10

sudo nano /etc/sysctl.conf

添加这行

vm.swappiness = 10
vm.vfs_cache_pressure = 50

验证交换的大小

swapon --summary
free -h

2
我的dd命令将是dd if=/dev/zero of=/swapfile count=4 bs=1GiB因为如果dd可以的话,我不必为以兆字节为单位计算兆字节而烦恼。您是否知道,在过去的日子里,人们以吉字节(KB)来表示它,然后手工将其计算为千兆字节(GB)?难以置信!
Amedee Van Gasse

@AmedeeVanGasse您的dd命令版本实际上需要1GiB的内存,如果您没有那么多可用内存,该命令将失败。
法比亚诺

@Fabiano是吗?你的意思是...?
Amedee Van Gasse

2
@AmedeeVanGasse我的观点是,如果您只是不想打扰计算MiB和GiB,那bs=不是正确的方法,因为它会带来意想不到的后果,例如效率降低,可能不适用于大多数低成本主机。如果你只是懒惰,使用count_bytes,让dd你两者都做数学和高效的块大小的选择:dd if=/dev/zero of=/swapfile count=4GiB iflag=count_bytes=)
法比亚诺

iflag=count_bytes是对您的评论的极大改进。而且我也不懒,我在乎可读性。在6个月的时间内,当我再次阅读我的脚本时(或当下一个维护者出现时),读者必须了解发生了什么。不仅是计算机可以读取代码,人类也可以读取代码!
Amedee Van Gasse
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.