文件系统与虚拟文件系统

硬件基础

磁盘的逻辑结构:一圈一圈的叫做磁道,比如图中的浅蓝色的圈就是一个磁道。扇区就是从磁盘的中心出发到磁盘的最边上画线,两条线之间区域与每个磁道的交集就是扇区,如下图中的红色区域,扇区大小相等,为512字节,像扇子一样,最边上开始的叫0磁道和0扇区。指的是第一个磁道个第一个扇区。一般放的是系统的一些启动引导程序,

相邻磁道之间并不是紧挨着的,这是因为磁化单元相隔太近时磁性会相互产生影响,同时也为磁头的读写带来困难。

文件系统与虚拟文件系统_第1张图片

文件系统与虚拟文件系统_第2张图片文件系统与虚拟文件系统_第3张图片

柱面:硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。就是说盘片组成了柱面,那就是说盘片组成了一个圆柱套圆柱的这样一个东西。

簇:“簇”是 DOS 进行分配的最小单位。当创建一个很小的文件时,如是一个字节,则它在磁盘上并不是只占一个字节的空间,而是占有整个一簇。DOS 视不同的存储介质(如软盘,硬盘),不同容量的硬盘,簇的大小也不一样。簇的大小可在称为磁盘参数块(BPB)中获取。簇的概念仅适用于数据区。

文件系统与虚拟文件系统_第4张图片

盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储 128×2的 N 次方(N = 0.1.2.3)字节信息。在 DOS 中每扇区是 128×2 的 2 次方=512 字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆。

文件系统与虚拟文件系统_第5张图片

,磁盘的柱面数与一个盘面上的磁道数是相等的,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁盘有两个面,每个面都有一个磁头(看上面这个图可以看出磁盘是两个面),习惯用磁头号来区分,盘面数(每个盘片有两面,每一面都有一个磁头)等于总的磁头数。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些参数可以得到硬盘的容量,计算公式为:
存储容量=磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数

知道硬盘的 CHS,即 Cylinder(柱面)、Head(磁头)、就可确定硬盘的容量了。

需要注意的是磁头是悬空的,而不是与磁盘接触的,是靠磁地读取的电信号。挨着的话,以磁盘7200转每分钟的速度,早都摩擦生热烧掉了。

这种磁盘就是电脑常用的机械式硬盘,是一种物理硬盘,磁盘的打转是读取数据的过程,磁盘转速越快,单位时间内读取的数据不应该会更多吗,但是目前标准硬盘的转速的7200转每分钟,偶尔有的磁盘转速达到10000转每分钟以上,为什么不能在提升了,因为毕竟是物理磁盘,再提升转速可能就要爆了,可能会烧掉,
现在的磁盘读取数据的理论速度能达到133MB/S,(B是byte) ,而cPU每秒处理的数据在1000GB以上。

这种机械式磁盘虽然有缺点,但是因为技术成熟,所以价格便宜,与之对应的就是固态硬盘。固态硬盘的和内存一样是以芯片存取数据的,如下:

文件系统与虚拟文件系统_第6张图片

黄色的东西在内存条上有的人把他叫金手指,而固态硬盘上的叫接口,比如SATA接口,这个接口限制这固态硬盘的速度。

里面的芯片的速度再快,固态硬盘的接口限制着,所以芯片再快,也没法施展。

文件系统与虚拟文件系统_第7张图片

上面的接口已经被淘汰,因为他的速度理论最大是133MB/s,有限制,一般用于光驱(就是光盘驱动)如下的这种,不过现在电脑的光驱基本没有了,所以这种接口几乎淘汰了。如下是这种接口。类似于插槽一样。

文件系统与虚拟文件系统_第8张图片

文件系统与虚拟文件系统_第9张图片

SCSI也淘汰了。

在苹果电脑中,人家用的是PCI-E接口,理论速度能达到2000多Mb/s,和内存的速度都差不多了。

/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

文件系统

文件系统;文件系统是操作系统用于明确存储设备(常见的是磁盘)或分区上的文件的方法和数据结构
文件系统分为不同的块(block)(索引块,数据块,这里只是简单的列出两个)要查看数据块数。

在c语言中,文件操作那块,c语言会默认打开三个输入输出流,分别是stdin ,stdout,stderr 而这三个流的类型都是FILE*,即就是文件指针。

fwrite fopen fread fprintf fseek ftell  rewind. 

在linux安装好了后,命令都以文本的形式被存放在磁盘上,而在linux命令行执行一个命令就是指令从磁盘中读到内存中去,这个时候通过一堆的映射关系从物理内存向虚拟内存映射。

我们在linux中使用ls -l;就是查看当前目录的文件,而显示的如下:

文件系统与虚拟文件系统_第10张图片

最后一个是文件名。前面都是文件的元数据。分别表示文件的元数据,硬链接数,文件所有者,组,大小,最后修改时间。

ls -l的命令就是在磁盘上,提取当前目录文件信息的过程.

文件系统与虚拟文件系统_第11张图片

其实还有一个命令可以更详细将当前目录的某一个文件的详细自信息显示出来。即stat命令。

文件系统与虚拟文件系统_第12张图片

文件test.c的大小:654 ,占用块大小:8, 

文件占用的块数。通常的 Linux 块大小为 512 字节,因此一个大小为 93,300,148 字节的文件将占用 (93300148/512=) 182226.85 个块。由于块都是完整占用,因此该文件使用了一些整数个数的块。无需猜测就可以获得确切的块数。

linux 块是字符设备驱动程序里最常见的字符。(Blocks): 由Linux制定对内核或文件系统等数据处理的基本单位。通常由1个或多个扇区组成。

Device:设备的意思,Inode 是节点的意思,Links是连接的意思

最下面的三个是关于时间的

以上输出最有用的部分是文件访问时间戳信息。该输出显示,该文件被访问的时间是 2006-08-04 04:30:52(显示在“Access:”的旁边),即 2006 年 8 月 4 日上午 4:30:52。这是某个人开始使用数据库的时间。该文件的修改时间是 2005-11-02 11:49:47(显示在“Modify:”的旁边)。最后,“Change:”旁边的时间戳显示文件状态更改的时间。

这儿要谈论文件系统,所以我们来看一下inode这个。

摘抄linux/unix系统编程手册一书上的文件系统:

文件系统是对常规文件和目录的合理地在磁盘中布局的组织集合文件系统源于磁盘分区,

用于创建文件系统的命令是mkfs(make file system)
传统的ext2文件系统(),各种原生的unix文件系统,如System V和BSD的文件系统,微软还有NTFS文件系统,ISO的CD_ROM文件系统。一系列日志文件系统,如ext3 ext4

文件系统的结构:(也就是文件系统的物理结构)

文件系统中,用来分配空间的基本单位是逻辑块,亦即文件系统所在磁盘上连续的物理块,ext2中的块大小就是1024,2048或者4096字节,使用mkfd创建文件系统的时候可以设置块的大小。

磁盘和文件系统的对应关系:

文件系统与虚拟文件系统_第13张图片

文件系统与虚拟文件系统_第14张图片

柱面组及时磁盘上的磁盘分区。第二图选自APUE,第一张图选自linux/unix系统编程手册。

 

文件系统与虚拟文件系统_第15张图片

 

 

 

 

 

 

linux文件系统包含哪些种类,ext文件系统用什么数据结构实现的;

 

 

面试的时候应该怎么说:

概念:文件系统是对常规文件和目录的合理地在磁盘中布局的组织集合文件系统源于磁盘分区

文件系统的组成:组成的话怎么记忆,就想像尚硅谷的那个文件系统的图。

引导块:引导操作系统的块,文件系统的首块,不为文件系统所用,只是包含了用来引导操作系统的信息,这个块很多的操作系统中没有用。

超级块:紧随其后的一个独立块,包含与文件系统有关的参数信息,其中包括:i节点表容量;文件系统逻辑块(就是磁盘的物理块)的大小,还有以逻辑块为单位,文件系统的大小。整体来说它保存的是文件系统的属性,而i节点保存的是文件的属性。

超级块有点难记忆:记住这个块比较超级,所以存放的内容比较多,存放的范围比较大,

驻留于同一物理设备上的不同文件系统 。类型大小,参数设置(比如块大小)有所不同,这也是可以将一个字盘划分为多个分区的原因之一。

i节点表:文件系统中的每个文件或者目录在i节点表中对应着唯一一条记录。这条记录登记了关乎文件的各种信息,记住是存放文件属性的地方,如文件大小,所有者,最近修改时间。

数据块:(数据区)存放文件数据的地方。

文件系统如何工作:

我们touch一个文件,即就是创建一个文件。接着ls -i,这个i就是i节点的意思,ls -i就是查看i的节点的信息 

文件系统与虚拟文件系统_第16张图片

解释一下这个意思:创建一个abc文件,输入ls -i就是输出i节点的信息,得到的是263466 abc,这个263466的意思是文件的i节点号,ls -i:显示文件索引节点号(inode)。一个索引节点代表一个文件;

上面的图中的画出了存储文件abc的数据的三个数据块。

创建一个文件主要有4个操作,

1》存储属性

内核先找到一个空闲的i节点(这里是233466).内核把文件信息记录到其中,

2》存储数据

在这个abc文件这儿需要存储在三个磁盘块,内核找到了三个空闲块,300 500 800,将内核缓冲区的第一块数据复制到300,下一块是500,以此类推。

3》记录分配情况

文件内容按顺序300 500 800 存放,内核在inode上的磁盘内存区记录了上述块列表。

4》添加文件名到目录

新的文件名abc linux的内核将入口(23466 abc)添加到目录文件,文件名和inode之间的对应关系将文件名和内容及属性连接起来。文件名不在inode节点里,是inode的上级目录的block块里。

 

文件系统的分类:

文件系统分类时与时俱进的,

windows下支持的最早的文件系统如NFTS,FAT16等等,linux下的ext系列(2,3,4)还有XFS。等等

主要是日志类文件系统的,

 

虚拟文件系统:有时候又叫虚拟文件交换(virual Filesystem switch),通过对文件系统操作创建抽象层来让程序与各类的文件系统打交道。说他虚拟是因为他所有的护具结构都是在运行以后才建立的,而在磁盘上并没有真实的存储这些数据结构,他的数据结构只有与实际的文件系统结合起来才能开始工作,所以VFS不是一个真正的文件系统

文件系统与虚拟文件系统_第17张图片

VFS针对文件系统定义了一套通用接口,所有与文件交互的程序都通过这一接口来进程操作,每种文件系统都会提供VFS接口的实现。

这样程序只需理解VFS提供的接口,而无需过问具体文件系统的实现细节。

VFS接口的操作与涉及文件系统和目录的所有常规系统调用相对应,比如open read wirite lseek等等一系列指针文件的系统调用。

所以概括起来:VFS主要有以下几个作用

1》对具体的文件系统进行抽象,对外程序提供统一的与文件系统互的接口

2》接受用户层的常规的文件系统调用

3》文件系统之间也可以互相访问

文件系统与虚拟文件系统_第18张图片

可以说VFS就像一个通用的文件系统,但却不是真正的文件系统。VFS采用的是面向对象的设计思路

那么虚拟文件系统是怎么实现的,主要思想在于引入了一个通用的文件模型。这个模型能够支持所有的文件系统

组成:

1》超级块对象,和具体的文件系统比,VFS也有自己的超级块,不过他这个的存放的是系统中已安装的文件系统的相关信息,他是在文件系统安装的时候,建立的一种将磁盘文件系统映射到内存的机制,进而让 他的超级块成为虚拟的,而爱文件系统卸载的时候会自动删除,VFS的超级块定义在include/fs/fs.h里,即数据结构super_block.,如下:

2》inode对象:存放具体的文件信息

3》目录项对象(dentry):存储的是目录与对应文件进行链接的信息,VFS把每个目录看成是一个由若干子目录和文件组成的常规文件,比如在查找路径名/temp/test的时候,内核为根目录"/"创建一个目录项对象,为tmp和test分别创建为第2和3级目录项对象,目录对象与目录项对象不一样

 

4》文件对象:存放文件与进程交互的有关信息,也就是那个struct file

这4个的特点:都是虚的,也就是说他们不真实存在于磁盘当中,而是运行期间虚拟的一种存在于内存的虚拟文件系统.

因为在linux中都是进程与文件来表示的各种操作,所以这个还涉及到了 struct  file(里面有VFS)           struct files_struct   还有描述文件系统信息的fs_struct,(fs是file system) ,下面的是linux 2.4版本之后的文件系统的结构信息,被定义在include/linux/fs_struct.h中

文件系统与虚拟文件系统_第19张图片

关于这几个VFS组成对象的源码见深入分析Linux内核源码的8.2节。

 

VFS的接口是什么数据结构:接口就是采用了一种数据结构来封装了文件系统,实现了程序对文件系统的统一操作。

文件系统与虚拟文件系统_第20张图片

超级块操作:超级块的结构体是struct block ,而对应的超级块操作就是super_operations,都定义爱fs.h里面

文件系统与虚拟文件系统_第21张图片

索引节点操作inode_operations主要是将VFS对索引节点的操作 转换为具体文件系统处理相应操作的时候用的函数,也是在fs.h的头文件里源代码见深入分析linux内核源代码陈莉君的8.2.6.

目录项操作:dentry_operations,定义在include/linux/dcache.h中

文件系统与虚拟文件系统_第22张图片

接着是文件操作:file_operation

struct file,这个常见的,不过这个在这儿是起的作用是连接VFS文件操作与具体文件系统的文件操作之间的枢纽。

 

ext2和ext3文件系统:

ext2文件系统是一直linux里最开始使用的文件系统,它的设计利用了与虚拟文件系统非常类似的结构,因为开发ext2的目标就是为了优化与Linux的相互操作,这个文件系统也可以用于其他的操作系统。

 

ext3系统是ext2的发展和演化,它仍然与ext2兼容,但提供了扩展日志功能,日志就是一种提供记录的功能,这对系统崩溃的回复特别有帮助

虚拟内存文件系统:tmpfs,

推荐一篇文章:从内核文件系统看文件读写过程https://www.cnblogs.com/huxiao-tee/p/4657851.html,写的很好。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(linux)