学习linux有一段时间了,在学习过程中发现linux支持很多的文件系统,如JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS
学习linux有一段时间了,在学习过程中发现linux支持很多的文件系统,如JFS、 ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC。那么文件系统到底是什么?怎么来的?我们先简单看一下
1、我们使用的文件系统是怎么来的?
通过高级格式化进行创建文件系统
2、文件系统用来做什么的?
文件系统是用来管理文件,实现按名存取的。
3、文件系统的位置在哪里?
文件系统通常位于内核当中。
4、文件系统所提供什么样的功能?以及这些功能是通过什么来实现的?
文件系统提供文件的创建,打开,删除,修改,读取等功能是通过操作系统的系统调用提供的。
通过这些简单的阐述我们不难看出,文件系统和磁盘的分区格式化是密不可分的,我们简单的说,通常磁盘分区是按照柱面来进行分区,通常磁盘的第0个扇区是不能被使用的,这个扇区被称为MBR(主引导记录 Master boot record),MBR分为三个部分
1、前446个字节是bootloader;
2、之后64个字节称为磁盘分区表,每16个字节来引导一个分区,总共可以创建4个主分区;
3、最后2个字节表示当前磁盘上是否是可引导的,用十六进制数5A来表示是可引导的,否则就表示是不可引导的磁盘分区;
MBR如下图所示
一,文件系统结构的阐述
分区后磁盘有了文件系统,那么文件系统到底是怎么来管理我们的文件的?
1、每个分区的头两个扇区512×2 = 1024字节=1k这个称之为引导块boot block,通常用来引导当前分区上的操作系统。
boot block与MBR的区别:
MBR用来引导整个磁盘上的操作系统,MBR中的程序是用来指明启动哪个分区上的操作系统,
boot block是一旦分区指定以后,这个分区本身还能够必须让这个分区上的操作系统完成加载。
boot block这个空间不一定是每个分区都使用,如果这个硬盘上只安装了一个操作系统,那么其他分区首部的boot block就没有什么实际作用,可能不被使用。
2、索引,紧挨着磁盘块,索引一般存放在磁盘的头部最开始处的空间里面
为了能够完成随机访问和存取功能,需要把物理的空间划分为固定大小的磁盘块,而磁盘块是一个逻辑结构,是把扇区重新进行整合。
每个文件都有一个索引条目,,这个索引条目中标明了当前文件存储在哪些编号的磁盘块上面
索引存放文件的大小,权限,属主,属组,访问(access)、 修改(modify)、改变(change)这三个访问的时间戳以及数据对应的磁盘块编号;但是文件名并不在索引中存放,而真正的数据在磁盘块中存储。
所以说文件的改变有两类改变,一个是文件内容的改变,即改变了磁盘块中的信息,一个是文件属性的改变,即改变了索引中的信息
每个文件的索引条目通常被称之为一个索引节点,index node即inode节点
inode信息本身与文件的内容没有关系,这些称为元数据(MetaData),元数据用来描述文件属性的,与对应文件内容没关系。
每个文件的索引条目inode都有一个编号,称之为inode号,查找文件就要去找对应inode编号的信息。
二、目录与文件系统的关系
目录是什么?目录就是文件的路径映射。为什么这么说?因为目录把文件组织成层次化的结构,下面我们来看下目录到底是什么?
首先目录本身也是个文件,也需要在索引中存放目录的inode号;
其次目录也需要一定的存储空间(一个或多个磁盘块)来存储目录的数据;
既然目录也是文件,那么目录中存储的数据是什么?
通过这个目录可以直接找到的文件的文件名和对应inode的关系以及文件的类型,即目录文件记录的存放当前目录下文件的文件名,inode号,文件类型。
目录文件记录的范围?· 只对其下直接目录文件以及普通文件负责,比如/var下
[root@CentOS6 init.d]# ls -l /var
total 76
drwxr-xr-x. 2 root root 4096 Jan 2 22:42 account
drwxr-xr-x. 12 root root 4096 Jan 2 22:45 cache
drwxr-xr-x. 2 root root 4096 Jan 2 22:45 crash
drwxr-xr-x. 2 root root 4096 Nov 22 20:29 cvs
drwxr-xr-x. 3 root root 4096 Jan 2 22:42 db
drwxr-xr-x. 3 root root 4096 Jan 2 22:42 empty
drwxr-xr-x. 2 root root 4096 Sep 23 2011 games
drwxrwx--T. 2 root gdm 4096 Nov 22 23:54 gdm
drwxr-xr-x. 30 root root 4096 Jan 2 22:42 lib
drwxr-xr-x. 2 root root 4096 Sep 23 2011 local
drwxrwxr-x. 5 root lock 4096 Jan 3 10:27 lock
drwxr-xr-x. 11 root root 4096 Jan 3 09:07 log
lrwxrwxrwx. 1 root root 10 Jan 2 22:38 mail -> spool/mail
drwxr-xr-x. 2 root root 4096 Sep 23 2011 nis
drwxr-xr-x. 2 root root 4096 Sep 23 2011 opt
drwxr-xr-x. 2 root root 4096 Sep 23 2011 preserve
drwxr-xr-x. 26 root root 4096 Jan 3 09:12 run
drwxr-xr-x. 13 root root 4096 Jan 2 22:41 spool
drwxrwxrwt. 2 root root 4096 Jan 2 22:44 tmp
drwxr-xr-x. 2 root root 4096 Sep 23 2011 yp
/var目录的目录文件仅仅只存储这些文件或者目录的文件名,inode号,和文件类型的信息,对于其下面account这个目录中的信息,var目录并不关心
即account下的文件仅仅和account目录有关系,和var目录没有关系
这里特别要说明的是 / (根目录)是一种特殊的文件,是实现自引用的,能够自我找到。
三、系统是如何查找文件的?
上面讲了文件系统和目录之间的关系,那么是文件系统是如何实现对通过文件名来对文件实现查找的,如/var/log/xxxxx.log
1、先找到/ (/是一种特殊的文件,是实现自引用的)在索引中的条目
2、根据/所在索引中的inode号,找到/目录文件存储所对应的磁盘块
3、在/目录文件中找到其下的var目录的目录文件名称,inode号,文件类型
4、根据var目录的inode号去索引中查找var目录文件所存储的磁盘块
5、找到var目录文件存储所对应的磁盘块以后,在找到其下面log目录的目录文件名称,inode号,文件类型
6、根据log目录的inode号去索引中查找log目录文件所存储的磁盘块
7、找到log目录文件存储所对应的磁盘块以后,在找到其下面xxxxx.log的目录文件名称,inode号,文件类型
8、根据xxxxx.log的inode号去索引中查找其文件所存储的磁盘块,这样文件就找到了
所以,我们得到两个结果:
1、我们通过ls -l 查看的时候目录文件通常比较小,这显示的是目录文件所占磁盘块的大小
2、目录删除以后,其下的文件就找不到了
因为查找文件会影响速度,所以第一次按照步骤查找,找到以后缓存在内存中,下次查找时可以提高效率。
四、linux常见ext文件系统的组织结构
根据上面的内容,我们可以了解到ext文件系统存储组织方式
ext文件系统大致划分为两个部分
1、引导块
2、剩余空间都被划为块组(block group)每个组内块个数相等,每个组内部是自我管理的
a)、bolock group0 这个比较特殊,第1024个字节以后的1024个字节称为超级(superblock)