尽管设备是空的,但仍出现“设备没有剩余空间”错误

尽管设备是空的,但仍出现“设备没有剩余空间”错误

No space left on device为什么当我尝试32767在 vFat USB 闪存驱动器中创建超过 100 个文件时会出现此问题?

信息

  • 闪存驱动器是空的(新格式化)
$ df -H
> Filesystem      Size  Used Avail Use% Mounted on
> /dev/sdb1        16G  2.1M   16G   1% /media/cmhteixeira/cmhteixeira-usb
  • gnome 磁盘显示:
Partition Type: W95 FAT32 (LBA)
Contents: FAT (32-bit version)

我一直在网上看到 FAT32/vFat 有一些限制,包括:

  • 单个目录中最多有 65,534 个文件。如果文件名不是 (8.3),则更少。

我正在单个目录(不一定是根目录)中创建这些文件,格式为12345678.txt。但是在创建前 32767 个这样的文件后,我收到no space left on device错误。令人怀疑的是,最大文件数恰好是我在互联网上读到的最大文件的一半(2^16-2=65,534 vs 2^15-1=32,767)。

你知道为什么吗?

(如果我在单独的目录中创建更多文件,我可以创建更多文件)

答案1

FAT32 32 位短文件名也必须是大写(技术上是 0x80 以下范围内的任何 ASCII 字符,不包括空格),达到最大文件数 65,534 个。

长文件名会占用更多 32 位条目,因此所有文件都占用 2 个块,导致文件数减半

答案2

你已经有了答案

我一直在网上看到 FAT32/vFat 有一些限制,包括:

单个目录中最多有 65,534 个文件。如果文件名不是 (8.3),则更少。

您正在创建一个扩展名为 的文件名txt。对于 8.3 格式,文件名必须全部大写。请尝试使用.TXT

答案3

正如其他答案中提到的,使用长文件名创建了第二个目录条目,因为“txt”是小写的(而不是大写的),因此生成了一个 LFN 条目来存储它。

但是,由于扩展中只有大小写差异,因此可以通过将其保存在 0x0C 字节上来避免 LFN,这可以在 Linux 上使用 mount 选项启用shortname

如果文件名仅包含小写字母,或者是小写基本名称与大写扩展名的组合,或反之亦然;并且没有特殊字符,并且符合 8.3 限制,则不会在 Windows NT 和更高版本的 Windows(如 XP)上创建 VFAT 条目。相反,目录条目字节 0x0C 中的两位用于指示文件名应被视为全部或部分小写。具体而言,位 4 表示小写扩展名,位 3 表示小写基本名称,这允许诸如“example.TXT”或“HELLO.txt”但不允许“Mixed.txt”之类的组合。很少有其他操作系统支持它。这会导致与较旧的 Windows 版本(Windows 95/98/98 SE/ME)的向后兼容性问题,如果使用了此扩展名,则会看到全大写的文件名,因此可以在操作系统之间传输文件时(例如在 USB 闪存驱动器上)更改文件的名称。目前的 2.6.x 版本的 Linux 在读取时会识别此扩展(来源:内核 2.6.18 /fs/fat/dir.c 和 fs/vfat/namei.c);挂载选项 shortname 决定在写入时是否使用此功能。

https://en.wikipedia.org/wiki/Design_of_the_FAT_file_system#VFAT_long_file_names

相关内容