Linux 文件系统 -- inode 笔记
什么是 inode
inode 的定义:Unix 文件系统中的一种数据结构,用来存储文件的元信息数据
文件在硬盘中的存储是以"块"(block)为单位的,常见的块大小是 4k
一个稍微大一点的文件则会存储在多个块中,那么如何快速访问到这些数据呢?答案就是 inode
在文件系统中,每个文件对象都对应着一个 inode,其中存储着常用的一些信息(所有者、创建时间、修改时间、文件权限、对应文件对象在系统中存储块的位置等等)
操作系统访问一个文件时分为三个步骤:
- 通过文件名找到对应的 inode 编号
- 通过 inode 编号访问对应文件对象的元信息
- 根据元信息找到文件对应的 block,读取数据
从上面的描述可以看出,inode 实际上就是文件系统中的一种索引,便于管理文件以及快速访问数据
关于 inode 的一些细节
inode 的内容
POSIX 标准定义了 inode 所包含的信息:
- 以字节为单位表示的文件大小
- 设备ID,标识容纳该文件的设备
- 文件所有者的 User ID
- 文件的 Group ID
- 文件的模式(mode),确定了文件的类型,以及它的所有者、它的 group、其它用户访问此文件的权限
- 额外的系统与用户标志(flag),用来保护该文件
- 3 个时间戳,记录了 inode 自身被修改(ctime, inode change time)、文件内容被修改(mtime, modification time)、最后一次访问(atime, access time)的时间
- 1 个链接数,表示有多少个硬链接指向此inode
- 指向文件系统存储位置的指针
使用 stat 命令可以查询一个文件的 inode 编号及对应的文件元信息:

inode 的存储
inode 存储文件对象的元信息,也会占用一部分磁盘空间
当文件系统创建(格式化)时,会把存储区域分为两大连续的区域,其中一个用来保存 inode,称为 inode table,每个 inode 默认 128 or 256 字节
另一块区域则用来保存文件的数据块
从这里可以看出,一个文件系统中 inode 的数量在初始化时确定了,inode 的数量和磁盘大小成正比
查看每个硬盘分区的 inode 总数和已经使用的数量,可以使用 df 命令:

由于每个文件都会对应一个 inode,当磁盘中存在大量小文件时,就可能出现磁盘空间有空闲但是 inode 用完的情况
例如一个电子邮件服务器可能会存在大量 eml 文件使磁盘 inode 耗尽,无法入信新邮件
所以一般大型的邮件系统都会设计自己的文件系统来存储邮件数据,如使用信桶(mbox)文件结构来存储单个用户的所有邮件数据
目录文件、硬链接和软链接
Linux 中一切皆文件,目录也是文件的一种,每个目录项包含两部分:目录中所有文件的文件名、所有文件名对应的 inode 编号
使用 ls -i 命令查看目录的内容:

如果想要查看该目录下文件的详细信息,那么就需要根据每个文件的 inode 编号,找到对应的 inode 访问元信息:

上述 inode 中包含的信息中,可以发现并不存在文件名这一信息,实际上在 Unix 环境下,一个文件对象可以对应多个文件名,即硬链接(hard link)
使用 ln 命令可以创建硬链接:
ln 源文件 目标文件

上图中 f1.txt f2.txt 都指向同一个 inode,修改其中一个文件内容会影响到另一个
从 inode 内容中可以发现有一个链接数,当我们创建了一个硬链接时,所对应的文件的 inode 中链接数就会 +1,表示其对应的文件名(引用计数)+1
同理,当删除一个文件后,该链接数将 -1,链接数为 0 时文件数据就被完全清除了
与硬链接对应的还有软链接,使用 ln -s 命令可以创建软链接:
ln -s 源文文件或目录 目标文件或目录

软链接和硬链接的区别在于,软链接指向其链接的文件名,而不是 inode,一个软链接有自己的 inode
删除其指向的文件后,该软链接则不可访问(No such file or directory)
这里的设计类似于 C++ 中指针和引用,硬链接可以类比为引用,而软链接则是指针,其中保存着文件名(访问文件数据的地址)
而 inode 链接数则和智能指针的引用计数设计思路相似,不得不说计算机系统中很多设计都有共通性
inode 的其他作用
由于硬链接的存在,文件名和 inode 是多对一的关系,操作系统打开一个文件后就抛弃了文件名,只保留 inode 编号来访问文件内容
库函数 getcwd() 的实现,就是从当前工作目录的 inode 逐级查找上级目录的 inode,最后拼出完整的绝对路径
inode 的设计,使得在操作系统中安装/更换新的库文件十分方便
当一些进程还在使用库时,其他进程可以替换该库文件 inode 编号指向新创建的 inode,后面对该库的访问都被引导至新库文件的内容,减少了替换库时重启系统的必要
由于旧的 inode 中链接数已经为 0,在使用旧库的进程结束后,旧的 inode 和旧库文件将被文件系统自动回收
参考文献
理解inode -- 阮一峰的网络日志
inode -- wikipedia
Linux 文件系统 -- inode 笔记的更多相关文章
- # linux文件系统(inode block superblock)
先说一下格式化:每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区格式化,以成为操作系统能够利用的文件系统格式.linux的文件格式为Ext2/Ext3,现在好像 ...
- Linux文件系统inode、block解释权限(三)
利用文件系统的inode和block来分析文件(目录)的权限问题. 为什么读取一个文件还要看该文件路径所有目录的权限? 为什么目录的w权限具有删除文件的能力,而文件w权限不行. inode:记录文件的 ...
- Linux文件系统学习笔记-1
在Linux中, 一切皆文件,不论是目录,设备,套接字等都可以看成文件,而且每一个文件对应一个inode号,这是一一对应的关系. [root@oracle ~]# ls -il 总用量 2624 ...
- linux 文件系统(inode和block)
linux文件系统(inode block superblock) 先说一下格式化:每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区格式化,以成为操作系统能 ...
- [apue] linux 文件系统那些事儿
前言 说到 linux 的文件系统,好多人第一印象是 ext2/ext3/ext4 等具体的文件系统,本文不涉及这些,因为研究具体的文件系统难免会陷入细节,甚至拉大段的源码做分析,反而不能从宏观的角度 ...
- Linux文件系统与inode、Block笔记
Linux文件系统与inode.Block笔记 在Linux下一切都是文件,无论是设备还是接口,亦或是网卡等均被抽象成了文件,并且有相关的内核代码进行调度.然而,在一切都是文件的前提下,最需要进行探讨 ...
- 理解Linux文件系统之inode
很少转发别人的文章,但是这篇写的太好了. 理解inode 作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...
- [转]理解Linux文件系统之inode
很少转发别人的文章,但是这篇写的太好了. 理解inode 作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...
- 学习笔记:CentOS7学习之十四:linux文件系统
目录 1. 机械硬盘结构 1.1 机械硬盘结构 1.2 簇和block 2.文件系统结构 2.1 文件名 2.2 inode的内容 2.3 inode的大小 2.4 目录文件 2.5 block块大小 ...
随机推荐
- part11-LED驱动程序设计-part11.1-字符设备控制
- @bzoj - 4381@ [POI2015] Odwiedziny
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,树上每条边的长度都为 1 ,第 i 个点 ...
- HZOJ 大佬(kat)
及其水水水的假期望(然而我已经被期望吓怕了……). 数据范围及其沙雕导致丢掉5分…… 因为其实每天的期望是一样的,考虑分开. f[i][j]表示做k道题,难度最大为j的概率. 则f[i][j]=(f[ ...
- Android ListView批量选择(全选、反选、全不选)
APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据.这就要求ListVIew支持批量选择.全选.单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢? ...
- 独家 | TensorFlow 2.0将把Eager Execution变为默认执行模式,你该转向动态计算图了
机器之心报道 作者:邱陆陆 8 月中旬,谷歌大脑成员 Martin Wicke 在一封公开邮件中宣布,新版本开源框架——TensorFlow 2.0 预览版将在年底之前正式发布.今日,在上海谷歌开发者 ...
- 【codeforces 520B】Two Buttons
[题目链接]:http://codeforces.com/contest/520/problem/B [题意] 给你一个数n; 对它进行乘2操作,或者是-1操作; 然后问你到达m需要的步骤数; [题解 ...
- Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合
复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...
- [转]Spring历史版本变迁和如今的生态帝国
前两篇: 为什么要有Spring? 为什么要有Spring AOP? 前两篇从Web开发史的角度介绍了我们在开发的时候遇到的一个个坑,然后一步步衍生出Spring Ioc和Spring AOP的概念雏 ...
- java 集合之HashMap的三种遍历
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. 这周我们只需记住三种遍历方法 1.通过keySet()获取键,再利用hashmap里面的.get(key)方法通过键获取 ...
- H3C 路由表查找规则(3)