我最近格式化了一个 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
1K 块的差异意味着可用空间明显减少了 22 GiB。
我已经执行了
tune2fs -O \^has_journal
tune2fs -r 0
tune2fs -m 0
毫不奇怪,没有任何效果,因为这不会影响不存在的块。
尽管如此,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
因此,例如 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
那个缺失的空间是用来做什么的?
答案1
让我们来看看。设备大小为 1,465,138,583½ kB = 1,500,301,909,504 B。文件系统由 366,284,288 个块组成,每个块 4096 B,即 1,500,300,443,648 B。我不知道剩余的 1,465,856 B(1.4 MB)用于什么(额外的)超级块的副本?我知道引导加载程序的开头有几 kB 的空间。)。
文件系统包含 91,578,368 个 inode,每个 inode 256 字节,占用 23,444,062,208 B(约 22 GB,提示,提示)。那么文件内容就有 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 块,在日志大小的正确范围内。
如您所见,一切都已考虑在内。 (好吧,几乎所有东西,但我们说的是兆字节,而不是千兆字节。)
答案2
首先,您看到的可用空间差异并不意味着存在“浪费”空间;而是意味着空间被“浪费”了。它不会被浪费,因为它对于文件系统的运行至关重要。如果没有一个非常大的“但是”来指定文件系统之间的所有设计和结构差异以及每个实现的细节(例如每个驱动程序如何向 VFS 层报告可用空间),则不应以这种方式比较 Ext4 和 NTFS。
将分区想象成一个巨大的空间,您可以在其中放置您拥有的任何数据。如果你只有一条数据,其大小等于分区,你可以从分区的开头开始写入它,然后就可以了。但你没有。相反,您可能有数千个小文件,所有这些文件以不同的方式分组,每个文件与许多其他小数据(名称、日期/时间和权限)等相关联。您必须组织大的空间。分区,以便您可以快速有效地访问所有这些数据。此外,您还必须关心如何有效地写入新数据并丢弃旧数据。你需要数据结构。
并且有很多数据结构。其中一些非常愚蠢,另一些允许您以更慢的写入速度更快地检索数据,另一些允许以读取速度更快的速度写入,有些仍然可能非常擅长读取和写入,但需要长时间的暂停和重新排列数据等时的空闲开销。
您当然想要一个具有以下功能的系统:
- 写入信息的速度非常快;
- 从中检索信息的速度非常快;
- 善于组织和管理其中存储的信息;
- 充分利用存储文件系统的空间(分区);
- 能够抵御硬件问题,因此您仍然可以在部分系统故障时恢复大部分或全部信息;
- 能够抵御软件问题,因此应用程序中的错误或安装的恶意应用程序不会永久破坏您的数据;
- 能够抵御人为错误,因此当您不小心命令系统删除不该删除的内容(又称垃圾箱/回收站)时,它会原谅您。
高性能文件系统允许非常快速的读取和写入,但会牺牲一些空间。文件系统中使用的一些最快的数据结构,例如哈希表和B树,非常复杂,并且它们保留比实际使用更多的空间,以便允许非常快速的访问。
Ext4 还有其他重要的属性。文件系统中不存在单点故障。分区中散布着许多关键数据的副本,而其他一些文件系统(对于 NTFS 我不能这么说)如果在正确的位置发生故障,可能会导致所有数据无法读取。此外,Ext4 在文件系统创建阶段为您的数据保留了大量空间,而 NTFS 则随着您的数据而增长。
答案3
WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'!
The util fdisk doesn't support GPT. Use GNU Parted.
此消息表明磁盘使用 GPT 样式分区,并且此fdisk
工具仅理解旧版 MBR 样式。
为了防止在将 GPT 分区磁盘插入较旧的非 GPT 感知系统时意外重新格式化,GPT 分区方案包括一个“保护性 MBR”:一个完全伪造的分区表,基本上告诉您“此磁盘已完全被您的分区类型使用”。对任何只了解 MBR 分区的操作系统或工具一无所知。
要准确显示您的分区表/dev/sdb
,请使用:
parted /dev/sdb print