Linux 文件系统

news2024/11/19 19:27:30

文章目录

  • 一、设备专用文件(设备文件)
    • 设备 ID
  • 二、磁盘与分区
    • 1. 磁盘驱动器
    • 2. 磁盘分区
  • 三、文件系统
  • 四、i-node
    • ext2 中的 i-node 与数据块指针
  • 五、虚拟文件系统(VFS)
  • 六、日志文件系统
  • 七、单根目录层级与挂载点

一、设备专用文件(设备文件)

 在内核中,每种设备类型都有与之对应的设备驱动程序,用来处理设备的所有 I/O 请求。设备驱动程序属于内核代码,可执行相关硬件的输入/输出动作。由设备驱动程序提供的 API 是固定的,包含文件系统调用open()close()read()/writemmap()以及ioctl(),即提供了与文件 I/O 一致的接口,从而满足 I/O 操作的通用性。
 可将设备划分为以下两种类型:

  • 字符型设备:基于字符流来处理数据(终端、键盘);
  • 块设备:基于数据块处理(磁盘、磁带)。块的大小取决于设备类型,但通常为 512 字节的倍数。

 对于每个设备,系统中都有与之对应的设备专用文件。某些设备是实际存在的,比如键盘、磁盘等;而有些设备则是虚拟的,并不存在相应的硬件设备,但内核可以通过设备驱动程序提供一种抽象设备,其携带的 API 与真实设备无二。

 设备文件通常位于/dev目录下。超级用户可使用mknod命令创建设备文件,特权级程序(CAP_MKNOD)也可调用mknod()完成相同的任务。

设备 ID

 每个设备文件都有一个主 ID 号与一个辅 ID 号:

  • 主 ID 号:标识设备等级,内核使用主 ID 号查找与该类设备相应的驱动程序;

  • 辅 ID 号:在一般等级中唯一标识特定设备。


二、磁盘与分区

 常规文件和目录通常放在磁盘设备里(其他设备也能存放文件和目录,比如 CD-ROM、flash 内存等)。

1. 磁盘驱动器

 磁盘驱动器由一个或多个高速旋转的盘片组成。通过在磁盘上快速移动读/写磁头,便可获取/修改磁盘表面的磁性编码信息。磁盘表面的物理信息存储在称为磁道的同心圆上,磁道自身又被划分为若干扇区,每个扇区包含一系列物理块,物理块是驱动器可以读/写的最小信息单元。

 磁盘 I/O 的时间开销通常包含以下三个部分:

  • 寻道时间:磁头首先需要移动到相应磁道;

  • 旋转延迟:等待相应扇区旋转到磁头下;

  • 传输时间:从所请求的块上传输数据。

2. 磁盘分区

 可将每块磁盘划分为一个或多个(不重叠的)分区。内核将每个分区视为位于/dev路径下的单独设备。

 磁盘分区可容纳任何类型的信息,通常有:

  • 文件系统:用来存放常规文件;

  • 数据区域:作为裸设备提供直接磁盘访问(一些数据库管理系统会用到);

  • 交换区域:供操作系统的虚拟内存管理使用。


三、文件系统

 文件系统是常规文件和目录的组织集合,通常一个文件系统用于管理一个磁盘分区。用于创建文件系统的命令是mkfs

 在文件系统中,用来分配空间的基本单位是逻辑块,亦即文件系统所在磁盘设备上若干连续的物理块。

   文件系统由以下几部分组成: - 引导块:作为文件系统的首块。引导块不为文件系统所用,只是包含用来引导操作系统的信息。操作系统虽然只需一个引导块,但所有文件系统都设有引导块;
  • 超级块:紧随引导块之后的一个独立块,包含文件系统有关的参数信息,包括:

    1. i-node 表容量;

    2. 文件系统中逻辑块的大小;

    3. 文件系统的大小(以逻辑块为单位);

  • i-node 表:文件系统中的每个目录或文件都对应 i-node 表中唯一一条记录,该记录登记了文件的各种信息;

  • 数据块:存放数据,以构成驻留在文件系统之上的文件和目录。


四、i-node

 驻留在文件系统上的每个文件,都对应文件系统 i-node 表中的一个 i-node。对 i-node 的标识,采用的是 i-node 表中的顺序位置,以数字标识。

 i-node 所维护的信息有:

  • 文件类型(比如常规文件、目录、符号链接以及设备文件等);

  • 文件属主(UID)

  • 文件属组(GID)

  • 三类用户的访问权限:

    • 属主

    • 属组

    • 其他用户

  • 三个时间戳:

    • 对文件的最后访问时间

    • 对文件的最后修改时间

    • 文件状态的最后改变事件

  • 指向文件的硬链接数

  • 以字节为单位的文件大小

  • 实际分配给文件的块数,以 512 字节块为单位(考虑文件空洞的情况,分配给文件的块数可能低于根据文件大小计算出的块数)

  • 指向文件数据块的指针

ext2 中的 i-node 与数据块指针

 文件系统在存储文件时,数据块通常采用离散存储的方式,这样做的好处在于能降低磁盘空间的碎片化程度,使得对磁盘空间的利用更为搞宵。为了定位文件数据块,内核在 i-node 内部维护有一组指针。

 在 ext2 中,每个 i-node 包含 15 个指针。其中的前 12 个指针指向文件前 12 个块在磁盘上的位置。接下来是一个指向指针块的指针,提供了文件的第 13 个以及后续数据块的位置。第 14、15 个指针则分别是双重间接指针与三重间接指针,以提供更大文件体积的支持。

 这么管理文件数据块的好处有: - 满足多重需求:对于占绝大多数的小文件而言,通过直接指针访问能够提供快速访问;同时通过多重指针,满足了存储大文件的需求;
  • 文件可以存在黑洞,文件系统只需将 i-node 中的相应指针打上标记,表明这些指针为指向实际的磁盘块即可,无需为文件黑洞分配字节数据块。

五、虚拟文件系统(VFS)

 虚拟文件系统是一种内核特性,通过为文件系统操作创建抽象层,从而为应用程序屏蔽不同实现的文件系统的具体细节:

VFS 为文件系统提供了一套通用接口:

  • 所有与文件交互的程序都按照这些接口进行操作;

  • 每种文件系统都提供 VFS 接口的实现

 VFS 的抽象层仿照 UNIX 文件系统模型。对于不支持的 VFS 操作,底层文件系统会将错误代码传回 VFS 层,表明不支持相应操作,而 VFS 随之会将错误代码传递给应用程序。


六、日志文件系统

 对于传统的文件系统,在系统崩溃时,对文件的更新可能只完成了一部分,而文件系统元数据也将处于不一致状态,故为了确保文件系统的完整性,重启时必须对文件系统的一致性进行检查。

 问题在于,一致性检查需要遍历整个文件系统,对于大型系统而言,花费的开销将难以容忍。

 采用日志文件系统,则无需在系统崩溃后对文件进行漫长的一致性检查。在实际更新数据之前,日志文件系统会将这些更新操作以事务的方式记录于专用的磁盘日志文件中。在事务处理过程中,一旦系统崩溃,系统重启时便可用日志重做(redo)任何不完整的更新,将文件系统恢复到一致性状态。从而大大降低系统崩溃后的复原时间。

 同时,日志文件系统的缺点在于增加了文件的更新时间。


七、单根目录层级与挂载点

 Linux 上所有文件系统中的文件都位于单根目录树下,树根就是根目录/。其他文件系统都挂载在根目录下,被视为整个目录层级的子树。

 超级用户可用以下命令来挂载文件系统:

mount device directory

 这条命令会将名为device的文件系统挂载到目录层级中由directory指定的目录,即文件系统的挂载点。可使用unmount目录卸载文件系统,然后重新挂载到其他挂载点。

 不带任何参数执行mount命令,可列出当前已挂载的文件系统。

应用程序中通过调用mount()/unmount()也可进行文件系统的挂载与卸载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

aidl原理

aidl 流程 为了方便理解,先将binder看做是一个黑盒子 aidl的流程图如下 demo连接添加链接描述 Androidstudio 会帮我们生成emotionAidlService,具体目录在n\build\generated\aidl_source_output_dir\debug\out\com\example\emotion\emotionAidlServic…

swiftUI和swift的区别

概述 SwiftUI是苹果公司推出的一种用于构建iOS、macOS、watchOS和tvOS应用程序界面的框架。它是基于Swift编程语言开发的,旨在简化UI开发过程并提供实时预览功能,使开发人员可以更快地构建出漂亮的应用程序界面。 Swift是苹果公司推出的一种面向对象的…

【QT】混合UI设计

虽然利用Designer和代码的设计方式都可以开发GUI,但是毫无疑问的是最有效的开发方式是利用两者进行混合开发。 下面这个实验例子来自《QT5.9 C开发指南》,我做了小部分修改,最终效果是这样: 图标导入 这次我们要开发的是一个有工…

AprilTag码估算平面法向量+相机标定

由于本人部分原创博客发布在古月居论坛,详细内容点击链接跳转: 1. AprilTag探索和原理分析 2. 相机标定,基于AprilTag估算平面法向量

web安全php基础_php常量及可变变量(魔术变量)

常量 php中常量是一个简单值的标识符。该值在脚本中不能改变。 一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。 常量有两点需要特别注意的地方 常量在整个脚本中都可以使用。常量值被定义后,在脚本的其他任何…

企业级CDP数据工程实践(一):建设中的最佳实践

大家好,许久未见,我是云祁~ 今天想和大家分享下 企业级CDP项目 建设中的数据工程实践。 在很多情况下,大家可能会将数据工程与ETL的过程画上等号,但实际上ETL只是数据工程的一部分,其工作量通常仅占整个数据…

I.MX6ULL_Linux_驱动篇(40)异步通知

在前面使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的,对于非阻塞方式来说还需要应用程序通过 poll 函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知,报告自己可以访问,然后应用程序在从驱动程序中读取…

Linux——进程信号(下)

目录 总结 一,信号保存 1.1 阻塞信号 2.2 信号在内核(操作系统)中的表示 2.3 系统接口 2.3.1 sigset_t信号集 2.3.2 信号集的操作函数 2.3.3 sigprocmask 2.3.4 sigpending 2.4 实验样例 三,信号处理 3.1 信号捕捉 3.2 sigaction接口 3.3 实验…

2022年真题 - 17 - 系统优化

系统优化 题目配置验证配置 题目 StorageSrv - 系统优化 系统资源限制设置:设置所有用户的硬件跟软件的最大进程数、最大文件打开数为65535;开启 IPv4 恶意 icmp 错误消息保护;开启 SYN 洪水攻击保护;允许系统打开的端口范围为 …

服务网关 Gateway

服务网关 Gateway 服务网关介绍Gateway 介绍Gateway 和 Nginx 网关的区别Gateway 核心概念Gateway工作流程 Gateway 案例Predicate(断言)After 路由谓词工厂Before路由谓词工厂Between 路由谓词工厂Cookie路由谓词工厂Header 路由谓词工厂Host 路由谓词工…

支付宝支付(六):小程序支付(Go+Gin+内网穿透)

一、前置条件 (1)go语言,1.18 (2)Gin、第三方依赖包:gopay【github.com/go-pay/gopay/alipay】https://github.com/go-pay/gopay/blob/main/doc/wechat_v3.md (3)支付宝支付相关信…

Java面向对象程序开发——JDK8新特性

文章目录 网络编程入门知识JDK8新特性Lambda表达式以多线程为例:Lambda结合for循环: Stream流获取一个流的2种常用的方式:常用方法终结方法延迟方法 案例 网络编程入门知识 软件结构、协议分类、网络通信协议、网络编程三要素、TCP通信协议、…

爬虫的分布式思维与实现思路

爬虫的分布式思维与实现思路 基本构架 scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为master,而把用于跑爬虫程序的机器称为slave 我们知道,采用scrapy框架抓取网页&…

netty学习(4):通过SpringBoot Web发送消息实现netty实现多个客户端与服务器通信

1. 基于netty学习(3):SpringBoot整合netty实现多个客户端与服务器通信的学习,要想通过http在netty客户端之间发送消息,需要实现spring-boot-starter-web,封装消息格式,自动调用netty客户端 2. 封装一个简单…

算法笔记——哈希表篇

一般哈希表都是用来快速判断一个元素是否出现集合里,哈希表并不意味着一定要使用HashMap,有时候使用数组更方便,有时候要使用set,依据具体情况而定,哈希表是典型的空间换时间。 数组作为哈希表 一些应用场景就是为数组…

工具 | 应用程序无法启动,应为应用程序的并行配置不正确

工具 | 应用程序无法启动,应为应用程序的并行配置不正确 “E:\02-Doc\朱老师物联网大讲堂-全部视频\朱有鹏老师嵌入式linux核心课程\开发版光盘资料\X210V3S_A\tools\x210_Fusing_Tool.exe”的激活上下文生成失败。 找不到从属程序集 Microsoft.VC90.MFC,processorA…

DNS-去中心化域名系统,创建您在DeSoc 社会中的YUAN ID

传统域名系统 (DNS) 是一个分层的分散信息存储,用于将用户在网络浏览器中输入可读名称(例如 www.baidu.com)解析为IP地址,来访问互联网上的计算机。传统DNS使用一种分布式数据库,有严格的上下级关系,上级仅…

[Android JNI] --- JNIEnv和JavaVM

1 JVMEnv 1.1 JNIEnv 是什么 JNIEnv 即 Java Native Interface Environment,Java 本地编程接口环境。JNIEnv 内部定义了很多函数用于简化我们的 JNI 编程。 JNIEnv是提供JNI Native函数的基础环境,线程相关,不同线程的JNIEnv相互独立&#…

SpringBoot快速回顾(@value读取配置文件)

目录 1.定义配置文件2. 定义Controller类3. 测试4. 优化4.1 封装实体类4.3 定义controller类4.2 测试 本文将介绍如何使用value读取配置文件的内容。 在实际项目中,往往会在配置文件中写项目部署需要配置的环境信息(数据库驱动,数据库账号密码…

医疗金融法律大模型:从ChatDoctor到FinBERT/FinGPT/BloombergGPT、ChatLaw/LawGPT_zh

第一部分 各种医疗类ChatGPT:或中英文数据微调LLaMA、或中文数据微调ChatGLM 1.1 基于LLaMA微调的中英文版ChatDoctor 1.1.1 ChatDoctor:通过self-instruct技术提示API的数据和医患对话数据集微调LLaMA Github上有一个基于LLaMA模型的医疗微调模型&am…