文件在 NTFS 和 LUKS + ext4 中占用的空间量是否不同?

文件在 NTFS 和 LUKS + ext4 中占用的空间量是否不同?

我有两个卷,一个是 NTFS(15028048 14213120 51544),对应于(1-K 块,已使用,可用),另一个是 LUKS + ext4(14895184 13869752 245752)。我用 md5sum 检查了里面的文件,它们是相同的,但是,为什么 NTFS 有 14213120,而另一个有 13869752?我知道不同的格式会占用不同的空间,但是一旦你有一个 1 MB 的文件,这个 1 MB 的文件在 NTFS、vfat、ext3、ext4 或你使用的任何格式中都是相同的。我错过了什么?

答案1

总结→ 文件的大小内容只是故事的一部分,它在文件系统中的存储方式会影响您的有效空间。

1MiB 文件可能需要不同数量的“内部管理”开销(即元数据),并且可能会分配到不同数量的块中。

无论使用什么文件系统,文件内容的长度(又名其“inode”)(常规文件具有一个或多个目录条目,又名硬链接,以及一个包含内容的 inode)都应该相同,但 inode 和元数据共同使其他文件无法使用的空间量可能会略有不同。

例如,文件系统可能以 4kiB 块为单位分配空间;在这种情况下,即使只有一个条目,目录也可能占用 4kiB,而 1 字节文件可能占用 4kiB。在具有 4kiB 块的文件系统上,4,097 字节文件将占用 8KiB 的有效空间。

stat .emacs

  File: ‘.emacs’
  Size: 36303           Blocks: 72         IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 2097977     Links: 1

此处的输出stat显示,我的主页位于具有典型 4,096 字节(4KiB)I/O 块的文件系统上,因此 ~36kiB(36,303B)的文件实际上比在具有 512 字节 I/O 块的 1970 年代系统上占用的空间要多一点。

Blocks:数字以传统的 Unix 512 字节 (½kiB) 块为单位,因此通过将大小除以IO Block512(4,096 ÷ 512 = 8),您会发现此文件系统上的块数始终是 8 的倍数。在这种情况下,该分配开销浪费了 ( 72 × 512 = 36,864 ) - 36,303 = 561 字节的空间。(在具有 512 字节块的文件系统上,只会使用 71 个块,因此开销只有 49 字节。)

尤其是 ext2/3/4 文件系统,它们进行了一些优化,使符号链接和非常小的文件占用更少的空间,并且特别有效地处理“稀疏”文件(包含许多只包含零的块的文件)。例如,一个空文件仅占用其目录条目的空间:

  File: ‘emptyness’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file                                                                 

同样,可以存储短符号链接而不实际分配任何自己的块:

  File: ‘symlink’ -> ‘emptyness’
  Size: 9               Blocks: 0          IO Block: 4096   symbolic link                                                                      

符号链接的9个字节存储在目录文件中,因此占用0个字节。

更长的符号链接名称可能需要分配空间:

File: ‘long-symlink’ -> ‘a very very long symlink target name … …                                                                     
Size: 2000            Blocks: 8          IO Block: 4096   symbolic link                                                                    

请注意,8 个“Unix 块”是此文件系统可以分配的最小数量(4096÷512),因此 ~2k 内容占用 ~4k。

这是一个其中什么都没有但只有零的文件(用 创建truncate -s 49M sparse-file),并且其逻辑大小与其磁盘占用空间不匹配:

File: ‘sparse-file’
Size: 51380224        Blocks: 0          IO Block: 4096   regular file                                                                   

请注意,这些类型的文件通常由数据库等随机访问程序或 BitTorrent 等随机顺序下载创建。


您还可以在创建(“格式化”)文件系统时设置许多选项,如果这是一个大问题,这些选项可以使其更有效地处理您的特定工作负载。(手册中mke2fs有一些详细信息。)

除了与单个文件(包括目录、常规文件、符号链接和设备特殊文件)相关的元数据(如文件名、权限、ACL、扩展属性等)之外,文件系统级别本身也有一些元数据,如“超级块”(ext2/3/4 保留了多个备份副本)和日志 inode,这些都将计入有效可用(可用)空间。

最后,ext2/3/4 通常保留每个卷的一定比例供超级用户使用(即root)——这个空间不会在 egdu或大多数类似程序上显示为“空闲”,但它仍然是未使用的空间,root仅供 使用。这可以随时调整tune2fs——我通常会在“文档”类型的卷上大大减少它,但会保留一定量以防/万一。

如果你真的想看到比通常有用的更多细节,dumpe2fo将会打印一份相当长的报告,列出文件系统上有效的各种选项 — — 例如,该报告的一部分可能会显示如下内容:

Filesystem features:      has_journal ext_attr resize_inode dir_index f … …
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              128016
Block count:              512000
Reserved block count:     25600
Free blocks:              331865
Free inodes:              127631

答案2

我认为这个短文来自医生的回答对于 SU 问题ext4 比 ntfs 贵吗?“很好地涵盖了这一点:

每个文件系统实现其数据结构的方式都不同。您可以尝试一种巧妙的方法,即使用各种文件系统格式化分区并进行比较。“可用”空间会有所不同。此外,当您填满它们时,存储开销也会有所不同,因此从某种意义上说,存储同一文件所需的空间量可能会因文件系统而异。通常,当您格式化文件系统时,您还可以选择一些参数来确定如何排列它 - 这也会产生影响。

相关内容