linux 在整个架构上可以看作是三层:

1.底层代码, (引导层strip) 跟硬件沟通的那一层的代码(可能是汇编+c), 驱动底层的;

strain: n./v. 拉紧, 张力, 气质, 风格, 乐曲(这个词的意思很多): 

  1. 中间层代码, OS层,用来管理文件系统,内存,作业调度等. 里面的实现包括很多文件,或 各种各样的数据结构, 数据库等等,

    (数据库也是由分散的文件构成的吧), 其中inode等等就是在这里支撑用户接触层的东东

  2. 表现层代码, 就是我们所看到的, 我们所接触的那些东西, 包括目录结构, 文件等等.


linux内核用 数字 管理文件系统, 内存, 进程等等, 是为了 方便, 简洁. 因为文件名称, 进程名称是很长很多 很占字节的东西, 让内核

去接触这些东西, 很累! 通过这些 实体的编号, id来管理它们就 撇脱 多了.

进程 通过 pid 来管理, 进程名称是pid的别名;

文件 通过 inode来管理, 文件名称是inode的别名;


inode的读法:

i-node : [ai ' n2ud]: i: 可以认为是id, identifier , 所以读成: [ai] , node是节点, 代表着对应文件的实体.


参考这篇关于inode的文章

linux上的inode编号是索引节点的编号。理解inode,要从文件储存说起。

  文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

** (如果把硬盘当作 一把称, 就是说, 它的最小刻度, 最小能够称出的重量 , 最大精度, 最多能够称出的, "只能打得起...多重?")

这种由多个扇区组成的"块",是文件存取的最小单位。所以 即使文件内容只有1个byte

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,(需要折中, 在效率和磁盘利用率的矛盾上折中!) 最常见的是4KB,即连续八个 sector组成一个 block。

  文件数据都储存在"块"中,那么很显然,还必须找到一个地方储存文件的元信息(metadata, 就是文件的"属性, 描述信息"!) ,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。(区域叫inode, 区域的编号叫inode 编号, inode号码)!

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。 对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:

首先,系统找到这个文件名对应的inode号码;(对应的文件或数据库表: 比如叫做: "文件名-inode表")

其次,通过inode号码,获取inode信息;

最后,根据inode信息,找到文件数据所在的block,读出数据。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

stat example.txt

三、inode的大小

  inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

  每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

  查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

  代码如下:

  df -i

  查看每个inode节点的大小,可以用如下命令:

  代码如下:

  sudo dumpe2fs -h /dev/hda | grep “Inode size”

  由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

使用ls -i命令,可以看到文件名对应的inode号码:

ls -i example.txt

----------------------------------------- 什么叫dirent?

LINUX系统下的一个头文件,在这个目录下/usr/include

为了获取某文件夹目录内容,所使用的结构体。

引用头文件#include<dirent.h>

结构体说明

编辑

struct dirent

{

long d_ino; /* inode number 索引节点号 / inode: 表示区域, inode number才是节点号.

off_t d_off; /
offset to this dirent 在目录文件中的偏移 /

unsigned short d_reclen; /
length of this d_name 文件名长 /

unsigned char d_type; /
the type of d_name 文件类型 /

char d_name [NAME_MAX+1]; /
file name (null-terminated) 文件名,最长256字符 */

}

五、目录文件

  Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

  目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

  ls命令只列出目录文件中的所有文件名:

  代码如下:

  ls /etc

  ls -i命令列出整个目录文件,即文件名和inode号码:

  代码如下:

  ls -i /etc

  如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

  代码如下:

  ls -l /etc

----------------------------------- 软链接和硬链接?

目的: 都是为了使用的方便. (如同一个人, 可以有多个名字, 父母叫的乳名, 长辈叫的小名, 同事叫的书名, 下属叫的尊称等等)

表现: 都是多个名字对应着同一个inode. inode: 文件名 = 1:N 是1对多的关系!

语法: ln 源文件 目标文件.

ln -s 源文件或目录名 目标文件或目录

	<< 根据 源和目标, 就可以确定 哪个是依赖, 那个是被依赖..  "源文件" 是最开始最根本被依赖的东西!)
源文件就是 原始 文件>>

区别: 硬链接, 各个文件的内容都相同! 都是真正的file data! 彼此之间的地位是相同的, 没有依赖性, 删除一个, 不影响另一个!

硬链接的主要目的是: 为了防止对重要文件的"误删". 有些 : "类似" 复制备份, 但是不是复制 备份!

硬链接的限制: 只能对文件, 不能对目录 ! 创建硬链接; 只能在同一分区内创建...

	软链接,  两个文件的内容不同.  ln -s  A  B,  就是 A文件是源文件, B依赖A,  A是源, B是目标文件,
A是包含真正的内容, B的内容是A的路径, 对B的访问将跳转到对A的访问. 也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。 这就允许符号链接(经常简写为symlinks)指向位于其他分区、甚至是其他网络硬盘上的某个文件

----------------------------------------------------------软链接和硬链接? (完)

八、inode的特殊作用

  由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

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

  九、实际问题

  在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

  查找原因:

  /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

  解决方案:

  1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。

  2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:

  ln -s /opt/newcache /data/cache

,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。

真正理解linux的inode?的更多相关文章

  1. 理解linux and inode

    inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念 ...

  2. Linux的inode的理解 [转]

    Linux的inode的理解 [转] 一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存51 ...

  3. 理解Linux文件系统之inode

    很少转发别人的文章,但是这篇写的太好了. 理解inode   作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...

  4. [转]理解Linux文件系统之inode

    很少转发别人的文章,但是这篇写的太好了. 理解inode   作者: 阮一峰 inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础. 我觉得,理解inode,不仅有助于提高系统 ...

  5. linux中inode、软链接、硬链接

    1 软链接 linux中软链接理解成window中的快捷方式.创建软链接的命令 ln -s 源文文件或目录 目标文件或目录 2 硬链接 创建硬链接的命令如下 ln  源文文件或目录 目标文件或目录 3 ...

  6. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  7. 深入理解Linux内存分配

    深入理解Linux内存分配 为了写一个用户层程序,你也许会声明一个全局变量,这个全局变量可能是一个int类型也可能是一个数组,而声明之后你有可能会先初始化它,也有可能放在之后用到它的时候再初始化.除此 ...

  8. 深入理解linux系统下proc文件系统内容

    深入理解linux系统下proc文件系统内容 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它 ...

  9. 深入理解linux关闭文件和删除文件

    背景介绍 最近看了linux系统编程(linux system programming)一书,结合深入理解linux内核(understanding the linux kernel)一书,深入理解了 ...

随机推荐

  1. 操蛋的CTex

    我一向是不屑于在windows下用latex的,看起来不伦不类,是geek就不要用windows,图方便就用word而不是latex.但是台式机上的fedora无法上网,那就委屈一下在windows1 ...

  2. Nuget包里的依赖包更新到最新版本会不会随主包回滚到旧包的研究

    A包中有几个依赖包:A-1包,版本:>=1.0:但是我项目上已经引用了A-1包的2.0版本,那么我添加A包的时候,不会将A-1包2.0版本改成1.0版本,会直接用2.0版本的.

  3. phpMyadmin /scripts/setup.php Execute Arbitrary PHP Code Via unserialize Vul Object Injection PMASA-2010-4

    目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对这个漏洞简单的概括如下 . "/scripts/setup.php&q ...

  4. Code笔记之:CSS块级元素、内联元素概念

    文档流 将窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流. 每个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端. 若当前行容不下, 则另起新行再浮动. 内联元素也不 ...

  5. MySQL学习笔记——增删改查

    有关数据库的DML操作 -insert into -delete.truncate -update -select -条件查询 -查询排序 -聚合函数 -分组查询 DROP.TRUNCATE.DELE ...

  6. JavaWeb学习笔记——开发动态WEB资源(六)ServletConfig和ServletContext

    1.只有在第一次请求服务器产生实例的时候才会调用init()方法,有一种办法能在服务器一启动的时候就加载init()方法. 即服务器启动即加载Servlet,且按数字大小顺序实例化Servlet. 方 ...

  7. C++ typedef用法小结 (※不能不看※)

    C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不 ...

  8. C#----操作应用程序配置文件App.config

    对配置文件的一些疑问: 在应用程序的目录下,有两处值得注意的地方,一个是应用程序根目录下的App.config文件,和bin\debug\name.exe.config 或者 bin\Release\ ...

  9. css教程

    网址:http://www.aa25.cn/layout/index.shtml

  10. Tween + 缓动函数

    Unity-Tween http://www.cnblogs.com/MrZivChu/p/UnityTween.html iTween: iTween大解构(一)之抛物线移动 http://blog ...