作者:Vamei 出处:http://www.cnblogs.com/vamei

偶然看到,自己也整理了一些不明白的地方,加以说明 附加上去。

 

 

Linux文件系统的实现

 

inux用一个树状结构来组织管理文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。

我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。比如cat可以打开文件,读取数据,最后在终端显示:

cat /tmp/test.txt

 

存储设备分区

文件系统的最终目的是把大量数据有组织的放入持久性(persistant)的存储设备中,比如硬盘和磁盘。这些存储设备与内存不同。它们的存储能力具有持久性,不会因为断电而消失;存储量大,但读取速度慢。

常见存储设备。最开始的区域是MBR,主引导记录(MBR,Master Boot Record)是Linux系统的硬盘的第一个扇区,用于Linux开机启动(参考Linux开机启动), 如何处理分区表,如何定位操作系统等。剩余的空间可能分成数个分区(partition)。每个分区有一个相关的分区表(Partition table),记录分区的相关信息。这个分区表是储存在分区之外的。分区表说明了对应分区的起始位置和分区的大小。

Linux 文件系统实现

MBR组成:

1.主引导程序代码,占446字节

2. 磁盘签名

3.硬盘分区表DPT,占64字节

4.主引导扇区结束标志55AAH

 

Windows系统常常看到C分区、D分区等。Linux系统下也可以有多个分区,但都被挂载在同一个文件系统树上。

 

系统分区:

主分区:最多分四个

扩展分区:最多有一个

             主分区 + 扩展分区  最多有四个

             不能写入数据,不能格式化,唯一作用就是包含逻辑分区,逻辑分区可以写入数据,可以格式化

Linux 文件系统实现

分区结束后,需要格式化(高级格式化),目的是为了写入文件系统。以前centos中默认的文件系统是ext4 。按照文件系统规则将磁盘分成等大小的数据块,一般每个数据块都是4K,数据块一般称作block。建立inode列表,存取数据的时候就要用到inode,类似门牌号。

硬件设备文件名:为了找到给哪个设备分配盘符(挂载),系统固定的

/dev/sda :sda就代表SCSI的接口的第一个硬盘

Linux 文件系统实现

分区设备文件名:在硬盘设备文件名后面加上数字编号

/dev/sda1 :sda1就代表SCSI/SATA硬盘第一个分区

/dev/sda2 :sda2就代表SCSI/SATA硬盘第二个分区

1,2,3,4这四个编号只能给主分区和扩展分区,无论编号有没有分出去,逻辑分区的编号都不能使用。

Linux 文件系统实现

使用df 命令可以查看文件属于哪个分区:.

df –h filename

挂载(写入盘符)

目的:给每个分区分配挂载点

window用C、D、E作为盘符,linux用空目录作为盘符。

必须分区:\ 根分区,swap分区---交换分区

交换分区的作用:虚拟内存,当真正的内存不够用的时候就可以拿这部分内存来用。分配的时候一般为内存的2倍,但是不超过2GB。

推荐分区:/boot(启动分区 200M)用来保存启动数据。

Linux 文件系统实现

数据存储

数据被存入到某个分区中。一个典型的Linux分区(partition)包含有下面各个部分:

Linux 文件系统实现

分区的第一个部分是启动区(Boot block),它主要是为计算机开机服务的。Linux开机启动后,会首先载入MBR,随后MBR从某个硬盘的启动区加载程序。该程序负责进一步的操作系统的加载和启动。为了方便管理,即使某个分区中没有安装操作系统,Linux也会在该分区预留启动区。

启动区之后的是超级区(Super block)。它存储有文件系统的相关信息,包括文件系统的类型,inode的数目,数据块的数目。

随后是多个inodes,它们是实现文件存储的关键。在Linux系统中,一个文件可以分成几个数据块存储,就好像是分散在各地的龙珠一样。每个文件对应一个inode。这个inode中包含多个指针,指向属于该文件各个数据块。当操作系统需要读取文件时,只需要对应inode的"地图",收集起分散的数据块,就可以收获我们的文件了。

inode简介

文件是文件系统对数据的分割单元。文件系统用目录来组织文件,赋予文件以上下分级的结构。在硬盘上实现这一分级结构的关键,是使用inode来虚拟普通文件和目录文件对象。

在Linux文件管理中,我们知道,一个文件除了自身的数据之外,还有一个附属信息,即文件的元数据(metadata)记录文件的属性。这个元数据用于记录文件的许多信息,比如文件大小,拥有人,所属的组,修改日期等等。元数据并不包含在文件的数据中,而是由操作系统维护的。事实上,这个所谓的元数据就包含在inode中。我们可以用$ls -l filename来查看这些元数据。正如我们上面看到的,inode所占据的区域与数据块的区域不同。每个inode有一个唯一的整数编号(inode number)表示。

在保存元数据,inode是“文件”从抽象到具体的关键。正如上一节中提到的,inode储存由一些指针,这些指针指向存储设备中的一些数据块,文件的内容就储存在这些数据块中。当Linux想要打开一个文件时,只需要找到文件对应的inode,然后沿着指针,将所有的数据块收集起来,就可以在内存中组成一个文件的数据了。

 

inode并不是组织文件的唯一方式。最简单的组织文件的方法,是把文件依次顺序的放入存储设备,DVD就采取了类似的方式。但如果有删除操作,删除造成的空余空间夹杂在正常文件之间,很难利用和管理

复杂的方式可以使用链表,每个数据块都有一个指针,指向属于同一文件的下一个数据块。这样的好处是可以利用零散的空余空间,坏处是对文件的操作必须按照线性方式进行。如果想随机存取,那么必须遍历链表,直到目标位置。由于这一遍历不是在内存进行,所以速度很慢

inode既可以充分利用空间,在内存占据空间不与存储设备相关,解决了上面的问题。但inode也有自己的问题。每个inode能够存储的数据块指针总数是固定的。如果一个文件需要的数据块超过这一总数,inode需要额外的空间来存储多出来的指针。

inode示例

在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录中的条目除了所包含的文件名,还有对应的inode编号。当我们输入$cat /var/test.txt时,Linux将在根目录文件中找到var这个目录文件的inode编号,然后根据inode合成var的数据。随后,根据var中的记录,找到text.txt的inode编号,沿着inode中的指针,收集数据块,合成text.txt的数据。整个过程中,我们参考了三个inode:根目录文件,var目录文件,text.txt文件的inodes。

在Linux下,可以使用$stat filename,来查询某个文件对应的inode编号。

使用ls –i filename 也可以查看到inode

Linux 文件系统实现


 

在存储设备中实际上存储为:

Linux 文件系统实现

当我们读取一个文件时,实际上是在目录中找到了这个文件的inode编号,然后根据inode的指针,把数据块组合起来,放入内存供进一步的处理。当我们写入一个文件时,是分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode的指针指像这些数据块,并放入内存中的数据。

文件共享
 

在Linux的进程中,当我们打开一个文件时,返回的是一个文件描述符。内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。这个文件描述符是一个数组的下标,对应数组元素为一个指针。这个指针并没有直接指向文件的inode,而是指向了inode列表,再通过该表格,指向加载到内存中的目标文件的inode。如下图,一个进程打开了两个文件。

 

可以看到,每个文件表格中记录了文件打开的状态(status flags),比如只读,写入等,还记录了每个文件的当前读写位置(offset)。当有两个进程打开同一个文件时,可以有两个文件表格,每个文件表格对应的打开状态和当前位置不同,从而支持一些文件共享的操作,比如同时读取。

要注意的是进程fork之后的情况,子进程将只复制文件描述符的数组,而和父进程共享内核维护的文件表格和inode

文件描述符与文件指针的区别

文件描述符: 在linux系统中打开文件就会获得文件描述符,它是个很小的非负整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符,也就是说FILE 结构体包含了文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。

 

相关文章:

  • 2022-12-23
  • 2021-10-09
  • 2021-07-27
  • 2022-12-23
  • 2022-12-23
  • 2021-11-09
  • 2021-11-14
猜你喜欢
  • 2022-01-20
  • 2022-01-02
  • 2022-01-29
相关资源
相似解决方案