ext3、ext4 orphan inode机制分析

合集下载

简述linux文件系统的类型

简述linux文件系统的类型

简述linux文件系统的类型Linux文件系统的类型文件系统是操作系统中用来组织和管理文件的一种机制。

Linux作为一种开源的操作系统,拥有多种不同的文件系统类型来适应不同的需求和场景。

本文将对常见的Linux文件系统类型进行简要介绍。

1. ext4文件系统ext4(Fourth Extended File System)是Linux中最常用的文件系统类型之一。

它是对ext3文件系统的改进和升级,具有更好的性能和稳定性。

ext4文件系统支持最大16TB的单个文件,最大1EB的文件系统大小,同时支持日志功能,可以在系统崩溃后快速恢复文件系统。

2. ext3文件系统ext3(Third Extended File System)是ext2文件系统的改进版本,它添加了日志功能以提供更好的数据一致性和可靠性。

相比ext2,ext3具有更好的容错能力,可以在系统崩溃后更快地恢复文件系统。

ext3文件系统最大支持16TB的文件大小和8TB的文件系统大小。

3. ext2文件系统ext2(Second Extended File System)是Linux中最早的一种文件系统类型,它为Linux提供了一个可靠的文件存储机制。

ext2文件系统采用了索引节点(inode)的结构来组织文件和目录,支持文件和目录的权限和属性设置。

然而,ext2文件系统没有日志功能,对于系统崩溃或断电等异常情况,恢复文件系统需要较长的时间。

4. XFS文件系统XFS是一个高性能的日志文件系统,最初由SGI开发,后来被红帽公司广泛采用。

XFS文件系统支持最大8EB的文件系统大小和最大8EB的单个文件大小。

它具有快速的文件系统检查和修复功能,并且能够高效地处理大文件和大量小文件。

5. Btrfs文件系统Btrfs(B-tree file system)是一个基于B树的文件系统,它是Linux内核的一部分,并且正在逐渐取代ext4成为Linux中的主流文件系统。

ext3中文件索引顺序

ext3中文件索引顺序

ext3中文件索引顺序English Answer.The file indexing order in ext3 is as follows:1. Inode Table: The inode table is an array of data structures that describe each file and directory on the filesystem. Each inode contains information such as thefile's size, owner, permissions, and the location of its data blocks.2. Block Groups: The filesystem is divided into block groups, which are groups of contiguous blocks. Each block group has its own inode table and data blocks.3. Inode Allocation Bitmap: The inode allocation bitmap is a bitmap that tracks which inodes are in use. When afile is created, an unused inode is allocated and the corresponding bit in the bitmap is set to 1.4. Block Allocation Bitmaps: Each block group has its own block allocation bitmap, which tracks which blocks in the block group are in use. When a block is allocated to a file, the corresponding bit in the bitmap is set to 1.5. Data Blocks: The data blocks contain the actual data of the files and directories on the filesystem. Each data block is 4 KB in size.When a file is opened, the kernel reads the inode for the file from the inode table. The inode contains the location of the file's data blocks, so the kernel can then read the data blocks from the filesystem and load the file into memory.中文回答。

Ext4文件系统架构分析(一)

Ext4文件系统架构分析(一)

Ext4⽂件系统架构分析(⼀)本⽂描述Ext4⽂件系统磁盘布局和元数据的⼀些分析,同样适⽤于Ext3和Ext2⽂件系统,除了它们不⽀持的Ext4的特性外。

整个分析分两篇博⽂,分别概述布局和详细介绍各个布局的数据结构及组织寻址⽅式等。

感兴趣的看官敬请留意和指导!1. Ext4⽂件系统布局综述⼀个Ext4⽂件系统被分成⼀系列块组。

为减少磁盘碎⽚产⽣的性能瓶颈,块分配器尽量保持每个⽂件的数据块都在同⼀个块组中,从⽽减少寻道时间。

以4KB的数据块为例,⼀个块组可以包含32768个数据块,也就是128MB。

1.1 磁盘布局Ext4⽂件系统的标准磁盘布局如下:Ext4⽂件系统主要使⽤块组0中的超级块和块组描述符表,在其他⼀些特定块组中有超级块和块组描述符表的冗余备份。

如果块组中不含冗余备份,那么块组就以数据块位图开始。

当格式化磁盘成为Ext4⽂件系统的时候,mkfs将在块组描述符表后⾯分配预留GDT表数据块(“Reserve GDT blocks”)以⽤于将来扩展⽂件系统。

紧接在预留GDT表数据块后的是数据块位图与inode表位图,这两个位图分别表⽰本块组内的数据块与inode表的使⽤,inode表数据块之后就是存储⽂件的数据块了。

在这些各种各样的块中,超级块、GDT、块位图、Inode位图都是整个⽂件系统的元数据,当然inode表也是⽂件系统的元数据,但是inode表是与⽂件⼀⼀对应的,我更倾向于将inode当做⽂件的元数据,因为在实际格式化⽂件系统的时候,除了已经使⽤的⼗来个外,其他inode表中实际上是没有任何数据的,直到创建了相应的⽂件才会分配inode表,⽂件系统才会在inode表中写⼊与⽂件相关的inode信息。

1.2 Flexible 块组(flex_bg)Flexible 块组(flex_bg)是从Ext4开始引⼊的新特性。

在⼀个flex_bg中,⼏个块组在⼀起组成⼀个逻辑块组flex_bg。

Ext3文件系统

Ext3文件系统

EXT3文件系统EXT2和EXT3是许多Linux操作系统发行版本的默认文件系统。

EXT基于UFS,是一种快速、稳定的文件系统。

随着Linux系统在关键业务中的应用,Linux文件系统的弱点也渐渐显露出来了;其中EXT2文件系统是非日志式文件系统,这在关键行业的应用是一个致命的弱点,EXT3文件系统弥补了这一缺点。

EXT3文件系统是直接从EXT2文件系统发展而来,目前EXT3文件系统已经非常稳定可靠。

它完全兼容EXT2文件系统。

用户可以平滑地过渡到一个日志功能健全的文件系统中来。

这实际上了也是EXT3日志文件系统初始设计的初衷。

Ext3文件系统属于一种日志文件系统,是对Ext2系统的扩展。

Ext3系统兼容Ext2文件系统,二者之间的相互转换并不复杂。

Ext2是 GNU/Linux 系统中标准的文件系统,其簇快取层的优良设计使得Ext2系统存取文件的性能非常好,尤其是针对中小型的文件更显优势。

Ext3是一种日志式文件系统,日志文件系统比传统的文件系统安全,因为它用独立的日志文件跟踪磁盘内容的变化。

就像关系型数据库(RDBMS),日志文件系统可以用事务处理的方式,提交或撤消文件系统的变化。

由于文件系统都有快取层参与运作,不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。

因此每当系统要关机时,必须将其所有的文件系统全部关闭后才能进行关机。

如果在文件系统尚未关闭前就关机 (如停电) 时,下次重开机后会造成文件系统的资料不一致,故(所以)这时必须做文件系统的重整工作,将不一致与错误的地方修复。

然而这一重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。

为了克服此问题,使用(便出现了)所谓的日志式文件系统 (Journal File System) 。

此类文件系统最大的特色是,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回溯追踪。

由于资料的写入动作包含许多的细节,如改变文件标头资料、搜寻磁盘可写入空间、一个个写入资料区段等等,每一个细节进行到一半若被中断,就会造成文件系统的不一致,因而需要重整。

linux不同文件系统向磁盘读写的方式

linux不同文件系统向磁盘读写的方式

linux不同文件系统向磁盘读写的方式Linux操作系统支持多种文件系统,每种文件系统向磁盘读写的方式可能会有所不同。

下面我们来了解一下几种常见的文件系统及它们向磁盘读写的方式。

1. ext2/ext3/ext4文件系统这是Linux下最常用的文件系统之一,其向磁盘读写的方式主要采用块设备的形式。

在磁盘上,ext文件系统会将数据分成多个块写入到不同的扇区中,因此读写速度相对较快。

同时,ext文件系统还采用了日志方式来记录磁盘上的数据操作,从而提高了数据的安全性。

2. Btrfs文件系统Btrfs文件系统是Linux下的一种新型文件系统,能够支持更高级别的数据压缩、快照、复制等功能。

在Btrfs文件系统中,向磁盘读写的方式主要采用了写时复制(Copy-on-Write)的方式。

该方式在写入数据时会先复制一份到另一个区域,然后再将修改后的数据写入原位置。

这种方式能够有效避免数据的丢失和损坏,同时也能够提高文件系统的读写性能。

3. NTFS文件系统NTFS文件系统是Windows下的一种文件系统,但也支持在Linux 中进行读写。

在NTFS文件系统中,向磁盘读写的方式主要采用了簇的形式。

当数据被写入磁盘后,NTFS文件系统会将其分成多个簇,然后将簇分别写入到磁盘的不同位置。

由于NTFS文件系统使用了较大的簇,因此会对小文件的读写速度造成一定影响。

综上所述,不同的文件系统对于磁盘读写的方式可能会有所不同。

对于不同的应用场景,我们需要选择合适的文件系统来进行数据存储和管理。

同时,也需要注意保护磁盘中的数据,避免因不当的操作而造成数据的丢失和损坏。

ext文件系统分析

ext文件系统分析

日志文件系统配置 Journal:将元数据和数据写操作涉及数据都写 入日志。 Ordered(省缺模式):日志只记录元数据写。 系统确保文件数据写盘后才进行元数据写操作, 减少文件数据损坏的机会 。 Writeback(最快模式):日志只记录元数据写。
17.8Ext4文件系统新特性
ext4 支持更大的文件系统、文件和子目录。最大
17.5 ext2与VFS层的接口函数 ext2_sops指针数组存放了super_operations 结构类型的一组操作函数指针;
ext2_file_inode_operations/ext2_dir_inod e_operations指针数组存放了inode_operations 结构类型的一组操作函数指针;(2.4版后将 ext2_file_inode_operations的大部分函数移到 ext2_aops中) ext2_file_operations指针数组存放了 file_operations结构类型的一组file操作函数 指针;
Inode及数据块区的bitmap表因为太大不可能同 时存于内核空间,需要部分缓冲处理;
17.4文件系统分区建立
利用/sbin/mke2fs实用程序建立ext2文件系统分 区。生成盘上相关数据结构、建根目录文件等。
如果系统断电等突然停机,e2fsck实用程序必须 在系统重启时运行以保证磁盘数据一致性。
ext2目录文件inode操作表: struct inode_operations ext2_dir_inode_operations = { create: ext2_create, lookup: ext2_lookup, link: ext2_link, unlink: ext2_unlink, symlink: ext2_symlink, mkdir: ext2_mkdir, rmdir: ext2_rmdir, mknod: ext2_mknod, rename: ext2_rename, };

LINUX EXT文件系统

LINUX  EXT文件系统

EXT文件系统研究报告EXT2 文件系统The Second Extended File System(ext2)文件系统是Linux系统中的标准文件系统,是通过对Minix的文件系统进行扩展而得到的,其存取文件的性能极好。

在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。

一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被删除。

此外,同一文件在磁盘中存放和被打开时所对应的inode是不同的,并由内核负责同步。

ext2文件系统采用三级间接块来存储数据块指针,并以块(block,默认为1KB)为单位分配空间。

其磁盘分配策略是尽可能将逻辑相邻的文件分配到磁盘上物理相邻的块中,并尽可能将碎片分配给尽量少的文件,以从全局上提高性能。

ext2文件系统将同一目录下的文件(包括目录)尽可能的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。

在扩展文件时,会尽量一次性扩展8个连续块给文件(以预留空间的形式实现)。

一、文件系统特性磁盘分区完毕后还需要进行格式化,之后操作系统才能够使用这个分区。

这是因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够利用的文件系统格式。

传统的磁盘与文件系统的应用中,一个分区誻只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个分区。

操作系统的文件数据除文件内容外,通常还有非常多的属性,Linux中的文件权限(rxw)与文件属性(所有者,群组、时间参数等)。

文件系统通常会将这两部分数据分别存放在不同的块:权限与属性放置到inode中.至于实际数据则放置到data block块中。

另外还有一个超级块(super block)会记录整个文件系统的的整体信息,包括inode 与block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block 号码。

Ext4,Ext3的特点和区别

Ext4,Ext3的特点和区别

Ext4,Ext3的特点和区别Linux kernel 自2.6.28 开始正式支持新的文件系统Ext4。

Ext4 是Ext3 的改进版,修改了Ext3 中部分重要的数据结构,而不仅仅像Ext3 对Ext2 那样,只是增加了一个日志功能而已。

Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:1. 与Ext3 兼容。

执行若干条命令,就能从Ext3 在线迁移到Ext4,而无须重新格式化磁盘或重新安装系统。

原有Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了Ext4 所支持的更大容量。

2. 更大的文件系统和更大的文件。

较之Ext3 目前所支持的最大16TB 文件系统和最大2TB 文件,Ext4 分别支持1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系统,以及16TB 的文件。

3. 无限数量的子目录。

Ext3 目前只支持32,000 个子目录,而Ext4 支持无限数量的子目录。

4. Extents。

Ext3 采用间接块映射,当操作大文件时,效率极其低下。

比如一个100MB 大小的文件,在Ext3 中要建立25,600 个数据块(每个数据块大小为4KB)的映射表。

而Ext4 引入了现代文件系统中流行的extents 概念,每个extent 为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的25,600 个数据块中”,提高了不少效率。

5. 多块分配。

当写入数据到Ext3 文件系统中时,Ext3 的数据块分配器每次只能分配一个4KB 的块,写一个100MB 文件就要调用25,600 次数据块分配器,而Ext4 的多块分配器“multiblock allocator”(mballoc)支持一次调用分配多个数据块。

6. 延迟分配。

Ext3 的数据块分配策略是尽快分配,而Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ext3、ext4的orphan inode机制分析一、概述orphan在英文中是孤儿的意思,在这里取被遗弃、被删除之意。

orphan inode是什么样的inode呢?这种inode是怎样产生的呢?先介绍一个概念,文件的引用计数,准确地说应该是inode的引用计数,因为一般来说一个文件会对应一个inode。

文件的引用计数,简单地说是表示有多少个文件指向该文件,准确地说是文件的硬链接的个数。

情况1:设想一个进程,open一个文件,然后unlink该文件,然后进行文件读写。

这是允许的,并且在进程退出时,内核会自动将引用计数为0的文件删除。

但是如果该进程尚未退出之前,系统崩溃了,那么,内核就没有机会将已被unlink、并且引用计数为0的inode从磁盘上删除了。

情况2:设想我们正在截断一个大文件(系统调用truncate),但是操作尚未完成,系统就崩溃了。

同样,内核也没有办法将该文件的所有数据块全部删除了。

ext3、ext4的orphan inode机制就是处理上述两种情况的。

基本思想是这样的:如果要删除或截断一个inode,要先把这个inode记录到磁盘上的一个特殊的orphan inode链表上。

如果删除或截断操作能够正常完成,那么,就从磁盘上的orphan inode链表上删除该inode;否则,如果删除或截断操作未完成之前,系统就发生崩溃了,那么,系统重启后,文件系统会遍历磁盘上的orphan inode链表,对链表上的每一个inode都重新进行一遍删除或截断操作,以此来保证这些inode真正在磁盘上被删除,维护文件系统的一致性。

内核版本:2.6.35二、相关数据结构及之间的关系先总体说一下orphan inode的组织。

orphan inode需要在两个地方组织,分别是在内存中和在磁盘上。

不论在哪里,从抽象角度来看,orphan inode都被组织成一个单向链表。

1、ext4_inodestruct ext4_inode {__le32 i_dtime; /* Deletion Time */.........}这个是磁盘上的inode的结构,i_dtime本来表示该inode被删除的时间,在orphan inode机制中,因为此时该域的值并不重要,故借用一下,用于记录下一个被unlink/truncate的inode号。

2、ext4_super_blockstruct ext4_super_block {__le32 s_last_orphan; /* start of list of inodes to delete */.........}这个是磁盘上的superblock 结构。

其中,s_last_orphan 记录的是最近一个被unlink/truncate 的inode 号,从抽象角度来看,它就代表磁盘上orphan inode 单链表的头。

新的inode 插入orphan inode 链表时采用“头插法”,也就是说,最近被unlink/truncate 的inode 号会放在s_last_orphan 中。

这样,磁盘上的orphan inode 单链表如下图1所示。

图1 磁盘上的orphan inode 链表结构图3、ext4_inode_infostruct ext4_inode_info {__u32 i_dtime;struct list_head i_orphan; /* unlinked but open inodes */.......}这个是内存中的inode 结构,即 磁盘上的ext4_inode 在内存中的表现。

其中,i_dtime 与ext4_inode 中的i_dtime 相对应,i_orphan 是个链表节点,用于在内存中组成orphan inode 链表。

4、ext4_sb_infostruct ext4_sb_info {struct list_head s_orphan;struct mutex s_orphan_lock;.........}这个是内存中的superblock 结构,即磁盘上ext4_super_block 在内存中的表现。

其中,s_orphan 代表链表头,s_orphan_lock 是用于保护链表的互斥锁。

在内存中的orphan inode 链表结构与图1很类似,在此从略。

三、辅助函数1、NEX T_ORPHAN(inode)fs/ext4/ext4.h1209 #define NEXT_ORPHAN(inode) EXT4_I(inode)->i_dtime这个宏的作用是在磁盘orphan inode链表上取得下一个orphan inode号。

2、ext4_orphan_g et()1074 struct inode *ext4_orphan_g et(struct super_block *sb, unsi g ned lon g ino){ .......1104 inode = ext4_i g et(sb, ino);.......}这个函数的主要作用是根据一个inode号ino,从磁盘上将该inode的信息读入内存,保存在ext4_inode_info结构中。

3、ext4_orphan_add()1984 int ext4_orphan_add(handle_t *handle, struct inode *inode){.......// 将“下一个”最近的inode号保存在本inode的ext4_inode_info->i_dtime中// 这样,当本inode写回磁盘时,会将“下一个”orphan inode号写回磁盘。

2030 NEX T_ORPHAN(inode)= le32_to_cpu(EX T4_SB(sb)->s_es->s_last_orphan);// 将最近的inode号保存在ext4_super_block->s_last_orphan中,// 这样,当本超级块写回磁盘时,会将最近的orphan inode号写回磁盘。

2031 EX T4_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino);.......// 将内存中的ext4_inode_info结构链到ext4_sb_info->s_orphan链表的第一个位置。

2046 if (!err)2047 list_add(&EX T4_I(inode)->i_orphan,&EX T4_SB(sb)->s_orphan);.......}总之,ext4_orphan_add()的作用是在内存中和磁盘上的orphan inode链表中分别添加一个inode节点。

4、ext4_orphan_del()2062 int ext4_orphan_del(handle_t *handle, struct inode *inode){.......// 取得磁盘上“下一个”orphan inode号2079 ino_next =NEX T_ORPHAN(inode);// 取得内存中“上一个”orphan inode的节点2080 pre v= ei->i_orphan.pre v;.......// 在内存中的orphan inode链表上将该inode删除2085 list_del_init(&ei->i_orphan);.......// 下面的代码为什么会有分支?// 主要是因为要区分要删除的inode是不是链表头2098 if (pre v==&sbi->s_orphan) {// 如果要删除的inode在链表头// ext4_super_block->s_last_orphan中记录该inode的下一个inode号即可2104 sbi->s_es->s_last_orphan = cpu_to_le32(ino_next);2106 } else {// 否则,要删除的inode不在链表头// 用上一个inode的i_dtime记录本inode下一个inode号2116 NEX T_ORPHAN(i_pre v)= ino_next;2118 }.......// 本inode已从orphan链表中删除了,故这里i_dtime设为02121 NEX T_ORPHAN(inode)= 0;.......}总之,ext4_orphan_del()的作用是在内存中和磁盘上的orphan inode链表中分别删除一个inode节点四、删除一个inode的正常过程我们结合unlink系统调用的逻辑,看看删除一个inode的正常的过程。

注意:我们只看未unlink前,该inode的引用计数为1,unlink后,该inode的引用计数为0的情况。

因为只有这种情况才会要求真正从磁盘上删除该inode。

SYSCALL_D EFINE1(unlink, const char __user *, pathname)-->do_unlinkat-->v fs_unlink-->ext4_unlink-->ext4_delete_entr y从该文件所在目录中删除该文件-->ext4_orphan_add-->iput-->iput_final-->g eneric_drop_inode-->g eneric_delete_inode(inode);-->ext4_delete_inode-->ext4_truncate清除磁盘上的索引信息-->ext4_orphan_del-->ext4_free_inode从内存中和磁盘上分别删除该inode由此过程可知,在删除一个inode时,ext4_orphan_add和ext4_orphan_del是成对使用的,这样才能保证一致性。

五、恢复时处理orphan inode的逻辑一般而言,上述unlink过程在ext4_delete_inode会执行较长的时间,因为里面有ext4_truncate函数,它负责把inode的全部索引信息清除,如果一个文件比较大,索引信息就会很多,删除过程就会很长。

现在有两个假设:假设1、假设orphan inode的信息已经写回磁盘,这样磁盘上的inode和superblock就包含了orphan inode的信息。

假设2、假设在ext4_delete_inode函数的执行过程中,系统崩溃了。

相关文档
最新文档