文件系统定义在计算机出现之前,其实就有文件系统的概念。此时的文件系统是指用来管理(存储和检索)纸质文件的系统,计算机发明后,文件系统逐渐指代管理存储介质的系统,为用户提供简单的界面方便用户使用存储设备。在学习Linux的时候,我们通常会看到这样一句话,Linux中的一切都是文件,也就是说无论是普通的文件和目录,还是包括块设备、管道、套接字等,也是交给文件系统来管理。文件系统是操作系统中负责管理持久数据的子系统。也就是说,它负责将用户的文件存放在磁盘硬件中。它是磁盘上的目录结构,是组织文件的方法,也是磁盘上的,它可以包含一个或多个文件系统。下面我们分别从用户的角度和操作系统的角度来解释文件系统的相关概念。从用户的角度,你需要了解Linux的文件系统。从分区和目录结构入手,我们先来看windows,这是目前大多数人使用最多的操作系统。打开电脑,映入眼帘的是大致是这样的画面:也就是说,在Windows下,磁盘分为C盘和D盘。...这样的目录结构。至于Linux,它的目录结构是什么样的?它有一个根目录,系统下的所有目录都与根目录分开。我们可以在Ubuntu终端运行如下命令查看Linux目录结构。tree-L1/上面tree表示以树形结构显示当前目录,-L表示显示当前目录层级,1表示显示到第一层,最后一个/表示也是根目录Linux的,也就是说当前命令是显示根目录下一级目录的信息。最终结果如下:为了更好的理解各个目录的含义,我们来看一下内容:/|----bin---------------->The文件系统的起始位置,称为根|----boot---------------->存放系统启动时读取的文件,包括系统核心文件|----dev---------------->存储设备文件接口,如打印机、硬盘等外围设备|----etc---------------->存放与系统设置和管理相关的文件,如用户账号、密码等|||----home---------------->存放用户专属目录|----lib----------------->存放一些共享函数库|--misc---------------->管理员存放公共杂物的空目录|----proc---------------->存储系统核心与执行程序之间的信息|----root---------------->系统管理员(超级用户)专用目录|----sbin---------------->类似于/bin,存放系统启动和管理的命令,一般供root使用|----tmp---------------->任何用户存放临时文件的临时目录|----usr------------------->该目录下包含很多子目录,用于存放系统命令、程序等信息|----var---------------->存放经常更改的文件,比如日志文件,临时文件,邮件说到这里,就不得不说说Linux下的路径问题了。在Linux中,Linux路径分为绝对路径和相对路径。绝对路径:指从根目录开始的文件或目录的完整路径相对路径:指文件或目录相对于前向工作目录的路径任何不以/和~开头的路径都是相对路径path是linux的文件类型,linux中一切皆文件,所以对于L对于Linux,它有哪些文件类型?主要有以下四种:普通文件、目录文件、链接文件:其作用类似于windows下的快捷方式,本身不包含内容,而是指向其他文件或目录设备文件:存放在/dev目录下,如:hda、hdb、sda。.最后,在使用操作系统的时候,可能会涉及到挂载的操作。挂载是什么意思?Linux启动时,首先挂载根文件系统,之后可以自动挂载或手动挂载其他文件。系统,这些文件系统被挂载到挂载点上,并与虚拟文件系统和通用块设备层建立联系。挂载是指将设备文件中的顶级目录连接到Linux根目录下的某个目录(最好是空目录)。访问该目录等同于访问设备文件。以上是从用户的角度对文件系统的概述,接下来从操作系统的角度进一步介绍操作系统。从操作系统的角度看文件系统的层次结构上面在讲解挂载的时候,提到了一个概念,就是Linux启动时,先挂载根文件系统,然后再挂载其他文件系统自动或手动。也是Linux支持不同文件系统的原因,支持各种文件系统的机制是什么?说到这里,就不得不提Linux的虚拟文件系统了。在描述它的概念之前,我们先从宏观的角度来看一下Linux下文件系统的一个结构:从上图可以看出,整个文件系统系统分为三层,用户层,内核层,和硬件层。用户层通过系统调用API调用来访问虚拟文件系统。在内核层,我们可以看到虚拟文件系统下连接着各种类型的文件系统,它是对不同文件系统的抽象,为上层应用提供统一的API接口;上图中还有一层内核层就是各个文件系统下面的一层,这一层的作用是隐藏不同硬件设备之间的细节,为内核提供统一的IO操作接口。下面我们从下到上依次解释整个文件系统各层的作用:设备驱动:常见的硬盘类型有PATA和SATA。在Linux中,为硬盘提供的驱动模块一般存放在内核目录树drivers/ata中,对于通用的硬盘驱动器,可以直接编译到内核中。通用块设备层:不同的硬盘会提供不同的IO接口。对于内核来说,这种乱七八糟的接口不利于管理,所以把这些接口抽象出来,形成一个统一的对外接口,这样不管你是哪种存储设备,操作它们的IO接口是没有区别的。文件系统层:目前大多数Linux使用ex4。与此同时,btrfs也蓄势待发。虚拟文件系统:正如不同的存储设备有不同的IO接口一样,不同的文件系统也有不同的API。内核要达到的目的无论是什么文件系统,都使用相同的API进行操作,所以VFS进行了抽象,提供了统一的API接口,使其可以在不同的文件系统上使用相同的操作。文件的使用在上面我们介绍了文件系统的层次,那么基于这样的层次,我们应该如何使用文件呢?下图是使用文件的流程图:对应的代码比较简单:fd=open(name,flag);/*打开文件*/...write(fd,...);/*写入数据*/...close(fd);/*关闭文件*/以上是向文件写入数据的步骤,使用open系统调用打开文件,open参数包含路径名和文件名文件,使用write写入数据,write使用open返回的文件描述符,使用文件后,使用close系统关闭文件,避免资源泄漏。打开一个文件后,操作系统会跟踪该进程打开的所有文件,也就是说,操作系统为每个进程维护一个打开文件表,文件表中的每一项代表一个文件描述符,所以文件description是打开文件的标识符。操作系统在打开文件表中维护打开文件的状态和信息:文件指针:系统跟踪最后一次读写的位置作为当前文件位置的指针,这个指针对于打开文件的进程是唯一的文件;文件打开计数器:当一个文件被关闭时,操作系统必须重用它打开的文件表目录,否则表中将没有足够的空间。因为多个进程可能打开同一个文件,所以系统必须等待最后一个进程关闭文件,然后才能删除打开的文件条目。该计数器跟踪打开和关闭的次数。当计数为0时,系统关闭文件并删除条目;文件磁盘位置:大多数文件操作需要系统修改文件的数据,这些数据存储在内存中,这样每次操作都不会从磁盘读取;访问权限:每个进程都需要另一种访问模式来打开文件(创建、只读、读写、添加等),这些信息保存在进程的打开文件表中。文件系统的IO类型根据文件系统读写的不同分为四种:BufferedI/O:指使用标准库缓存来加速文件访问,标准库内部访问通过系统调度文件。UnbufferedI/O:指直接通过系统调用访问文件,不经过标准库缓存。这里的标准库缓存指的是使用一些栈、队列等数据结构进行资源调度,而不是页面缓存。不管是不是bufferedIO,都会使用系统调用pagecache来减少IO次数。根据是否使用操作系统的pagecache,文件I/O可以分为直接I/O和间接I/O。DirectI/O:表示跳过操作系统的pagecache,直接与文件系统交互访问文件。间接I/O:读写文件时,首先要经过系统的pagecache,然后才真正写入内核或附加的系统调用。通常,我们的IO都是非直接I/O。根据应用程序是否阻塞自己的操作,文件I/O可以分为阻塞I/O和非阻塞I/O。阻塞I/O是指应用程序执行完I/O操作后,如果没有响应,当前线程就会被阻塞,其他任务自然无法执行。非阻塞I/O是指应用程序执行I/O操作后,当前线程不会被阻塞,可以继续执行其他任务,然后通过轮询或事件通知的方式获取调用的结果。通常,I/O是阻塞的。在网络编程中,是非阻塞I/O,用于网络套接字的I/O。根据是否等待响应结果,文件分为同步IO和异步IO。同步IO:应用程序进行IO操作后,要等到整个IO完成后,才能得到IO响应。异步IO:是指应用程序进行IO操作后,不需要等待完成,可以继续做后面的事情。当IO完成后,会通过事件通知通知应用程序文件,Linux中的所有文件都有一个唯一的索引节点与之对应。索引节点记录文件的元数据。操作系统不是通过文件名,而是通过索引节点来管理文件,并使用目录项来描述文件之间的关系。关系。索引节点,也称为索引节点,用于记录文件的元数据。元数据包括:节点号、文件大小、访问权限、修改日期、数据位置等。目录项也称为目录,用于记录文件名、索引节点指针以及与其他目录项的关联。多个关联的目录条目构成了文件系统的目录结构。因此,索引节点相当于文件的指针,目录项维护着文件的树状关系。下面是文件存储各部分的逻辑关系示意图:上图中,超级块用于存储整个文件系统的状态,索引节点区用于存储索引节点,数据块区用于存放文件的数据。它们之间的关系在图中也一目了然,不再赘述。综上所述,Linux是一个非常庞大而优秀的系统,在嵌入式行业中的应用也非常广泛。笔者接触Linux不多。这也是我最近对Linux文件系统学习的一个总结。提出来不胜感激~本文转载自微信公众号“文子嵌入式软件”,可通过以下二维码关注。转载本文请联系文子嵌入式软件公众号。
