Linux索引节点以及链接

  在学习Linux中,索引节点以及链接概念都是一个既简单又重要的基础概念,一下是我学习这两个概念的总结,在此分享给大家,如有不当之处,敬请各位大神留言提醒,谢谢!


1.0  Linux索引节点

   

   在Linux文件系统中,不管什么类型的文件,保存在磁盘分区中,系统都会给它分配一个编号,称为索引节点index node。在Linux中,存在多个文件指向同一个inode,这种情况一般称为硬链接【hard link】.

   一个索引节点(inode)是在一个表项,包含有关文件的信息(元数据),包括:文件类型,权限,UID,GID,硬链接数(指向这个文件路径名称个数),该文件的大小和不同的时间戳,指向磁盘上文件的数据块指针,有关文件的其他数据. 可用 stat 命令查看

[root@localhost testdir]# stat filename
  File: ‘filename’
  Size: 38       Blocks: 8     IO Block: 4096   regular file
Device: 805h/2053d	Inode: 134         Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  0/  root)   Gid: (  0/  root)
Context: unconfined_u:object_r:etc_runtime_t:s0
Access: 2016-07-24 21:54:56.948084045 -0400
Modify: 2016-07-24 21:53:30.720370973 -0400
Change: 2016-07-24 21:54:37.683701323 -0400
 Birth: -
[root@localhost testdir]#

上述显示文件名(File)为: filename ; 

    大小(Size) : 38 字节 (一般情况下显示为字节,若想直观查看文件大小,用命令`ll -h filename`) ; 

    块数量(Blocks) : 8 ; 

    单块IO设备块大小 (IO Blocks) 4096 字节 ; 

    文件类型 : rugular file(普通文件) ; 

    索引节点(inode) : 134 ;

    硬链接数(Link) : 1 ; 

    权限(Access) : (0755/-rwxr-xr-x) ; 

    Uid & Gid : ( 0/  root)  &  (  0/  root) ; 

    三个时间戳 : Access: 2016-07-24 21:54:56.948084045 -0400

           Modify: 2016-07-24 21:53:30.720370973 -0400

              Change: 2016-07-24 21:54:37.683701323 -0400


    

Linux索引节点以及链接_第1张图片


inode结构如上图一

inode的元数据存储方式类似于人类的记忆方法--记忆宫殿:

    1、当存储的元数据不是很大时,恰好在 12个直接块指针 的容量范围内,就讲源数据存储在12个直接块指针中;

    2、当存储的原数据大小超过 12个直接块指针 的容量时,则启用第13个块 间接块指针 :次块作为存放多个指针目录的块,每个指针目录都指向下一个块,下一个块便是存放原数据的块. 双重间接块指针以及三重块指针 等工作原理都是如此.

   

   Linux索引节点以及链接_第2张图片   人是通过文件名来引用一个文件,而文件引用是通过一个inode号,所以一个目录是目录下的文件名和文件inode号之间的映射.如上图.


1.2 cp rm 与inode关系


1.2.1  cp和inode

    CP 命令:

    分配一个空闲的inode号,在inode表中生成新条目

    在目录中创建一个目录项,将名称与inode编号关联

    拷贝数据生成新的文件

  

1.2.2 rm和inode

    rm 命令:

    链接数递减,从而释放的inode号可以被重用

    把数据块放在空闲列表中

    删除目录项

    数据实际上不会马上被删除,但当另一个文件使用数据块

    时将被覆盖。


1.2.3  mv和inode

    如果mv命令的目标和源在相同的文件系统,作为mv 命令

    用新的文件名创建对应新的目录项

    删除旧目录条目对应的旧的文件名

    不影响inode表(除时间戳)或磁盘上的数据位置:没有

    数据被移动!

    如果目标和源在一个不同的文件系统, mv相当于cp和rm



2.0  Linux链接


 在Linux系统中,Linux链接分为两种:硬链接(hardlink) 和 软链接(symbolic link)


2.1 硬链接(hard link)


  在Linux文件系统中,不管什么文件保存在磁盘中,系统都会自动分配一个inode号,多个文件名指向同一个inode号是存在的,而这种行为叫 硬链接(hard link).

  硬链接的作用是一个inode号可拥有多个有效路径.如下图:

Linux索引节点以及链接_第3张图片   对于重要文件而言,创建硬链接是必要的.因为当修改源文件是,对应的硬链接文件也会随之修改;当删除原文件是,对应的硬链接文件不会受影响.也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除.(ll -i filename 可查看文件filename  inode号)

[root@localhost testdir]# ll -i ./hard1 ./hard.link 
7304 -rw-r--r--. 2 root root 0 Jul 29 04:43 ./hard1
7304 -rw-r--r--. 2 root root 0 Jul 29 04:43 ./hard.link
[root@localhost testdir]# echo test > ./hard.link 
[root@localhost testdir]# cat ./hard1
test
[root@localhost testdir]# rm -f ./hard.link 
[root@localhost testdir]# cat ./hard1
test

   要注意的是,硬链接是对应于同一文件系统上一个物理文件,所以创建硬链接是必须要在 同一分区下 或者 不能跨越驱动器 ,否则无法进行.

   在删除文件时:

    rm命令递减计数的链接

    文件要存在,至少有一个连接数

    当链接数为零时,该文件被删除


2.1 软链接(SymbolicLink) ln -s 原始文件路径 软链接

  另外一种连接称之为符号连接(SymbolicLink),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

 软链接文件与硬链接文件有所不同:

    不共用源文件inode;

    删除源文件,对应的软链接文件无法使用;删除软链接文件,源文件还可以使用;

    可以跨越驱动器 或者 不在 同一分区下 创建;


路径--原始文件相对路径:相对于软连接文件路径,而不是相对于当前工作目录