在 U 盘上使用 UDF

Ces*_*arB 76 usb operating-systems filesystems udf usb-flash-drive

在无法将大于 4G 的文件复制到我的 8G USB 闪存驱动器后,我将其格式化为 ext3。虽然到目前为止这对我来说工作正常,但如果我想用它来将文件复制到不使用 Linux 的人,它会导致问题。

我正在考虑将其格式化为UDF,我希望它可以在三种最流行的操作系统(Windows、MacOS 和 Linux)上读取(甚至可能写入),而无需安装任何额外的驱动程序。但是,从我在网上找到的内容来看,似乎有几个与用于创建文件系统的参数有关的小问题,这会降低兼容​​性(但我发现的大多数页面都是关于光学媒体,而不是USB闪存驱动器)。

我想知道:

  • 我应该使用哪个实用程序来创建文件系统?(到目前为止,我已经找到了mkudffsand genisoimage,而且mkudffs似乎是最好的选择。)
  • 我应该将哪些参数与所选的实用程序一起使用以获得最大的兼容性?
  • 与这三个操作系统 UDF 的最常见版本的兼容性如何?
  • 使用 UDF 实际上是最好的主意吗?是否有另一种文件系统具有更好的兼容性,没有像 FAT32 4G 文件大小限制这样的问题限制,并且无需在每台接触它的计算机上安装特殊驱动程序?

Ces*_*arB 57

首先,在创建 UDF 文件系统之前,我将驱动器完全归零:

dd if=/dev/zero of=/dev/sdx bs=512
Run Code Online (Sandbox Code Playgroud)

这是为了避免任何剩余的超级块或其他可能会混淆操作系统文件系统类型检测的元数据(至少应该需要将第一个扇区清零,以消除分区表;UDF 不使用前几个扇区,以及剩余的分区表真的很容易混淆)。您还可以使用count=1dd 命令上的开关,以便更快地将驱动器的前 512 个字节(MBR 通常位于其中)归零,尽管这尚未经过测试。

要创建文件系统,我使用的命令是:

mkudffs --media-type=hd --blocksize=512 /dev/sdx
Run Code Online (Sandbox Code Playgroud)

mkudffs安装udftools软件包后,命令将在基于 Debian 的 Linux 发行版(例如 Ubuntu)上可用:

sudo apt-get install udftools
Run Code Online (Sandbox Code Playgroud)

默认块大小为mkudffs2048,这对于 USB 闪存驱动器(使用 512 字节扇区)是错误的。由于块大小用于查找文件系统元数据,因此使用错误的块大小可能会使其无法识别为 UDF 文件系统(因为锚点将不是文件系统驱动程序期望的位置)。请注意,mkudffs手册页是错误的;512 是块大小的有效值(并且代码明确接受它)。

我还使用了整个驱动器而不是分区;这应该更兼容。

到目前为止我的测试结果:

  • 具有最新内核的 Linux(2.6.31,来自 Ubuntu 9.10):有效。
  • 具有较旧内核的 Linux:需要bs=512选择mount,因为它错误地使用了 2048 而不是设备扇区大小(已在提交 1197e4d 中修复)。
  • Windows Vista:有效。
  • 全新的 Mac:有效。
  • Windows XP:可以正常读取,但在尝试写入时显示“拒绝访问”;好像也觉得磁盘满了。

虽然到目前为止我还没有尝试在其中创建大于 4G 的文件,但我认为没有理由它不起作用。

鉴于它在所有最新的操作系统上都能完美运行(只需要在 Linux 上手动挂载,一旦 Ubuntu 9.10 和 Fedora 12 发布就不再需要了),并且在 Windows XP 中以只读方式运行(这是一个惊喜对我来说;我原以为它根本无法识别文件系统),在大型 USB 闪存驱动器中使用 UDF 而不是 FAT32 或 NTFS 似乎是个好主意。

  • @romeovs:我没有对驱动器进行分区。这就是将它归零的重点,删除分区表和旧的文件系统剩余物,并将 UDF 文件系统放在整个未分区的驱动器中。创建分区表只会冒着混淆的风险。 (4认同)
  • 使用 500 GB SeaGate FreeAgent Desktop USB 2.0 外置硬盘驱动器对我不起作用(不确定是否应该使用,因为该线程是关于闪存驱动器的)。Windows 7 在磁盘管理实用程序中始终将驱动器显示为“未分配”。我尝试了几种不同的选项组合。 (3认同)
  • 非常感谢您的跟进。如果不是第一次,我很少看到一个聪明的问题,然后在经过几天/几周的测试后,OP 会精心回答这个问题。干得好,谢谢! (2认同)
  • 大多数 USB 记忆棒将其内存“公开”为 512 字节块。而内部情况则要复杂得多(大小不同,具体取决于您是否谈论写入块(通常是几 kb)、擦除块(很多 kb)或分配单元(几 mb))。在某些系统上,UDF 需要块大小 == 扇区大小。所以“-b 512” (2认同)

j0n*_*1el 7

CesarB 在解决问题的关键方面做得很好。不能强调的一件事是在格式化 UDF 时使用正确的块大小是多么重要。

受 CesarB 的帖子(以及我的其他研究/测试)的启发,我编写了一个脚本来自动化 UDF 中的格式化过程——使用正确检测到的扇区大小。请参阅GitHub 上的 format-udf。显着特点:

  • 以通用磁盘格式 (UDF) 格式化块驱动器(硬盘驱动器或闪存驱动器)
    • UDF 修订版 2.01 用于最大兼容性
    • 前 4096 个扇区被清零以擦除任何现有的 MBR(对于正确的 UDF 检测是必需的)
  • 生成的文件系统可以跨多个操作系统系列(Windows、OS X 和 Linux)读取/写入
  • 在任何具有 Bash 环境的操作系统上运行

因为最后一点,我写的这个脚本不能在windows上使用。但是,该脚本将在 OS X 和 Linux 上运行。这样做之后,Windows 应该能够神奇地检测到新格式化的 UDF 驱动器。

要直接回答发布的问题,format-udf 将:

  • 根据操作系统和环境选择合适的格式化工具
  • 自动检测并填充格式化所需的所有参数
  • 最大化操作系统兼容性(有关兼容性图表,请参阅 GitHub 页面)
  • 产生提问者正在寻找的最大特征集(和最小限制)