惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
爱范儿
爱范儿
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
V
Visual Studio Blog
有赞技术团队
有赞技术团队
U
Unit 42
D
Docker
小众软件
小众软件
F
Full Disclosure
I
Intezer
Scott Helme
Scott Helme
P
Privacy International News Feed
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
B
Blog
Martin Fowler
Martin Fowler
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
S
Security Affairs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
C
Cisco Blogs
云风的 BLOG
云风的 BLOG
Schneier on Security
Schneier on Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Threat Research - Cisco Blogs
量子位
Hacker News - Newest:
Hacker News - Newest: "LLM"
H
Heimdal Security Blog
N
Netflix TechBlog - Medium
H
Hacker News: Front Page
P
Proofpoint News Feed
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
S
Schneier on Security

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日 mktemp: Shell 脚本中临时文件的安全陷阱与最佳实践 - 暗无天日 WSL9x —— 在 Windows 9x 里跑 Linux 内核 6.19 用 ox.el 做你想做的事 —— org-export 高级编程指南 读:Hot-wiring the Lisp Machine —— 用纯 Elisp 构建零依赖的 Org 静态站点生成器 Elisp 性能优化的六个实战教训 - 暗无天日 fcitx5 下 Emacs 无法切换输入法的排查 - 暗无天日 ERT 测试交互命令的三种方式 - 暗无天日 SEM Assistant: 当 Elisp 守护进程遇上 LLM 用 dmsg 给 Elisp 加上结构化调试日志 用 org-habit 追踪非每日习惯 - 暗无天日 Clojure X-Men:当编程语言特性变成超能力 - 暗无天日 TIL: 用 diff-hl 在 fringe 中显示 git 变更 读:llm-test —— 用 LLM agent 驱动 Emacs 测试 TIL: AI 时代的橡皮鸭调试 - 暗无天日 fcitx 启动后键盘输入卡顿的排查 - 暗无天日 TIL: 早期网页的图片热区导航 - 暗无天日 读 Seeing the Whole System 用 Emacs 自动生成每周链接推荐 - 暗无天日 读:ASCII control characters in my terminal 读 What to learn - 暗无天日 Lisp 的括号之痛——一个愚人节玩笑揭开的老伤疤 - 暗无天日 一本书该"线性读"还是"并行读" - 暗无天日 读 How to Monetize a Blog:一篇伪装成变现指南的讽刺文 Python Mock 第三方依赖的四种策略 - 暗无天日 Emacs Lisp 热重载实用指南 - 暗无天日 Prot 的 Emacs 配置哲学 - 暗无天日 TIL: 从直播对谈中学到的三个 Emacs 技巧 - 暗无天日 TIL: 自动使用项目虚拟环境的 Python - 暗无天日 TIL: 让 Help buffer 自动获得焦点 一条命令让本地开发用上 HTTPS —— slim 工具介绍 用 fsck 检查和修复 Linux 文件系统 排查Linux进程"卡死"实战:从strace到gdb全流程 - 暗无天日 PostgreSQL 索引:从基础到你可能不知道的高级用法 - 暗无天日 用 .pdbrc 自定义 Python 调试器 ANSI 转义码的标准化现状 - 暗无天日 终端程序的潜规则 - 暗无天日 PARA Org-mode 测试配置 - 暗无天日 AI越强越辣鸡?控制论说这是必然的 - 暗无天日 AI 越强越需要你盯着——反馈循环实操指南 - 暗无天日 你的AI代理正在偷你的密钥——四种你没想到的泄露通道 - 暗无天日 LLM 在 DevOps 中的三种角色 - 暗无天日 写作风格的反建议 - 暗无天日 反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了 - 暗无天日 文件充满了危险——Dan Luu 谈文件系统的可靠性陷阱 - 暗无天日 AI 时代的 PARA 方法:用 Org-mode 和 AI 打造个人知识管理系统 Linux 数据去重学习笔记 - 暗无天日 创建跨平台 ZIP 文件的隐藏陷阱:Extra Field - 暗无天日 X11 Forwarding 排障指南 - 暗无天日 IP欺骗端口扫描:当别人冒充你去扫描别人 - 暗无天日 Linux 输入栈全景解析:从硬件按键到屏幕响应 - 暗无天日 Unix 系统中那些被埋没的配置开关——以 FontConfig 为例 - 暗无天日 在Linux上限制儿童使用电脑 - 暗无天日 GIF不仅仅是一种图片格式——用GIF流做些奇怪的事 - 暗无天日 Leiningen 学习笔记:Clojure 项目构建与管理从入门到实战配置 - 暗无天日 Google SRE Book 读书笔记 - 暗无天日 yes 管道 head 发生了什么 - 暗无天日 为什么 nohup 在 crontab 中不起作用 Bash中的Indirection与Nameref - 暗无天日 Linux PAM 简介 - 暗无天日 从Linux ISO文件启动计算机 - 暗无天日 用 Bash 打造一个Screen Locker 用GitHub Actions自动构建EGO博客 - 暗无天日 blocking I/O 的作用 - 暗无天日 mobileog 手机端同步提示Error:2 No such file 的解决方法 回收 WSL2 VHDX 文件占用空间 使用 org-mode columnview 生成任务列表 - 暗无天日 Emacs 作为 MPD 客户端 - 暗无天日 移动文件路径却不破坏org file link的方法 - 暗无天日 如何合理的导出help link 成HTML - 暗无天日 笑话理解之Biology - 暗无天日
读:Linux 创建指定大小文件的三种方式——dd、fallocate 与 truncate - 暗无天日
2026-05-10 · via 暗无天日

你需要一个 1GB 测试文件,用于磁盘基准测试、填满分区验证告警阈值、或者模拟大日志文件。 touch 命令只能给你一个 0 字节空壳,对这些场景毫无用处。

Linux 有三个命令能创建指定大小的文件: ddfallocatetruncate 。实现方式完全不同,适用于不同的场景。

场景一:磁盘基准测试

要对磁盘做顺序写速度测试,你需要让数据真的写进去。 dd 就是这个场景的工具。

dd 从输入源逐字节读数据,一块一块写入输出文件。最常用的数据源是 /dev/zero ,这个设备持续产出空字节:

dd if=/dev/zero of=testfile.img bs=1M count=100
输入了 100+0 块记录
输出了 100+0 块记录
104857600 字节 (105 MB, 100 MiB) 已复制,0.041992 s,2.5 GB/s

参数拆解:

  • if=/dev/zero 从 zero 设备读取,这个设备无限产出空字节
  • of=testfile.img 写入目标文件
  • bs=1M 每次读写操作的块大小为 1MB
  • count=100 复制 100 个块,100 × 1MB = 100MB

输出本身就是一个简易的磁盘写入基准:实际字节数、用时、传输速度全给了。这是真正的数据写入,不是预留空间,写 100MB 到磁盘需要多久,命令就要跑多久。

要创建 1GB 文件,直接把 count 放大:

dd if=/dev/zero of=testfile.img bs=1M count=1024
输入了 1024+0 块记录
输出了 1024+0 块记录
1073741824 字节 (1.1 GB, 1.0 GiB) 已复制,3.30795 s,325 MB/s

大文件写入时加上 status=progress 可以看实时进度:

dd if=/dev/zero of=bigfile.img bs=1M count=4096 status=progress

速度取决于你的磁盘。上面 100MB 的测试在 SSD 上只花了 0.04 秒(2.5 GB/s),但 1GB 文件降到了 325 MB/s,因为 SSD 的缓存写完之后真实速度就暴露了。机械硬盘上的差异会更明显。

场景二:快速创建大文件占位

磁盘基准测试要的是真实写入。但很多时候你只需要一个指定大小的大文件先把空间占着。比如:

  • 创建 VM 磁盘镜像,之后会往里面装系统
  • 预分配日志文件,防止磁盘碎片
  • 快速占满分区到某个阈值,测试告警

这时候 fallocate 是正确选择。它在文件系统层面预留空间,不写数据,所以即使 GB 级文件也是秒级的。

time fallocate -l 1G largefile.img

对比 dd 写 1GB 花了 3.3 秒, fallocate 快得多:

real    0m1.162s
user    0m0.000s
sys     0m0.960s

验证文件大小:

ls -lh largefile.img
-rw-r--r-- 1 lujun9972 users 1.0G  5月 9日 22:36 largefile.img

fallocate 支持 ext4、xfs、btrfs 等现代文件系统。如果遇到 "Operation not supported" 错误,说明你的文件系统不支持预分配(比如 tmpfs 或 FAT),这时退回到 dd

工作机制: fallocate 调用文件系统的 fallocate() 系统调用,文件系统直接标记一段连续块为"已分配但未初始化"。从文件系统的角度看空间已经被占用了,但实际数据块还没写入。读这些未初始化的块时,文件系统返回零值。这跟 2018 年我在《ext4 tips 三则》里写的 ext4 范围预分配是同一个机制。

场景三:测试占位,空间都不想占

有时候连预留空间都不必要,你只需要一个文件"看起来"有某个大小。比如:

  • 写测试用例,需要指定大小的输入文件
  • 临时占位,文件内容完全无所谓
  • 多个测试并行,磁盘空间有限

truncate 只改元数据,不分配任何磁盘块,创建的是稀疏文件。

truncate -s 1G sparsefile.img

du 看实际占用:

du -sh sparsefile.img
0	sparsefile.img

0 字节。文件大小只在元数据里存在,没有任何块被分配。用 stat 看更直观:

stat sparsefile.img
大小:1073741824 	块:0          IO 块大小:2097152 一般文件

注意 stat 输出里的"块:0"。对比前面 ddfallocate 创建的 100MB 文件, stat 都显示"块:204800"(204800 × 512 字节/块 = 100MB)。

truncate 真正的杀手功能是扩缩已有文件, ddfallocate 都做不到:

truncate -s +500M sparsefile.img
truncate -s 200M sparsefile.img

缩文件时 truncate 会静默丢弃超出新边界的数据,没有警告。对存着真实内容的文件用之前要想清楚。

场景四:创建 swap 文件

如果你要在 Linux 上添加 swap 空间,创建 swap 文件是常见做法。这个场景下,选错命令会导致 mkswap 报错。

内核要求 swap 空间必须被完全分配。稀疏文件不行,因为内核需要把内存页换出到实际存在的磁盘块上, truncate 创建的稀疏文件会让 mkswap 直接报错。

在 ext4 和 xfs 上, ddfallocate 通常都能用。但在 btrfs 上, fallocate 创建的 swap 文件可能有问题。最保险、兼容性最好的方法是 dd

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

要让它开机自动挂载,在 /etc/fstab 里加一行:

/swapfile none swap sw 0 0

如何验证文件的实际大小

创建完文件后, ls -lh 可以快速看一眼人类可读的大小,但它会四舍五入。精确比较三个命令的差异,你需要 statdu

stat 告诉你两个关键数字:"大小"是文件字节数,"块"是实际分配的 512 字节块数(中文 locale 下显示为"大小"和"块",英文 locale 下为 SizeBlocks )。

把三种方式创建的文件放在一起对比:

du -sh test_dd.img test_falloc.img test_trunc.img
100M	test_dd.img
100M	test_falloc.img
0	test_trunc.img
  • dd 创建的: du 显示 100M, stat 的"块"是 204800(204800 × 512 = 100MB),数据真实存在
  • fallocate 创建的: du 也显示 100M,空间已被预留,但数据块未初始化
  • truncate 创建的: du 显示 0, stat 的"块"是 0,没有任何磁盘分配

这也是判断一个文件是不是稀疏文件的标准方法: ls -lh 显示的大小比 du -sh 大得多,就是稀疏文件。

怎么选:一张对比表

标准 dd fallocate truncate
工作机制 逐字节写数据 文件系统预留空间 只改元数据
速度(1GB) 3.3s(SSD,取决于盘速) 1.2s 瞬间
实际分配磁盘块 是(预留,未初始化)
du -sh 显示 等于文件大小 等于文件大小 0
适用文件系统 所有 ext4/xfs/btrfs 等 所有
扩缩已有文件
swap 文件 最保险 ext4/xfs 上可用 不可用

记住三条就够:

  • 要测磁盘速度、要确保数据已写入 → dd
  • 要一个大文件占位,不关心内容 → fallocate
  • 要一个"看起来大"的文件,空间都不想占 → truncate