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

Ine*_*neu 8 linux

我刚刚注意到我尝试在 500G 硬盘上创建的任何 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 大小、已用大小和可用空间。在这种情况下,我有:

对于 reiserf:

/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 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 更小的文件系统。

Omn*_*ous 19

这有两个原因。

首先,出于某种原因或其他操作系统编写者仍然报告可用空间为 base 2 系统,而硬盘驱动器制造商报告可用空间为 base 10 系统。例如,操作系统编写者将 1024 字节(2^10 字节)称为一千字节,而硬盘驱动器制造商会称一千字节为 1000 字节。这种差异对于千字节来说非常小,但是一旦达到 TB,就非常显着。操作系统编写者将 1099511627776 字节(2^40 字节)称为 1 TB,而硬盘驱动器制造商将 1000000000000 字节称为 1 TB。

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

二进制大小有一个非常受支持的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 将要存储的大部分数据,而目录条目(动态分配的)存储其余部分。

  • 有 ISO 标准:http://en.wikipedia.org/wiki/Binary_prefix (2认同)

Dav*_*ett 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
Run Code Online (Sandbox Code Playgroud)

调整保留块选项(tune2fs's-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
Run Code Online (Sandbox Code Playgroud)

正如您在上面的示例中看到的,即使以 root 用户身份登录df也不会在“可用”计数中显示保留空间。保留空间也不显示在“已使用”计数中,无论是作为 root 用户还是较低权限的用户登录。如果您没有预料到这两个事实,这有时会在文件系统接近满时引起混淆。

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