fallocate
通过快速分配或释放文件空间来管理磁盘块,无需实际写入数据,比用零填充文件更快。支持的操作包括预分配空间、打洞(创建稀疏区域)、折叠范围等。其核心功能依赖于文件系统的 fallocate
系统调用,适用于支持该功能的文件系统(如 ext4、XFS、Btrfs 等)。
基本语法
fallocate [选项] 文件名
选项
选项 | 描述 |
---|---|
-c, --collapse-range | 折叠范围:从 offset 开始删除指定长度 length 的数据,后续数据前移,文件变小。需指定 -o 和 -l ,且不支持 --keep-size 。 |
-d, --dig-holes | 挖掘空洞:将文件中连续的零转换为稀疏区域(空洞),减少磁盘占用。默认覆盖整个文件,隐含 --keep-size 。 |
-i, --insert-range | 插入空洞:在 offset 处插入长度 length 的空洞,并将后续数据右移。需指定 -o 和 -l 。 |
-l, --length length | 指定操作范围的长度(字节),支持单位后缀(如 K , M , G )。 |
-n, --keep-size | 保持文件大小:不修改文件的逻辑长度,但可能分配 EOF 以外的块(需后续 truncate 删除)。 |
-o, --offset offset | 指定操作范围的起始偏移量(字节)。 |
-p, --punch-hole | 打洞:释放指定范围内的空间,后续读取返回零。隐含 --keep-size ,支持 XFS、ext4、Btrfs、tmpfs 等。 |
-v, --verbose | 显示详细操作信息。 |
-x, --posix | POSIX 模式:强制使用兼容模式,即使文件系统不支持快速分配,也会完成操作(可能耗时更长)。 |
-z, --zero-range | 零化范围:将指定范围内的数据设为零,但仅分配未初始化的块。支持 --keep-size 。 |
-V, --version | 显示版本信息并退出。 |
-h, --help | 显示帮助信息并退出。 |
互斥选项
以下选项不能同时使用:
-c
(折叠范围)、-p
(打洞)、-z
(零化范围)。
参数说明
- 单位后缀:
长度和偏移量支持以下单位后缀:KiB
(=1024)、MiB
(=1024²)、GiB
等(iB
可省略,如K
等效KiB
)。KB
(=1000)、MB
(=1000²)、GB
等。
退出状态
状态码 | 含义 |
---|---|
0 | 操作成功。 |
1 | 操作失败(如权限不足、无效参数、文件系统不支持等)。 |
示例
示例 1:预分配 100MB 空间
fallocate -l 100M file.txt
示例 2:打洞(释放文件中 512KB 的范围)
fallocate -p -o 1024 -l 512K file.txt
示例 3:折叠范围(删除 100KB 数据)
fallocate -c -o 0 -l 100K file.txt
示例 4:挖掘空洞(将文件中零转换为空洞)
fallocate -d file.txt
示例 5:零化范围(将偏移 512KB 处的 1MB 区域设为零)
fallocate -z -o 512K -l 1M file.txt
示例 6:插入空洞(在偏移 1MB 处插入 2MB 空洞)
fallocate -i -o 1M -l 2M file.txt
注意事项
-
权限要求:
- 需要对文件有写权限,且对文件系统有操作权限(如
root
)。
- 需要对文件有写权限,且对文件系统有操作权限(如
-
文件系统支持:
- 打洞(
--punch-hole
):支持 XFS(Linux 2.6.38+)、ext4(3.0+)、Btrfs(3.7+)、tmpfs(3.5+)。 - 折叠范围(
--collapse-range
):仅支持 ext4(extent 文件)和 XFS(Linux 3.15+)。 - 零化范围(
--zero-range
):支持 ext4(extent 文件)和 XFS(Linux 3.14+)。
- 打洞(
-
风险提示:
- 折叠范围操作会永久删除数据,需谨慎使用。
--keep-size
:若文件大小未修改,但分配了 EOF 以外的块,需用truncate
修复文件长度。
-
性能优势:
- 预分配或打洞操作无需实际 I/O,速度远快于
dd
或truncate
。
- 预分配或打洞操作无需实际 I/O,速度远快于