所有USB驱动器都有一个微控制器,可接收传入的USB请求并将其转换为与USB设备上实际存储一致的操作。
对于具有NAND闪存的USB驱动器,这些设备上的固件/微控制器可能(希望)实现确实损耗均衡的FTL。
不幸的是,如果没有任何固件的源代码以及对该USB闪存驱动器上小型硬件平台的全面了解,您将无法知道微控制器到底在做什么。
没有USB闪存驱动器的标准硬件,固件或软件平台之类的东西,因此您不能依靠任何种类的标准来帮助您准确预测固件在处理传入USB请求时可能在做什么,而无需深入了解USB闪存驱动器。微控制器,NAND闪存硬件和相关固件。
这与驱动器或操作系统内部的功能无关。
我知道,但是没有这些内部知识,您就无法有意义地修改写入行为。特别是由于存在各种微控制器,固件和NAND闪存芯片,可能会对一个闪存驱动器产生任何影响的东西可能无法在另一个闪存驱动器上工作。
未针对闪存优化的“哑”文件系统
“针对闪存进行了优化”的文件系统需要直接访问闪存硬件,因此它们可以自己向闪存发出擦除命令。通过大容量存储命令通过USB,SATA,SCSI总线与设备通讯不是直接访问。
可能最容易遇到这种情况的情况是基于Linux的消费级路由器-基础Linux操作系统已打开,可以访问4MB,8MB,16MB或类似的闪存芯片,并且可以与其通信并直接对其进行管理。Android手机与此类似。
除了TRIM之外,您不能在USB或SATA大容量存储设备上发出擦除命令(这只是对设备固件的请求,而不是对闪存芯片的直接命令),这些标准是针对硬盘驱动器而不是闪存硬件的。
现在,如果我要创建一些文件A,B和C,然后重复就地修改文件,这会使驱动器磨损多于添加B',C'等。
闪存芯片以页面形式读写。它们在Linux项目称为“ eraseblocks”的页面集中被擦除。(这与机械硬盘驱动器非常不同)。
基于闪存的存储设备实现FTL(闪存转换层)。这是什么:它们维护一个内部表,该表将OS可见的“块”映射到固件可见的闪存页(从PBA到LBA),并且还将跟踪哪些“擦除块”已准备好用于新数据。传入的写入不会仅根据传入的块号进入闪存页面,而是在固件认为合适的任何地方-固件都会将其内部PBA更新到LBA表以在下一个需要时找到它。
良好的固件会出于性能原因而尝试将写入重定向到具有已擦除页面的擦除块,并且它们将在后台交换块以尝试进行写入,因此在写入之前不需要擦除。当驱动器已满时,这样做的可能性较小,并且性能会受到影响。
然后,您可以假定即使从OS角度来看相同的文件和“阻止”写入,也不会到达闪存上的相同位置。因此,您无需担心就地修改文件,因此一无所获。
这个故事的寓意:不要担心。像对待普通硬盘一样对待它,并保留备份。坏脾气的闪存驱动器将比优质的闪存驱动器更早地死亡。