当前位置: 首页 > 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启动的时间很长,有时候以为装错了。 第二是初始密码,如果…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

SpringAI实战:ChatModel智能对话全解

一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM&#xff0…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...