【问题标题】:How does the length of a filename affect remaining storage space on a disk?文件名的长度如何影响磁盘上的剩余存储空间?
【发布时间】:2011-04-16 01:28:36
【问题描述】:

文件名的长度如何影响磁盘上的剩余存储空间?

我意识到这是依赖于文件系统的。特别是我正在考虑 EXT 系列文件系统。我不完全了解 inode 如何影响磁盘空间以及文件名本身是如何存储的。这个问题也很难得到相关的搜索结果。这就是我在这里问的原因。在 linux 上,最大文件名长度通常为 255 或 256 个字符。创建文件系统时,是否为每个文件名“保留”了该空间量?换句话说,磁盘存储是否不受实际文件名的影响,因为已经使用了最大值?还是比这更复杂?

假设,我有一个名为“joe.txt”的文件并将其重命名为“joe2.txt”。在此之后可用磁盘空间量是否减少了?像“joe_version.txt”或“joe_original_version_with_bug_that_Jim_solved.txt”这样的较长名称呢?我担心 8、16、32、64 等字符的阈值。我将存储数百万张图像。我以前从来没有担心过这样的问题,所以我不完全确定它是如何工作的。

虽然 EXT 是我使用的唯一文件系统,但讨论 FAT 和其他文件系统可能对有类似问题的其他人有用。

【问题讨论】:

    标签: filesystems filenames diskspace ext3 ext4


    【解决方案1】:

    FAT16 预分配。

    FAT32 使用解决方法来提供长文件名;随着文件名变长,需要额外的目录文件块来存储额外的字符 - 目录文件是常规文件,因此会占用额外的磁盘空间。但是,最小的分配是一个集群,因此除非额外的文件名存储超出集群边界,否则不会消耗您本来可以使用的额外磁盘空间。

    我并不熟悉 UNIX 类型文件系统中文件名的处理方式。

    【讨论】:

      【解决方案2】:

      在 Linux(或更一般地,Unix 类型的文件系统)上,文件名存储在目录条目 inode 中,其中包含目录中每个文件的(文件名,inode 编号)映射列表。我的理解是,对于每个文件名,都有 NAME_MAX 个字符的保留空间。事实上,在 Linux 上 NAME_MAX 是 255。

      所以,回答你的问题,当文件系统创建时,没有为文件名保留空间,但是一旦你创建了一个文件,NAME_MAX 个字节就会被保留给文件名。此外,对于目录 inode,我的理解是,至少在 ext2/3/4 上,空间是根据需要以磁盘块(4 KB,除非你正在做一些非常奇怪的事情)粒度分配的。 IE。一个目录至少占用 4 KB(加上父目录 inode 中的一个条目),如果 (filename, inode) 对的列表不适合该 4 KB(减去其他开销,例如目录权限),它会分配一个新的 4 KB 块来继续列表,依此类推(ext2/3 使用间接块方案,而 ext4 使用范围)。

      【讨论】:

      • 我希望更多的人最终会对您的答案发表评论并予以确认。我认为它是正确的,但我仍然不知道 100%。
      • 请注意,程序不应盲目假设系统范围的 NAME_MAX 可以实际使用。许多文件系统确实支持许多 bytes,这可能与经常使用 UTF-8 编码的字符完全不同。此外,如果当前安装是例如ecryptfs 实际限制可能更像 160 字节。要获得真正的限制,请运行getconf NAME_MAX /path/to/directory
      • 关于原始问题的答案:文件名的存储取决于文件系统,有些文件系统可能不会为每个文件名保留 255 个字节,但会压缩目录条目以尽可能适合一个磁盘块。此外,由于历史原因,大多数文件系统仍然设计用于 512 字节磁盘块,因此如果更改确实适合现有块,则不需要空间。如果更改不适合,则会保留额外的块,直到数据适合。
      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 2010-12-10
      • 2010-11-06
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      相关资源
      最近更新 更多