ฉันเห็นการเขียนที่ช้าไปยัง FAT ในแฟลชไดรฟ์ USB ที่ฟอร์แมต FAT (FAT12) ขนาดเล็กความจุแม้ว่านโยบายสำหรับไดรฟ์จะถูกตั้งค่าเป็น "การลบอย่างรวดเร็ว" (ฉันเชื่อว่านี่หมายถึงการSurpriseRemovalOK
ตั้งค่าสถานะ) ฉันจับคำสั่ง SCSI ที่ส่งไปยังไดรฟ์ผ่าน USB: การตัดทอนไฟล์เกิดขึ้นทันทีไฟล์ทั้งหมด (2 เซ็กเตอร์ยาว 512 ไบต์) จะถูกเขียนทันทีหลังจากนั้น แต่มีการหน่วงเวลา 20-90 วินาทีก่อน FAT ได้รับการปรับปรุงเพื่อให้สะท้อนถึงการเขียนไฟล์
ขนาดของไดรฟ์มีความสำคัญ ฉันทดสอบและดูปัญหาเกี่ยวกับระบบไฟล์ FAT ขนาด 15MB และเล็กกว่า ตั้งแต่ 16MB ขึ้นไปการเขียนจะไม่ล่าช้า 16MB เป็นเบรกพอยต์ที่ฉันเห็นระหว่างการใช้ FAT12 และ FAT16 เมื่อฉันฟอร์แมตไดรฟ์ใน Windows (หมายเหตุเพิ่มเติมในภายหลัง: แต่จุดพัก FAT12 / FAT16 ขึ้นอยู่กับจำนวนของคลัสเตอร์ไม่ใช่ขนาดระบบไฟล์สัมบูรณ์)
ในขนาด 16MB และใหญ่กว่า Windows จะส่งPrevent/Allow Medium Removal
คำสั่งSCSI ก่อนการเขียนโดยถามว่าจะไม่ลบอุปกรณ์ แท่ง USB จะส่งคืนความล้มเหลวของคำขอเหล่านี้ (เพราะไม่สามารถรับประกันได้ว่าจะไม่มีการลบออก) แต่ Windows ก็พยายามอยู่ดี ร่องรอยขนาด 15MB และขนาดเล็กกว่าไม่ แสดงPrevent/Allow Medium Removal
คำสั่งใดๆ
(ฉันค้นพบปัญหานี้ในขณะที่ใช้ไมโครคอนโทรลเลอร์บอร์ดที่รองรับระบบไฟล์ FAT ขนาดเล็กที่มีรหัส Python เมื่อไมโครคอนโทรลเลอร์ตรวจพบการเขียนไปยังระบบไฟล์มันจะรอสักครู่เพื่อให้การเขียนเสร็จสมบูรณ์จากนั้นรีสตาร์ทโดยอัตโนมัติ แต่ไมโครคอนโทรลเลอร์เห็นรหัสที่เสียหายหรือระบบไฟล์เสียหายเนื่องจากการเขียนล่าช้า)
ทำไมการเขียนไปยัง FAT จึงล่าช้าเป็นเวลานานถึงแม้ว่าจะมีการตั้งค่า "การลบอย่างรวดเร็ว" ฉันสามารถบังคับให้เขียนได้ด้วยการทำ "ดีด" ในไดรฟ์ แต่กำจัดคำสัญญาของ "การลบด่วน" ถ้าฉันดึงไดรฟ์ก่อนมันจะมีตาราง FAT ที่ไม่ถูกต้อง สิ่งนี้ปฏิเสธคำแถลงในภาพหน้าจอด้านล่างว่าไม่ต้องใช้ "Safely Remove Hardware" นี่เป็นข้อบกพร่องหรือฉันขาดอะไรไปหรือเปล่า? มีวิธีใดที่จะบังคับให้การเขียนทั้งหมดเกิดขึ้นทันทีโดยไม่มี "Eject" ด้วยตนเองหรือไม่?
นี่คือสารสกัดที่ถูกตัดทิ้งจากการติดตาม Wireshark / USBPcap ที่แสดงปัญหา ฉันตัดทอนไฟล์ที่มีอยู่แล้วเขียนสำเนาใหม่ ###
ฉันได้เพิ่มความเห็น การเขียนส่วนใหญ่ไปยังไดรฟ์ USB จะเกิดขึ้นประมาณ 5 วินาทีในการติดตาม แต่การเขียน FAT ขั้นสุดท้ายไม่ได้จนกว่า 26 วินาที
No. Time Source Destination Protocol Length Info
### write directory entry to truncate file
13 5.225586 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x00000041, Len: 8)
14 5.225838 host 1.2.2 USB 4123 URB_BULK out
### write FAT entries to truncate file
16 5.230488 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003b, Len: 1)
17 5.230707 host 1.2.2 USB 539 URB_BULK out
19 5.235110 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003e, Len: 1)
20 5.235329 host 1.2.2 USB 539 URB_BULK out
### write directory entry for
22 5.252672 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x00000041, Len: 8)
23 5.252825 host 1.2.2 USB 4123 URB_BULK out
### write out file data (2 sectors of 512 bytes)
25 5.257416 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x000000c1, Len: 2)
26 5.257572 host 1.2.2 USB 1051 URB_BULK out
### 20 second delay
### finally, write FAT entries to indicate used sectors
79 26.559964 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003b, Len: 1)
80 26.560191 host 1.2.2 USB 539 URB_BULK out
82 26.560834 host 1.2.2 USBMS 58 SCSI: Write(10) LUN: 0x00 (LBA: 0x0000003e, Len: 1)
83 26.560936 host 1.2.2 USB 539 URB_BULK out
ฉันสร้างร่องรอยเช่นนี้โดยใช้แฟลชไดรฟ์ทั่วไปและยังมีไมโครคอนโทรลเลอร์ที่จำลองไดรฟ์ USB MSC ขนาดเล็กทั้งใน Windows 7 และ windows 10
เพื่อให้ชัดเจนนี่คือไดรฟ์ที่จัดรูปแบบ FAT12 หรือที่เรียกว่า "FAT" ในเครื่องมือการจัดรูปแบบของ Windows
main.py
หรือไฟล์ที่คล้ายกันเมื่อตรวจพบว่าไฟล์ถูกเขียนขึ้น มันล่าช้าเล็กน้อยสำหรับการเขียนให้เสร็จสมบูรณ์ แต่ไม่นับสิบวินาที เราสามารถปิดใช้งานการรีสตาร์ทอัตโนมัตินี้ได้ แต่ยังจำเป็นต้อง "ขับ" ไดรฟ์เพื่อให้แน่ใจว่าการเขียนเสร็จสมบูรณ์ในเวลาที่เหมาะสม การกำหนดให้ผู้ใช้ทำการดีดออกเป็นสิ่งที่สร้างความรำคาญ เราต้องการหลีกเลี่ยงสิ่งนั้น