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

linux下inode节点理解

1、理解inode还要从文件存储说起计算机中在磁盘上面存储数据的,磁盘上是一“扇区”为基本单位的,一个扇区的大小在512字节左右(相当于0.5k);但是为了效率计算机一般一次不会只读取一个扇区而是一性连续读取多个扇区,即一次读取一个“块”。“块”是文件存储的最小单位,一般“块”的大小就是4kB,即连续的8个“扇区”组成一个“块”。文件存储在“块”中,但是在存储文件的同时还要存储文件的“元信息”,元信息:”文件创建者、文件的创建日期、文件的大小等;而存储文件元信息的区域叫“inode”节点、也叫“索引节点”。
2、inode节点

  • 文件字节数(文件大小)
  • 文件拥有者User ID
  • 文件所属组Group ID
  • 文件的读.写.执行权限
  • 文件的时间戳:ctime指inode上一次变动时间,mtime指文件内容上一次变动时间,atime指文件上一次打开时间
  • 链接数(多少个文件名指向这个inode节点)
  • 文件数据block的位置

利用stat命令,查看某个文件的inode信息:
在这里插入图片描述
除了文件名以外的所有文件信息,都存在inode节点之中;
3、inode的大小
inode也会消耗硬盘空间,所以在外面格式化硬盘时,操作系统会自动将硬盘分成两个区域。一个是数据区,存放文件数据;另外一个是inode区(inode table),存放inode所包含的信息;
每一个inode节点的大小一般是128或者是256字节。inode节点总数在格式化时就一定给定了,一般是1KB或者2KB及设置一个inode节点,假设1GB硬盘,每一个1KB就设置一个inode,那么inode table的大小就会达到128MB,占整个硬盘12.8%。
可以产看每一个硬盘分区的inode总数和已经使用的数量,使用df命令:
在这里插入图片描述
查看每一个inode节点的大小,用 sudo dumpe2fs -h /dev/hda | grep “Inode size”
由于每一个文件必须有一个inode节点,因此可能出现inode已经用光,但是硬盘还没有存满的情况。这时,就无法在硬盘上面创建文件
4、inode号码
每一个inode节点都有一个号码,操作系统用inode号码来识别不同的文件。
注意:Unix和linux系统内部都不使用文件名,而使用inode号码来识别文件。对于系统来说文件名只是inode号码便于识别的别称或者是绰号。
表面上用户通过文件名打开文件。实际上系统内部这个过程分为三步:首先系统找到文件名对应的inode号码;其次通过inode号码,获取inode信息;最后根据inode信息,找到文件所造的“块”Block;读出数据;
使用 ls -i 命令查看文件的inode号码:
在这里插入图片描述
5、目录文件
Unix和linux系统中,目录(director)也是一种文件,打开目录,其实就是打开目录文件。
目录文件的结构非常简单,及时一系列目录项(dirent)的列表。每一个目录项,有两部分组成:所包含文件文件名、以及文件名对应的inode号码。
ls 命令只是列出目录文件中的所有文件名:
在这里插入图片描述
ls -i命令列出目录文件的全部内容,即文件名+inode号码:
在这里插入图片描述
如果想要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。
ls -l命令就是列出文件的详细信息:
在这里插入图片描述
同理可以理解一下目录的权限。目录文件的读权限®、写权限(w)都是针对目录文件本身。由于目录文件内面只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取去他信息,因为其他信息都存储在inode节点中,而读取inode节点中的信息需要目录文件的执行权限(x)。
6、硬链接
一般情况下,文件名和inode号码都是“一一对应”关系,每一个inode号码对应一个文件名。但是,Unix/linux系统允许,多个文件名指向同一个inode号码。 这也就意味着可以用不同的文件名访问相同的文件内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不会影响另一个文件名的访问。这种情况就叫“硬链接”。
ln命令可以创建硬链接:
在这里插入图片描述
运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。
反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
“链接数”:创建目录时,默认会生成两个目录项:“.”和“…”。前者的inode号码就是当前目录的inode号码,等同于当前目录的“硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等于父目录的“硬链接”。一个目录的“硬链接”数总是等于2加上它的子目录总数(含隐藏目录)。
7、软连接
除了硬链接还有一种特殊情况:文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此无论打开那一个文件,最后读取的文件收都是B。这时文件A就叫做文件B的“软连接”。
这就意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软连接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码。
ln -s命令可以创建软连接:
在这里插入图片描述
8、inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/linux系统特有的现象:
1.
有时,文件名包含特殊字符,无法正常删除。这是,直接删除inode节点,就可以删除文件。
2.
移动文件或是重命名文件,只是改变文件名,不会改变inode号码。
3.
打开一个文件后,系统就以inode节点号码来识别这个文件,不在考虑文件名。因此系统无法通过inode号码获取文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

相关文章:

  • C语言函数
  • C语言数组
  • C语言表达式
  • C语言初识指针
  • C语言结构体
  • C语言深度剖析数据在内存中的存储
  • 深入了解指针
  • 字符串函数(认识 + 实现)
  • C语言内存函数(认识 + 实现)
  • 内存对齐和位段
  • 枚举和联合
  • 线性表,顺序表,链表,数组的区别与联系
  • c++实现顺序表
  • c++模拟实现单链表
  • c++模拟实现带头循环双向链表
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 2017前端实习生面试总结
  • JavaScript 一些 DOM 的知识点
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • maya建模与骨骼动画快速实现人工鱼
  • NSTimer学习笔记
  • Octave 入门
  • Solarized Scheme
  • vue--为什么data属性必须是一个函数
  • 规范化安全开发 KOA 手脚架
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 前端自动化解决方案
  • 强力优化Rancher k8s中国区的使用体验
  • 在Unity中实现一个简单的消息管理器
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #{}和${}的区别?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (06)Hive——正则表达式
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)STL算法之遍历容器
  • (3)选择元素——(17)练习(Exercises)
  • (33)STM32——485实验笔记
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (黑马C++)L06 重载与继承
  • (九)信息融合方式简介
  • (十六)一篇文章学会Java的常用API
  • (一)UDP基本编程步骤
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)我也是一只IT小小鸟
  • (轉)JSON.stringify 语法实例讲解
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ****Linux下Mysql的安装和配置
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET BackgroundWorker
  • .NET DataGridView数据绑定说明
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net IE10 _doPostBack 未定义