mknod 不能创建空洞文件,因其专用于生成设备节点或FIFO,而空洞文件是通过seek+write机制实现的普通文件,依赖文件系统对lseek的支持,二者inode类型与内核处理方式完全不同。

mknod 不能创建空洞文件,它专门用于创建设备节点(字符、块设备)或 FIFO 管道,和空洞文件(sparse file)在原理、用途、实现机制上完全不同。
为什么 mknod 不适用于空洞文件
空洞文件是普通文件的一种,其特点是文件系统中逻辑大小远大于实际占用的磁盘块数(中间存在未分配的“空洞”)。它通过 seek + write 方式生成,依赖的是文件系统对 lseek() 系统调用的支持,而非设备号或特殊文件类型。
mknod 创建的是特殊文件(device special file),内核会将其识别为设备接口,访问时触发驱动程序;而空洞文件是 regular file,由 VFS 和具体文件系统(如 ext4、xfs)按需分配数据块——两者属于完全不同的 inode 类型。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
正确创建空洞文件的方法
以下命令均可生成空洞文件,无需 root 权限,且能真实反映文件系统对稀疏存储的处理能力:
-
使用 truncate(最推荐):
truncate -s 100G /tmp/test.sparse
立即创建一个逻辑大小为 100GB、但实际占用 0 字节的空洞文件。速度快、语义清晰、可跨文件系统使用。 -
使用 dd(带 seek):
dd if=/dev/zero of=/tmp/test.sparse bs=1 count=1 seek=$((100*1024*1024*1024-1))
在末尾写入 1 字节,使文件大小达到 100GB,中间全为空洞。 -
用程序调用 lseek + write(C/Python 示例):
Python 中:f = open('test.sparse', 'wb'); f.seek(10**11 - 1); f.write(b'\0'); f.close()
测试文件系统存储极限的实用建议
仅靠单个空洞文件不足以全面测试极限,还需结合以下操作:
- 用 df -h /tmp 和 du -sh /tmp/test.sparse 对比,确认空洞是否生效(du 显示极小,df 显示已预留空间);
- 持续追加写入(dd if=/dev/urandom bs=1M count=1000 >> test.sparse),观察何时触发 ENOSPC;
- 注意:某些文件系统(如 btrfs 启用压缩时)可能自动填充空洞,导致行为偏离预期;ext4/xfs 更符合传统空洞语义。

















