在 macOS 下创建一个高通用性的 U 盘

Author Avatar
黎明余光 5月30日
  • 在其它设备中阅读本文章

最近迫于手头 U 盘要么丢了要么满了要么坏了,买了个「闪迪至尊高速™ Type-C USB 3.1 双接口 OTG 闪存盘 」(识别为 Sandisk Ultra,吐槽下闪迪的迷惑命名,当然产品质量还是可以的,这价格要什么自行车)。

TL;DR: 为了你的时间,请找台 Windows 设备初始化你的闪存盘,怎么整都不会出大问题(逃
如果你坚持在 macOS 下初始化并且没有更新强迫症的话,Apple 官方推荐选择 MBR + FAT32 / exFAT。

阅读下文时请铭记:数据无价,谨慎操作。

错误示范

到手检查了下发现默认 MBR + FAT32,作为一个更新强迫症怎么可以容忍这么古老的组合,连个系统镜像都放不下。果断拿出 macOS 的磁盘工具选择抹掉,选择 GUID 分区表 + exFAT 一气呵成。

289eb376f46cb5b26b8192a51d0da6f9.png

看起来完全没有问题,在 macOS 下写入等操作一切正常,然后因为我最近从 MI 6X 换成了 iPhone 11 也没 Type-C 设备测试,给予了 Apple 充分的信任后就先这么放着了。

a75a112359f4b283c9a3341907eec11c.png

直到我把这个闪存盘插进了一台 Windows 7 的 PC,正确安装设备后并不能正确挂载磁盘,在 Windows 磁盘管理中是这样的。沙雕苹果创建的 EFI 分区识别正确,但是数据分区的卷名及文件系统均不正确。尝试对分区进行任何操作,都会提示「系统找不到指定的文件」。然而在 Windows 10 下一切正常,不知道 Apple 在分区表上加了什么黑魔法。

e9f3e7dfda662d0cecdbc0283457aea7.png

4138800dcecd401e49ef0191792d421f.png

Windows 7 的占有率依然不低,问题还得解决。那我们该怎么正确地在 macOS 下使这个设备可以在 Windows 7 下正确运行呢?

解决方案:直接干掉没什么卵用的 EFI 分区

作为一个单纯的存储设备,我们并不需要一个 EFI 分区,并且在没有这个分区的情况下 macOS 也是可以正确挂载磁盘的,并不会提示磁盘存在问题、急救失败 balabala 然后给你锁只读。

为什么我会知道这个提示?在 macOS 上使用 gdisk 全默认大小只分一个区就会报这个错误。即使用 gdisk 把磁盘工具分出的 MBR 转成 GPT 也是不可行的。但是我们接下来还得用到 gdisk,不过只是删除 EFI。

对,没错,干掉这个分区在 Windows 7 下就一切正常了。(原因我没找到,交给评论(跑

在 Windows 下,可以使用 DiskGenius 之类的工具直接干掉然后合并(自带的磁盘管理中 EFI 是受保护的),然而 macOS 上并没有(至少我没找到)类似的工具,能用的 GUI 工具只有自带的「Disk Utility.app」,而这玩意,它连 EFI 分区都不给你显示。

如果你认真看图的话,应该可以发现开篇的图中子分区数为 2,但如果你单击「分区」,则只能看到一个 exFAT 分区。

52a34cf35bc0afb6348dc0533a094faa.png

也别妄图使用它的 CLI 版本 diskutil,合并分区会失败,而重新分区的话即使指定分区数为 1 也依然会创建 EFI 分区。

数据无价,谨慎操作。
异常 瞎搞 操作将导致 Disk Utility 完全无法处理此驱动器(无法挂载、无法推出、分区大小 > 16EB、卡在写入分区表等等),届时最好借助一个 Windows 设备来处理。
别问我怎么知道的。
62fa478446eb38f0eea10a1191323488.png
> diskutil mergePartitions force ExFAT AppleYES disk2s1 disk2s2 # 是 Apple 自己不想 YES 的(
Format disk-node disk2s1? (y/N) y
Merging partitions into a new partition
     Start partition: disk2s1 EFI
     Finish partition: disk2s2 F-ckApple

Merging partitions encountered error "Couldn't read partition map (-69876)".
The erase will not occur.

使用 gdisk 去掉那个该死的 EFI

执行 diskutil list 确定闪存盘的 DeviceNode,比如下面的 /dev/disk2

> diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
--- Some internel disk info ---
   5:                APFS Volume Macintosh HD            11.2 GB    disk1s5

->> /dev/disk2 <<- (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *123.1 GB   disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:       Microsoft Basic Data F-ckApple               122.8 GB   disk2s2

现在可以用 brew cask install gdisk 来获取一份 gdisk,然后 sudo gdisk /dev/disk2,依次输入

  • p(查看分区表,确定你没有选错磁盘)
  • d(删除分区)
  • 1(该磁盘上的第一个分区,即 EFI)
  • w(保存修改)
  • Y(确认)

b0a61881880ded7bc8943f639f471022.png

尽管我们并不能利用起来前面的 200M 空间,但至少 Windows 7 可以正常识别了,目标达成!

理论上可以合并分区,但我尝试使用 gdisk 一通瞎搞 后反而导致磁盘工具识别错乱,所以在此不作介绍。
当然,这一操作可以在 Windows 上完成,不过也需要借助第三方工具。

f51610007d5de20b0543971064ddff8d.png

更进一步

为了最佳的通用性,exFAT 并不是最好的选择,毕竟某些自带还原的死活不更新的 Windows XP 设备可支持不了这先进(指发布于 2006)的文件系统。是的,发布于 2008 的 Service Pack 3 并没有提供 exFAT 支持, 而是在之后通过一个 补丁 (发布于 2009)才加入了支持。

隆重介绍 Universal Disk Format!关于这个文件系统的更多信息,可以参考维基或者是 这个知乎回答 。总之,UDF 2.0x 版本可以在所有主流桌面操作系统上读写,以及 Windows XP 上只读。

当然,UDF 也会有一些微妙的坑, 由于实现细节上的一些差别,在默认情况下使用 Windows 系统格式化出来的 UDF 分区,在 macOS 只能被只读挂载。反之用 macOS 格式化的 UDF 分区,到了 Windows 上也会变成只读状态。 Github 上有一个项目解决了这个问题但是这个工具只能运行在 macOS 或 Linux 下。

这个项目就是 JElchison/format-udf,用法请参照 README,大体上来讲只需要运行 ./format-udf.sh /dev/disk4 "My UDF External Drive" 就可以了。

> ./format-udf.sh /dev/disk2 "AppleYES" 
[+] Validating arguments...
[+] Testing dependencies...
[+] Looking for drive detail tool... using /usr/sbin/ioreg
[+] Looking for drive listing tool... using /usr/sbin/diskutil
[+] Looking for drive info tool... using /usr/sbin/diskutil
[+] Looking for drive summary tool... using (none)
[+] Looking for unmount tool... using /usr/sbin/diskutil
[+] Looking for UDF tool... using /sbin/newfs_udf
[+] Detecting logical block size...
[*] Detected logical block size of 512
[+] Validating detected logical block size...
[+] Detecting physical block size...
[+] Validating file system block size...
[*] Using file system block size of 512
[+] Detecting total size...
[*] Detected total size of 123060879360
[+] Validating detected total size...
[+] Gathering drive information...
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *123.1 GB   disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:       Microsoft Basic Data F-ckApple               122.8 GB   disk2s2
The above-listed device (and partitions, if any) will be completely erased.
Type 'yes' if this is what you intend:  yes
[+] Unmounting device...
Unmount of all volumes on disk2 was successful
[+] Zeroing out first chunk of device...
4096+0 records in
4096+0 records out
2097152 bytes transferred in 0.967494 secs (2167612 bytes/sec)
[+] Formatting /dev/disk2 ...
write to block device: /dev/disk2  last written block address: 240353279
[+] Writing fake MBR...
16+0 records in
16+0 records out
16 bytes transferred in 0.072425 secs (221 bytes/sec)
2+0 records in
2+0 records out
2 bytes transferred in 0.024521 secs (82 bytes/sec)
[+] Successfully formatted 
Please disconnect/reconnect your drive now.

92cb74e867086dc259b5c607e8e057a3.png

6affe477157635a2c435188bfecce0ec.png

UDF 在 macOS 下的一个坑

macOS 应该是针对其应用场景特殊化了,只有全盘写为 UDF 才能被 macOS 挂载,磁盘管理可以看到没有分区,因此如果同时用作 PE 就没法在 macOS 下使用 UDF 了。

macOS seems to only mount UDF file systems that utilize the full disk (not just a partition)
Source

关于 JElchison/format-udf 的备注

这个项目创建的分区表是他所称的 Fake MBR,因此更改为其他类型时最好使用一些工具重建分区表,否则可能会出问题,比如 U 启通虽然提示写入成功实则失败,并且会彻底损坏分区表。使用 UQT 的还原空间应该也没问题。

UDF 相关阅读

关于 UDF 文件系统的介绍和详细规范,这里有篇文档可以参考一下:

https://blog.csdn.net/johnny_nass_hu/article/details/48065895
转载注:此为答主个人翻译,英文原版为 Wenguang's Introduction to Universal Disk Format (UDF)

我曾在另一个问题里发表过 UDF 文件系统的回答,答主应该是看到了我那篇回答受到启发而写的吧?

到目前为止在各大平台下 UDF 文件系统确实是最好的选择,尽管这个文件系统可以说是冷门到无人问津的程度,但在它能有和 FAT32 相当的广泛兼容性且能支持存储>4G 单文件的天然优势下,俨然成为了跨平台环境的首选文件系统。

之所以 UDF 如此冷门那是因为它和其他常见文件系统相比本身确实没有什么亮点也得不到推广,虽然初版 UDF 早在 1996 年就已经发行了,但是 OSTA 光学存储技术协会只针对于光学存储媒体而设计并没有在非光盘介质上大力推广使用,一定程度上就导致它不够流行也就没有太大的占有率。而 UDF 在整体上的特性和 exFAT 最为相似,但 UDF 有类似于日志文件系统的元文件结构所以在某些方面要优于 exFAT,其实 UDF 的稳定性在多数情况下比 exFAT 更高,虽然 UDF 和 exFAT 都通过支持元数据校验来弥补无日志的缺陷,但是 UDF 的校验机制和算法更为完善,而且它也有类似于 exFAT 的 TFAT 写保护机制,在一定程度上保证了数据的安全性。

虽然 UDF 有着这些优势,但也不是完全没有劣势:

1、UDF 虽然可以应用在非光学存储媒体上,但其性能并不一定是最佳的。

2、UDF 在作为可引导启动卷还存在一些问题,尽管 UDF 是一个自由开放的格式,但 UEFI 协会到目前为止并没有将其纳入规范,不像 FAT 一样有着原生 UEFI 引导支持,此外 Windows 启动管理器不能识别 UDF 分区无法引导,这也意味着用于制作 U 盘启动盘会有所受阻。

3、UDF 唯一的缺陷就是支持的分区大小有限,由于与 MBR 分区表一样使用四个字节即 32 位表项来描述分区大小,因此在常规的 512 字节扇区中最大只能支持到 2TB 容量,尽管这对于目前主流的 U 盘容量还在 GB 级别来说已经足够,但在将来很可能会受制于该瓶颈而不够用。

PS:如果想要强行为 UDF 续命也不是不可以,使用原生 4K 逻辑扇区则可实现,当扇区大小为 4KB 时,MBR 和 UDF 的容量上限均能提高至 16TB。

参考

碎碎念:VMware Workstation 微妙的 USB Passthrough

  • USB Passthrough 要求连接宿主机的 USB 设备使用的 USB 版本与虚拟机 USB 控制器的 USB 兼容性一致,否则会重定向失败

    • 然后我才知道我两台 Dell 显示器的 USB Hub 居然都是 USB 3.1
  • 在 Windows 7 的虚拟机上使用 USB 3.1 时需要安装 Intel® USB 3.0 eXtensible Host Controller Driver。注意,不是在宿主机中安装,而是在虚拟机中安装。

2744e3c4d39dbcec83dc99fe06a4e985.png

本文链接:https://blog.lim-light.com/archives/create-a-universal-flash-disk-on-macos.html
本文采用 CC BY-NC-SA 3.0 CN 协议进行许可,阅读 相关说明