Linux下inode理解及软、硬链接初探

1、Inode是什么?

要理解inode,要从文件储存说起。

文件由元数据和数据构成。

文件储存在硬盘上,最小的存储单位叫做“扇区(Sector)”。每个扇区存储512字节。操作系统读取硬盘时,不会一个扇区一个扇区地读取,这样非常低效;而是一次性连续读取多个扇区,即一次性读取一个“块(block)”。“块”由多个扇区组成,常见的大小有1K、2K、4K等,其中4K较常见。

文件的数据都存储在块(block)中,那么文件的元数据(比如文件的创建者、创建日期、大小等信息)也需要找个空间存储。存储文件元数据信息的区域就叫做inode,中文译作“索引节点”。

在linux系统中,每个文件会分配到一个inode,可以将inode简单理解为指针,它永远指向文件的具体存储位置。系统是通过inode来定位每个文件的。

2、Inode包含的内容

Inode包含下面的信息:

* 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

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

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

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

* 文件数据block的位置

3、inode的大小

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

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

查看每个inode的大小:dumpe2fs –h /dev/sda1| grep “Inode size”

4、inode号码

      每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

5、目录文件:

在unix/linux系统中,目录也是一种文件。目录由一系列的目录项(dirent)组成,每个目录项由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

简单来说,目录是用来关键文件名与Inode number的。

6、那么在linux中,文件系统查找文件的过程是怎样的呢。

以查找/var/log/somefile文件为例:

       先查找/对应的inode号——>在对应inode表中找到/对应inode信息,通过该信息找到对应磁盘块——>在/磁盘块中找到var的inode号——>再到对应的inode表中找到var对应inode信息,获知其对应的磁盘块——>在var对应的磁盘块中找到log对应的inode号——>根据inode号找到log对应inode信息,找到对应的磁盘——>在log中找到somfile文件对应的inode号——>在inode表中找到somefile文件对应inode信息,查找到对应磁盘块——>再到somefile文件的磁盘块上获取文件的数据内容。至此,文件获取。

7、复制、移动和删除文件在inode上的表现

       复制文件:分配空闲的inode——>在inode table里创建条目——>在目录里创建文件和inode的对应关系——>将文件写入块

       移动文件:文件的移动分为两种情况。

              第一种:源文件和目标文件在同一文件系统/分区上。文件移动的实现方式是:在目标目录下创建目标文件名与inode的对应关系——>删除源目录下的源文件名与inode的对应关系。完成。Ctime会被改写。在此情况下,数据在磁盘上的位置没有移动。

              第二种:源文件与目标文件在不同的文件系统上。文件移动的实现方式是:

找到空闲的inode——>在inode下创建条目——>在目录下创建目标文件名和inode的对应关系——>将文件写入块——>同时源文件将被删除。Ctime会被改写,inode发生变化,数据在磁盘上的位置也相应地移动

       删除文件:

       删除文件的实质是减少inode的链接数,当链接数为0时,删除目录下文件名和inode的对应关系,将inode标记为可用。数据在块中并没有被移除,只是该块也被标记为可用,当有新数据写入并且需要用到该块时,该块上面的数据才会被覆盖。

8、软、硬链接的区别

8.1 什么是硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。

但是,Unix/Linux系统允许多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

       源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。

前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。

所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。

       硬链接创建方式:ln  源文件  链接文件

blob.png

8.2 什么是软链接

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。

软连接创建方式:ln –s 源文件 链接文件

    

blob.png

这是软链接与硬链接最大的不同:软链接指向文件的文件名,而不是文件的inode号码,文件的"链接数"不会因此发生变化。

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/26632

(0)
M20-1钟明波M20-1钟明波
上一篇 2016-07-29 15:23
下一篇 2016-07-29 15:23

相关推荐

  • Linux发展史

    Linux发展史 Linux是一套自由加开放源代码的类Unix操作系统,诞生于1991年10月5日(第一次正式向外公布),由芬兰学生Linus Torvalds和后来陆续加入的众多爱好者共同开发完成。 Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。 li…

    Linux干货 2017-05-20
  • 文本处理工具

    分页查看文件内容 less和more命令介绍 分页查看文件内容:less和more less:一页一页地查看文件或STDIN输出   # less FILE less的快捷键:     Ctrl+u:向上翻半屏     Ctrl+d:向下翻…

    Linux干货 2016-08-07
  • 变量、脚本、条件测试

    一、编程基础   程序:指令+数据  计算机:运行二进制指令 程序编程风格:  过程式:以指令为中心,数据服务于指令  对象式:以数据为中心,指令服务于数据shell程序:提供了编程能力,解释执行编程语言:  编译:高级语言–>编译器–>目标代码  解释:高级语言…

    Linux干货 2016-08-15
  • 加密·解密·PKI详解及如何创建私有CA

    加密解密技术基础: 安全的目标:   保密性:confidentiality 确保通信信息不被任何无关的人看到 完整性:integrity 实现通信双方的报文不会产生信息丢失 数据完整性 系统完整性 可用性:availability 通信任何一方产生的信息应当对授权实体可用 攻击类型:   威胁保密性的攻击:窃听、通信…

    2017-05-30
  • 系统日志和loganalyzer

    作为运维人员,熟悉系统日志是一项基本功。本文将介绍centos6的系统日志rsyslog及loganalyzer工具。 简介 系统日志:记录历史事件,通常都是按时间顺序将发生的事件予以记录,linux上的日志分为syslogd(系统进程相关日志)和klogd(内核事件日志) centos5:syslog    缺点:不能进行并行数据存储,…

    Linux干货 2016-03-20
  • Linux部分命令及使用

    Linux部分命令解释及使用 ASCII 信息交换码  GB2312 big5 UTF-8 字符集 乱码问题 生产环境中最常见故障  字符集格式设置不一致 查看系统版本  cat /etc/redhat-release  $() “&nb…

    2017-04-09