ext4文件系统写入小文件时块未使用尾部的处理机制及用户可控性问询
ext4文件系统写入小文件时块未使用尾部的处理机制及用户可控性问询
嗨,我来帮你把ext4这块的逻辑理清楚哈~
先直接回答你的核心问题:当ext4把一个曾经用过、后来被释放的4KiB块分配给你的100B小文件时,块里没被这100B占用的尾部内容(也就是剩下的差不多4096-100字节)会原封不动地保留下来——不会自动写零,也不会填充随机数,就保持它上次被使用时的状态。
为啥会这样?其实是文件系统的性能优先原则在起作用:额外写零或者随机数都是多余的IO操作,会拖慢写入速度,ext4默认不会做这种无意义的性能损耗。而且从常规文件访问的角度来说,这些尾部数据对你是完全不可见的——你用cat或者普通的文件读取API根本读不到它们,只有直接去读取块设备(比如用dd if=/dev/sda1 of=block_dump bs=4096 skip=XXX这种操作)才可能看到残留的内容。
再说说你关心的「用户能不能控制这个行为」:
- 想要自动把尾部清零:ext4本身没有默认开启的配置能做到这一点,但有几种间接方式:
- 如果你用ext4的内置加密功能(比如通过
cryptsetup配置),分配给加密文件的块会被加密处理,残留的旧数据即使存在,没有密钥也无法解密读取,相当于间接实现了“清除敏感数据”的效果; - 手动操作的话,可以用
fallocate --zero-range命令,指定文件的尾部区域来填充零,但这需要你每次写小文件后手动执行,无法自动触发; - 另外,如果你挂载文件系统时用了
discard选项,这是给SSD做TRIM用的,它不会清零块内容,只是告诉SSD这块可以被回收,和你的需求不是一回事。
- 如果你用ext4的内置加密功能(比如通过
- 想要用随机数覆盖尾部:ext4没有内置的自动机制支持这个。你只能手动通过工具实现,比如写完小文件后,用
dd if=/dev/urandom of=your_file bs=1 seek=100 count=$((4096-100))这样的命令,往文件尾部填充随机数据直到占满整个块,但这完全是手动操作,文件系统不会帮你自动做。
补充一句:Ubuntu 20.04默认的ext4配置就是上面说的「保留尾部残留」的状态,没有额外的自动清理逻辑哦。
备注:内容来源于stack exchange,提问作者Zorglub29
相关产品推荐
相关产品推荐

