您的位置:首页 > 运维架构 > Linux

Linux的Ext2文件系统

2015-07-20 14:34 519 查看

一、硬盘组成与分割

各种接口的磁盘在Linux中的文件名分别为:

/dev/sd[a-p][1-15]:为SCSI, SATA,U盘, Flash闪盘等接口的磁盘文件名;

/dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名; 

二、文件系统特性

        文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。

        每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下:

superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;

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

block:实际记录文件的内容,若文件太大时,会占用多个 block 。

        每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码。因此,我们可以知道的是,如果能够找到文件的 inode 的话,那么自然就会知道这个文件所放置数据的 block 号码,当然也就能够读出该文件的实际数据了。

        我们将 inode 与 block 区块用图解来说明一下,如下图所示,文件系统先格式化出 inode 与 block 的区块,假设某一个文件的属性与权限数据是放置到 inode 4 号(下图较小方格内),而这个 inode 记录了文件数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容读出来!那么数据的读取就如同下图中的箭头所指定的模样了。



图1.2.1、inode/block 数据存取示意图

        这种数据存取的方法我们称为索引式文件系统(indexed allocation)。那有没有其他的惯用文件系统可以比较一下啊?有的,那就是我们惯用的闪盘(闪存),闪盘使用的文件系统一般为 FAT 格式。FAT 这种格式的文件系统并没有 inode 存在,所以 FAT 没有办法将这个文件的所有 block 在一开始就读取出来。每个 block 号码都记录在前一个 block 当中,他的读取方式有点像底下这样:



图1.2.2、FAT文件系统数据存取示意图

三、Linux 的 EXT2 文件系统(inode):

        文件系统一开始就将 inode 与 block 规划好了,除非重新格式化(或者利用 resize2fs 等命令变更文件系统大小),否则 inode 与 block 固定后就不再变动。但是如果仔细考虑一下,如果我的文件系统高达数百GB时,那么将所有的 inode 与 block 通通放置在一起将是很不智的决定,因为 inode 与 block 的数量太庞大,不容易管理。 

        为此之故,因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。感觉上就好像我们在当兵时,一个营里面有分成数个连,每个连有自己的联络系统,但最终都向营部回报连上最正确的信息一般!这样分成一群群的比较好管理啦!整个来说,Ext2 格式化后有点像底下这样:



图1.3.1、ext2文件系统示意图(注1)

        在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装启动管理程序,这是个非常重要的设计,因为如此一来我们就能够将不同的启动管理程序安装到个别的文件系统最前端,而不用覆盖整颗硬盘唯一的 MBR。

data block (数据区块)

data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的block 大小有 1K, 2K 及 4K 三种而已。

inode table (inode 表格)

inode 的内容在记录文件的属性以及该文件实际数据是放置在哪几号 block 内!基本上,inode 记录的文件数据至少有底下这些:

该文件的存取模式(read/write/excute);

该文件的拥有者与群组(owner/group);

该文件的容量;

该文件创建或状态改变的时间(ctime);

最近一次的读取时间(atime);

最近修改的时间(mtime);

定义文件特性的旗标(flag),如 SetUID...;

该文件真正内容的指向 (pointer);

如下所示:

[root@chenchen cctmp]# stat ccc.c
File: “ccc.c”
Size: 877             Blocks: 8          IO Block: 4096   一般文件
Device: 802h/2050d      Inode: 2111402     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-07-18 15:15:52.000000000 +0800
Modify: 2015-07-14 09:42:29.000000000 +0800
Change: 2015-07-14 09:42:29.000000000 +0800


inode 的数量与大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特色呢?

每个 inode 大小均固定为 128 bytes;

每个文件都仅会占用一个 inode 而已;

承上,因此文件系统能够创建的文件数量与 inode 的数量有关;

系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。

        我们约略来分析一下 inode / block 与文件大小的关系好了。inode要记录的数据非常多,但偏偏又只有
128bytes 而已,而 inode 记录一个 block号码要花掉 4byte ,假设我一个文件有400MB 且每个 block 为 4K 时,那么至少也要十万笔 block
号码的记录呢!inode 哪有这么多可记录的信息?

        学过OS的人都知道,文件系统这种存储方式实际上和内存的存储方式也是一样的,inode就像每一个程序的页表一样,一个程序有一个页表,那么一个文件也有一个Node。在内存管理中,如果一个程序的信息太多,页表不能再大,装不下那么多信息,操作系统就会使用一个叫做间接多级页表的方式也离散存储页表,也就是说利用计算机中离散的空间来分散存储一个大的页表。在文件系统中也是一样,如果inode存储不了那么多block的编号信息,那么inode就会利用间接,双间接,这种技术,来吧inode里面的信息分级存储,一些Block块内只是存储了block块存储信息的下一个block块的信息而已。这样一来,通过多级离散存储,就可以解决一些大文件的inode存不下他所有的Block块的问题。

        为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。这是啥?我们将 inode 的结构画一下好了。



图1.3.2、inode 结构示意图(注5)

举一个例子来说,以1KB大小的block为例,每个block编号需要4B,那每个block当中又可以寻址1KB / 4B = 256个block,那么:

12 个直接指向: 12*1K=12K

间接: 256*1K=256K

双间接: 256*256*1K=2562K=64M

三间接: 256*256*256*1K=16777216K=16384M=16G

这样,一个inode就可以寻址一个16G的文件了,这么大的单个文件容量应该足够用了吧。

Superblock (超级块)

Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock,就没有这个 filesystem 了.

记录的信息主要有:

block 与 inode 的总量

未使用与已使用的 inode / block 数量

block 与 inode 的大小 (block 为 1, 2,4K,inode 为 128 bytes)

filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息

一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1

block bitmap (区块对照表)

block bitmap 记录使用与未使用的 block 号码,并在进行文件添加修改时候对应的修改 block 的使用状况

inode bitmap (inode对照表)

inode bitmap 记录使用与未使用的 inode 号码,并在进行文件添加修改时候对应的修改 inode 的使用状况

对于每个区段与superblock的信息都可以使用dumpe2fs这个命令查看。

[root@chenchen cctmp]# dumpe2fs /dev/sda1 | more
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   /boot
Last mounted on:          <not available>
Filesystem UUID:          a59a8d2a-eb5b-4206-8b1a-91a89c0d21c7
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              26104
Block count:              104388
Reserved block count:     5219
Free blocks:              89643
Free inodes:              26070
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2008
Inode blocks per group:   251
Filesystem created:       Sun Jan  4 05:39:27 2015
Last mount time:          Tue May 19 19:38:58 2015
Last write time:          Tue May 19 19:38:58 2015
Mount count:              12
Maximum mount count:      -1
Last checked:             Sun Jan  4 05:39:27 2015
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      91192e87-fbad-4c91-aed3-f09b09b2f0e1
Journal backup:           inode blocks
Journal size:             4114k

Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-511 (+260)
596 free blocks, 1991 free inodes, 2 directories
Free blocks: 5637-6147, 8108-8192
Free inodes: 18-2008
Group 1: (Blocks 8193-16384)
Backup superblock at 8193, Group descriptors at 8194-8194
Reserved GDT blocks at 8195-8450
Block bitmap at 8451 (+258), Inode bitmap at 8452 (+259)
Inode table at 8453-8703 (+260)
5101 free blocks, 2008 free inodes, 0 directories
Free blocks: 8704-11156, 13737-16384
Free inodes: 2009-4016
Group 2: (Blocks 16385-24576)
......


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: