![如何使用具有特定簇大小的更强大的 Linux 可用文件系统来格式化 SD 卡,以获得更好的写入性能?](https://linux22.com/image/1302344/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E7%B0%87%E5%A4%A7%E5%B0%8F%E7%9A%84%E6%9B%B4%E5%BC%BA%E5%A4%A7%E7%9A%84%20Linux%20%E5%8F%AF%E7%94%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%9D%A5%E6%A0%BC%E5%BC%8F%E5%8C%96%20SD%20%E5%8D%A1%EF%BC%8C%E4%BB%A5%E8%8E%B7%E5%BE%97%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%86%99%E5%85%A5%E6%80%A7%E8%83%BD%EF%BC%9F.png)
目标:microSD 卡格式化...
- 以获得最佳写入性能
- 仅适用于嵌入式 Linux
- 为了提高可靠性(可能会发生随机电源故障)
- 使用 64kB 簇大小
我在嵌入式 Linux/ARM 设备中使用 8GB microSD 卡来存储数据。SD 卡不可移动。我一直使用 ext3 而不是预装的 FAT32,因为它似乎能更好地处理写入过程中的随机电源故障。但是,我一直注意到,使用金士顿预装的 FAT32 时,我的写入性能始终最佳。如果我用 FAT32 重新格式化卡,性能仍然会受到影响。浏览维基百科后,我偶然发现了以下评论,说有些卡针对特定的簇大小进行了优化。就我而言,金士顿预格式化为 64kB 簇大小。
使用不同的文件系统(甚至相同的文件系统)重新格式化 SD 卡可能会使卡变慢或缩短其使用寿命。有些卡使用耗损均衡技术,其中经常修改的块在不同时间映射到内存的不同部分,并且一些耗损均衡算法是针对 FAT16 或 FAT32 设备上文件分配表的典型访问模式而设计的。[60] 此外,预格式化的文件系统可能使用与卡上物理内存的擦除区域相匹配的簇大小;重新格式化可能会改变簇大小并降低写入效率。
答案1
市面上的大多数 SD 卡(以及 USB 驱动器)都针对 FAT32 进行了优化。将它们与任何其他 FS 一起使用都会导致性能下降。
更多信息左心室收缩末期。
答案2
注意:SD 卡协会格式化工具为您执行以下操作。
我还没有找到所有设备的完整答案。不过,这是使用 FAT32 的 8GiB 卡的答案。
对卡进行分区,使 FAT32 分区从扇区 8,192 开始,该扇区距磁盘起始位置 4MiB。接下来,使用 32kiB 簇格式化 FAT32 分区,并设置“保留扇区”的数量,使 FAT32 分区的数据区域(簇 2)从逻辑扇区 8,192(或距磁盘起始位置 8MiB(距分区起始位置 4MiB))开始。
Use 32kiB clusters
| 4MiB | 4MiB | remainder of disk |
| ------- | --------------------------------- | ------------------ |
| MBR | First Partition Header + FAT tables | First Partition Data |
总结理由:SD 卡协会建议将这些 4MiB 边界作为优化区域,并建议将 FAT32 作为这些大小的卡的文件系统。卡中的控制器芯片针对第二个 4MiB 区域中的小型读取/写入进行了优化。
还有很多事情要做,但这是快速而粗略的答案。上述方法仅适用于 32kiB 集群的磁盘 < 16GiB 和 64kiB 集群的磁盘 < 32GiB。我怀疑在更大的磁盘大小下,数据区域会被推到逻辑 8MiB,但我没有大于 8GiB 的磁盘可用。