Linux系统编程:文件系统和inode

这篇具有很好参考价值的文章主要介绍了Linux系统编程:文件系统和inode。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一. 磁盘的结构和读写数据的方式

1.1 磁盘级文件和内存级文件

1.2 磁盘的物理结构

1.3 访问磁盘数据的方式

二. 磁盘文件系统

2.1 磁盘的分区管理方法

2.2 文件名和inode的关系

三. 结合文件系统对文件创建和删除的相关问题的理解

3.1 文件创建时操作系统进行的工作

3.2 文件删除时操作系统进行的工作

3.3 查看文件时操作系统进行的工作

3.4 已删除文件的恢复问题

四. 总结


一. 磁盘的结构和读写数据的方式

1.1 磁盘级文件和内存级文件

  • 内存级文件:被某个进程打开的文件,文件的内容被加载到了内存。
  • 磁盘级文件:没有被进程打开的文件,存储在磁盘。

如果设备断电,内存中的数据会丢失,但是磁盘上存储的数据依旧会被保存下来。也就是说,磁盘是一种永久性的存储介质,永久性的存储介质还有:SSD、光盘、磁带等。

磁盘,是计算机系统中唯一的机械设备。

现代笔记本电脑和很多台式机,都采用SSD来替代机械硬盘。SSD,就是我们常说的固态硬盘,它以固态电子芯片作为存储介质,相对于磁盘,SSD的读写速度更快,成本也较高。大型互联网公司的服务器,一般还是使用磁盘来存储数据。

1.2 磁盘的物理结构

一个磁盘的主要结构包括:磁盘盘片、磁头、音圈马达、主轴等。磁盘盘片用于存储数据,磁头用于从磁盘中读取数据和向磁盘中写数据。

计算机只认识二进制数据,也就是0/1,因此,只要能在磁盘盘片上读写0/1信号即可。磁盘盘片上涂有磁性物质,通过磁头放电,改变磁盘上磁性物质的正负极,从而实现数据的读写。通过磁盘上的正负极信号,来记录二进制数据,从而实现对数据的永久性存储。

Linux系统编程:文件系统和inode,Linux系统和网络,linux,运维,服务器
图1.1 磁盘的物理结构

磁盘盘片,根据区域划分原则,可分为如下几块区域:

  • 磁道:在一个磁盘盘片上,距离中心轴半径相同的环形面。
  • 扇区:一个磁道中的一段扇形区域,每块扇区所对应的圆周角大小相同。
  • 柱面:所有磁盘盘片上,以主轴为中心轴,半径相同的圆柱面。(一个磁盘并非只有一个盘片,而是由许多盘片摞起来的)

一个扇区,为一个数据存储的单元。一般一个扇区可以存储512bytes的数据,也有些磁盘一个扇区存储4KB的数据,现在的技术也支持了不同扇区的容量有所不同。

Linux系统编程:文件系统和inode,Linux系统和网络,linux,运维,服务器
图1.2 磁盘盘片结构

1.3 访问磁盘数据的方式

如果我们想要访问某个特定的数据,要依次进行如下的工作,找到数据存储的位置:

  1. 确定数据存储在哪个磁盘盘面(确定对应磁头)-- Head
  2. 确定位于那个磁道(柱面)-- Cylinder
  3. 确定位于哪个扇区 -- Sector 

上述寻址方法,被称为CHS寻址法, 有了CHS,我们就能够访问到任意扇区的数据。

我们可以通过磁带结构,来抽象类比磁盘。如图1.3所示,磁带被环形缠绕在一个柱面上,每层磁带叠加起来,就好比磁盘的盘片结构,磁带上也存在正负极来记录二进制信号。磁带可以展开为线性结构,这个线性结构就类似于数组,而我们可以想象将磁盘当做磁带展开,这样盘形结构就变为了数组似的线性结构。每个数组下标位置,就相当于一个磁盘上的扇区,根据下标就可以转换获取对应的盘面、磁道和扇区。

假设存储空间为1T的磁盘,那么我们就可以假想整个磁盘的存储空间就是一个数组,而向磁盘的某个扇区写数据,就等同于向这个数组中某个特定下标位置写数据。

Linux系统编程:文件系统和inode,Linux系统和网络,linux,运维,服务器
图1.3 磁带
Linux系统编程:文件系统和inode,Linux系统和网络,linux,运维,服务器
图1.4 磁盘盘面抽象展开图

二. 磁盘文件系统

2.1 磁盘的分区管理方法

由于一个磁盘的存储空间相对较大,为了便于管理,一般会对磁盘进行分区管理,这就好比我们将电脑的存储空间分为C盘、D盘、E盘。磁盘的存储空间,会被划分为若干个Block Group和一个Boot Block,Boot Block记录整个文件系统相关的属性信息,如果Boot Block中的数据丢失,那么对整个文件系统来说将是灾难性的,因此,在每个block group中,会有一块Super Block,用于备份文件系统的属性信息。当Boot Block中的信息丢失时,OS会去Block Group中寻找备份信息。

每个Block Group又可以根据存储数据的不同,分为这几个区域:Super Block、Group Descriptor Table、Block Bitmap、inode Bitmap、inode Table、Data Blocks。在这些分区里,存储了文件的数据和属性,以及块组和文件系统相关的属性信息。

Linux系统编程:文件系统和inode,Linux系统和网络,linux,运维,服务器
图2.1 磁盘分区图

每块Block Group(块组)内部分区存储的内容为:

  • Data Block:数据块,存储文件的正文内容,一般来说,每个块组的容量为4KB。
  • inode Table:inode表,每个文件会分的一块128bytes的inode空间,用于存储文件的属性信息。同时,每个inode都有与之对应的inode编号,对应于某个特定的文件,如果拿到文件的inode编号,就可以找到对应的inode模块,获取文件的属性信息。
  • inode Bitmap:与inode Table对应的位图,每个二进制比特位对应一个inode Table的下标位置,0表示该inode Table位置(某个inode编号)没有被使用,1表示被使用了。
  • Block Bitmap:与Data Block对应的位图,每个存储文件内容的Data Block如果被使用了,与之对应的Block Bitmap的二进制位就为1,否则为0。
  • Group Descriptor Table:块组描述表,记录该Block Group(块组)中,使用了几个inode,还剩几个inode,使用了几个Data Block,还有多少Data Block没有使用等信息。
  • Super Block:记录整个文件系统的属性信息,如果Boot Block或某个块组上的Super Block上存储的信息被破坏,那么其他块组中的Super Block就存储了其备份信息,用于OS恢复文件系统属性信息。之所以要在多个块组保存多份文件系统属性信息,是因为如果文件系统属性信息被破坏或丢失,那么整个文件系统就会崩溃。

在磁盘的每个块组上记录上面的这些信息,让每个文件的属性和内容可追溯、可管理。在磁盘中,文件的内容和文件的属性是分开存储的,文件 = 文件内容 + 文件属性。

一个Data Block存储4KB的数据,磁盘和内存进行IO操作的基本单位为4KB,但是,一个扇区一般存储512Bytes的数据,不让一个扇区存储的数据量和磁盘和内存进行IO操作的基本单位保持一致主要出于以下两个方面考虑:(1)如果IO的基本单位太小,那么就会大幅增加IO的次数,降低计算机系统的整体效率。(2)如果让磁盘扇区大小和IO基本单位大小一致,那么如果磁盘扇区大小发生变化,那么就需要更改OS的源代码,不让它们一致,是为了实现硬件层面和软件层面的解耦,软件工程要求高内聚低耦合。

2.2 文件名和inode的关系

存储在特定块组中的每个文件,都会有一个独立的、与之对应的inode编号,通过这个inode编号,可以在inode Table中,查找到特定的下标位置,以获取文件的属性信息。

Linux系统内置的ll、stat等获取文件属性信息的指令,其底层都是通过拿到文件的inode编号,进而在inode Table中获取文件的属性信息来实现的。

那么,文件的内容又是怎样获取的呢,怎样知道某个文件的内容存储在哪个Data Block中呢?

每个Data Block,都有一个特定的编号,每个文件的inode中,会记录有文件对应的Data Block编号, 只需要根据inode中记录的Data Block编号,就可以找到与之对应的Data Block,从而找到文件的内容。如图2.2所示,inode中有一个blocks数组,记录存储这个文件内容的Data Block编号。

获取某个文件的内容的流程为:拿到文件的inode编号 -> 找到与之对应的inode -> 找到inode内部的Blocks数组,获取存储这个文件的内容Data Blocks -> 访问Data Blocks获取文件内容。 

那么,如果文件很大,需要庞大数量的Data Blocks才能放下的时候,又该怎么办呢,总不能将这些Data Blocks的编号全都放到inode中的Blocks数组中吧? -- Data Blocks中不仅可以存储文件的具体内容,也可以存储其它的Data Block编号,这个可以根据Data Blocks中记录的其他Data Block编号,找到存储了具体文件内容的Data Blocks。

Linux系统编程:文件系统和inode,Linux系统和网络,linux,运维,服务器
图2.2 通过inode编号获取文件内容

inode中,并不会存储文件的文件名!

提问,如何通过文件名获取文件对应的inode编号呢?目录(文件夹),也属于文件,有与之对应的inode编号和Data Blocks,目录的Data Blocks中存储该目录下文件名和inode编号之间的映射关系,这就解释了为什么同一目录下不允许有同名的文件,因为如果有同名文件,就无法建立文件名与inode编号之间准确的映射关系。

在某一特定磁盘块组Data Group中,inode和Data Block的数量都是固定的。这就解释了为什么有时候明明块组中还有内存空间,但却无法成功创建新文件的现象。这有可能是因为inode Table被用完了,但Data Blocks还没用完,或者Data Blocks被用完了,但是inode Table还没有被用完。

三. 结合文件系统对文件创建和删除的相关问题的理解

3.1 文件创建时操作系统进行的工作

遍历块组的inode Bitmap,查找一个还没有被使用的inode编号,分配给新建的文件 -> 将对应的inode Bitmap的二进制为置为1 -> 向inode中写入文件的属性信息 -> 为文件分配Data Blocks,记入inode中,并将Block Bitmap中与之对应的二进制位置为1 -> 将文件名及其与inode编号之间的映射关系写入到文件所在目录对应的Data Blocks中。

3.2 文件删除时操作系统进行的工作

根据文件名,从文件所在路径的Data Blocks中获取该文件的inode编号 -> 根据inode编号,在inode Tables中,找到与之对应的inode,从inode中获取该文件占用的Data Blocks编号 -> 将inode Bitmap和Blocks Bitmap中对应的二进制位置0 -> 在文件所在的目录的Data Blocks中,解除文件名和inode编号的映射关系。

注意:删除文件不需要清除Data Blocks中的文件内容,只要改变位图标记、解除文件名和inode编号之间的映射关系即可。因此,删除一个大文件所耗费的时间远低于拷贝一个大文件的时间。

3.3 查看文件时操作系统进行的工作

根据文件名拿到与之对应的inode编号 -> 通过inode编号找到该文件的inode -> 从inode中获取存储该文件内容的Data Blocks -> 访问指定的Data Blocks,查看文件内容。

3.4 已删除文件的恢复问题

当用户删除一个文件时,OS会有记录相应的删除日志,日志中会包含文件的inode编号。由于删除文件并不会删除掉inode Tables和Data Blocks中的内容,因此,可以通过已删除文件的inode编号,获取存储文件内容的Data Blocks,这样就可以实现对删除文件的恢复。

但是,恢复删除文件有一个必要的前提:原来文件所使用的inode Tables和Data Blocks均没有被覆盖。如果被覆盖,那么文件就无法恢复,写文件、新建文件等各种操作,都有可能造成被删除文件的inode Tables和Data Blocks被覆盖,因此,如果误删了重要文件,在文件恢复之前,什么都不应该做!

四. 总结

  • 文件根据是否被进程打开,分为内存级文件和磁盘级文件。

  • 磁盘的主要结构有:盘片、磁头、主轴、音圈马达等。数据存储在磁盘盘片上,磁盘盘片被划分为一个个的磁道和扇区,一个扇区为一个磁盘存储单元。磁盘盘片上涂有磁性物质,磁性物质的正负极,代表二进制数据的0和1,磁头负责在磁盘盘片上读取数据和向磁盘写数据。

  • 通过CHS法,找到数据在磁盘中的盘片、磁道和扇区,就可以获取对应的数据。

  • 磁盘中是被分为若干个块组进行分区管理的,每个块组存储有文件的属性信息和文件的内容,文件的属性信息和内容是分开存储的,每个文件占用一个inode来存储属性信息,占用若干个Data Blocks存储文件内容。

  • 目录也是文件,与它自己的inode和Data Blocks,目录的Data Blocks中存有该目录下文件的文件名和与之对应的inode编号。文章来源地址https://www.toymoban.com/news/detail-566753.html

到了这里,关于Linux系统编程:文件系统和inode的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Linux]理解文件系统!动静态库详细制作使用!(缓冲区、inode、软硬链接、动静态库)

            hello,大家好,这里是bang___bang_,今天来谈谈的文件系统知识,包含有缓冲区、inode、软硬链接、动静态库。本篇旨在分享记录知识,如有需要,希望能有所帮助。 目录 1️⃣缓冲区 🍙缓冲区的意义 🍙常见缓冲区刷新策略 🍙缓冲区位置猜想 🍥现象猜测 🍥现象解

    2024年02月13日
    浏览(37)
  • 云计算Linux运维——Linux系统管理——网络参数配置

    点关注不迷路 目录 1网络参数配置 一、网络参数 1、主机名 2、查看网卡IP地址 3、查看网关 4、查看DNS服务器地址 二、配置网卡 1、修改网卡配置文件 2、nmcli命令 3、nmcli配置网卡 3)重新加载配置 三、VMware网络工作模式 1、虚拟网络、虚拟网卡 2、虚拟网络工作模式 2双网卡绑

    2024年02月04日
    浏览(31)
  • C++ 网络编程项目fastDFS分布式文件系统(四)-fastCGI项目相关技术以及linux搜狗输入法相关问题。

    目录 1. Nginx作为web服务器处理请求 2. http协议复习       Get方式提交数据 Post方式提交数据 3. fastCGI   3.1 CGI  3.2 fastCGI 3.3 fastCGI和spawn-fcgi安装         1. 安装fastCGI     2. 安装spawn-fcgi 3.4 nginx fastcgi     4其他知识点 1. fastCGI环境变量 - fastcgi.conf  2. 客户端使用Post提交数据

    2024年02月12日
    浏览(32)
  • Day11-Linux系统iNode及链接知识及企业按哪里精讲

    中文意思是索引节点(index node) 是磁盘上的一块【存储空间】。 一个inode大小256字节。 看到形态是一个串数字(身份证)。 存储文件的属性信息(大小、用户、组、修改时间 ls -l的信息都在里面放着)。 还存放一个重要的东西,指向文件真正实体的位置信息(指针)。 1)买回

    2024年02月20日
    浏览(27)
  • Linux内核的两种安全策略:基于inode的安全与基于文件路径的安全

    在Linux中,一切皆为文件,实现系统安全的策略主要可分为两种:基于 inode 的安全、基于文件路径的安全。 基于inode的安全 为文件引入安全属性,安全属性不属于文件内容,它是文件的元数据,应该与 inode 关联,一些内核安全模块将安全属性存储在文件的扩展属性中,这种

    2024年02月12日
    浏览(33)
  • Linux:概述 、安装 、文件与目录结构 、vim编辑器 、网络配置 、远程登录 、系统管理 、基础命令 、软件包管理 、克隆虚拟机 、shell编程

    2.1.1、Linux是什么? Linux是一个操作系统(OS) 所谓的操作系统就是直接用来操作计算机底层硬件的软件。 2.1.2、Linux的出现 官网: https://www.centos.org/ 进入官网进行下载 有很多的镜像,以阿里云的为例: 3.3.1、下载 官网: https://www.vmware.com/ 这是下载的企业版,30天试用期,可

    2024年02月05日
    浏览(50)
  • Linux系统应用编程(五)Linux网络编程(上篇)

    1.两个网络模型和常见协议 (1)OSI七层模型(物数网传会表应) 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层(自下到上) (2)TCP/IP四层模型(网网传应) 网络接口层(链路层)、网络层、传输层、应用层 (3)常见网络协议所属层 2.字节序 (1)两种

    2023年04月25日
    浏览(25)
  • Linux网络编程之TCP文件传输

    1. 要求 在Linux环境下,编程实现文件的上传和下载,即客户端可以发送文件给服务器,服务器将文件写到服务器端文件系统中;客户端请求下载文件时服务器读取文件内容,发送给客户端,客户端接收内容并写入本地文件。要求 (1)源代码格式化良好并适当注释; (2)除上述核心功

    2024年02月08日
    浏览(31)
  • Linux系统编程---文件IO

    一、系统调用 由操作系统实现并提供给外部应用程序的编程接口(Application Programming Interface,API),用户程序可以通过这个特殊接口来获得操作系统内核提供的服务 系统调用和库函数的区别: 系统调用(系统函数)     内核提供的函数 库调用                        

    2024年04月13日
    浏览(24)
  • 【Linux操作系统】举例解释Linux系统编程中文件io常用的函数

    在Linux系统编程中,文件IO操作是非常常见和重要的操作之一。通过文件IO操作,我们可以打开、读取、写入和关闭文件,对文件进行定位、复制、删除和重命名等操作。本篇博客将介绍一些常用的文件IO操作函数。 1.1 原型、参数及返回值说明 1.1.1 原型: open()函数是Linux系统

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包