ext4:如何占文件系统空间?

mis*_*isc 17 filesystems ext4 disk-usage

我最近格式化了一个 1.5 TB 驱动器,打算用 ext4 替换 ntfs。

然后我注意到我保存的文件不适合新分区。

df:

ext4 (ext3 & ext2 show the same behavior)
Filesystem      1K-blocks   Used  Available Use% Mounted on
/dev/sdb1      1442146364   71160 1442075204    1% /media/Seagate

ntfs (similar to all other options that gparted offers):
/dev/sdb1      1465137148  110700 1465026448    1% /media/Seagate
Run Code Online (Sandbox Code Playgroud)

1K 块的差异意味着可用空间明显减少了 22 GiB。

我已经执行了

tune2fs -O \^has_journal
tune2fs -r 0
tune2fs -m 0
Run Code Online (Sandbox Code Playgroud)

不出所料,没有效果,因为这不会影响不存在的块。

尽管如此,fdisk 报告 ext4 分区覆盖了整个磁盘。

fdisk -l /dev/sdb:

WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.

Disk /dev/sdb: 1500.3 GB, 1500301910016 bytes
255 heads, 63 sectors/track, 182401 cylinders, total 2930277168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1  2930277167  1465138583+  ee  GPT
Run Code Online (Sandbox Code Playgroud)

因此,例如 resize2fs 报告说“无事可做!”

dumpe2fs -h /dev/sdb1:
dumpe2fs 1.41.14 (22-Dec-2010)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          d6fc8971-89bd-4c03-a7cd-abdb945d2173
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              91578368
Block count:              366284288
Reserved block count:     0
Free blocks:              360518801
Free inodes:              91578357
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      936
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat May 21 17:12:04 2011
Last mount time:          Sat May 21 17:15:30 2011
Last write time:          Sat May 21 17:24:32 2011
Mount count:              1
Maximum mount count:      32
Last checked:             Sat May 21 17:12:04 2011
Check interval:           15552000 (6 months)
Next check after:         Thu Nov 17 16:12:04 2011
Lifetime writes:          1372 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Default directory hash:   half_md4
Directory Hash Seed:      c334e6ef-b060-45d2-b65d-4ac94167cb09
Journal backup:           inode blocks
Run Code Online (Sandbox Code Playgroud)

什么在使用这个缺失的空间?

Gil*_*il' 21

让我们来看看。设备大小为 1,465,138,583½ kB = 1,500,301,909,504 B。文件系统由 366,284,288 个块组成,每个块为 4096 B,即 1,500,300,443,648 B。我不知道剩余的 1546 个副本(1546 个 B. ? 我知道引导加载程序的开头有几 kB 的空间。)。

文件系统包含 91,578,368 个 inode,每个 256 字节,占用 23,444,062,208 B(约 22 GB,hint,hint)。然后有 1,442,146,364 kB = 1,476,757,876,736 B 用于文件内容。这占 23,444,062,208 B + 1,476,757,876,736 B = 1,500,201,938,944 B。剩余的大小是 98,504,704 B = 24,029 块,这是在正确的日志大小范围内。

如您所见,一切都已考虑在内。(好吧,几乎所有东西,但我们说的是兆字节,而不是千兆字节。)


Jul*_*ano 13

首先,您看到的可用空间的差异并不意味着“浪费”了空间;它不会被浪费,因为它对于文件系统的运行至关重要。如果没有一个非常大的“但是”指定文件系统之间的所有设计和结构差异,以及每个实现的细节(例如每个驱动程序如何向 VFS 层报告可用空间),您不应该以这种方式比较 Ext4 和 NTFS。

将分区想象成一个巨大的空间,您可以在其中放置您拥有的任何数据。如果你只有一个大小等于分区的数据,你可以从分区的开头开始写它,然后用它很酷。但你没有。相反,您可能有数千个小文件,所有这些文件以不同的方式分组,每个文件与许多其他小数据(名称、日期/时间和权限)等相关联。您必须组织大空间分区,以便您可以快速有效地访问所有这些数据。此外,您必须关心如何有效地写入新数据和丢弃旧数据。你需要数据结构

并且有很多数据结构。其中一些非常愚蠢,另一些允许您以更慢的写入为代价更快地检索数据,其他允许以读取速度为代价更快地写入,有些仍然可能非常擅长读写,但需要长时间的停顿和重新排列数据时的空闲开销等。

您当然想要一个系统:

  1. 在上面写信息非常快;
  2. 从中检索信息非常快;
  3. 善于组织和管理存储在其中的信息;
  4. 充分利用存储文件系统的空间(分区);
  5. 对硬件问题具有弹性,因此您仍然可以在部分系统故障时获得大部分或全部信息;
  6. 对软件问题具有弹性,因此应用程序中的错误或安装的恶意应用程序不会永久破坏您的数据;
  7. 对人为错误具有弹性,因此当您不小心命令系统删除您不应该删除的内容(又名垃圾箱/回收站)时,它会原谅您。

高性能文件系统允许以牺牲一些空间为代价进行非常快速的读取和写入。文件系统中使用的一些最快的数据结构,如哈希表B 树,非常复杂,它们保留比实际使用更多的空间,以允许非常快速的访问。

Ext4 还有其他重要的属性。文件系统中没有单点故障。有许多关键数据的副本分布在分区中,而其他一些文件系统(我不能说是 NTFS)可能会导致您的所有数据无法读取,如果故障发生在正确的位置。此外,Ext4 在文件系统创建阶段为您的数据保留了大量空间,而 NTFS 会随着您的数据而增长。