为什么 ext 文件系统不能填满整个设备?

为什么 ext 文件系统不能填满整个设备?

我刚刚注意到,我尝试在 500G HDD 上创建的任何 ext{2,3,4} 文件系统都没有使用所有可用空间(466G)。我还尝试了 reiser3、xfs、jfs、btrfs 甚至 vfat。它们都创建了大小为 466G 的 fs(如DF-H)。但是,ext* 会创建 459G 的 fs。禁用保留块会增加用户可用的空间,但 fs 的大小仍然是 459G。

1Tb HDD 也是如此:932G reiserfs、917G ext4。

那么,这 1.5% 的差异是什么?为什么会发生这种情况?有没有办法让 ext 填满整个卷?

UPD:所有测试都在同一台机器、同一个硬盘等上进行。466G 与市场 500G 有何不同并不重要。问题在于不同的 FS 有所不同。

关于 df - 它显示 FS 的总大小、已用大小和可用空间。在本例中,我有:

对于 reiserfs:

/dev/sda1 466G 33M 466G 1% /mnt

对于 ext4:

/dev/sda1 459G 198M 435G 1% /mnt

如果我关闭根块保留,435G 将变为 459G - fs 的完整大小(减去 198M)。但 fs 本身对于 ext4 仍然是 459G,对于 reiser 仍然是 466G!

UPD2:通过 dd 用真实数据填充卷:

reiserfs:

fs:~# dd if=/dev/zero of=/mnt/1
dd: 在 «/mnt/1» 中记录:已建立连接
975702649+0 评论
975702648+0 评论
 已下载 499559755776 字节 (500 GB),8705.61 字节,57.4 MB/字节

关闭块保留的 ext2 (mke2fs -m 0):

fs:~# dd if=/dev/zero of=/mnt/1
dd: 在 «/mnt/1» 中记录:已建立连接
960356153+0 评论
960356152+0 评论
 已下载 491702349824 册 (492 GB),8870.01 册,55.4 MB/册

抱歉,我用的是俄语,但我已经在默认语言环境中运行过,重复运行的时间太长了。没关系,dd 输出很明显。

因此,事实证明 mke2fs 确实创建的文件系统比其他 mkfs 更小。

答案1

有两个原因使得这一说法属实。

首先,出于某种原因,操作系统编写者仍然以 2 为基数来报告可用空间,而硬盘制造商则以 10 为基数来报告可用空间。例如,操作系统编写者将 1024 字节(2^10 字节)称为 1 千字节,而硬盘制造商将 1000 字节称为 1 千字节。对于千字节来说,这种差异很小,但一旦达到 TB 级,这种差异就相当明显了。操作系统编写者将 1099511627776 字节(2^40 字节)称为 1 千字节,而硬盘制造商将 1000000000000 字节称为 1 千字节。

这两种谈论尺寸的不同方式经常会引起很多混淆。

有零星的支持二进制大小的 ISO 前缀. 考虑到新前缀而设计的用户界面在使用 2 进制前缀系统显示大小时将显示 TiB、GiB(或更一般的 XiB)。

其次,df -h 报告有多少空间可供您使用。所有文件系统都必须写入内部管理信息来为您跟踪事物。这些信息会占用您驱动器上的部分空间。通常不会很多,但会占用一些。这也解释了您看到的一些看似损失的原因。

在您编辑帖子以明确我的答案都没有真正回答您的问题后,我会尝试回答您的问题......

不同的文件系统使用不同大小的空间来存储内部信息,并且以不同的方式报告空间使用情况。

例如,ext2 将磁盘划分为磁柱组。然后,它在每个磁柱组中预先分配空间,用于 inode 和可用空间映射。ext3 执行相同的操作,因为它基本上是 ext2 + 日志记录。ext4 也执行完全相同的操作,因为它是 ext3 的一个相当简单(并且几乎向后兼容)的修改。由于此元数据开销在文件系统创建或调整大小时是固定的,因此不会将其报告为“已使用”空间。我怀疑这也是因为磁柱组元数据位于磁盘上的固定位置,因此只是暗示正在使用,因此不会在可用空间映射中标记或说明。

但是 reiserfs 不会预先分配任何类型的元数据。它没有在文件系统创建时固定的 inode 限制,因为它会像数据块一样动态分配所有 inode。它最多需要一些描述根目录的结构和某种空闲空间映射。因此,当里面什么都没有时,它占用的空间要少得多。

但这意味着当您添加文件时,reiserfs 将占用更多空间,因为它将分配元数据(如 inode)以及文件的实际数据空间。

我不知道 jfs 和 btrfs 究竟是如何跟踪元数据空间使用情况的。但我怀疑它们跟踪元数据空间使用情况的方式更像 reiserfs。特别是 vfat 根本没有 inode 概念。它的可用空间映射(其大小在文件系统创建时固定(臭名昭著的 FAT 表))存储了 inode 的大部分数据,而目录条目(动态分配)存储了其余数据。

答案2

除了 Omnifarious 提到的问题之外,ext2/3/4 还为根保留了一定量的空间 - 但这些保留的空间不会显示在 df 的输出中。

例如,使用默认选项创建一个小型文件系统(~100mb),使用 ext2 而不是 3 或 4,以忽略日志原本会占用的空间:

swann:/tmp# dd if=/dev/zero of=./loop.fs bs=10240 count=10240
swann:/tmp# mkfs.ext2 loop.fs
swann:/tmp# mkdir loop
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     92480   2% /tmp/loop

调整保留块选项(tune2fs选项-m将保留块设置为百分比, 选项-r将保留块设置为直接数量的块):

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 25 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     72000   3% /tmp/loop

swann:/tmp# umount loop
swann:/tmp# tune2fs -m 0 loop.fs
swann:/tmp# mount -text2 -oloop loop.fs loop
swann:/tmp# df loop
Filesystem           1K-blocks      Used Available Use% Mounted on
/tmp/loop.fs             99150      1550     97600   2% /tmp/loop

如上例所示,即使以 root 身份登录,df在“可用”计数中也不会显示预留空间。无论是以 root 身份还是以较低权限的用户身份登录,在“已使用”计数中也不会显示预留空间。如果您不期望这两个事实,当文件系统接近满时,这有时会造成混淆。

还请注意tune2fs,尽管其名称不同,但它与 ext3 和 ext4 文件系统以及 ext2 文件系统相关。

答案3

关于文件系统之间的差异,不同的文件系统以不同的方式组织块,需要更多或更少的数据来识别和跟踪块。块大小也有所不同,因为如果同一空间的块更多或更少,则“丢失”的空间会更多或更少。此外,文件系统会将块分组以避免文件碎片化,并且每个块簇都有一个一定大小的标识符,因此更多或更少的块簇将使用磁盘上的不同物理空间。因此,差异在于文件系统如何组织物理空间。

这里有一个ext2 的描述您可能还会找到类似 reiserfs 的东西,但我从未使用过它,所以我没有。

相关内容