首先,硬盘要分区,然后格式化从而创建文件系统。

每个分区被格式化创建文件系统会创建3个部分,即inode节点和block块以及super block。block存放实际数据,而inode存放文件的属性,super block记录整个文件系统的整体信息,有多少inode和block,使用量以及使用量等信息;

分区被格式化创建文件系统后,inode和block被创建无法更改,除非重新格式化,当文件系统数量高达Gb时,那么将所有inode和block放在一起不明智了,不易管理。故而就有了块组的概念;

块组:每个块组有独立的inode/block/super block三个部分。

每个块组的数据图:

linux文件系统介绍_第1张图片

1、启动扇区:每个文件系统的最前面都有一个启动扇区可以安装引导程序。这样就可以在不同引导程序安装在不同的文件系统中了。而不用覆盖磁盘唯一的MBR,这样可以实现多重引导的环境。

2、block group:格式化时将分区为多个块组,每个块组都有独立的super block、inode、block等块。

1.superblock:是记录整个文件系统相关信息的地方,主要有

  1. block与inode的总量

  2. 未使用与已使用的block和inode数量

  3. inode与block的大小,inode是128bytes,block是1024、2048、4096bytes

  4. 文件系统的挂载时间、最近一次写入数据时间、检查磁盘的时间

  5. 一个validbit数值,已挂载为0,未挂载为1

  6. 每个block group中可能都有super block,块组0中必须有一个superblock,用户复制给其他块组并修复使用。同样其他块组中有superblock,也可以救援块组0.  

2.组描述:主要记录每个blockgroup的开始与结束块号,以及superblock、数据块位图、索引块位图、inode表、block块的块号。

3.数据块位图:位图是位的序列,用二进制记录块的使用情况,0表示对应块是空闲,1表示对应块是占用。创建文件时会找空的block块记录文件内容,删除文件,其实就是把block位图和inode位图的相关位置成空,相当于不被占用,注意:数据还在,下次创建文件时,覆盖原已清空block位图和inode位图的文件的数据。

4.索引节点位图:位图是位的序列,用二进制记录inode的使用情况,0表示对应块是空闲,1表示对应块是占用。

5.索引节点表:index node,记录文件的属性权限以及该文件实际数据放置在哪些block中的,inode表记录至少如下

    1. 该文件的访问模式(read/write/excute)

    2. 该文件的拥有者与组

    3. 该文件的大小

    4. 该文件的创建时间改变时间mtime(内容修改)、最近一次读取的时间atime(访问时间)、最近一次修改的时间ctime(属性权限更改)

    5. 该文件真正的指向,即指向哪个block

    6. 每个inode有128bytes,ext4默认是256Bytes

    7. 每个文件只占用一个inode

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

    inode表需要记录的东西非常多,而每个inode的大小是128bytes。若每个块是4096bytes,每个块才记录32个inode。如果有个文件是500M,记录block需要花4bytes。大概有13万的block号需要记录,系统将inode记录block号码的区域定义了12个直接、1个间接、1个双简介、1个三间接记录区。


    6.数据块:用来放置文件的实际数据/目录的内容。支持的大小为1K、2K、4K

    1. block的大小与数量在格式化后就不可以改变了(除非重新格式化)

    2. 每个block中只能存放1个文件数据

    3. 当文件数据大于block的大小时,会占用多个block

    4. 当文件数据小雨block的大小时,磁盘空间会浪费


    使用dumpe2fs命令查看文件系统信息,dumpe2fs - dump ext2/ext3/ext4 filesystem information

    语法:dumpe2fs [ -bfhixV ] [ -o superblock=superblock ] [ -o blocksize=blocksize ] device

    选项:

    -b:打印文件系统中的坏块

    -f:强制显示所有信息

    -h:只显示超级块信息

    实例:

[root@www ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5       8.0G  2.1G  5.5G  28% /
tmpfs           937M     0  937M   0% /dev/shm
/dev/sda1       194M   27M  158M  15% /boot
/dev/sda2       9.7G  1.5G  7.7G  16% /usr
/dev/sdc4        99M   23M   72M  24% /home
[root@www ~]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda5      191616  6445 185171    4% /
tmpfs          127415     1 127414    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot
/dev/sda2      192000 26761 165239   14% /usr
[root@www ~]#
[root@www ~]# dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:          #列出文件系统的名称

实例:

    顺便介绍下e2label命令

    man e2label后:e2label - Change the label on an ext2/ext3/ext4 filesystem

    用法:e2label device label

linux文件系统介绍_第2张图片

linux文件系统介绍_第3张图片

    再介绍下 文件系统与目录树的关系

    目录:

            当创建目录时,文件系统会分配一个inode和至少一个block。

            inode记录该目录的权限属性等信息;

            block记录该目录下文件名称及inode号。

    文件:

            当创建文件时,首先确定用目录是否有w与x的权限,有才可以新建文件,其次根据文件系统的inode索引节点位图和block数据块位图找到没有使用的inode、block号码,并将新文件的权限与属性写入inode表和文件内容写入block表,并且变更inode的block指向数据,然后将刚才写入的inode和block数据同步更新到inode表和block表,并更新superblock的内容。

            inode记录该文件的权限属性等信息;

       block记录该文件的实际数据。

     目录树的读取:

    目录树是从根读取的,如读取/etc/passwd文件数据

    1. /的inode,通过挂载点的信息找到/dev/sda5的inode号是2,且inode具有权限让我们读取block的内容。

    2. /的block,取得block的号码,找到有etc目录及对应的inode为261123。

    3. 根据etc的inode261123找到inode中记录etc的block块,找到passwd文件名及inode为281728

    4. 找到了passwd的inode281728,得知我有r的权限,找到passwd实际数据放置的block号

    5. 读取passwd数据