如何在 1s 内创建上百 G 的超大文件?

本文介绍了在测试场景下,如何使用dd、fallocate和truncate命令快速创建上百GB的大文件,对比了各种方法的效率,并详细解释了fallocate和truncate在文件大小处理上的区别。

作者 | 写代码的明哥 

来源 | Python编程时光 

责编 | 王晓曼

常规的创建文件方式有:

  • touch

  • vi(m)

  • tee

  • > 或 >>

但是这几种都只适合创建小的文本文件,某些情况下出于测试的需要,你需要快速创建一个超大的文件,可能要上百G。这时候要使用上面几个命令,你可能要等一天的时间,效率非常低。

接下来介绍几种我常用的方法。

dd

dd 命令,可以从标准输入或指定的文件中读取数据,拷贝至新文件。

$ dd if=/dev/zero of=big_file count=10 bs=1G

使用 time 命令,可以算出创建一个 10G的文件需要耗时多久?

$ time dd if=/dev/zero of=big_file count=10 bs=1G
10+0 records in
10+0 records out
10737418240 bytes (11 GB) copied, 7.93627 s, 1.4 GB/s

real    0m7.941s
user    0m0.000s
sys    0m7.935s

花了将近8秒的时间!

$ ls -lh big_file 
-rw-r--r-- 1 root root 10G Jun  2 10:57 big_file

fallocate

fallocate 命令可以为文件预分配物理空间。-l 后接空间大小,默认单位为字节。也可后跟k、m、g、t、p、e来指定单位,分别代表KB、MB、GB、TB、PB、EB。

$ fallocate -l 10G big_file

使用 time 命令,可以算出创建一个 10G的文件需要耗时多久?

$ time fallocate -l 10G big_file
real    0m0.002s
user    0m0.000s
sys    0m0.001s

居然只有 0.001秒。

$ ls -lh big_file 
-rw-r--r-- 1 root root 10G Jun  2 11:01 big_file

使用 du 命令,查看是否是真正创建了一个 10G大小的文件?从结果来看,是的。

$ du -sh big_file
10G    big_file

truncate

truncate 命令可以将文件缩减或扩展为指定大小,使用 -s 参数设置大小。

$ truncate -s 10G big_file

使用 time 命令,可以算出创建一个 10G的文件需要耗时多久?

$ time truncate -s 10G big_file
real    0m0.001s
user    0m0.000s
sys    0m0.001s

也是只有 0.001 秒。

不过与 fallocate 不同的是,allocate 创建的文件是真实大小,而 truncate 创建的并不是。

使用 ls 和 du 命令,查看的文件大小,结果是不一样的。

$ ls -lh big_file 
-rw-r--r-- 1 root root 10G Jun  2 11:11 big_file

$ du -sh big_file 
0    big_file

由此可见 truncate 的作用是指定一个文件的大小,如果该文件不存在,就会创建该文件。如果指定文件的大小小于原先的大小,会丢失内容。

这个命令指定的文件大小其实是虚拟的。只是显示出来的大小。如果你指定一个非常大的文件。其实服务器剩余空间并不会减少。

以上,是我常用的几种创建大文件的方法,可以根据不同的使用场景进行选择,我一般使用的是 fallocate,速度够快,也是也会真实地占用磁盘空间,符合真实的测试场景。

更多精彩推荐
☞“删除中国应用”App 凭啥火爆印度?
☞红警 1 游戏开源,代码非常规范,网友:秀色可餐
☞头条和百度“大打出手”时,微信搜索去哪儿了?
☞怒肝 8 个月源码,我成为了 Spring 开源贡献者
☞干货 | 基于SRS直播平台的监控系统之实现思路与过程
☞挖矿仍然有利可图吗?
你点的每个“在看”,我都认真当成了喜欢
<think>我们参考了用户提供的引用内容,特别是引用[1]、[2]、[3]中提到的创建指定大小文件的方法。用户希望了解在Linux中创建指定大小的空白测试文件的方法。以下是几种常用方法:###方法1:使用`fallocate`命令(推荐,最快)```bashfallocate-l1Gtestfile.img#创建1GB空白文件```-**原理**:直接分配磁盘块,不写入数据(创建稀疏文件)-**优点**:瞬间完成,不占用IO资源-**适用场景**:需要快速创建大文件(如1GB以上)-**注意**:部分老文件系统(如FAT32)不支持[^1][^3]###方法2:使用`truncate`命令```bashtruncate-s500Mtestfile.img#创建500MB文件```-**原理**:设置文件逻辑大小,不实际分配磁盘块-**特点**:创建的是**稀疏文件**(显示大小≠实际磁盘占用)-**验证**:`du-htestfile.img`查看实际占用[^3]###方法3:使用`dd`命令(兼容性强)```bashddif=/dev/zeroof=testfile.imgbs=1Mcount=100#100MB文件```-**参数说明**:-`if=/dev/zero`:输入源(空字节流)-`bs=1M`:每次读写1MB-`count=100`:操作100次-**优点**:所有文件系统通用-**缺点**:逐块写入,速度慢(创建10GB文件约需10秒)[^1][^2]###方法4:使用`head`/`tail`命令```bashhead-c10M/dev/zero>testfile.img#10MB文件#或tail-c200K/dev/zero>testfile.img#200KB文件```-**特点**:管道操作灵活,适合中小文件###方法5:Python生成(跨平台)```pythonwithopen('testfile.img','wb')asf:f.seek(1024*1024-1)#定位到1MB位置f.write(b'\0')#写入单个空字节(创建稀疏文件)```-**优化**:可添加`f.truncate()`确保精确大小###性能对比(创建1GB文件)|方法|耗时|实际磁盘占用||--------------|---------|--------------||`fallocate`|0.003s|1.0G||`truncate`|0.002s|0(稀疏文件)||`dd`|4.2s|1.0G|>⚠️**关键区别**:>-`fallocate`和`dd`会**预分配物理磁盘空间**>-`truncate`和Python的`seek()`创建**稀疏文件**(仅标记大小,不占实际空间)###应用场景选择1.**测试磁盘速度**→用`dd`(需真实写入)2.**快速占用磁盘空间**→用`fallocate`3.**创建逻辑大文件(无物理占用)**→用`truncate`###验证文件属性```bashls-lhtestfile.img#查看逻辑大小du-htestfile.img#查看实际磁盘占用filefrag-vtestfile.img#检查是否稀疏文件```§§相关问题§§1.稀疏文件在Linux文件系统中是如何实现的?2.如何检测一个文件是否是稀疏文件?3.为什么`dd`命令创建大文件时会产生IO负载?4.在Kubernetes中如何快速创建临时大文件用于测试?</think>### 在 Linux 中创建指定大小的空白测试文件方法 #### 🚀 推荐方法(最快最安全) ```bash # 创建 1GB 空白文件(瞬间完成) fallocate -l 1G testfile.img # 创建 500MB 空白文件 fallocate -l 500M mediumfile.bin ``` - **原理**:直接分配磁盘块,不写入实际数据(稀疏文件) - **优势**: - 零 IO 操作,瞬间完成(创建 10GB 文件仅需 0.01 秒) - 不产生磁盘写入负载,避免影响系统性能[^2] - **注意**:需文件系统支持(ext4/xfs/btrfs 等现代文件系统) #### 📦 通用方法(兼容所有文件系统) ```bash # 创建 100MB 文件(写入空字节) dd if=/dev/zero of=testfile.img bs=1M count=100 # 创建 2GB 文件(带进度显示) dd if=/dev/zero of=largefile.img bs=128M count=16 status=progress ``` - **参数说明**: - `bs=1M`:每次读写 1MB(块大小) - `count=100`:操作 100 次(总大小 = bs × count) - `status=progress`:显示实时进度(需较新内核) - **优化技巧**: - 增大 `bs` 值(如 `bs=128M`)可显著提升速度 - 使用 `/dev/urandom` 替代 `/dev/zero` 生成随机数据 #### ⚡ 替代方案(各有适用场景) 1. **创建稀疏文件(逻辑大小≠物理占用)** ```bash truncate -s 5G sparse_file.img ``` - 特点:瞬间创建,实际磁盘占用为 0 - 验证:`ls -lh` 显示 5G,`du -h` 显示实际占用 2. **使用高效写入工具** ```bash head -c 10M /dev/zero > smallfile.bin # 10MB 文件 ``` - 比 `dd` 更简洁,适合中小文件 3. **Python 跨平台实现** ```python with open('testfile.bin', 'wb') as f: f.truncate(1024 * 1024 * 100) # 创建 100MB 空文件 ``` #### 🔍 文件验证命令 ```bash ls -lh testfile.img # 查看逻辑大小 du -h testfile.img # 查看实际磁盘占用 filefrag -v testfile.img # 检查是否稀疏文件 hexdump -C -n 64 testfile.img # 查看文件头部内容 ``` #### 💡 不同场景推荐 | 场景 | 推荐方法 | 耗时示例 (10GB) | |-----------------------|------------------|-----------------| | 快速占用磁盘空间 | `fallocate` | 0.01 秒 | | 兼容旧文件系统 | `dd` | 20-60 秒 | | 创建逻辑大文件 | `truncate` | 0.001 秒 | | 需要真实数据填充 | `dd if=/dev/urandom` | 30-90 秒 | > **重要提示**:使用 `dd` 创建超大文件时: > 1. 先通过 `df -h` 确认磁盘空间充足 > 2. 添加 `oflag=direct` 参数避免缓存影响速度 > 3. 用 `conv=fdatasync` 确保数据完全落盘[^1]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值