【kernel doc】The Second Extended Filesystem(ext2)


原文链接:
The Second Extended Filesystem

The Second Extended Filesystem

ext2 最初于 1993 年 1 月发布。由R’emy Card, Theodore Ts’o和Stephen Tweedie编写,这是对Extended Filesystem的重大改写。它目前仍然(2001 年 4 月)是 Linux 使用的主要文件系统。也有适用于 NetBSD、FreeBSD、GNU HURD、Windows 95/98/NT、OS/2 和 RISC OS 的实现。

Options

大多数默认值由文件系统超级块决定,可以使用 tune2fs(8) 设置。 内核确定的默认值由 (*) 标注。

bsddf(*)使df的行为像BSD那样
minixdf使df的行为像minix那样
check=none, nocheck(*)不要在挂载时对位图进行额外检查(删除了 check=normal 和 check=strict 选项)
dax使用直接访问(不用page cache)参考 Direct Access for files
debug发送到内核系统日志的额外的调试信息, 对开发人员有用
errors=continue当文件系统出现错误时继续运行
errors=remount-ro出现错误时以只读方式重新挂载
errors=panic如果发生错误,内核panic并停止机器
grpid, bsdgroups为对象提供与其父对象相同的组 ID。
nogrpid, sysvgroups新对象具有其创建者的组 ID。
nouid32使用16位的uid和gid
oldalloc启用旧的块分配器。 Orlov 分配器应该有更好的表现,如果对你来说相反,我们希望得到一些反馈
orlov(*)使用Orlov 块分配器 (参考http://lwn.net/Articles/14633/ and http://lwn.net/Articles/14446/.)
resuid=n可以使用保留块的用户 ID
resgid=n可以使用保留块的组 ID
sb=n在此位置使用备用超级块
user_xattr启用“user.”POSIX 扩展属性(需要 CONFIG_EXT2_FS_XATTR)
nouser_xattr不启用"user."拓展属性
acl启用 POSIX 访问控制列表支持(需要 CONFIG_EXT2_FS_POSIX_ACL)
noacl不启用posix acl
nobh不要将 buffer_heads 附加到文件页面缓存。
quota, usrquota启用用户磁盘配额支持(需要 CONFIG_QUOTA)
grpquota启用组磁盘配额支持(需要 CONFIG_QUOTA)

noquota 选项的展示 被 ext2 默认忽略

Specification

ext2 与传统的 Unix 文件系统有许多共享属性。 它有块、索引节点和目录的概念。 它在访问控制列表 (ACL)、片段、取消删除和压缩的规范中留下了实现空间,尽管这些尚未实现(有些作为单独的补丁提供)。 还有一个版本控制机制,允许以最大兼容的方式添加新功能(例如日志)。

Blocks

设备或文件中的空间被分成块。 这些是固定大小,为 1024、2048 或 4096 字节(在 Alpha 系统上为 8192 字节),这是在创建文件系统时决定的。 较小的块意味着每个文件浪费的空间更少,但需要更多的记录开销,并且还会对文件和文件系统的大小施加其他限制。

Block Groups

块被聚集组织成块组,以便在读取大量连续数据时减少碎片并最小化头部搜索量。 关于每个块组的信息保存在一个描述符表中,该表存储在超级块之后的块中。 每组开头附近的两个块保留用于块使用位图和 inode 使用位图,它们显示哪些块和 inode 正在使用中。 由于每个位图仅限于单个块,这意味着块组的最大大小是块大小的 8 倍。

每个块组中位图之后的块被指定为该块组的 inode 表,其余的块是数据块。 块分配算法尝试在与包含它们的 inode 相同的块组中分配数据块。

The Superblock

超级块包含有关文件系统配置的所有信息。超级块的主副本存储在距设备开头 1024 字节的偏移处,这对于挂载文件系统至关重要。由于它非常重要,超级块的备份副本存储在整个文件系统的块组中。 ext2 的第一个版本(修订版 0)在每个块组的开头存储一个副本,以及组描述符块的备份。由于这可能会为大型文件系统消耗大量空间,因此以后的修订版可以通过仅将备份放在特定组中来选择性地减少备份副本的数量(这是稀疏超级块功能)。选择的组是 0、1 和 3、5 和 7 的幂。

超级块中的信息包含一些字段,例如文件系统中的 inode 和块总数以及有多少空闲,每个块组中有多少 inode 和块,文件系统何时挂载(以及是否已完全卸载),当它被修改时,它是什么版本的文件系统(请参阅下面的修订部分)以及创建它的操作系统。

如果文件系统是版本 1 或更高版本,则有额外的字段,例如卷名、唯一标识号、inode 大小以及用于存储配置信息的可选文件系统功能的空间。

超级块中的所有字段(与所有其他 ext2 结构一样)都以小端格式存储在磁盘上,因此文件系统可以在机器之间移植,而无需知道它是在哪台机器上创建的。

Inodes

inode(索引节点)是 ext2 文件系统中的一个基本概念。文件系统中的每个对象都由一个 inode 表示。 inode 结构包含指向文件系统块的指针,文件系统块包含对象中保存的数据以及关于对象的除名字以外的所有元数据。关于对象的元数据包括权限、所有者、组、标志、大小、使用的块数、访问时间、更改时间、修改时间、删除时间、链接数、片段、版本(对于 NFS)和扩展属性(EA) ) 和/或访问控制列表 (ACL)。

在 inode 结构中有一些当前未使用的保留字段和一些已重载的字段。如果 inode 是目录,则为目录 ACL 保留一个字段;如果 inode 是常规文件(允许文件大小大于 2GB),则为文件大小的前 32 位保留一个字段。翻译器字段在 Linux 下未使用,但由 HURD 使用以引用将用于解释此对象的程序的 inode。大多数剩余的保留字段已被 Linux 和 HURD 用于更大的所有者和组字段,HURD 还具有更大的模式字段,因此它使用另一个剩余字段来存储额外的更多位。

有指向前 12 个块的指针,这些块包含 inode 中的文件数据。有一个指向间接块的指针(它包含指向下一组块的指针)、一个指向双间接块的指针(包含指向间接块的指针)和指向三重间接块的指针(包含指向双重间接块)。

flags 字段包含一些特定于 ext2 的标志,标准 chmod 标志无法使用这些标志。这些标志可以用 lsattr 列出并用 chattr 命令更改,并允许基于每个文件的特定文件系统行为。有安全删除、不可删除、压缩、同步更新、不变性、仅附加、可转储、无时间、索引目录和数据日志的标志。并非所有这些都受支持。

Directories

目录是一个文件系统对象,并且与文件一样具有 inode。 它是一个特殊格式的文件,其中包含一个个的记录,这些记录将每个文件名与一个 inode 编号关联起来。 文件系统的后续修订版还对对象的类型(文件、目录、符号链接、设备、fifo、套接字)进行了编码,以避免需要检查 inode 本身以获取此信息(目前尚不支持利用此功能) Glibc 2.2)。

inode 分配代码会尽量把inode分配到和首次创建它们的目录位于同一个块组。

ext2 的当前实现使用单向链表将文件名存储在目录中; 有待优化使用文件名的散列来允许查找而无需扫描整个目录。

一旦空目录块被分配以容纳更多文件,当前的实现永远不会删除空目录块。

Special files

符号链接也是具有 inode 的文件系统对象。 它们需要特别提一下,因为如果符号链接长度小于 60 字节,它们的数据存储在 inode 本身中。它使用通常用于存储指向数据块的指针的字段。 这是一个有价值的优化,因为我们避免为符号链接分配一个完整的块,并且大多数符号链接的长度小于 60 个字符。

字符和块特殊设备从来没有分配给它们的数据块。 相反,它们的设备号存储在 inode 中,再次重用将用于指向数据块的字段。

Reserved Space

在 ext2 中,有一种机制可以为特定用户(一般是超级用户)保留一定数量的块。 这是为了允许系统继续运行,即使非特权用户填满了他们可用的所有空间(这与文件系统配额无关)。 它还可以防止文件系统完全填满,这有助于防止碎片化。

Filesystem check

在启动时,大多数系统在其文件系统上运行一致性检查 (e2fsck)。 ext2 文件系统的超级块包含几个字段,这些字段指示 fsck 是否应该实际运行(因为如果文件系统很大,则在启动时检查文件系统可能需要很长时间)。如果文件系统没有完全卸载、超过最大挂载计数或超过检查之间的最长时间,那么将运行fsck。

Feature Compatibility

ext2 中使用的兼容性机制是复杂的。它可以安全地添加功能到文件系统中,而不会白白牺牲与旧版本文件系统代码的兼容性。 ext2的原始修订版0(EXT2_GOOD_OLD_REV)不支持特性兼容机制,但在修订版1中引入。 共有三个32位字段,一个用于兼容特性(COMPAT),一个用于只读兼容(RO_COMPAT)功能和不兼容 (INCOMPAT) 功能的其中之一。

这些功能标志对内核具有特定的含义,如下所示:

COMPAT 标志表示文件系统中有一个新特性,但磁盘格式与旧的磁盘格式 100% 兼容,因此不知道这个特性的内核可以读/写文件系统而不会任何损坏文件系统(甚至使其不一致)。这本质上只是一个标志,上面写着“这个文件系统有一个(隐藏的)特性”,内核或 e2fsck 可能想要知道(稍后将详细介绍 e2fsck 和特性标志)。 ext3 HAS_JOURNAL 特性是一个 COMPAT 标志,因为 ext3 日志只是一个包含数据块的普通文件,因此如果内核不理解 ext3 日志,则不需要特别注意它。

RO_COMPAT 标志表示磁盘格式与旧磁盘格式的读取100% 兼容(即该功能不会更改可见的磁盘格式)。但是,写入此类文件系统的旧内核会/可能会损坏文件系统,因此可以防止这种情况。最常见的此类功能 SPARSE_SUPER 是RO_COMPAT 功能,因为稀疏组会让文件数据块取代之前的超级块/组描述符备份中,但ext2_free_blocks() 不会释放这些块,这将导致位图不一致。如果旧内核试图释放一系列跨越组边界的块,它也会出错,但这是 SPARSE_SUPER 文件系统中的合法布局。

INCOMPAT 标志表示磁盘格式已以某种方式更改,使其无法被旧内核读取,或者如果旧内核试图挂载它,则会导致一些问题。 FILETYPE 是一个 INCOMPAT 标志,因为旧内核会认为文件名超过 256 个字符,这会导致目录列表损坏。COMPRESSION 标志是一个明显的 INCOMPAT 标志——如果内核没有实现压缩,它只会从 read() 返回垃圾而不会自动解压缩你的数据。需要 ext3 RECOVER标志来防止没有实现ext3日志的内核在不重播日志的情况下挂载文件系统。

对于 e2fsck,它需要比内核更严格地处理这些标志。如果它不理解任何 COMPAT、RO_COMPAT 或 INCOMPAT 标志,它将拒绝检查文件系统,因为它无法验证给定的功能是否有效。允许 e2fsck 在具有未知功能的文件系统上成功对用户来说是一种错误的安全感。拒绝检查具有未知功能的文件系统会促使用户更新到最新 e2fsck。这也意味着任何向 ext2 添加功能标志的人也需要更新 e2fsck 以验证这些功能。

Metadata

人们经常声称写入异步元数据的 ext2 实现比 ffs 同步元数据方案快,但不太可靠。 这两种方法都可以通过各自的 fsck 程序同样解析。

如果您特别在意,有 3 种方法可以在 ext2 上同步元数据写入:

  • 每个文件,如果你有程序源:使用 O_SYNC 标志来 open()

  • 如果您没有源文件,则为每个文件:在文件上使用“chattr +S”

  • 每个文件系统:添加“同步”选项以挂载(或在 /etc/fstab 中)

第一个和最后一个不是特定于 ext2 的,但确实强制同步写入元数据。 另请参阅下面的日记。

Limitations

ext2 的磁盘布局存在各种限制。内核代码的当前实现施加了其他限制。 许多限制是在首次创建文件系统时确定的,并取决于所选的块大小。 inode 与数据块的比率在文件系统创建时是固定的,因此增加 inode 数量的唯一方法是增加文件系统的大小。 当前不存在可以更改 inode 与块的比率的工具。

大多数这些限制可以通过磁盘格式的轻微更改和使用兼容性标志来表示格式更改来克服(以牺牲一些兼容性为代价)。

文件系统块大小1kb2kb4kb8kb
文件大小限制16GB256GB2048GB2048GB
文件系统大小限制2047GB8192GB16384GB32768GB

2.4 内核中单个块设备限制为 2048GB,因此此时无法创建大于该值的文件系统。内核页面大小对块大小也有上限,因此 8kB 块只允许在 Alpha 系统(和其他支持更大页面的体系结构)上。

单个目录的子目录数量上限为 32000 个。

在当前的线性链表目录实现中,单个目录中有大约 10-15k 个文件的“软”上限。此限制源于在如此大的目录中创建和删除(以及查找)文件时的性能问题。使用散列目录索引(正在开发中)允许单个目录中的 100k-1M+ 文件没有性能问题(尽管此时 RAM 大小成为一个问题)。

单个目录中文件的(无意义的)绝对上限(由文件大小强加的,现实限制显然要少得多)超过130万亿个文件。除非没有足够的 4 个字符的名称来组成唯一的目录条目,否则它会更高,因此它们必须是 8 个字符的文件名,即使这样我们也很接近用完唯一的文件名。

Journaling

Stephen Tweedie 开发了 ext2 代码的日志扩展。它避免了元数据损坏的风险以及在崩溃后需要等待 e2fsck 完成的风险,且无需更改磁盘上的 ext2 布局。简而言之,日志是一个常规文件,在将它们写入文件系统之前,它存储已修改的整个元数据(和可选的数据)块。这意味着可以将日志添加到现有的 ext2 文件系统,而无需进行数据转换。

当对文件系统的更改(例如,文件被重命名)时,它们将存储在日志中的事务中,并且在崩溃时可以是完整的或不完整的。如果事务在崩溃时完成(或在系统未崩溃的正常情况下),则该事务中的任何块都保证表示有效的文件系统状态,并被复制到文件系统中。如果在崩溃时事务未完成,则无法保证该事务中的块的一致性,因此它们将被丢弃(这意味着它们所代表的任何文件系统更改也会丢失)。如果您想阅读有关 ext4 和日志的更多信息,请查看Documentation/filesystems/ext4/。

References

内核源码file:/usr/src/linux/fs/ext2/
e2fsprogs (e2fsck)http://e2fsprogs.sourceforge.net/
设计和实现http://e2fsprogs.sourceforge.net/ext2intro.html
Journaling (ext3)ftp://ftp.uk.linux.org/pub/linux/sct/fs/jfs/
文件系统大小调整http://ext2resize.sourceforge.net/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值