man ntfs-3g
使big_writes
挂载选项看起来像是一件好事:
big_writes
This option prevents fuse from splitting write buffers into 4K
chunks, enabling big write buffers to be transferred from the
application in a single step (up to some system limit, generally
128K bytes).
没有列出任何缺点...我什么时候想避免安装 big_writes
?
答案1
这是一个好问题,真的。从我在这里看到的情况来看,它可能没有任何缺点。
时间回到2008年,big_writes
当时首先添加到FUSE米克洛斯说道:
在 2.6.26 之前,fuse 仅支持单页写入请求。理论上,所有熔断文件系统都应该能够支持大于 4k 的写入,因为 API 中没有任何内容可以阻止它。 不幸的是,NTFS-3G 中有一个已知的情况,即大写操作会导致文件系统损坏。 还可能存在其他文件系统,其中缺乏对大写入请求的测试会导致错误。
为了防止内核升级时出现此类问题,请默认禁用大写操作,但让文件系统设置一个标志来打开它。
具体问题在 NTFS-3G 中记录param.h
为:
/* * Use of big write buffers * * With small volumes, the cluster allocator may fail to allocate * enough clusters when the volume is nearly full. At most a run * can be allocated per bitmap chunk. So, there is a danger when the * number of chunks (capacity/(32768*clsiz)) is less than the number * of clusters in the biggest write buffer (131072/clsiz). Hence * a safe minimal capacity is 4GB */ #define SAFE_CAPACITY_FOR_BIG_WRITES 0x100000000LL
目前,它确实通过在请求 big_writes 之前验证 fs 容量至少为 4GB 来防御此限制。所以它是安全的。
事实上,图克塞拉建议打开它如果 NTFS-3G 正在耗尽您的 CPU:
解决方法:使用挂载选项“big_writes”通常会降低 CPU 使用率,前提是请求写入的软件支持大块。
未来
自从libfuse 3.0.0(2016)big_writes
始终开启:
安装
-o big_writes
选项已被删除。现在它始终处于活动状态。想要限制写入请求大小的文件系统应该使用该-o max_write=<N>
选项。犯罪
然而,libfuse3 是全新一代,ntfs-3g 根本不支持针对它进行构建。我无意中将新的 1MiB 写入缓冲区(libfuse 3.6.0)向后移植到 ntfs-3g 的内部迷你 libfuse2 中,因此如果您想使用它,可以从这里获取它:
- https://github.com/AOSC-Dev/ntfs-3g/commit/96f6fbedaf7aad70b4a4c39d8dd4a637a63beec1
- https://github.com/AOSC-Dev/ntfs-3g/commit/6aa576ae2a13fb636bff65bcb2701e731d2f5a94
是的,我确实记得重构写入大小/卷大小限制。是的,即使在现代 Ryzen 上,大文件写入速度也更快。
PS:我计划向 ntfs-3g 添加 libfuse3 支持,但没有真正的截止日期。 Tuxera 显然对这样的改变不感兴趣,而且为一个分叉起一个名字对我来说有点太多了。