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
下一篇 2016-07-29

相关推荐

  • lamp安装配置详细过程(把以前的笔记贴上来)

    准备; 首先进入/usr/local/目录 #cd /usr/local 删除所有安装过的php mysql apache 以及libxml 首先查看目前 /usr/local目录下面的内容 #ls –l 如果看到php5 php apache2 apache mysql mysql5 libxml libxml2字样的目录都将其删除具体命令如下 #rm –…

    Linux干货 2015-05-01
  • 推荐-自动化运维之puppet小试牛刀

     一、puppet介绍       puppet是IT基础设施自动化管理工具,“她”能够帮助系统管理员管理基础设施的整个生命周期:供应(provisioning、配置(configuration)、联动(orchestration)及报告(reporting)。    …

    Linux干货 2016-04-05
  • 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象…

    Linux干货 2015-07-20
  • MySQL/MariaDB DML操作之Select

    前言 上文我们已经讲解了MySQL/MariaDB的基础知识和DDL相关操作,接下来我们来说一下MySQL/MariaDB的DML操作,因select查询较复杂也较重要,所以本文主要是对select查询的详解。 DML操作 DML之select 投影查询 select col_name,[col_name1,…] from …

    Linux干货 2015-05-07
  • Week5 grep和find命令及正则表达式练习

    1、显示当前系统上root、fedora或user1用户的默认shell;   cat /etc/passwd  | grep -E "^\<root\>|^\<fedora\>|^\<\user1\>" |&nb…

    Linux干货 2017-02-14
  • mogilefs部署

    mogilefs实验环境: 1.需要两台tracker主机 2.一台mariadb 3.nginx_mogilefs_module模块要编译安装 在tracker主机: 1.上下载rpm包 mkdir mogilefs/ cd mogilefs lftp 172.16.0.1 get MogileFS-Server-2.46-2.el7.centos.noa…

    Linux干货 2017-08-08