fallocate -l 是生成真实大小大文件的最快最安全选择,它不写入数据、仅在元数据中预留空间,毫秒级完成10g创建,适用于ext4/xfs/btrfs等主流文件系统,但不支持nfsv3、cifs或ext2/ext3。

fallocate -l 是最快且最安全的选择
只要文件系统支持(ext4、xfs、btrfs 等主流类型都支持),fallocate -l 是生成真实大小大文件的首选。它不写入数据,只在文件系统元数据中预留空间,毫秒级完成 10G 文件创建。
- 必须确保目标分区挂载时未启用
nobh或禁用预分配的选项(极少见) - 不适用于某些网络文件系统(如 NFSv3、CIFS)或旧版 ext2/ext3
- 执行后
ls -lh和du -h显示一致,都是真实占用大小 - 示例:
fallocate -l 8G /tmp/testfile.bin
dd if=/dev/zero 的兼容性更强但慢得多
当 fallocate 报错 “Operation not supported” 时,dd 是可靠 fallback,但它会真正往磁盘写零,耗时随文件大小线性增长。
-
bs=1M count=1024比bs=1K count=1048576更快(减少系统调用次数) - 加
status=progress可实时看进度(GNU coreutils ≥ 8.24) - 若只想“占位”不占实际空间(稀疏文件),可用
seek:例如dd if=/dev/null of=sparse.img bs=1G seek=5 count=0创建一个显示为 5G 但du为 0 的文件 - 错误常见于权限不足或磁盘满:
dd: failed to open '/tmp/big': Permission denied或No space left on device
别混淆“虚拟大小”和“真实大小”
Linux 文件有逻辑大小(ls 显示)和实际磁盘占用(du 显示)。测试磁盘压力时,必须用真实占用的文件,否则压测无效。
-
truncate -s 10G foo创建的是稀疏文件:逻辑大小 10G,但du -h foo返回 0 —— 它不消耗空间,也不能用于 IO 压力测试 -
fallocate -l 10G foo和dd if=/dev/zero of=foo bs=1G count=10都产生真实占用 10G 的文件 - 验证是否真实分配:
stat foo | grep "Blocks:"—— Blocks 值应 ≈ 大小 / 512;稀疏文件 Blocks 接近 0
测试场景下容易被忽略的关键点
很多用户用对了命令,却在后续测试中出问题,根源常在文件路径、权限或文件系统特性上。
- 不要在
/tmp(可能挂载为 tmpfs)或容器 rootfs 中生成大文件,易触发 OOM 或写满内存 - 目标目录需有足够剩余空间:
df -h /target/path比df -h /更准确 - 某些环境(如 CI runner、Docker 默认存储驱动 overlay2)不支持
fallocate,需提前探测:fallocate -l 1M /tmp/test && rm /tmp/test || echo "fallocate not available" - 如果测试需要可预测内容(如校验一致性),
dd if=/dev/zero比fallocate更合适;若只需占空间,fallocate绝对优先











