Windows ล่าช้าในการเขียนตาราง FAT ในไดรฟ์ USB ขนาดเล็กแม้จะมี“ การลบอย่างรวดเร็ว”


10

ฉันเห็นการเขียนที่ช้าไปยัง 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" ด้วยตนเองหรือไม่?

ไดรฟ์ USB ตั้งเป็น Quick Removal

นี่คือสารสกัดที่ถูกตัดทิ้งจากการติดตาม 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


1
คุณแค่อยากรู้อยากเห็น? หรือคุณกำลังเผชิญสถานการณ์ที่คุณจำเป็นต้องใช้ระบบไฟล์ FAT16 หรือไม่?
ฉันพูดว่า Reinstate Monica

2
ฉันกำลังช่วยทดสอบบอร์ดไมโครคอนโทรลเลอร์ (Adafruit Feather M0 และที่เกี่ยวข้อง) ซึ่งใช้งานตัวแปรของ MicroPython (CircuitPython) มันมีระบบไฟล์ FAT ขนาดเล็กที่มีรหัส Python เพื่อความสะดวกบอร์ดได้ตั้งค่าให้รีเซ็ตอัตโนมัติและเรียกใช้main.pyหรือไฟล์ที่คล้ายกันเมื่อตรวจพบว่าไฟล์ถูกเขียนขึ้น มันล่าช้าเล็กน้อยสำหรับการเขียนให้เสร็จสมบูรณ์ แต่ไม่นับสิบวินาที เราสามารถปิดใช้งานการรีสตาร์ทอัตโนมัตินี้ได้ แต่ยังจำเป็นต้อง "ขับ" ไดรฟ์เพื่อให้แน่ใจว่าการเขียนเสร็จสมบูรณ์ในเวลาที่เหมาะสม การกำหนดให้ผู้ใช้ทำการดีดออกเป็นสิ่งที่สร้างความรำคาญ เราต้องการหลีกเลี่ยงสิ่งนั้น
Dan Halbert

โปรดพิจารณาการแก้ไขในตอนต้นของคำถามของคุณสำหรับคำอธิบายสั้น ๆ เป็นบริบทพื้นหลังที่ดีที่จะมี
ฉันพูดว่า Reinstate Monica

คำแนะนำที่ดี เสร็จสิ้น
Dan Halbert

คำตอบ:


4

ฉันอาจพบรหัสไดรเวอร์ Windows จริงที่ทำให้เกิดปัญหา

MS เกิดขึ้นกับการรวมโปรแกรมควบคุมระบบแฟ้ม FAT ในแพคเกจของรหัสโปรแกรมควบคุมตัวอย่าง มีหลายที่ในไดร์เวอร์นั้นหากระบบไฟล์เป็น FAT12 คนขับจะไม่สนใจที่จะทำอะไรบางอย่างเช่นตั้งค่าบิตสกปรก (อาจจะไม่มี FAT12) หรือล้างข้อมูล FAT

https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/fastfat/verfysup.c#L774 https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys /fastfat/cachesup.c#L1212 และอาจเป็นช่วงที่สำคัญที่สุด: https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/fastfat/cleanup.c#L1101

ในลิงค์สุดท้ายcleanup.cระบบจะไม่ล้างข้อมูลหากระบบไฟล์เป็น FAT12 ฉันคิดว่านี่อาจทำให้พฤติกรรมที่ฉันเห็น:

    //
    //  If that worked ok,  then see if we should flush the FAT as well.
    //

    if (NT_SUCCESS(Status) && Fcb && !FatIsFat12( Vcb) && 
        FlagOn( Fcb->FcbState, FCB_STATE_FLUSH_FAT)) {

        Status = FatFlushFat( IrpContext, Vcb);

รายงานไปยัง Microsoft ใน Windows Feedback Hub ที่https://aka.ms/btvdog (URL พิเศษที่เปิดใน Feedback Hub)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.