![文件在 NTFS 和 LUKS + ext4 中占用的空间量是否不同?](https://linux22.com/image/1426311/%E6%96%87%E4%BB%B6%E5%9C%A8%20NTFS%20%E5%92%8C%20LUKS%20%2B%20ext4%20%E4%B8%AD%E5%8D%A0%E7%94%A8%E7%9A%84%E7%A9%BA%E9%97%B4%E9%87%8F%E6%98%AF%E5%90%A6%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
我有两个卷,一个是 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 Block
512(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 贵吗?“很好地涵盖了这一点:
每个文件系统实现其数据结构的方式都不同。您可以尝试一种巧妙的方法,即使用各种文件系统格式化分区并进行比较。“可用”空间会有所不同。此外,当您填满它们时,存储开销也会有所不同,因此从某种意义上说,存储同一文件所需的空间量可能会因文件系统而异。通常,当您格式化文件系统时,您还可以选择一些参数来确定如何排列它 - 这也会产生影响。