Văd scrieri întârziate pe FAT pe o unitate flash USB formatată cu capacitate mică FAT (FAT12), chiar dacă politica pentru unitate este setată la „Eliminare rapidă”. (Cred că acest lucru înseamnă că semnalizatorul SurpriseRemovalOK este setat). Am capturat comenzile SCSI trimise pe unitate prin USB: scrierile trunchierii de fișiere se întâmplă imediat, întregul fișier (lung de 2 sectoare de 512 octeți) este scris imediat după aceea, dar există o întârziere de 20-90 secunde înainte de FAT este actualizat pentru a reflecta scrierea fișierului.

Dimensiunea unității este semnificativă. Am testat și am văzut probleme pe sistemele de fișiere FAT de dimensiune 15MB sau mai mică. La 16 MB și mai mult, scrierile nu sunt întârziate. 16MB este punctul de întrerupere pe care îl văd între utilizarea FAT12 și FAT16 atunci când formatez o unitate în Windows. (Notă adăugată mai târziu: Dar punctul de întrerupere FAT12/FAT16 depinde de numărul de clustere, nu de dimensiunea absolută a sistemului de fișiere).

Pe 16 MB și mai mari, Windows trimite comenzile SCSI Prevent/Allow Medium Removal înainte de a scrie, cerând ca dispozitivul să nu fie eliminat. Stick-ul USB întoarce de fapt eșecul la aceste cereri (deoarece nu poate garanta nicio eliminare), dar Windows încearcă oricum. Urmele de 15 MB și cele mai mici nu prezintă comenzi Prevenire/Permitere eliminare medie.

(Am descoperit această problemă în timp ce foloseam o placă de microcontroler care acceptă un mic sistem de fișiere FAT care conține cod Python. Când microcontrolerul detectează o scriere în sistemul de fișiere, așteaptă puțin până la finalizarea scrierii și apoi repornește automat și rulează codul Python nou scris Dar microcontrolerul a văzut codul corupt sau un sistem de fișiere corupt din cauza scrierii întârziate.)

De ce este întârziată scrierea către FAT atât de mult, în ciuda setării „Eliminare rapidă”? Pot forța scrierile făcând un „Eject” pe unitate, dar care înfrânge promisiunea „Quick Removal”. Dacă aș trage unitatea devreme, ar avea o masă FAT incorectă. Acest lucru contrazice afirmația din captura de ecran de mai jos despre faptul că nu trebuie să folosiți „Înlăturați hardware-ul în siguranță”. Este o problemă sau îmi lipsește ceva? Există vreo modalitate de a forța toate înregistrările să se întâmple imediat fără un „Eject” manual?

tabelul

Iată un extract tăiat dintr-o urmă Wireshark/USBPcap care arată problema. Trunchiez un fișier existent și apoi scriu o nouă copie a acestuia. Am adăugat comentarii cu ###. Majoritatea scrierilor pe unitatea USB au loc la aproximativ 5 secunde în urmărire, dar scrierea FAT finală nu durează decât 26 de secunde.

Am generat urme de acest fel folosind o unitate flash obișnuită și, de asemenea, cu o placă de microcontroler care emulează o mică unitate USB MSC, atât pe Windows 7, cât și pe Windows 10.

Pentru a fi clar, aceasta este o unitate formatată FAT12, numită doar „FAT” în instrumentul de formatare Windows.