Linux下对inode和块的理解

转载https://www.cnblogs.com/whych/p/9315723.html

基本概念

首先讲下inode和块的基本概念。在Linux系统中,文件由元数据和数据块组成。数据块就是多个连续性的扇区(sector),扇区是文件存储的最小单位(每个512字节)。块(block)的大小,最常见的是4KB,也就是连续8个sector组成,存储文件数据和目录数据。而元数据用来记录文件的创建者、创建日期、大小等,这种存储文件元数据信息的区域叫做inode,即索引节点。

由于inode也是用来存储文件相关属性信息的,所以也会消耗硬盘空间。具体包含的信息有inode号,文件的字节数、User ID、Group ID、读、写、执行权限、时间戳(共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间)、链接数(软硬链接)、数据block的位置,注意没有文件名。

在硬盘格式化的时候,操作系统就会将硬盘分为两个区,即数据区和inode区。每个inode节点的大小一般为128B或者256B,inode的总数在格式化文件系统的时候就已经确定。

另外还有几个概念了解一下:

inode Bitmap:即inode位图,用二进制的方式记录了inode的使用情况, 比如inode是否空闲等。

Block Bitmap:即块位图,同Inode Bitmap,用二进制方式记录了块的使用情况。当查找或创建文件时,会扫描此位图来寻找空闲的inode号对应的块。

super block:超级块包含了该硬盘或分区上的文件系统的整体信息,如文件系统的大小等。

dentry:在内核中起到了连接不同的文件对象inode的作用,进而起到了维护文件系统目录树的作用。dentry是一个纯粹的内存结构,由文件系统在提供文件访问的过程中在内存中直接建立。dentry中包含了文件名,文件的inode号等信息。

下图为文件系统inode区block区图:

Linux下对inode和块的理解

文件的查找、创建、删除原理

接下来对文件的查找、创建、删除原理三个方面来对inode和块的理解。

文件的查找:比如要查找/var/log/message

文件的创建:比如要创建/backup/test.txt(前提backup目录存在)

文件的删除:删除/backup/test.txt

查找

Linux下对inode和块的理解
  1. 首先根目录(目录也是个文件,不是容器!也可以理解为路径的映射表)会自引用。找到inode表中对应的条目。(暂且把inode表中inode号和其对应的块信息成为条目)
  2. inode表中对应的信息指向根目录对应的块,其中有var目录对应的信息和inode号。
  3. 系统根据var目录inode号回头找到inode表中var目录其对应的条目。
  4. 根据var目录对应的块信息找到对应的块,其中有log目录对应的信息和inode号。
  5. 系统又根据log目录inode号在inode表中找到其对应的条目。
  6. 根据log目录对应的块信息找到对应的块,其中有messages文件。
  7. 根据messages文件的inode号在inode表中找到其对应的条目。
  8. 最后系统根据messages对应的条目信息告诉我们messages文件对应了多少的块,最后给我们呈现的就是所看到的数据。

创建

Linux下对inode和块的理解
  1. 首先扫描inode位图,找空闲的inode号,找到之后占用。
  2. 根目录自引用找到inode表中对应的条目,并根据条目找到对应的块。
  3. 依据根目录对应的块中backup目录对应的inode号,回头找到inode表中条目。
  4. inode表中条目又找到对应的块,在这个块的dentry中新建了一个文件test.txt。
  5. 然后在最开始扫描占用的inode号给到此test.txt文件。

当要存数据给test.txt文件时,会进行如下:

系统扫描块位图(加速查找磁盘空闲块,记录是否空闲等),找到空闲块,分配大于数据大小的块,最后再回收(避免磁盘碎片)。比如要创建10k大小的test.txt文件,一个块4k,只需要3个块,系统分配4个或者多于,最后再去把这多余的块分配到空闲块中等待使用。

删除

当要删除一个文件时,其实就是把其使用的block位图标记为空闲,inode位图的相关位置成空,相当于不被占用,系统就认为此文件删除。但是数据还在,在下次创建文件时,就可覆盖原已清空block位图和inode位图的文件的数据。

文件的本质只是将一些随机数据填充到原始文件的数据块中,使得恢复文件变得困难。

[En]

The essence of the file is only filled with some random data into the data block of the original file, making it difficult to recover the file.

以上

Original: https://www.cnblogs.com/saolv/p/13356879.html
Author: 扫驴
Title: Linux下对inode和块的理解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/10310/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • yum 安装报 关于Public key for *.rpm is not installed 的解决方法

    yum 安装 net-snmp的时候报错 [root@localhost backup]# yum -y install net-snmpLoaded plugins: faste…

    Linux 2022年8月30日
    0550
  • Redis快速度特性及为什么支持多线程及应用场景

    转载请注明出处: 1.Redis 访问速度快特性 正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能;Redis使用了…

    Linux 2022年9月14日
    0160
  • docker redis启动将配置文件挂载在数据卷(volume)中

    关键词 [     "linux",     "docker",     "volume",     "red…

    Linux 2022年9月14日
    0240
  • git 配置多用户和邮箱

    Git的用户信息配置Git的配置一共有三个级别:system(系统级)、global(用户级)和local(版本库)。system的配置整个系统只有一个,global的配置每个账户…

    Linux 2022年8月30日
    01600
  • JavaScript修改CSS属性的实例代码

    用JavaScript修改CSS属性 只有写原生的javascript了。 1.用JS修改标签的 class 属性值: class 属性是在标签上引用样式表的方法之一,它的值是一个…

    Linux 2022年8月20日
    0400
  • K8S容器环境下GitLab-CI和GItLab Runner 部署记录

    6)Gitlab Runner 配置使用 这里上传了一个测试项目gitlab-ci-k8s-demo-master,下面介绍:在gitlab项目里添加k8s集群(只要一个项目添加成…

    Linux 2022年8月30日
    0290
  • 【Linux】ubuntu 20无法打开终端的解决方法

    1、安装一个辅助终端xterm 由于系统自带的终端无法使用,为了方便接下来的操作,首先安装一个辅助终端xterm $ sudo apt install xterm 用softwar…

    Linux 2022年8月24日
    0330
  • Linux namespace系列文章

    骏马金龙 (博客已搬家:www.junmajinlong.com) 网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。爱研究、爱翻译、爱分享。特借此一亩三分田记录…

    Linux 2022年8月24日
    0330
  • redis的GEO实战 (RedisTemplate)

    geoadd 时间复杂度为O(log(N)) geoadd cityGeo 116.405285 39.904989 “北京”geoadd cityGeo …

    Linux 2022年9月14日
    0410
  • Git—git版本回退

    前言 前面已经简单的介绍了如何使用git,我们也知道每一次提交,都是属于一次版本,如果目前我们正在发布的版本有问题,想要回退,这个时候应该怎么做呢? git reset命令介绍 g…

    Linux 2022年8月30日
    0290
  • 006 Linux 命令三剑客之-grep

    01 一起来认识 grep! Linux 命令三剑客,sed、grep、awk。 sed:擅长数据修改。 grep:擅长数据查找定位。 awk:擅长数据切片,数据格式化,功能最复杂…

    Linux 2022年9月10日
    0250
  • Redis分布式锁的使用与实现原理

    模拟一个电商里面下单减库存的场景。1.首先在redis里加入商品库存数量。 2.新建一个Spring Boot项目,在pom里面引入相关的依赖。 <dependency&gt…

    Linux 2022年9月14日
    01140
  • 介绍一种使用poweshell 监控的方式

    本篇将使用PowerShell脚本对SQL Server 的关键指标进行监控. 以下,用数据库空间容量为例,实现一下逻辑: 一、建表 为每台服务器创建一个表,用于记录服务器各个数据…

    Linux 2022年9月14日
    0140
  • Linux 0.11源码阅读笔记-高速缓冲

    高速缓冲 概念 高速缓冲区是内存中的一块内存,在块设备与内核其它程序之间起着一个桥梁作用。内核程序如果需要访问块设备中的数据, 都需要经过高速缓冲区来间接的操作。 [En] The…

    Linux 2022年9月10日
    0190
  • github使用ssh

    背景 我想使用jekins+github自动化部署,奈何因为墙的原因拉不下来 听闻大佬们说 使用ssh可以破解此问题,所以试一下。 生成本地git证书 1、配置本地git帐户 gi…

    2022年8月30日
    0320
  • Linux SSH 连接不上

    http://blog.csdn.net/cryhelyxx/article/details/46473783 在xshell下用ssh登录远程主机centos出现以下问题: Co…

    Linux 2022年8月13日
    0310
  • Redis 持久化

    Redis 提供了一系列不同的持久性选项: RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。 AOF(Append Only File):AOF…

    Linux 2022年9月14日
    0210
  • Android7关机充电流程

    在学习SPI的时候,看到了某个rtc驱动中用到了 regmap,在学习了对应的原理以后,也记录一下如何使用。 在Linu 3.1开始,Linux引入了regmap来统一管理内核的I…

    Linux 2022年8月11日
    05860
  • sourcetree 绑定 github

    1、介绍 Git在开发中的重要性不用多说了。虽然几乎各种IDE都内置了Git。但是还是要推荐一下SourceTree。统一的来管理代码不用每个IDE的内置Git都要熟悉了。并且So…

    2022年8月30日
    0310
  • Windows Subsystem for Linux 允许在Windows 11中运行Linux系统

    微软的Windows Subsystem for Linux (WSL)是一套非常有趣的子系统,它基本上可以让你在Windows 11(或Windows 10)中轻松运行一个Lin…

    2022年8月11日
    0320
  • 写给自己看的Linux运维基础(三)Mono

    如果使用ubuntu,可使用apg-get安装完mono,xsp,mod_mono,我的yum源并没有找到mono可安装,网上也没找到CentOS的源,最后选择下载编译安装。 下载…

    Linux 2022年8月13日
    0450
  • git指令 小记-01

    commited(已提交) 已经保存在本地数据库 modified(已修改) 已修改某个文件,但是没有提交保存 staged(已暂存) 把已修改的文件放在下次提交时要保存的清单中 …

    Linux 2022年8月30日
    0210
  • Ubuntu 16.04安装Docker-CE

    系统环境 Ubuntu: 16.04 Docker: 17.09.0-ce 安装步骤 1.1、删除计算机中已有的docker版本,如果没装过就进行1.2步 1.2、安装linux-…

    Linux 2022年8月26日
    0440
  • yum如何查询某个命令是什么包安装的

    命令:yum whatprovides 命令的正则表达式举例如下: [root@localhost ceph]# yum whatprovides rbd Loaded plugi…

    Linux 2022年8月30日
    0360
  • 每日好书推荐:《Kali Linux渗透测试的艺术》PDF高清版

    Original: https://www.cnblogs.com/bnn86/p/15344056.htmlAuthor: 测试楠楠君Title: 每日好书推荐:《Kali Li…

    Linux 2022年9月10日
    0470
  • 一起来学习linux创建用户useradd命令

    linux创建用户useradd命令 一,adduser与useradd命令二者的关系 复制代码代码示例: [root@larrywen opt]# type adduseradd…

    Linux 2022年8月26日
    0260

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部