fallocate 与 dd

这两个命令都可以创建文件, 尤其是大文件.那么都有什么区别呢?

其中很多人都注意到 dd 慢一点.

➜  ~ time fallocate -l 1G 1G
fallocate -l 1G 1G  0.00s user 0.00s system 0% cpu 0.006 total

➜  ~ time dd if=/dev/zero of=1G bs=128M count=8
8+0 records in
8+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.45113 s, 438 MB/s
dd if=/dev/zero of=1G bs=128M count=8  0.00s user 1.15s system 46% cpu 2.456 total

同时 dd 如果 bs 给的过大会直接爆掉内存.

那么区别呢?区别在于 fallocate 是一个 System call,由文件系统支持, 其创建的是一个稀疏文件, 或者说预分配空间.实际上没有写入实际数据, 而 dd 则是真的写了 1G 的零进去.

顺便一提, macOS 上并没有 fallocate, 你可以使用 mkfile.Linux 上也有类似的, 包含在 xfsprogs 中, 叫做 xfs_mkfile.

➜  ~ time mkfile -n 1G file_1G
mkfile -n 1G file_1G  0.00s user 0.68s system 15% cpu 4.242 total

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.