UDF可以作为硬盘格式使用吗?

最近我多次看到人们将UDF提出作为在Linux、Mac OS X和Windows XP及以上操作系统上使用的跨平台格式的解决方案。
我在这里搜索了一下,并没有找到相同的建议(大部分都建议使用ntfs-3g,但似乎需要付费,并且在Mac上没有预装)。
所以我的问题是:如何正确地实现这个,有人做过吗?你是否填满了驱动器并删除了一些文件以腾出空间,发现一切都像一个真正的可读写格式一样工作,即使它似乎主要是一种只写一次的格式?
叫我疯狂吧,但我真的希望UDF系统也能自动挂载,并且可以由登录用户进行写入。到目前为止,我尝试过的方法(如kicsyromy提到的udftools格式化)并没有解决这个愿望。

1一个澄清:ntfs-3g是免费的。它的源代码是免费提供的(即无需费用)。它也是“自由”的(参见自由软件)。ntfs-3g是Ubuntu中的NTFS驱动程序!在OS X上手动构建/安装它稍微有点技术性(参见此处),而Tuxera(开发者)提供了专有的付费版本,基本上就是将免费的ntfs-3g驱动程序构建并打包成易于安装和使用的OS X版本。如果没有额外的驱动程序,OS X只能读取(不能写入)NTFS卷,所以你考虑选择其他文件系统是正确的。 - Eliah Kagan
@EliahKagan 如果ntfs-3g是“免费”的,那为什么苹果没有将其包含在内,以支持NTFS的读写功能呢? - user29020
@user29020我不知道为什么苹果选择不包含它,但你可以通过下载源代码(目前是这个文件),解压并查看COPYING文件是GNU GPL,从而验证它是免费的。也许苹果不想花功夫将其集成到Finder中,以便无缝使用。另请参阅http://www.tuxera.com/products/tuxera-ntfs-for-mac/和http://sourceforge.net/projects/catacombae/。 - Eliah Kagan
1@user29020 支持成本(如果有一些错误怎么办)?法律限制?根据GNU GPL许可证,免费的意思是它只能添加到已经在GPL下可用的源代码/二进制文件中(LGPL则允许其作为其他非GPL代码的库使用)。鉴于苹果的代码主要是专有的,另外还受到APSL许可证的约束,而APSL不是GPL兼容的许可证,这是他们必须遵守的限制。https://www.gnu.org/philosophy/apsl.html - dlamblin
3个回答

有人对如何使用UDF格式化闪存驱动器进行了一些研究,以便在尽可能多的操作系统上使用。以下是他的研究结果(曾经在这里,现已下线):
- Windows 7完全支持UDF v2.6,但UDF块大小必须与底层设备的块大小匹配(对于USB闪存驱动器和大多数磁盘而言,块大小为512字节;"高级格式"磁盘为4096字节)。显然,磁盘必须分区。
- Linux 2.6.30及更高版本至少完全支持UDF v2.5。
- Mac OS X 10.5完全支持UDF v2.01,但仅当用于整个磁盘时,而不是分区。
如上所述,对于USB硬盘,Windows要求对其进行分区。另一方面,在OS X上,只有在使用未分区的完整磁盘时才能使用UDF。令人惊讶的是,有一种解决方案可以同时适用于两者:将硬盘同时分区和未分区。
DOS分区表存储在主引导记录的字节446-510中。这个主引导记录存储在磁盘的第一个扇区,即扇区0中。通常,指定的第一个分区会从几千字节之后开始。然而,似乎可以构建一个分区表,使得第一个分区从扇区0开始,因此结果就是一个包含分区表本身的分区。分区编辑程序似乎拒绝创建这样的表,但至少最近的Linux和Windows内核似乎并不介意。
好处是UDF(我认为是故意的)不使用所放置的分区或磁盘的前几千字节,因此这个位置确实可以用来存储一个传统的分区表,引用跨越整个磁盘的分区。一些测试表明,这在Linux、Windows和Mac OS X上确实有效。
  • 在Linux 2.6.30+、Mac OS X 10.5+和Windows Vista+中,可以自动挂载为读写模式。
  • 在Windows XP中只能以只读模式使用,在Linux 2.6.0+中可以通过命令行挂载后使用。
  • 支持大文件、UNIX权限、Unicode文件名、符号链接、硬链接等功能。

格式化磁盘的脚本:Perl脚本Bash脚本


不行。

在回答的时候,我们已经是2015年了。我正在使用OSX Yosemite、Ubuntu 14.10和Windows 10企业技术预览版在一台Mactel机器上(Macmini 7,1)。

我尝试了UDF和exFat两种格式。我用Ubuntu进行开发,确实需要Unix风格的权限。

以前的所有指南都不再适用:UDF驱动程序已经发展了,所有操作系统都将接受UDF分区,而且还有更多我无法名字的问题和不稳定性。

  • 在Mac OS上格式化的UDF驱动器无法在Windows 10上挂载。
  • 在Linux上格式化的UDF驱动器无法在Windows 10上挂载。
  • 在Windows 10上格式化的UDF驱动器可以在Linux上读写挂载,在OSX上只能读取。

然而,Windows不允许在格式化UDF卷时指定块大小,因此你的逻辑块大小可能与分区的物理块大小不同。

我不清楚这是否与我在OSX上挂载它时遇到的困难有关,但在使用Linux删除一定数量的文件后,我再也无法在OSX上挂载该驱动器。

系统进入内核恐慌并且崩溃得令人瞠目结舌。

这一点以及关于此主题的各种答案表明目前对该格式的支持不一致。
看起来我可以通过使用NTFS卷来实现现代文件系统的功能、类Unix权限 - 我可能能够设置它们 - 并在所有操作系统上进行读/写挂载,从而达到平衡。

哪个系统崩溃了?你说内核恐慌,但在前一句中你似乎在说是OSX出现了问题。 - Janus Troelsen
1OSX是基于BSD的。所以是的,正是OSX Yosemite(10.10.2)遇到了内核恐慌。最终我使用了NTFS和适用于OSX的NTFS 3d。 - Mauro Colella
Windows不允许您在格式化UDF卷时指定块大小。UDF没有可调整的块大小。它使用设备扇区大小,没有任何形式的聚集。您所指的设置是什么? - JDługosz
1显然不是。请参见:http://manpages.ubuntu.com/manpages/lucid/man1/mkudffs.1.html 和 http://tanguy.ortolo.eu/blog/article93/usb-udf - Mauro Colella
2@Argo 第二个参考文献指出:"-b 512 是为了强制文件系统块大小等于 USB 闪存的物理块大小,这是 UDF 规范所要求的。如果你有幸拥有一个更适合的块大小的 USB 闪存,可以进行相应的调整。" 因此,它确实允许您指定块大小,但必须指定为所需值。 - JDługosz
@JDługosz 是的,在Linux或BSD上可以使用mkudffs进行格式化。但是在Windows上格式化时,无法指定块大小。 - Mauro Colella
你提到了exFAT,但没有提供任何细节。我知道exFAT不支持POSIX文件权限,这就是你为什么没有使用它的原因吗?我一直在使用exFAT的闪存驱动器上没有遇到任何问题,但我并不需要POSIX权限。 - bmaupin
1Windows 10没有被OS X挂载/OS X没有被挂载是因为每个操作系统处理分区表的方式不同。Windows 10:需要一个。 Mac OS X:需要将UDF放在裸盘上作为整个驱动器分区。 - DrYak
4有一个格式化工具可以处理不一致性:https://github.com/JElchison/format-udf - velop
看起来很不错。但在理想的世界里,应该由标准制定者和实施者来解决不一致性问题。 - Mauro Colella
有点混乱,也许你是指“UDF驱动程序已降级”吗?另外,你是否向苹果和微软报告了这些错误? - Hi-Angel
@DrYak 这是否意味着如果我在我的内部硬盘上添加一个UDF分区,macOS将无法挂载它?我正在研究文件系统,并且如果可能的话,计划将所有数据放在一个UDF分区中,以便我可以从不同的操作系统访问它。 - Arc676
@Arc676: 我没有详细测试过这个行为(我不经常使用Mac OS X)。但基本上:
  • 如果你想在这个驱动器上有多个不同的分区,其中一个是UDF:在Mac OS X上似乎很难实现。
  • 如果你只想让UDF分区对Mac OS X和其他双启动系统可见:通过使用其他答案中提到的技巧,这是可能的。
- DrYak
所以基本上: 将UDF分区对齐到扇区0(这样它就从驱动器的起点开始,并且Mac OS X将其视为完整的原始分区),并在分区开头的引导区隐藏一个分区表(这样Windows就能看到一个分区并且也会很高兴)。但是,有很大的可能性(未经测试)Mac OS X只能看到和挂载第一个UDF分区,而无法看到驱动器上的其他内容。(因此,可以使用其他分区进行Linux或Windows特定的操作)。 - DrYak
可以在NTFS和FAT文件系统上存储POSIX权限。 - phuclv
对于UDF,您需要指定正确的选项,以便在所有操作系统中都可以挂载分区:https://en.wikipedia.org/wiki/Universal_Disk_Format#Compatibility - phuclv

我刚在虚拟机中测试了一下。看起来你需要在Windows中重新创建分区并为其分配一个驱动器号,但不要格式化为任何文件系统。之后启动Ubuntu,按照指示进行操作,应该可以实现读写功能。
记得备份所有数据!
首先安装UDF工具:
sudo apt-get install udftools

将您希望格式化为UDF的分区上的第一个块替换为空。
sudo dd if=/dev/zero of=/dev/sdxN bs=512 count=1

最后格式化为UDF^。
sudo mkudffs --media-type=hd --blocksize=512 /dev/sdxN

^where by:
  • x 是当前分配给您的硬盘的字母占位符

  • N 是分区号的占位符

祝您好运,如果成功了,请告诉我。


谢谢,这回答了“如何”的问题;但我仍然对它在上述情况下是否足够有效感兴趣。 - dlamblin
这对我来说完美地运作了。唯一的问题是我必须在Windows中使用磁盘管理器手动挂载分区。除此之外,我可以确认它也适用于硬盘上的多个分区(我正在使用1udf+2ext4)。 - Nemo
这里的关键似乎是实际上创建一个分区,然后在其中创建一个UDF文件系统。如果您没有创建任何分区,它将在Linux中工作,但不能在Windows(7)中工作。那是我的经验。 - DanMan
@DanMan Dan似乎找到了一个解决该问题的人,并提供了一个用于在Linux、Mac和Windows 7上格式化整个磁盘为UDF的脚本,同时在Win XP上只读。 - dlamblin
@kicsyromy:对分区(sdxN)进行UDF格式化失败,执行以下命令: sudo mkudffs --media-type=hd --blocksize=512 /dev/sdd1 出现以下错误信息: 尝试更改多个范围的类型然而,我成功地使用整个磁盘(sdd)按照这里描述的方法格式化了UDF:http://superuser.com/questions/39942/using-udf-on-a-usb-flash-drive - Tim Banchi
+1 初步的文本很重要:在Windows中准备新的卷,然后只在Linux中进行格式化。这样,UDF分区可以被Windows和Linux都识别。在本地硬盘上测试了主分区。 - user37165