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


8

我刚刚注意到我要在500G HDD上创建的ext {2,3,4}文件系统中的任何一个都不会使用所有可用空间(466G)。我也尝试过reiser3,xfs,jfs,btrfs甚至vfat。它们全部创建大小为466G的fs(如df -h所示)。但是,ext *会产生459G的fs。禁用保留块会增加用户可用的空间,但是fs的大小仍为459G。

1Tb硬盘也是如此:932G reiserfs,917G ext4。

那么,这1.5%的差异是多少?为什么会发生这种情况,是否有办法使外部填充全部体积?

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)。但是对于ext4,fs本身仍然是459G,对于reiser,fs本身仍然是466G!

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

reiserfs:

fs:〜#dd if = / dev / zero of = / mnt / 1
dd:записьв«/ mnt / 1»:Наустройствекончилосьместо
975702649 + 0записейсчитано
975702648 + 0записейнаписано
 скопировано499559755776байт(500 GB),8705,61 c,57,4 MB / c

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

fs:〜#dd if = / dev / zero of = / mnt / 1
dd:записьв«/ mnt / 1»:Наустройствекончилосьместо
960356153 + 0записейсчитано
960356152 + 0записейнаписано
 скопировано491702349824байта(492 GB),8870,01 c,55,4 MB / c

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

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


2
每个FS都有一定的开销...我不知道那是什么让您可以访问磁盘上的所有可用物理空间。
prodigitalson

我建议您更改显示名称,并在个人资料的“网站”字段中放置似乎是您博客的内容,以减少广告宣传的麻烦。
Hello71 2010年

1
您好71,谢谢您的建议。网站并不重要,仅适用于openid。
Ineu

对于未来的注意,如果你想快速的程序用英语输出,使用LANG=C fooLC_ALL=C foo
阿伦皮尔斯

艾伦,对,谢谢。甚至可以是LANG =或LANG = POSIX。但是正如我所说,此过程需要很多时间,因此仅针对几行使用不同的语言环境重新运行它是不合理的:)在两种情况下,它都证明ext2的FS大小存在问题:(
Ineu 2010年

Answers:


19

这有两个原因。

首先,由于某种原因或其他操作系统编写者仍然报告以2为基础的系统的可用空间,而硬盘驱动器制造商报告以10为基础的系统的可用空间。例如,操作系统编写器将调用1024字节(2 ^ 10字节)/千字节,而硬盘制造商将调用1000字节/千字节。这种差异对于千字节来说是很小的,但是一旦达到TB,就非常重要了。OS编写器将调用1099511627776字节(2 ^ 40字节)兆字节,而硬盘驱动器制造商将调用1000000000000字节每兆字节。

谈论大小的这两种不同方式经常引起很多混乱。

二进制大小有一个特别受支持的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
为此有一个ISO标准:en.wikipedia.org/wiki/Binary_prefix
Bobby,2010年

@Bobby-是的,它开始出现在显示器上。我将其添加到我的答案中。谢谢!
2010年

8

以及Omnifarious提到的问题,对于ext2 / 3/4,为root保留了一定数量的空间-此保留的空间不会在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身份登录还是以特权级别较低的用户身份登录,保留的空间都不会显示在“ Used”计数中。如果您不希望这两个事实,有时在文件系统接近满时可能会造成混乱。

还要注意tune2fs,尽管名称如此,但它与ext3和ext4文件系统以及ext2文件系统有关。


感谢您的回答。不,这与保留块无关。更新的问题。
Ineu

0

关于文件系统之间的差异,不同的文件系统不同地组织块,并且需要更多或更少的数据来识别和跟踪块。块大小也会有所不同,就好像您在同一空间中拥有更多或更少的块,或多或少有“丢失”的空间一样。同样,文件系统将块分组以避免文件碎片,并且每个块群集都有一定大小的标识符,因此或多或少的块群集将使用磁盘上的不同物理空间。因此,区别在于文件系统如何组织物理空间。

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


2
Reiserfs和btrfs与众不同之处在于,几乎所有簿记信息都是动态分配的。在文件系统设置中仅分配超级块副本和可用空间位图。当然,这意味着对于这些文件系统而言,可用于数据的实际空间量不是很确定。
2010年

@Omnifarious +1-因此,如果我对reiserfs和btrfs很好理解,则报告的可用空间在开始时会较大,但将同时用于数据和簿记信息,而不仅仅是数据,对吗?
洛朗

@ laurent-rpnet-是的,这是正确的。对于btrfs来说更有趣。btrfs可以在单个文件的基础上实现RAID,因此其可用空间报告甚至更难确定,因为它不能仅仅假设用于数据的每个块将使用一定数量的额外空间。此外,它允许基于COW的非常便宜的副本,因此在现有文件中间写入一个块可能会分配空间。
2010年

XFS,JFS和VFAT又如何呢?很难相信像FAT32这样的原始fs比ext4更动态。
Ineu

FAT32还具有为组织保留的块。动态在这里是什么意思?如果使用dynamyc分配,则FAT32将没有动态分配,例如ext,并且不会显示磁盘上可用于数据的所有块。ext4也有一些局限性,而ext4具有POSIX权限和ACL,而ext4具有POSIX权限和ACL,最大文件大小在FAT32上为4GB,在ext3上为2TB(不确定ext4,但至少应该相同)。
洛朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.