一、认识EXT2文件系统

    文件系统是如何运作的呢?这与操作系统的档案数据有关。文件除了本身实际内容外,通常还包含了很多其他的属性(比如: 文件档案权限、文件属主、属组等信息)

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

    每个inode与 block 都有唯一的编号:

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

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

  • Block : 实际记录文件的内容,一个文件可能会占用多个block.

    由于每个inode与block都有编号,而每个文件都会占用一个inode, inode中又保存了文件数据实际占用block块的号码。所以如果我们能够知道文件的inode号码, 自然就知道其block号码,所以也就能够读取实际的数据了。

Linux基础:文件系统_第1张图片 

二、i-node、block、superblock

    inode 的内容记录文件的权限与相关属性,block区块则是记录文件的实际内容。在高级格式化的时候,文件系统就将inode与block固定好了不会再变动,除非重新格式化(或者利用resize2fs等指令变更文件系统大小)。

    为了更加易于管理,采用分组的方式进行组织和管理。

Linux基础:文件系统_第2张图片


2.1 Data Blocks

1.     block的大小与数量在格式化完成之后就不能再改变(除非重新格式化)

2.     每个block内最多只能够放置一个文件的数据

3.     如果文件大于block的值,则一个文件会占用多个block数量,自动分配

4.     如果文件小于block的值,则该block的剩余容量就不能再被其他文件使用

2.2 inode Table

    inode的内容主要记录文件的属性以及该文件实际数据放置在那几个block块中。 通过命令  ls  -li , 除了第一列: inode 编号 以及最后一列: 文件名, 其余的都是保存在inode中的。

  • 文件的读、写、执行权限

  • 文件拥有者的User ID,文件的Group ID

  • 文件的字节数

  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  • 链接数,即有多少文件名指向这个inode

  • 文件真正的指向(pointer),文件数据block的位置

Linux基础:文件系统_第3张图片

inode 的其他特点:

1.     每个inode大小一般固定为128 bytes / 256 bytes

2.     每个文件仅会占用一个inode而已

3.     文件系统能够建立的文件数量与inode的数量有关

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

Inode需要记录block编号,而block号码需要存储空间。所以每个inode能记录的block号码有限。 inode 记录block号码的区域定义为12个直接,一个间接,一个双间接与一个三间接记录区,以保证能够存储足够大的文件。

Linux基础:文件系统_第4张图片


    每个inode都有一个编号,操作系统利用inode编号来标识不同的文件对于linux/UNIX 操作系统来说,内部不使用文件名,而使用inode编号来标识文件。有过编程经验的同学都知道,对于计算机来说数字比字符串处理起来更简单。文件名只是为了便于用户记忆而已。

  • inode不包含文件名或目录名的字符串,只包含文件或目录的“元信息”。

  • Unix的文件系统的目录也是一种文件。打开目录,实际上就是读取“目录文件”。目录文件的结构是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件或目录的名字,以及该文件或目录名对应的inode号码

  • 文件系统中的一个文件是指存放在其所属目录的“目录文件”中的一个目录项,其所对应的inode的类别为“文件”;文件系统中的一个目录是指存放在其“父目录文件”中的一个目录项,其所对应的inode的类别为“目录”。可见,多个“文件”可以对应同一个inode;多个“目录”可以对应同一个inode。

  • 文件系统中如果两个文件或者两个目录具有相同的inode号码,那么就称它们是“硬链接”关系。实际上都是这个inode的别名。换句话说,一个inode对应的所有文件(或目录)中的每一个,都对应着文件系统某个“目录文件”中唯一的一个目录项。

  • 创建一个目录时,实际做了3件事:在其“父目录文件”中增加一个条目;分配一个inode;再分配一个存储块,用来保存当前被创建目录包含的文件与子目录。被创建的“目录文件”中自动生成两个子目录的条目,名称分别是:“.”和“..”。前者与该目录具有相同的inode号码,因此是该目录的一个“硬链接”。后者的inode号码就是该目录的父目录的inode号码。所以,任何一个目录的"硬链接"总数,总是等于它的子目录总数(含隐藏目录)加2。即每个“子目录文件”中的“..”条目,加上它自身的“目录文件”中的“.”条目,再加上“父目录文件”中的对应该目录的条目。

  • 通过文件名打开文件,实际上是分成三步实现:首先,操作系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,判断是否有相应权限,找到文件数据所在的block,读出数据。


可以使用stat 命令来查看某个文件的inode信息: 


2.3 Superblock

        记录整个filesystem相关信息。相当重要,因为此文件系统的基本信息都写在这里。为了安全考虑,每个block group都可能含有superblock。事实上除了第一个block group内会含有superblock,其他后续的block group 如果含有,则是作为备份。

 

三、目录

        A directory is a file that contains directory entries.Most implementations of UNIX systems don’t store attributes in the directoryentries themselves, because of the difficulty of keeping them in synch when afile has multiple hard links.

    当我们在LIinux下的ext2文件系统中创建一个目录时, ext2会分配一个inode与至少一块block给该目录。其中 inode 记录该目录的相关权限与属性,并可记录分配到的block号; 而block则是记录在这个目录下的文件名与该文件名对应的inode号。        

    目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件对应的inode号码。也就是说目录分配的block仅仅记录了此目录下的文件名和其相应的inode号码。

Linux基础:文件系统_第5张图片

四、目录树的读取

     经过前面的介绍, 我们应该很清楚的知道: inode 本身不记录文件名,文件名的记录是保存在目录的block中。

由于目录树是由根目录开始读起,因此系统通过挂载的信息可以找到挂载点的 inode 号。此时就能够得到根目录的 inode 内容,并依据该inode读取根目录的block内的文件名数据,再一层一层的往下读到最终的文件名。Linux基础:文件系统_第6张图片


什么是文件链接数??

【有多少个文件名链接到这个 inode 号码】

五、挂载点的意义

    每个filesystem都有独立的 inode / block / superblock 等信息, 但是对于我们使用者来说,我们不是直接和这些数据打交道,我们通过虚拟的目录树结构进行抽象。 将文件系统与目录树关联起来,才能被我们使用。 将文件系统与目录树结合【关联】的动作: 就叫做【挂载】

 目录树的关系是逻辑上的。所有的分区都可以挂载到相应的目录上。Linux在目录这一层作了些抽象,可以说是在目录和分区之间作了一个映射(挂载)

Linux基础:文件系统_第7张图片

六、磁盘的分区、格式化、挂载

当我们有需求,在设备上新增一块硬盘的时候,应该有哪些操作需要做呢?

  • 对磁盘进行分区,建立可用的 partition

  • 对partition进行格式化,建立系统可用的 filesystem

  • 对建立好的 filesystem 进行挂载