当前位置: 首页 > 科技观察

工作多年,你对Linux文件系统还不是很了解?

时间:2023-03-14 21:38:33 科技观察

本文转载自微信公众号《架构改进之路》,作者的架构改进之路。转载本文请联系建筑改良之路公众号。作为“码农”,我们每天都在接触编程和linux系统。那么常见的Linux目录和文件有哪些,它们的作用是什么?想必大家往往忽略了这一点。作为工作多年的你也不例外,今天就带大家一起来了解一下吧~1目录结构介绍2文件介绍2.1文件类型2.1.1文件的第一个属性是[-]。最常用的类型包括:纯文本文件(ASCII);二进制文件(binary);数据格式文件(数据);各种压缩文件。2.1.2目录第一个属性为[d]2.1.3链接文件第一个属性为[l]2.1.4管道第一个属性为[p]2.1.5块设备第一个属性为B]。存储系统访问数据的接口设备就是硬盘。ll/dev/vda1brw-rw----1rootdisk253,November2819:17/dev/vda12.1.6字符设备文件的第一个属性是[c]。即串口的接口设备,如键盘、鼠标等。2.1.7套接字的第一个属性是[s]。这种文件类型最常出现在/var/run目录中。如何查看文件类型:#file,stat,ls说到这里,你可能会有一些疑惑,什么是文件?2.2文件是什么?如上图所示,一般文件包括两部分:元数据和用户数据metadata:文件的辅助信息:文件大小,文件创建时间,文件所有者,inode号(文件的唯一标识)用户数据:所在位置记录文件真实内容的地方。为了有效地管理文件,引入了文件系统。2.3文件系统文件系统本身就是一种组织和管理存储设备上文件的机制。因此,根据不同的组织机制,可以分为不同的文件系统。文件系统系统包括4大元素:索引节点、目录项、逻辑块和超级块。2.3.1索引节点和上面提到的元数据部分一样,索引节点和文件是一一对应的,它和文件内容一样存储在磁盘中。所以索引节点占用磁盘空间。所以它不会随着进程的死亡而消失。2.3.2目录项简称dentry,用于记录文件名、索引节点指针和目录项之间的关系,会形成一个树形结构。多个关联的目录条目形成一个目录结构。它是由内存维护的内存数据结构,因此常被称为“目录项缓冲区”。2.3.3逻辑块索引节点和目录项记录了文件的元数据,那么文件内容是如何存储的呢?实际上,磁盘上最小的读写单位是一个“扇区”,大小只有512B,即0.5K。为了读写效率,系统会将连续的扇区组合成一个“块”。一般一个“块”是8个扇区,也就是4K,4096B。从磁盘读取内容极其缓慢,因此系统会将读取的内容存储在“页面缓冲区”中。2.3.4超级块一个超级块对应一个文件系统。超级块会保存文件系统的大小和状态、块设备引用和元数据信息(如freelist等)。文件系统有很多,比如Ext4、NFS等,可以分为三种根据不同的存储位置类型。基于磁盘的文件系统:即数据直接存储在计算机本地挂载的磁盘上。常见的Ext4、Ext3、XFS。基于内存的文件系统:即虚拟文件系统。这种文件系统不需要任何磁盘来分配存储空间,但会占用内存。例如,/proc文件系统、/sys文件系统。网络文件系统:用于访问其他计算机数据的文件系统,如NFS、SMB。每个文件系统都是独立的,有自己的组织和运行方式。那么对于用户来说,不可能了解所有的文件系统,那么如何让用户透明的处理文件呢?2.4VFS虚拟文件系统虚拟文件系统定义了一套数据结构和所有文件系统支持的标准接口。内核中的用户进程和其他子系统只需要与VFS提供的统一接口进行交互,不需要关心底层文件系统的实现细节。磁盘的运行速度很慢,所以为了协调磁盘的访问速度,内核提供了“索引节点缓存”、“目录项缓存”、“页缓冲区”。2.5文件系统I/O根据文件读写方式的不同,有多种类型的I/O。最常见的有以下四类:2.5.1BufferedIO和non-bufferedIO第一种,根据是否使用标准库缓存分为:BufferedIO:只使用标准库缓冲区来加速文件使用权。在内部,标准库通过系统调用访问文件。无缓冲IO:直接系统调用。需要注意的是,“缓冲”是指标准库的缓冲,而不是内核提供的高速缓冲(即页面缓冲)。无缓冲IO操作的数据流向:数据-内核缓冲区-磁盘标准IO操作数据流向:数据-流缓存-内核缓存-磁盘2.5.2直接IO和非直接IO是否跳过pagebuffer。要实现直接IO,可以在调用系统时指定O_DIRECT标志。直接IO和间接IO本质上都是和文件系统打交道。如果跳过文件系统,直接读写磁盘,就是我们通常所说的bareIO。2.5.3阻塞和非阻塞IO设置O_NONBLOCK阻塞IO:表示应用程序进行IO操作。如果没有响应,就会阻塞当前线程,不做其他任务。非阻塞IO:是指应用程序在不阻塞当前线程的情况下进行IO操作,可以继续执行其他任务,然后以轮询或事件通知的形式获取调用结果。2.5.4同步和非同步IO设置O_SYNC或O_DSYNC标志表示同步IO。设置O_DSYNC会等待数据写入磁盘后再返回;设置O_SYNC是基于O_DSYNC的,要求文件元数据在返回前返回到磁盘。同步IO:应用程序执行IO操作后,必须等待IO完成才能得到IO响应。异步IO:是指用户程序执行IO操作后,不需要等待完成或完成后的响应,而是继续执行。等待IO完成,response会以事件通知的形式告诉应用程序。