如何“手动”清除 FAT32“脏”位?

如何“手动”清除 FAT32“脏”位?

根据 Microsoft FAT32“规范”,FAT32 卷应在安装时清除其“干净”标志(ClnShutBit),并在卸载/弹出时设置。

事实上,这是 Linux 和 Mac OS X 上的行为 - 以读/写方式安装 FAT32 USB 设备会将其标记为“脏”,而卸载会将其标记为“干净”。如果在未卸载/弹出的情况下移除设备,则标志保持清除状态(不干净/脏)。

如果将标记为“脏”的 USB 驱动器插入 Windows 10,它会弹出一条消息,提示用户“可能存在问题……”并提示进行扫描和修复。从技术上讲,这是正确的 - 可能存在问题,但也可能不存在问题(例如,如果在手动移除之前完全清除了对驱动器的写入)。Windows 并不遵循“规范” - 它似乎在安装时将 USB 驱动器标记为干净,这样如果手动移除并重新插入它们,它们就不会收到此提示(也许它在写入操作之前标记为脏,在完成后标记为干净? - 我不知道)。

我怎样才能强制在 Linux 上清除这个标志?

(请不要回答为什么不这样做等等。)

维基百科 FAT 文件系统设计条目讨论了 FAT 中的特殊条目,并且在 InterWebs 上有一个名为“Microsoft FAT 规范”的 Microsoft 文档(FAT32 Spec (SDA Contribution).pdf),其中讨论了 ClnShutBitMask。

但是,我不清楚如何找到它。如果我将 USB FAT32 卷(在 Linux 上)安装为只读,使用 dd 将内容复制到文件,然后将其重新安装为读写并再次复制,则字节是相同的。

例如 8GB USB 驱动器 df 报告为 /dev/sdd1

sudo mount -o remount,ro /media/user/USB/
sudo dd if=/dev/sdd of=/tmp/usbbytes-ro bs=1024 count=8388608
sudo mount -o remount,rw /media/user/USB/
sudo dd if=/dev/sdd of=/tmp/usbbytes-rw bs=1024 count=8388608
cmp -l /tmp/usbbytes-ro /tmp/usbbytes-rw

报告并无任何不同。仅供参考:

sudo file -s /dev/sdd   
/dev/sdd: DOS/MBR boot sector; partition 1 : ID=0xc, active, start-CHS (0x0,32,33), end-CHS (0x3d3,48,29), startsector 2048, 15728640 sectors
sudo file -s /dev/sdd1   
/dev/sdd1: DOS/MBR boot sector, code offset 0x58+2, OEM-ID "SYSLINUX", sectors/cluster 8, Media descriptor 0xf8, sectors/track 62, heads 248, hidden sectors 2048, sectors 15728640 (volumes > 32 MB), FAT (32 bit), sectors/FAT 15336, reserved 0x1, serial number 0x98d03da8, label: "USB        "

有任何想法吗?

(出于好奇,我们有一个运行 Debian9 的嵌入式设备,它允许用户插入和手动移除 USB 驱动器,但没有用于“弹出”的 UI 功能。用户抱怨说,任何插入和从设备移除的 USB 随后都会在 Windows 上出现“扫描和修复”提示)

谢谢!

相关内容