传统上,存储设备(硬盘驱动器)被认为没有除了简单地覆盖数据之外“删除”数据的机制。我可以看到一些理论场景,在这些场景中,块设备被告知不再需要其底层存储将很有用,但我没有看到任何机制可以做到这一点。
用例:
- 几乎所有现代 SSD 都使用磨损均衡来延长他们的寿命。这可以通过简单地拥有比报告的大小更多的内部存储块并在它们之间循环来实现。但如果 SSD 被告知不再需要块,它将提供一个更大的池来循环。
- 在 RAM 中创建的文件系统(不包括 tmpfs)。在删除文件的情况下,如果文件系统无法报告不需要的空间,则底层 ramdisk 无法将分配的空间返回到可用 RAM。
- 交换解决方案,例如使用兹拉姆当交换空间中不再使用页面时,需要通知块设备,否则它们会在 RAM 中留下大量“垃圾”。
这看起来像一个类似的概念FALLOC_FL_PUNCH_HOLE
。但从我在那里读到的内容来看,这纯粹是为了从文件系统中的文件中取消分配空间。也就是说,用户空间应用程序可以通知文件系统不需要空间。但这与文件系统通知块设备不需要空间不同或者是吗?
那么在每种情况下是否都有一种解决方法,或者我们有一种机制允许文件系统和交换在不再需要块时通知块设备?
答案1
在 Linux 上,文件系统可以通知块层不再需要一个或多个块,使用blkdev_issue_discard
。实际上,当请求相应的行为时,文件系统使用它来丢弃块,通常是通过使用“丢弃”选项挂载文件系统。中间层也使用此请求来传播丢弃,例如在MD层。
默认情况下不会这样做;联机ext4
帮助页说“默认情况下它是关闭的,直到完成足够的测试”,但正如太茶提醒我,许多 SSD 不能很好地应对不断的丢弃,因此建议的方法是定期运行fstrim
反而。大多数文件系统的默认行为是在删除相应内容时在内部将块标记为未使用,而不通知底层这一事实。这就是允许在意外删除后恢复文件内容的原因,无论是使用文件系统特定的“取消删除”实用程序,还是块设备探索工具,例如摄影记录。标记未使用的块而不进行进一步处理还可以快速执行文件删除。
事实上,如果没有显式丢弃,文件系统在不再需要块时不会进行太多处理,这意味着精简配置涉及的工作比预期的要多。因此,Xen 包括对 Ext3 文件系统精简配置的特定支持——那里的块层“了解”它所存储的文件系统,并利用它来识别不需要的块,而无需文件系统明确通知它任何信息。在 VMware 上,精简配置,或者更确切地说,识别未使用的块以减少精简配置块设备的存储要求,需要将未使用的块清零并运行分析工具。基于 SAN 的精简配置系统也有类似的支持。 (通过丢弃支持,精简配置变得更加容易 - 精简配置卷宣传对修剪的支持,文件系统完成其余的工作。)
FALLOC_FL_PUNCH_HOLE
正如您所描述的,是文件系统级操作,但是当底层文件系统支持它并使用适当的丢弃选项安装时,它将导致块被丢弃。