在计算机出现之前似乎就有文件系统的概念了,此时的文件系统指的是用于管理(储存和检索)纸质文件的系统,而在计算机发明以后,文件系统逐步指的是管理储存介质的系统,它通过简单的插口给用户,便捷用户使用储存设备。
在学习Linux的时侯,我们一般会见到这样一句话,Linux中一切皆文件,也就是说,不管是普通的文件和目录,还是包括块设备、管道、socket等,也都是交给文件系统去管理的。文件系统是操作系统中负责管理持久数据的子系统,换言之,也就是负责把用户的文件存到c盘硬件中,它是一个c盘上的目录结构,是一个组织文件的方式,但是在一个c盘上,可以包含一个或则多个文件系统。
下边,我们从用户的角度和操作系统的角度两个层面来探讨文件系统的相关概念。
用户角度要认识Linux的文件系统,从分区和目录结构说起,首先我们先来看下windows,这是大多数人使用最多的一个操作系统,当打开我的笔记本的时侯,映入眼睑的是大致是这样一个一张图:
image-253663也就是说在windows下,c盘被分为了C盘,D盘。。。。这样的一个目录结构。那对于Linux呢,它的目录结构是长啥样,它有一个根目录,而系统下的所有目录都是从根目录分离出去的linux,我们可以在Ubuntu终端运行如下命令来查看Linux的目录结构。
tree-L1/
上述中,tree表示将当前目录以树的结构展示,-L表示的是要显示当目录的第几层,1表示的是要显示到第一层,最后面的/表示的也就是Linux的根目录,也就是说当前命令就是显示根目录下第一层目录的信息,最终得到的结果如下所示:
image-251803为了更好地理解每位目录所代表的意思,我们看如下所示的内容:
|----bin---------------->文件系统的起始位置,称之为根
|----boot---------------->储存系统启动时读取的文件,包括系统核心文件
|----dev---------------->储存设备文件插口,如复印机,硬碟等外围设备
|----etc---------------->储存与系统设置和管理相关的文件,如用户帐号、密码等
||
|----home----------------->储存用户专属目录
|----lib----------------->储存一些共享的函数库
|----misc----------------->一个空目录,供管理员储存公共杂物
|----proc----------------->储存系统核心和执行程序之间的信息
|----root----------------->系统管理员(超级用户)专用目录
|----sbin----------------->与/bin类似,储存用于系统引导和管理命令,一般供root使用
|----tmp----------------->临时目录,供任何用户储存临时文件
|----usr----------------->此目录包含许多子目录,拿来储存系统命令和程序等信息
|----var----------------->储存常常变动的文件,如日志文件,临时文件,电子邮箱
说到这,就有必要再说一下Linux下的路径问题了,在Linux中,Linux的路径分为绝对路径和相对路径
说完了路径,接出来要表述的就是Linux的文件类型的,Linux内一切皆文件,这么对于Linux来说,其具有什么文件类型呢,其主要有如下四种:
最后,在平常使用操作系统的时侯,可能会涉及到挂载的操作,那挂载是哪些意思呢?Linux启动的时侯,首先挂载的是根文件系统,然后可以手动或则自动挂载其他文件系统,这种文件系统要挂载到挂载点上,与虚拟文件系统和通用块设备层构建联系。
挂载,指的就是将设备文件中的顶尖目录联接到Linux根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
上述就是基于用户的角度对文件系统进行了一个概述,接出来从操作系统的角度,更进一步地探讨操作系统。
操作系统角度文件系统的层次在上述中,论述挂载的时侯说到一个概念,就是说Linux在启动的时侯,首先挂载的是根文件系统,之后再手动或则自动挂载其他文件系统,这也是Linux中支持不同文件系统的缘由,而支持各类不同文件系统的这些机制又是哪些呢?说到这儿,就有必要提及Linux的虚拟文件系统了,再表述它的概念之前,我们先以宏观的角度来看一下Linux下的文件系统的一个结构:
image-240091由上图可以晓得,整个文件系统体系分为了三个层面,用户层,内核层,硬件层,用户层是通过API通过系统调用调用的方法访问虚拟文件系统。在内核层,我们可以看见虚拟文件系统下联接了各种类型的文件系统,其是对不同的文件系统的具象,为下层应用提供了统一的API插口;上图内核层还有一层是各个文件系统之下的一层,这一层的作用是隐藏了不同硬件设备之间的细节,为内核提供了统一的IO操作插口。下边我们对整个文件系统从下到上对各个层的作用进行一个探讨:
文件的使用上述中,我们介绍了文件系统的层次,这么基于这样一个层次,我们又应当怎样使用文件呢?右图是一个使用文件的流程图:
image-258026与其对应的代码也比较简单:
fd=open(name,flag);/*打开文件*/
...
write(fd,...);/*写数据*/
...
close(fd);/*关掉文件*/
上述就是往一个文件中写数据的步骤,使用open系统调用打开文件,open的参数中包含文件的路径名和文件名,使用write写数据,其中write使用open所返回的文件描述符,使用完文件后,用close系统关掉文件,防止资源的泄漏。
在打开了一个文件后,操作系统会跟踪进程打开的所有文件,也就是说操作系统为每位进程维护一个打开文件表,文件表里的每一项代表的是文件描述符,所以说文件描述符是打开文件的标示。
image-242481操作系统在打开文件表中维护着打开文件的状态和信息:
文件系统的IO类型依据文件系统的读写差别,可以将IO分为四种类型:
此处标准库缓存指的是借助栈、队列等一些数据结构进行的资源调度,而不是页缓存。无论是否是缓冲IO,就会通过系统调用页缓存来降低IO次数
按照是否借助操作系统的页缓存,可以把文件I/O分为直接I/O与非直接I/O
一般,我们的IO都是非直接I/O
按照应用程序是都阻塞自身运行,可以把文件I/O分为阻塞I/O和非阻塞I/O
一般情况下I/O都是阻塞的。网路编程中是非阻塞的I/O,用在网路套接字的I/O中
按照是否等待响应结果,把文件分为同步IO和异步IO
文件的储存Linux中所有文件都有一个惟一与之对应的索引节点linux系统创建只读用户,索引节点记录了文件的元数据,操作系统不是通过文件名,而是通过索引节点来管理文件,用目录项来描述文件之间的关系。
索引节点,也被称之为是inode,拿来记录文件的元数据linux系统创建只读用户,元数据就包括:node编号、文件大小、访问权限、修改日期、数据的位置等。
目录项,也被称为dentry,拿来记录文件的名子、索引节点表针及与其他目录项的关联关系。多个关联的目录项,也就构成了文件系统的目录结构。
因而,索引节点相当的于文件的表针,目录项维护着文件的树型关系
下边是文件储存各个部份逻辑关系的一个示意图:
image-257280上图中,超级块拿来储存着整个文件系统的状态linux运维博客,索引节点区拿来储存索引节点,数据块区拿来储存文件的数据,她们之间的关系在图中也很清不仅,就不进行赘言了。
总结Linux是一个很庞大也很优秀的系统,在嵌入式行业也应用广泛,笔者对于Linux的接触不深,这也是近来对于学习Linux文件系统时的一个总结,假如文中出现问题,欢迎诸位及时给我提出来呀,我将不胜感激~