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
inode结构如上图一
inode的元数据存储方式类似于人类的记忆方法--记忆宫殿:
1、当存储的元数据不是很大时,恰好在 12个直接块指针 的容量范围内,就讲源数据存储在12个直接块指针中;
2、当存储的原数据大小超过 12个直接块指针 的容量时,则启用第13个块 间接块指针 :次块作为存放多个指针目录的块,每个指针目录都指向下一个块,下一个块便是存放原数据的块. 双重间接块指针以及三重块指针 等工作原理都是如此.
人是通过文件名来引用一个文件,而文件引用是通过一个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号可拥有多个有效路径.如下图:
对于重要文件而言,创建硬链接是必要的.因为当修改源文件是,对应的硬链接文件也会随之修改;当删除原文件是,对应的硬链接文件不会受影响.也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除.(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;
删除源文件,对应的软链接文件无法使用;删除软链接文件,源文件还可以使用;
可以跨越驱动器 或者 不在 同一分区下 创建;
路径--原始文件相对路径:相对于软连接文件路径,而不是相对于当前工作目录