<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)
《Linux操作系统原理分析之Linux文件管理(1)》(25)
- 8 Linux文件管理
- 8.1 Linux 文件系统概述
- 8.2 EXT2 文件系统
- 8.2.1 EXT2 文件系统的构造
- 8.2.2 EXT2 超级块(super block)
- 8.2.3 组描述符
- 8.2.4 块位图
- 8.3 EXT2 的 inode 和文件结构
- 8.3.1 EXT2 文件系统 inode 结构
- 8.3.2 inode 表和 inode 位图
- 8.3.3EXT2 文件的物理结构
- 8.3.4 EXT2 的目录结构
8 Linux文件管理
8.1 Linux 文件系统概述
本章主要介绍 EXT2 文件系统的结构特点以及 linux 虚拟文件系统 VFS 的特点及其实现技术。
-
Linux 文件系统的树型结构
Linux 最上层的是根目录,用/表示。
Linux 采用目录分解的方法管理文件目录。在树型目录中的目录项是文件的符号目录。如下图所示:
-
Linux 文件类型
普通文件
目录文件
设备文件
管道文件
链接文件(基于索引节点共享) -
文件的访问权限
Linux 中的每个文件都归于一个特定的用户所有,而且一个用户一般都是与某个用户组相关。所以,linux 设置了三种针对访问者身份的权限:文件所有者、与文件所有者同组的用户、其他用户。
对文件的访问限制主要体现在文件的 3 种操作上,即文件的读取、写入和执行。对 3 种访问者的 3 种操作限制形成了 9 种情况,用 9 位二进制代码表示。
-rwxr-xr-x 1 user wheel 3212 Dec 4 12:36 a.out
8.2 EXT2 文件系统
8.2.1 EXT2 文件系统的构造
一个文件系统一般使用块设备上的一个独立逻辑分区,在这个分区内建立文件系统的树型层次结构 。EXT2 文件系统由逻辑序列块序列组成。EXT2 文件系统把它所使用的磁盘逻辑分区划分为若干块组(block group),并从 0 开始依次编号。每个块组中包含若干数据块,其中存放文件内容。每个组中除数据块之外包括 5 种用于管理和控制的信息块:超级块、组描述符、块位图、inode 位图和 inode 表。这些信息位
于每个块组的前部,后面是文件的数据块。
8.2.2 EXT2 超级块(super block)
EXT2 超级块(super block):用来描述 EXT2 文件系统整体信息的数据结构,主要描述文件在逻辑分区中的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。所有块组中包含的超级块的内容是相同的。系统运行期间 系统运行期间, 需要把超级块中的内容复制到内存缓冲区内。
在 linux 中,EXT2 文件系统超级块定义为 ext2_super_block 结构,定义在/include/linux/ext2_fs.h 中 。EXT2 超级块由两部分组成:
基本超级块:EXT2 文件系统得整体静态信息。
扩充块:反映所在块组的某些动态特性。
超级块本身占用一个物理块(1024B),基本块占 84B,扩充块占 20B,剩余的 920B 定义为元素长度为 4B 的数组 reserved[230],作为备用。
8.2.3 组描述符
组描述符:记录各个组块的描述信息(在位文件分配磁盘空间时需要使用这些信息)。这些组描述符集中在一起,就形成了组描述符表。组描述符可能占用多个物理块。和超级块一样的是:每个组块中的组描述符的内容完全相同,而且它的内容也要读入内存。
在 linux 中,组描述符(32B)是一个 ext2_group_desc 结构,定义在/include/linux/ext2_fs.h 中:
8.2.4 块位图
块位图:记录每块组的数据块的使用情况。它占用一个物理块。所以一个块组中数据块的最大数量是一个物理块的长度的 8 倍。例:对 1024 的物理块而言,其块位图就有 1024*8 位,即可以表示 8K 个数据块,也就是说一个块组的数据区的最大容量是 8M。如果 EXT2 文件系统使用的逻辑分区为 100M,则它可以划分为 12 个块组。
系统运行后,块位图装入一个高速缓存中,但是由于高速缓存空间有限,故只装入当前常用的 8 块(缺省值)位图。
8.3 EXT2 的 inode 和文件结构
8.3.1 EXT2 文件系统 inode 结构
Linux 中 EXT2 文件系统 inode 定义为 struct ext2_inode。它定义在/include/linux/ext2_fs.h。
8.3.2 inode 表和 inode 位图
inode 表:一个块组的所有文件的 inode 的集合。它可能占据多个物理块。每个块组可以包含的 inode 的数目由超级块中的成员项 s_inoders_per_group 给出。
Inode 位图:反映了 inode 表中各个项的使用情况,它的每一位表示 inode 表的一个表项。1 使用;0 空闲。与块位图相似,inode 位图也装入一个高速缓冲中。
8.3.3EXT2 文件的物理结构
采用混合索引结构。Inode 中 i_block[]数组共有 15 个地址。如下图所示:
EXT2 文件默认的物理块尺寸为 1K,EXT2 的块地址长度 4B,所以每个间接块中的索引表可以包括1024/4=256 个物理地址。所以
1.直接地址:允许文件不大于 12K
2.一次间接地址:当文件大于 12K 时采用,允许文件长达 256K+12K
3.二次间接地址: 当文件大于 256K+12K 时采用,允许文件长达 256*256*K+256K+12K
4.三 次 间 接 地 址 : 当 文 件 大 于 256*256K+256K+12K 时 采 用 , 允 许 文 件 长 达256*256*256K+256*256K+256K+12K=16G+64M+256K+12K
但是实际上 linux 是 32 位文件系统,文件尺寸最大为 4G。
EXT2 文件系统按照文件的逻辑块号为索引值查找数据块,逻辑块从 0 依次编号。
例:如何查找逻辑块号 100 对应的物理块。
8.3.4 EXT2 的目录结构
Linux 树型目录结构中,每个文件目录都是一个目录文件,每个目录项都是一个 ext2_dir_entry 结构体,它
就是一个文件的符号目录。定义在/include/linux/ext2_fs.h。
Struct ext2_dir_entry
{
_u32 inode; /*inode 号*/
_u16 rec_len; /*目录项长度*/
_u16 name_len; /*文件名长度*/
Char name[EXT2_NAME_LEN]; /*文件名*/
}
EXT2_NAME_LEN 缺省为 255,也就是文件名最大可以用 255 个字符。另外目录项长度根据文件名长度的大小是可变的。但是必须是 4 的倍数,不用部分用\0 填充。
删除文件时,将相应的 inode 号字段置 0,如果相邻有空白目录项则合并。
添加文件时,找到一个长度合适的空白目录项,并写入相应信息;若空白表项使用后剩余空间大于12B,则把剩余部分仍作为空白目录项。如果找不到合适的空目录项,就在文件尾部建立这个文件的目录项。
相关文章:

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)
《Linux操作系统原理分析之Linux文件管理(1)》(25) 8 Linux文件管理8.1 Linux 文件系统概述8.2 EXT2 文件系统8.2.1 EXT2 文件系统的构造8.2.2 EXT2 超级块(super block)8.2.3 组描述符8.2.4 块位图 8.3 EX…...
算能PCIe开发环境搭建-一些记录
开发环境与运行环境: 开发环境是指用于模型转换或验证以及程序编译等开发过程的环境;运行环境是指在具备Sophon设备的平台上实际使用设备进行算法应用部署的运行环境。 开发环境与运行环境可能是统一的(如插有SC5加速卡的x86主机,…...

使用C#和HtmlAgilityPack打造强大的Snapchat视频爬虫
概述 Snapchat作为一款备受欢迎的社交媒体应用,允许用户分享照片和视频。然而,由于其特有的内容自动消失特性,爬虫开发面临一些挑战。本文将详细介绍如何巧妙运用C#和HtmlAgilityPack库,构建一个高效的Snapchat视频爬虫。该爬虫能…...
c/c++的字符和字符串输入输出
注: 1.下面这些为本人大学四年所用过的处理办法, 至今为止遇到的所有编程题都能够使用。如果需要了解更多关于putchar,cin.get,cin.getline等的请自行搜索。 2.getchar相当于获取一个字符,可以实现单个字符的输入以及通过循环实现多个字符输…...

学习设计模式的网站
Refactoring and Design Patternshttps://refactoring.guru/...

Hadoop学习笔记(HDP)-Part.08 部署Ambari集群
目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...

IDEA加载阿里Java规范插件
IDEA加载阿里巴巴Java开发手册插件,在写代码的时候会自动扫描代码规范。 1、打开Settings 2、打开Plugins 3、搜索Alibaba Java Code Guidelines(XenoAmess TPM)插件,点击Install进行安装,然后重启IDE生效。 4、鼠标右…...

【CSP】202305-1_重复局面Python实现
文章目录 [toc]试题编号试题名称时间限制内存限制题目背景问题描述输入格式输出格式样例输入样例输出样例说明子任务提示Python实现 试题编号 202305-1 试题名称 重复局面 时间限制 1.0s 内存限制 512.0MB 题目背景 国际象棋在对局时,同一局面连续或间断出现3次或3…...

html5各行各业官网模板源码下载(1)
文章目录 1.来源2.源码模板2.1 HTML5白色简洁设计师网站模板2.2 HTML5保护野生动物响应式网站模板 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134682321 html5各行各业官网模板源码下载,这个主题覆盖各行…...

6 Redis缓存设计与性能优化
缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义…...
SpringCloud常见问题
1、什么是Spring Cloud? Spring Cloud是一款基于Spring Boot框架开发的微服务框架,它为开发人员提供了一系列的组件和工具,可以帮助开发人员快速构建和部署微服务,提高开发效率和项目可维护性。Spring Cloud提供了包括服务注册与…...

实战演练 | 在 Navicat 中格式化日期和时间
Navicat 支持团队收到来自用户常问的一个问题是,如何将网格和表单视图中的日期和时间进行格式化。其实这个很简单。今天,我们将介绍在 Navicat Premium 中进行全局修改日期和时间格式的步骤。 如果你想边学边用,欢迎点击 这里 下载免费全功能…...
mysql面试题分享带答案
数据库索引的原理,为什么要用B树,为什么不用二叉树? 可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不…...
利用 Python进行数据分析实验(一)
一、实验目的 使用Python解决简单问题 二、实验要求 自主编写并运行代码,按照模板要求撰写实验报告 三、实验步骤 本次实验共有5题: 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少&…...

Jupyter Notebook工具
Jupyter Notebook 是一个交互式的笔记本环境,允许用户以网页形式编写和分享代码、文本、图像以及其它多媒体内容。它支持超过 40 种编程语言,最常用的是 Python。 以下是 Jupyter Notebook 工具的一些特点和用法: 1. 特点: 交互式…...
c语言上机小练(有点难)
1.题目 用指向数组的指针编程实现:输入一个字符串,内有数字和非数字符号,如:a123x456(此处一个空格)17960?302tab5876。将其中连续的数字作为一个十进制整数,依次存放到一个数组a中。例如&…...
<JavaEE> 什么是线程安全?产生线程不安全的原因和处理方式
目录 一、线程安全的概念 二、线程不安全经典示例 三、线程不安全的原因和处理方式 3.1 线程的随机调度和抢占式执行 3.2 修改共享数据 3.3 关键代码或指令不是“原子”的 3.4 内存可见性和指令重排序 四、Java标准库自带的线程安全类 一、线程安全的概念 线程安全是指…...
Kotlin 中的 also 和 run:选择正确的作用域函数
在 Kotlin 中,also 和 run 是两个十分有用的作用域函数。 虽然它们在功能上相似,但各自有独特的用途和适用场景。 一、分析: also:在对象的上下文中执行给定的代码块,并返回对象本身。它的参数是一个接收对象并返回…...
ZKP Understanding Nova (1): MinRoot Example
Understanding Nova Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. Nova: Paper Code 1. Unders…...

0基础学java-day14
一、集合 前面我们保存多个数据使用的是数组,那么数组有不足的地方,我们分析一下 1.数组 2 集合 数据类型也可以不一样 3.集合的框架体系 Java 的集合类很多,主要分为两大类,如图 :[背下来] package com.hspedu.c…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...