工作多年,Linux文件系统还不太了解?

简介: 我们作为“码农”,每天都在接触编程,接触linux系统,那么常见的Linux目录和文件都有哪些,它们又有什么作用呢?

我们作为“码农”,每天都在接触编程,接触linux系统,那么常见的Linux目录和文件都有哪些,它们又有什么作用呢?想必大家经常会忽略这点,作为工作多年的你而言也不例外,今天就带大家来一起了解一下吧~


1 初识目录结构


微信图片_20220608220927.png

2 初识文件


2.1 文件类型


2.1.1 文件


第一个属性为 [-]。最常用的类型,包括:


  • 纯文本文件(ASCII);


  • 二进制文件(binary);


  • 数据格式的文件(data);


  • 各种压缩文件。


2.1.2 目录


第一个属性为 [d]


2.1.3 链接文件


第一个属性为 [l]


2.1.4 管道


第一个属性为 [p]


2.1.5 块设备


第一个属性为 [b] 。储数据以供系统存取的接口设备,简单而言就是硬盘。


ll /dev/vda1
brw-rw---- 1 root disk 253, 1 11月 28 19:17 /dev/vda1

2.1.6 字符设备文件


第一个属性为 [c] 。即串行端口的接口设备,例如键盘、鼠标等等。


2.1.7 套接字


第一个属性为 [s]。最常在 /var/run目录中看到这种文件类型。查看文件类型的方法:


#file, stat, ls

讲到这里,可以有些疑问,到底文件是个什么东东?


2.2 文件是什么?

微信图片_20220608220929.png如上图所示,一般文件包括两部分:元数据和用户数据


  • 元数据:文件的附属信息:文件大小,文件创建时间,文件拥有者,Inode编号(文件的唯一标识)


  • 用户数据:记录文件真实内容的地方。


为了有效管理文件,引入了文件系统。


2.3 文件系统


文件系统,本身是对存储设备上的文件,进行组织管理的机制。所以根据组织机制的不同,可以分为不同的文件系统。文件系统系统包括4大要素:索引节点,目录项,逻辑块,超级块微信图片_20220608220931.png

2.3.1 索引节点


同上面讲的元数据部分,索引节点和文件是一一对应的,它和文件内容一样,是存储在磁盘中的。所以索引节点是占用磁盘空间的。所以它不会随着进程的消亡而消失。


2.3.2 目录项


简称dentry,用来记录文件的名称,索引节点指针以及目录项之间的关联关系,会形成一棵树状结构。多个关联的目录项,就形成了目录结构。它是由内存维护的一个内存数据结构,所以通常被称作“目录项缓冲”。


2.3.3 逻辑块


索引节点和目录项记录了文件的元数据,那么文件内容是怎么存储的?实际上,磁盘上最小的读写单位是“扇区”,只有512B大小,也就是0.5K,为了读写效率,系统会将连续的扇区组合一个”块“,一般一个“块”是8个扇区,也就是4K,4096B。从磁盘中读取内容是特别慢的,所以系统会将读取的内容存到“页缓冲”中。


2.3.4 超级块


一个超级块对应一个文件系统。超级块会保存文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)文件系统有多种,比如Ext4, NFS等,根据存储位置不一样,可以分为三类。


  • 基于磁盘的文件系统:也就是数据直接存储在计算机本地挂载的磁盘中。常见的Ext4, Ext3,XFS。


  • 基于内存的文件系统:也就是虚拟文件系统。这类文件系统,不需要任何磁盘分配存储空间,但会占用内存。比如/proc文件系统,/sys文件系统。


  • 网络文件系统:用来访问其他计算机数据的文件系统,比如NFS,SMB。


每个文件系统是独立的,有自己的组织方法,操作方法。那么对于用户来说,不可能所有的文件系统都了解,那么怎么做到让用户透明的去处理文件呢?


2.4 VFS虚拟文件系统微信图片_20220608220935.png

虚拟文件系统定义了一组所有文件系统都支持的数据结构和标准接口。用户进程和内核中的其他子系统,只需要跟VFS提供的统一接口交互就OK,不需要关心底层文件系统实现细节。 磁盘的操作是非常慢的,所以为了协调磁盘的访问速度,内核提供了“索引节点缓存”,“目录项缓存”,“页缓冲”。


2.5 文件系统I/O


根据文件读写方式的各种差异,导致I/O的分类多种多种。最常见的为以下4类:


2.5.1 缓冲IO和非缓冲IO


第一种,根据是否利用标准库缓存,分为:


  • 缓冲IO:只利用标准库的缓冲来加速文件的访问。标准库内部会通过系统调用来访问文件。


  • 非缓冲IO:直接系统调用。


需要说明的是:“缓冲”指的是标准库的缓冲,而不是内核提供的高速缓冲区(也就是页缓冲)


  • 无缓存IO操作数据流向路径:数据——内核缓存区——磁盘


  • 标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘


2.5.2 直接IO和非直接IO


是否跳过页缓冲。要想实现直接IO,可以在系统调用的时候,指定O_DIRECT标志。直接IO和非直接IO,本质上还是和文件系统打交道,如果跳过文件系统直接读写磁盘,就是我们通常说的裸IO。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完成,响应会用事件通知的形式,告诉应用程序。
相关文章
|
2月前
|
存储 Linux 数据处理
探索Linux操作系统的内核与文件系统
本文深入探讨了Linux操作系统的核心组件,包括其独特的内核结构和灵活的文件系统。文章首先概述了Linux内核的主要功能和架构,接着详细分析了文件系统的工作原理以及它如何支持数据存储和检索。通过比较不同的文件系统类型,本文旨在为读者提供一个关于如何根据特定需求选择合适文件系统的参考框架。
|
1月前
|
存储 缓存 算法
【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念
【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念
|
6天前
|
存储 Linux 文件存储
Linux 存储管理 (二)创建文件系统
【8月更文挑战第13天】使用`fdisk`创建分区后,通过`mkfs`命令创建文件系统,支持多种类型如ext4、XFS等。创建前确认分区无重要数据,示例命令为`mkfs.ext4 /dev/sdc1`。之后使用`mount`命令将分区挂载至指定目录,如`mount /dev/sdc1 /w`。为实现开机自动挂载,可在`/etc/fstab`文件中添加相应条目。这些步骤有助于高效管理和利用存储空间。
18 2
|
16天前
|
存储 数据管理 物联网
探索Linux文件系统的奥秘
【8月更文挑战第3天】在数字时代的海洋中,Linux 文件系统犹如一座灯塔,指引着数据存储和访问的航向。本文将带你深入Linux的文件系统结构,从基础概念到操作实践,通过代码示例揭示文件系统背后的逻辑与美学。准备好跟随我们的脚步,开启一场关于数据组织和管理的知识之旅。
|
1月前
|
存储 运维 安全
Linux命令stat:深入了解文件与文件系统状态
`stat`命令在Linux中用于显示文件和文件系统的详细状态,包括权限、大小、时间戳等。它通过读取inode获取信息,特点是显示全面、易用且支持多种参数,如`-c`自定义格式,`-f`查看文件系统状态,`-L`处理符号链接。例如,`stat example.txt`显示文件详情,`stat -c "%n 的大小是 %s 字节" example.txt`输出文件大小。理解`stat`有助于系统管理和故障排查。
|
1月前
|
存储 Linux Windows
【Linux】文件系统软硬链接的那些事儿
本文介绍了Linux文件系统的磁盘结构、逻辑结构以及文件和inode的关系,重点讲解了软链接和硬链接的区别,强调了它们在文件管理中的作用。
42 7
|
1月前
|
存储 缓存 固态存储
Linux操作系统之文件系统详解
Linux操作系统之文件系统详解
|
2月前
|
存储 Unix 数据管理
深入探讨Linux文件系统:从传统到现代
深入探讨Linux文件系统:从传统到现代
26 0
|
3月前
|
运维 安全 Linux
深入理解 Linux 文件系统的权限管理
【5月更文挑战第30天】 在 Linux 操作系统中,文件系统权限管理是维护系统安全与数据完整性的基石。本文旨在深入探讨 Linux 权限模型的核心概念、实现机制及其对系统安全性的影响。通过对用户身份、文件权限和访问控制列表(ACL)等关键元素的剖析,揭示权限管理在实际操作中的应用细节。文章还将讨论如何有效配置权限来优化系统性能和提升安全性,以及解决常见的权限问题的策略。
|
3月前
|
Linux PHP 数据安全/隐私保护
深入理解PHP7的返回值类型声明深入理解 Linux 文件系统的权限管理
【5月更文挑战第30天】在PHP7中,引入了返回值类型声明的特性。这一特性使得开发者可以在函数定义时指定函数应返回的值的类型。本文将详细解析返回值类型声明的用法,以及它在实际开发中的应用,帮助读者更好地理解和使用这一特性。