当前位置: 首页 > news >正文

Linux之文件系统

1.前言

文件 = 内容+属性

文件分为被打开的文件(跟基础IO有关,在内存上)和没有被打开的文件(在磁盘上)。

在磁盘上找没有被打开的文件属于文件系统的工作

2.对硬件的理解

    2.1 磁盘,服务器,机柜,机房

1.磁盘属于外设,有着容量大,价格低的,速度慢等特点属于机械设备。

2.服务器是专门用于处理网络请求、存储和传输数据的高性能计算机。它是互联网服务的核心设备,支撑着各种在线应用与服务的运行。

3.机柜是专为存储计算机及相关控制设备而设计的设备,它提供了一个物理环境来保护这些硬件免受灰尘、水汽等环境因素的侵害。同时,机柜通过标准化的安装架和内部布局,确保服务器等硬件设备能够有序排列,从而便于文件系统的管理和数据的存储与访问。

4.机房是存放服务器、存储设备及其它关键信息系统硬件的物理空间。机房确保了数据存储、备份与恢复所需的高可靠性硬件环境得以维护。

     2.2 磁盘的物理结构

    2.3 磁盘的存储结构 

扇区:磁盘存储数据的基本单位,512字节,块设备 

磁盘容量 = 磁头数*磁道数*每道扇区数*每扇区字节数

如何定位一个扇区?

 1.可以先定位磁头

 2.确定磁头要访问哪一个磁道

 3.定位一个扇区

磁盘的数据存储在扇区上,根据柱面,磁头,扇区这三个部分就可以定位数据了,这就是数据定位的方式之一:CHS寻址方式

(CHS寻址方式支持的磁盘容量大约8.4G)

fdisk -l 指令介绍:用于列出指定磁盘或所有磁盘上的分区表信息。

 2.4 磁盘的逻辑结构

       2.4.1 理解过程

把磁盘想象成卷在一起的磁带,把磁盘拉直后可以得的存储结构类似下图:

 

每一个扇区都有了相应的线性地址(即数组下标),这就叫做LBA

 

       2.4.2 具体过程 

柱面是一个逻辑上的概念,其实就是每一面由相同半径的磁道逻辑上构成柱面 

磁道的展开:

柱面的展开:

整个磁盘的展开:

 

由C/C++的基础可知,这些都可以看成是一维数组:

每一个扇区都有下标,我们称之为LBA地址。

2.4.3 CHS和LBA地址

CHS随着时代的发展变得没那么实用,但在旧的硬件或特定的应用场景还有一定程度的用处

LBA地址通常被现代操作系统和磁盘驱动程序使用,因为它们提供了更高效、更简单的磁盘访问方式

所以在大多数情况下磁盘使用者直接使用LBA地址,而CHS地址和LBA地址间的转化通常由磁盘控制器和操作系统协同完成的。

以下是相关的转换方式了解即可:

3.引入文件系统

    3.1 块的概念

操作系统在读取硬盘数据的时候,为了追求效率,会一次连续读取多个扇区,即八个扇区组成一个块,块是文件存取的最小单位,块的单位一般是4KB.

块号=LBA/8;

LAB=块号*8+n(n是块内第几个扇区) 

    3.2 分区的概念

磁盘还可以被分成多个分区,按windows的观点来看就是一块磁盘被分为C,D,E盘,linux设备都是以文件的形式存在的,可以利用柱面的号码来进行分区(柱面是最小的分区单位) 

    3.3 inode的概念

在使用ls-l 命令的时候除了看见了文件的名字,还能看见文件元数据(属性)

每行的从左到右依次是:

模式,硬链接数,文件所有者,组,大小,最后修改时间,文件名 

除了ls -l获取文件的信息外还有stat命令能够看到更多的信息

用法:stat + 文件名

所谓的inode就是存储文件元信息的区域,中文译名为“索引节点”。

4.ext2 文件系统

    4.1 简单介绍

ext2文件系统将整个分区划分成多个同样大小的块组也就是Block Group(基本单位数为4KB),管理一个分区就能管理所有分区了,也就能管理所有磁盘文件

Linux中文件的内容和属性是分开存储的,内容存储在Data Blocks中,属性存储在inode Table中 

inode table 大小为4kb,故而会保留32个inode

为了区分不同的inode的,故而有inode编号,ls -li可以查看inode的编号,第一个就是

        4.2 位图(Bitmap)

      4.2.1 块位图(Block Bitmap)

 记录着Data Block中哪个数据块已经被占用,占用的置1,没占用的置0

      4.2.2 inode位图(inode Bitmap)

  每个bit表示一个inode是否空闲可用

      4.3 GDP(Group Descriptor Table)

块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符,每个块组描述符存储一个块组的描述信息。

描述信息

1.块组内部结构的定位信息:

  • inode表(inode Table)的起始位置:指出在块组中从哪里开始是inode表。inode表存储了文件系统中所有文件的元数据(如文件类型、权限、大小、创建/修改/访问时间等)。
  • 数据块(Data Blocks)的起始位置:指出在块组中从哪里开始是数据块。数据块用于存储文件的数据内容。

2.块组资源的使用情况

  • 空闲inode的数量:记录当前块组中还有多少个inode未被使用。
  • 空闲数据块的数量:记录当前块组中还有多少个数据块未被占用。

     4.4 超级块(Super Block)

存放文件系统本身的结构信息,描述整个分区的文件系统信息。

  1. 文件系统的大小和块大小:超级块记录了整个文件系统的大小以及组成文件系统的基本单位——数据块的大小。

  2. inode表的信息:包括inode表的大小、位置以及空闲inode的数量等。inode是文件系统用于存储文件元数据(如文件名、文件大小、文件权限等)的数据结构,每个文件都有一个对应的inode。

  3. 块位图和空闲块列表:块位图记录了文件系统中各个数据块的占用情况,而空闲块列表则列出了当前可用的数据块。这些信息对于文件系统的空间管理和文件存储至关重要。

  4. 文件系统的状态信息:如最近一次的更新时间、文件系统的挂载次数等。这些信息有助于操作系统了解文件系统的当前状态,并进行相应的维护和管理。

  5. 其他关键参数:如标识文件系统类型的幻数、文件系统的修改标记等。这些参数对于操作系统的识别和访问文件系统至关重要

    4.5 i节点表(inode Table)

inode编号以分区为单位,整体划分,不可跨分区 

存放文件属性如大小,所有者之类的

当前分组所有inode属性的集合

    4.6 Data Block

Block号按照分区划分,不可跨分区

    4.7 目录,文件名和映射

在磁盘中没有目录的概念,只有文件属性+文件内容的概念,磁盘中的文件采用类似树形的结构保存的。

inode编号跟文件名有着映射的关系

   4.8 struct dentry

Linux中,在内核中维护树状路径结构的内核结构体叫做struct dentry

struct dentry {
atomic_t d_count;
unsigned int d_flags; /* protected by d_lock */
spinlock_t d_lock; /* per dentry lock */
struct inode * d_inode ; /* Where the name belongs to - NULL is
* negative */
/*
* The next three fields are touched by __d_lookup. Place them here
* so they all fit in a cache line.
*/
struct hlist_node d_hash ; /* lookup hash list */
struct dentry * d_parent ; /* parent directory */
struct qstr d_name ;
struct list_head d_lru ; /* LRU list */
/*
* d_child and d_rcu can share memory
*/
union {
struct list_head d_child ; /* child of parent list */
struct rcu_head d_rcu ;
} d_u;
struct list_head d_subdirs ; /* our children */
struct list_head d_alias ; /* inode alias list */
unsigned long d_time; /* used by d_revalidate */
struct dentry_operations * d_op ;
struct super_block * d_sb ; /* The root of the dentry tree */
void *d_fsdata; /* fs-specific data */
# ifdef CONFIG_PROFILING
struct dcookie_struct * d_cookie ; /* cookie, if any */
# endif
int d_mounted;
unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};

1.每个文件都有对应的dentry结构,包括普通文件,这样被打开的文件,就可以在内存中形成整个树形结构

2.整个树形节点也同时隶属于Hash,方便快速查找

3.树形结构整体构成了Linux的路径缓存结构,打开访问任何文件,都得先在这颗树下根据路径进行查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径

    4.9 挂载分区

      4.9.1 挂载的概念

定义:磁盘分区后,分区与目录连接在一起,方便用户对该分区进行访问和操作

作用:通过挂载,Linux系统能够识别和使用磁盘上的分区,从而实现对文件和数据的存储,读取和管理

     4.9.2 挂载的步骤

  1. 查看磁盘和分区:使用lsblkfdisk -l命令查看当前的磁盘和分区情况。
  2. 创建分区:使用分区工具(如fdiskgdisk)创建新的分区。对于MBR分区表,使用fdisk;对于GPT分区表,使用gdisk
  3. 格式化分区:创建分区后,需要对其进行格式化以创建文件系统。例如,使用mkfs命令创建ext4文件系统。
  4. 挂载分区:使用mount命令将分区挂载到指定的目录(挂载点)。例如,将/dev/sda1分区挂载到/mnt目录

      4.9.3 重要用处 

根据对挂载分区知识的了解,可以通过访问目标文件的“路径前缀”准确判断文件在哪一个分区

    5.软硬链接

      5.1 硬链接

创建格式: ln 原文件 目标文件

例:名为a.txt的文件,想让他生成一个b.txt的硬链接

硬链接本质上不是一个独立的文件,因为它没有独立的inode

本质上是一组新的文件名和目标文件inode number的映射关系

作用:对文件进行备份

(.代表当前目录,..代表上一目录)

硬链接只能给普通文件建立而不能给目录建立

         5.2 软链接

创建格式:ln-s 原文件或目录  目标文件或目录

软文件本质是一个独立的文件

作用:保存目标文件的路径(相当于windows下的快捷方式) 

相关文章:

Linux之文件系统

1.前言 文件 内容属性 文件分为被打开的文件(跟基础IO有关,在内存上)和没有被打开的文件(在磁盘上)。 在磁盘上找没有被打开的文件属于文件系统的工作 2.对硬件的理解 2.1 磁盘,服务器,机柜,机房 1.磁…...

LeetCode刷题 -- 23. 合并 K 个升序链表

小根堆排序与合并 K 个有序链表的实现 1. 介绍 本技术文档详细介绍了如何使用 小根堆(Min Heap) 实现 K 个有序链表的合并。 核心思想是: 使用 小根堆 维护当前最小的节点。每次取出堆顶元素(最小值)加入合并链表&…...

DeepSeek在MATLAB上的部署与应用

在科技飞速发展的当下,人工智能与编程语言的融合不断拓展着创新边界。DeepSeek作为一款备受瞩目的大语言模型,其在自然语言处理领域展现出强大的能力。而MATLAB,作为科学计算和工程领域广泛应用的专业软件,拥有丰富的工具包和高效…...

mapbox基础,使用geojson加载fill-extrusion三维填充图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion三维填充图层样式二、�…...

基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现

大家好,今天要和大家聊的是一款基于 SpringBoot 的 “电影交流平台小程序” 系统的设计与实现。项目源码以及部署相关事宜请联系我,文末附上联系方式。 项目简介 基于 SpringBoot 的 “电影交流平台小程序” 系统设计与实现的主要使用者分为 管理员 和…...

单片机裸机编程-时机管理

对于 RTOS 实时操作系统,我们是通过 TASK(任务)进行底层操作的,这与裸机编程中的函数(fun)类似。不同的任务或函数实现不同的功能,在RTOS中,单片机有信号量、队列等不同任务之间的通…...

Flutter系列教程之(2)——Dart语言快速入门

目录 1.变量与类型 1.1 num类型 1.2 String类型 1.3 Object与Dynamic 1.4 类型判断/转换 1.5 变量和常量 2.方法/函数 3.类、接口、抽象类 3.1 类 3.2 接口 4.集合 4.1 List 4.2 Set 4.3 Map 5.总结 Dart语言的语法和Kotlin、Java有类似之处,这里就通…...

pyecharts介绍

文章目录 介绍安装pyecharts基本使用全局配置选项 折线图相关配置地图模块使用柱状图使用 介绍 echarts虑是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可,而Pyhon是门富有表达力的语言&a…...

前缀和相关题目记录(未完待续...)

1 前缀和 一维前缀和是指对于一个数组 a a a,我们定义一个新的数组 s s s,其中每个元素 s [ i ] s[i] s[i] 表示从数组开头到第 i i i 个元素的累加和: s [ i ] a [ 1 ] a [ 2 ] ⋯ a [ i ] ∑ j 1 i a [ j ] s[i] a[1] a[2] \…...

Https解决了Http的哪些问题

部分内容来源:小林coding 详细解析 Http的风险 HTTP 由于是明文传输,所以安全上存在以下三个风险: 1.窃听风险 比如通信链路上可以获取通信内容,用户号容易没。 2.篡改风险 比如强制植入垃圾广告,视觉污染&#…...

OpenCV给图像添加噪声

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 如果你已经有了一张干净的图像,并希望通过编程方式向其添加噪声,可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…...

湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌

2025年2月11日,湖北中医药大学&谱度众合(武汉)生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行,湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…...

欢乐力扣:快乐数

文章目录 1、题目描述2、思路1代码 1、题目描述 快乐数。  编写一个算法来判断一个数 n 是不是快乐数。  快乐数定义为:对于一个正整数,每次不断将其转化成 每位数字的平方和。 判断是否最终和会为1,是1就是快乐数,否则不是。 …...

【聊天室后端服务器开发】功能设计-框架与微服务

服务器功能设计 微服务思想应用 微服务架构 主要组成分析 客户端 客户端通过 HTTP 协议与网关进行交互,进行操作如用户注册、好友申请等客户端只需要知道网关的地址,无需关心后端服务的具体实现 网关 作为系统的统一入口,网关负责接收客…...

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》,是国内视频行业最重要的国家标准,目前有三个版本: 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平…...

让网页“浪“起来:打造会呼吸的波浪背景

每次打开那些让人眼前一亮的网页时,你是否有注意到那些看似随波逐流的动态背景?今天咱们不聊高深的技术,就用最朴素的CSS,来解锁这个让页面瞬间鲜活的秘籍。无需JavaScript,不用复杂框架,准备好一杯咖啡&am…...

linux-多进程基础(1) 程序、进程、多道程序、并发与并行、进程相关命令,fork

程序是什么 程序是包含一系列信息的文件。这些信息描述了如何在运行时创建一个进程,包含二进制格式标识、机器语言指令、程序入口地址、数据、符号表及重定位表、共享库信息及其他信息 二进制格式标识,每个程序包含了描述可执行文件的元信息(是否可读之…...

美颜相机1.0

项目开发步骤 1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化 2 创建主函数调用界面方法 3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel 4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添…...

Docker内存芭蕾:优雅调整容器内存的极限艺术

title: “💾 Docker内存芭蕾:优雅调整容器内存的极限艺术” author: “Cjs” date: “2025-2-23” emoji: “🩰💥📊” 当你的容器变成内存吸血鬼时… 🚀 完美内存编排示范 📜 智能内存管家脚本…...

gitlab初次登录为什么登不上去

今天又写了一次gitlab安装后,第一次登录的问题。 gitlab工作笔记_gitlab默认用户名密码-CSDN博客 因为又掉这个坑里了。 # 为什么第一次登录这么难? 第一是因为gitlab启动的时间很长,有时候以为装错了。 第二是初始密码,如果…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...