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

<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 的特点及其实现技术。

  1. Linux 文件系统的树型结构
    Linux 最上层的是根目录,用/表示。
    在这里插入图片描述
    Linux 采用目录分解的方法管理文件目录。在树型目录中的目录项是文件的符号目录。如下图所示:
    在这里插入图片描述

  2. Linux 文件类型
    普通文件
    目录文件
    设备文件
    管道文件
    链接文件(基于索引节点共享)

  3. 文件的访问权限
    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…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...