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

Quo*_*ans 4 filesystems

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

BRP*_*ock 6

TL;DR \xe2\x86\x92 文件内容的大小只是故事的一部分,它在文件系统中的存储方式会影响您的有效空间。

\n\n

1MiB 文件可能会占用不同数量的“内务”开销(即元数据),并且会被分配到不同数量的块中。

\n\n

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

\n\n

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

\n\n
stat .emacs\n\n  File: \xe2\x80\x98.emacs\xe2\x80\x99\n  Size: 36303           Blocks: 72         IO Block: 4096   regular file\nDevice: fd01h/64769d    Inode: 2097977     Links: 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里的输出stat显示我的家庭所在的文件系统具有典型的 4,096 字节 (4KiB) I/O 块,因此 ~36kiB (36,303B) 文件实际上比 1970 年的文件占用更多空间具有 512 字节 I/O 块的系统。

\n\n

Blocks:数字采用传统的 Unix 512 字节 (\xc2\xbdkiB) 块,因此通过将大小除以IO Block512 (4,096 \xc3\xb7 512 = 8),您会发现块的数量始终是 8 的倍数在此文件系统上。在本例中,该分配开销造成了 ( 72 \xc3\x97 512 = 36,864 ) - 36,303 = 561 字节的浪费空间。(在具有 512 字节块的文件系统上,仅使用 71 个块,因此开销仅为 49 字节。)

\n\n

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

\n\n
  File: \xe2\x80\x98emptyness\xe2\x80\x99\n  Size: 0               Blocks: 0          IO Block: 4096   regular empty file                                                                 \n
Run Code Online (Sandbox Code Playgroud)\n\n

同样,一个短符号链接可能会被存储而不实际分配它自己的任何块:

\n\n
  File: \xe2\x80\x98symlink\xe2\x80\x99 -> \xe2\x80\x98emptyness\xe2\x80\x99\n  Size: 9               Blocks: 0          IO Block: 4096   symbolic link                                                                      \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

一个非常非常长的符号链接名称可能需要分配空间:

\n\n
File: \xe2\x80\x98long-symlink\xe2\x80\x99 -> \xe2\x80\x98a very very long symlink target name \xe2\x80\xa6 \xe2\x80\xa6                                                                     \nSize: 2000            Blocks: 8          IO Block: 4096   symbolic link                                                                    \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

这是一个除了零之外什么都没有的文件(用 创建truncate -s 49M sparse-file),它的逻辑大小也与其磁盘占用空间不匹配:

\n\n
File: \xe2\x80\x98sparse-file\xe2\x80\x99\nSize: 51380224        Blocks: 0          IO Block: 4096   regular file                                                                   \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n\n

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

\n\n

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

\n\n

最后,ext2/3/4 通常保留每个卷的一定百分比仅供超级用户使用(即root)\xe2\x80\x94,此空间不会在例如du或最类似的设备上显示为“空闲”程序,但它仍然是root仅供使用的未使用空间。tune2fs这可以随时使用 \xe2\x80\x94 进行调整,我通常会在“文档”类型卷上大大减少它,但会保留一定的数量/以备某种紧急情况。

\n\n

如果您确实想查看比通常有用的更多详细信息,dumpe2fo将打印一份相当长的报告,其中列出了对您的文件系统 \xe2\x80\x94 有效的各种选项,例如该报告的一部分可能会这样:

\n\n
Filesystem features:      has_journal ext_attr resize_inode dir_index f \xe2\x80\xa6 \xe2\x80\xa6\nFilesystem flags:         signed_directory_hash \nDefault mount options:    user_xattr acl\nFilesystem state:         clean\nErrors behavior:          Continue\nFilesystem OS type:       Linux\nInode count:              128016\nBlock count:              512000\nReserved block count:     25600\nFree blocks:              331865\nFree inodes:              127631\n
Run Code Online (Sandbox Code Playgroud)\n