U盘、分区表、Windows和Linux对USB设备的识别

最近再次遇到了Linux下将U盘分区并格式化后Windows无法识别的情况。按理说单一分区exFAT格式不至于识别不到!?

请教了一下Google老师,在红迪上找到了一个被downvoted并回复点草的解释(但其实说对了一部分):

r/psyblade42:

In my experience windows is very picky about partition tables.

If windows thinks of it as a USB stick it MUST NOT HAVE a partition table.

If windows thinks of it as a USB hard drive it MUST HAVE a partition table.

Windows’ perception of hdd vs. stick might not match yours (or anyone elses for that matter)

经过实验后发现的确如此,但又不完全如此:原先没有分区表,在Windows下双击盘符直接格式化使用的U盘,在Linux下只能看到一个sda,确实没有分区表;但这又与经验是冲突的, 我自己就用过多个分区的U盘的呀!? 虽然explorer.exediskmgmt.msc不支持将U盘分多个分区,但很显然diskpart.exe可以——

于是我尝试用diskpart给U盘分区,不试不知道,一试吓一跳:无论MBR还是GPT,diskpart都会给U盘创建正常的分区表(哪怕是全盘一个分区),Linux下就可以看到sda里面还有一个sda1

那问题又回来了,为甚喵Linux下分出来的分区表Windows不认呢?

最终经过再一番搜索,发现了罪魁祸首:分区的msftdata标志。在U盘有分区表的情况下,Windows只会列出带有msftdata flag的分区,而在Linux下直接创建出来的分区并喵有这个flag。(尤其是通过清零等方式破坏原有分区表之后,Linux当然不会主动为创建的分区带这个flag啦)Source

既然知道了原因便可以对症下药,创建分区之后用parted等工具给希望在Windows下访问的分区添加msftdata标志即可。

1
# parted /dev/sda set 1 msftdata on

进一步试验更新:若在Linux下创建MBR分区表,parted就无法添加msftdata标志,此时在Windows下就无法识别。但通过DiskGenius等工具转换Type ID之后,分区又能正常识别。申必喵。 Windows,很神奇罢!

更新2:dd清零的盘在Windows下直接双击格式化使用,DiskGenius工具识别为USB-FDD。并不是USB-ZIP!