不能用 touch 创建 swapfile,因为 touch 只创建空 inode,不分配真实磁盘块,而 mkswap 必须写入交换头,需 fallocate 或 dd 分配连续可寻址块空间。

fallocate 创建、chmod 600 设权限、mkswap 格式化、swapon 启用——四步走,但每步都有硬性前提,错一步就失败。
为什么不能用 touch 创建 swapfile
常见错误是 touch /swapfile && chmod 600 /swapfile && mkswap /swapfile,结果报错 mkswap: cannot open /swapfile: Text file busy 或直接静默失败。这是因为 touch 只创建空 inode,不分配磁盘块;mkswap 需要真实、连续、可寻址的块空间才能写入交换头(swap header)。fallocate 或 dd 才能真正“占位”。
-
fallocate -l 2G /swapfile:最快,但某些文件系统(如 ext3、XFS 默认 noalloc 模式)可能不支持,会报Operation not supported -
dd if=/dev/zero of=/swapfile bs=1M count=2048:兼容性好,但慢,且写入过程不可中断(否则文件损坏) - 别用
truncate—— 它和touch一样不分配块,mkswap会拒绝
mkswap 报 “Invalid argument” 的真实原因
这个错误不是权限问题,也不是路径写错,而是底层不兼容。典型场景:
- 文件系统类型不支持 swap:比如
/swapfile放在overlayfs(Docker 容器内)、tmpfs(内存盘)、nfs或加密卷未解锁路径下 - 确认方式:
findmnt -T /swapfile | awk '{print $4}',只接受ext4、xfs等主流本地文件系统 - 内核没编译 swap 支持:
zcat /proc/config.gz 2>/dev/null | grep CONFIG_SWAP应输出CONFIG_SWAP=y;云主机或精简内核可能关掉它 - swapfile 被其他进程锁住:检查
lsof /swapfile或重启systemd-journald(它有时会缓存写入)
/etc/fstab 中 swapfile 条目必须严格按格式写
很多用户照抄网上示例,把第二列写成 swap 或留空,导致开机卡在 dev-disk-by… 解析阶段,甚至进不了系统。正确写法只有一条:
/swapfile none swap sw 0 0
- 第一列必须是绝对路径,不能用
UUID=...或LABEL=...——swapon不解析这些 - 第二列必须是
none,不是swap,不是空格,不是路径 -
sw是唯一推荐挂载选项;加nofail无意义,swap 不参与 mount 依赖链 - 改完
/etc/fstab后,运行sudo systemctl daemon-reload并sudo swapon --show验证,不要直接 reboot
swapfile 大小和 swappiness 设置不当反而害性能
设太大不是保险,而是埋雷:
- SSD 上频繁 swap 会加速磨损;建议上限 ≤ 2× RAM,8GB RAM 就别搞 32GB swapfile
-
vm.swappiness=60(默认)会让系统过早换出匿名页,拖慢响应;桌面或数据库建议调到10,仅在内存真正吃紧时才 swap - 临时改:
sudo sysctl vm.swappiness=10;永久改:echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf - 别忽略
free -h和swapon --show的区别:free显示总量,swapon才告诉你它是file还是partition,以及是否真启用
fallocate 或 dd 分配真实块、fstab 第二列必须是 none。这三个条件缺一不可,漏一个,swap 就只是个躺在磁盘上的普通文件。


















