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

相关推荐

  • 马哥网络教育班21期+第一周博客作业

    1、描述计算机的组成及其功能。   硬件:     CPU(运算器、控制器、一缓存(L1)、二级缓存(L2)):       运算器主要用来进行算数运算以及逻辑运算。       控制器主要是用来协调       一级缓存和二级缓存主要是用…

    Linux干货 2016-07-12
  • 运维学习笔记-看看别人家的Puppet代码

    这篇博客的目的是通过分析Forge上的Puppet模块来加深一些概念的理解,同时了解一些常用用法。 今天的例子是jfryman-nginx模块,它是原puppetlabs-nginx模块的升级版本,依赖3个Puppet公共模块:puppetlabs-apt,puppetlabs-stdlib和puppetlabs-concat。安装非常方便,puppet m…

    Linux干货 2016-06-23
  • 磁盘配额、Raid及逻辑卷LVS

    磁盘配额、Raid及逻辑卷LVS 磁盘配额 Linux是多用户的操作系统,同一时间可能有多个用户登录到系统上进行操作,某些用户可能会写入很多数据,占用大量磁盘空间,导致其他用户没有磁盘空间可用。如何限定某个用户对磁盘的使用空间大小,以及可使用的inode多少,也就是限定可创建多少个文件,这就是磁盘配额管理的作用。 磁盘配额特点 在内核中执行; 以文件系统为单…

    Linux干货 2016-09-19
  • Linux批量创建用户、passwd、shadow、组管理、group、gshadow、默认配置文件login.defs、切换用户su、提升权限(一)

    Linux批量创建用户、passwd、shadow、组管理、group、gshadow、默认配置文件login.defs、切换用户su、提升权限 在Linux中用户运行某个程序时,该程序的权限属于当前用户,进程所能够访问资源的权限取决于进程的运行者的身份。如果用户的id号为0,即使不叫root,他也是管理员;就算名字叫root它也可能是普通用户。当有多个不同…

    Linux干货 2016-08-03
  • rsync+inotify实时同步备份数据

    rsync同步 rsync+inotify实时同步备份数据 软件简介: rsync命令简介: rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大…

    Linux干货 2016-10-28
  • 集群-基础知识(1)

    背景 随着互联网访问量的急剧增加,单台服务器的能力已严重不能满足需求。则需要从两个方面考虑提高服务能力:1、向上扩展,2、向外扩展 向上扩展的缺点: 1、造价高 2、随着性能的提高,会在某个临界点遇到瓶颈,导致性能随后降低。 向外扩展的优点: 1、造价低 2、提供高并发能力和高可用性 3、可扩展性好。 分类 负载均衡集群(Load Balance) 高可用集…

    Linux干货 2015-11-26