inode、软链接与硬链接

什么是inode?

​ 理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

​ 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在"块"中

​ 那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

inode的内容(inode是一个结构体)

我们可以通过stat指令查看一个文件的inode信息

在这里插入图片描述

inode中的内容:

  • 文件的字节数,块数
  • 文件的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳,共有三个:ctime、mtime、atime
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置
  • inode编号(对应数组的下标)

block区和inode区的理解

​ 硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区(block区),存放文件数据;另一个是inode区,存放inode所包含的信息。inode区是以数组的形式存储的,对应的数组下标就是inode编码,每个元素就是一个结构体(结构体内容在上面已说),inode结构体中会有一个指针,指向block区也就是存放的文件内容。
​ 我们可以通过指令df查看每个硬盘分区的inode总数和已经使用的数量.

在这里插入图片描述

inode编号

inode编号是很重要的,当系统在找一个文件时,步骤如下:

  • 通过文件名先找到文件的inode编号
  • 通过inode编号找到文件inode信息
  • 通过inode信息中的block指针找到文件内容

我们可以通过ls -i查看文件的inode编号

软链接与硬链接

  在linux系统中,硬链接 (hard link) 和软链接 (symbolic link) 是两个非常重要的概念

  可以用ln命令建立硬链接,加上-s选项建立软链接

luzelin@DESKTOP-5VT4IIQ Link % touch source                                                                 
luzelin@DESKTOP-5VT4IIQ Link % ln -s source S1                                                               
luzelin@DESKTOP-5VT4IIQ Link % ln source H1                                                                 
luzelin@DESKTOP-5VT4IIQ Link % ln source H2                                                                 
luzelin@DESKTOP-5VT4IIQ Link % ll -i                                                                        
total 0
6755399441374992 -rw-r--r-- 3 luzelin luzelin 0 Jul 28 09:37 H1
6755399441374992 -rw-r--r-- 3 luzelin luzelin 0 Jul 28 09:37 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin 6 Jul 28 09:37 S1 -> source
6755399441374992 -rw-r--r-- 3 luzelin luzelin 0 Jul 28 09:37 source

  我们仔细观察一下发现,source、H1、H2拥有一样的i结点(显示结果的第一列,即6755399441374992),甚至于连权限属性都一模一样。而S2拥有另外一个独立的i结点。我们在前面曾经说过,每一个i结点对应一个实际的文件。所以,我们可以发现,建立的硬链接实际上跟我们的源文件是一样的。而软链接则是重新建立了一个独立的文件。

  事实上,硬链接的本质就是一条文件名和i结点的关联记录而已(i节点的引用次数+1),作用是容许一个文件拥有多个有效路径名,这样用户就能够创建硬链接到重要文件,以防止“误删”的功能。

  另外,我们观察一下这几个文件的大小,由于我们的源文件是空文件,所以大小是0。那为什么两个硬链接也是0?而软链接却是6呢?

  因为硬链接关联着我们的源文件,所以源文件的大小是多大,它们就是多大。至于软链接的大小为什么是6,这个就比较有趣了,大家观察一下软链接指向的源文件名(“source”)的长度,是不是6?对了,我们的软链接会写上链接文件的文件名。一个字母一个字节,所以是6个字节,所以软链接的大小是6。

  可能有人对于上面的说法有怀疑,别慌,我们接着测试一下。我们往空的源文件里写入一些东西。

luzelin@DESKTOP-5VT4IIQ Link % vim source     //添加内容                                                     
luzelin@DESKTOP-5VT4IIQ Link % ll -i                                                                        
total 0
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:49 H1
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:49 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin   6 Jul 28 09:37 S1 -> source
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:49 source
luzelin@DESKTOP-5VT4IIQ Link % cat source                                                                   
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
luzelin@DESKTOP-5VT4IIQ Link % cat H1                                                                       
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
luzelin@DESKTOP-5VT4IIQ Link % cat H2                                                                       
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee
luzelin@DESKTOP-5VT4IIQ Link % cat S1                                                                       
aaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccdddddddddddddddddddddddddeeeeeeeeeeeeeeeee

修改完源文件后,硬链接文件的大小和所有链接文件的内容也跟着修改了,印证了刚才的说法。

当我们删除了源文件之后,发现硬链接还能正常显示原本的内容,而软链接则提示文件不存在,这是怎么回事?

  我们刚才说过,软链接是建立了另一个新的独立的文件,它指向源文件,因为源文件没了,所以它就不能正常指向了;而硬链接为什么依旧能显示原来的内容呢?回到我们一开始的解释,硬链接实际是一条文件名与i结点的记录。所以,在删除源文件的时候,系统则将链接数减1,当链接数为0的时候,inode就会被系统回收,文件的内容才会被删除。

luzelin@DESKTOP-5VT4IIQ Link % ll -i                                                                         
total 0
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:50 H1
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:50 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin   6 Jul 28 09:37 S1 -> source
6755399441374992 -rw-r--r-- 3 luzelin luzelin 122 Jul 28 09:50 source

luzelin@DESKTOP-5VT4IIQ Link % rm source                                                                     
luzelin@DESKTOP-5VT4IIQ Link % ll -i                                                                         
total 0
6755399441374992 -rw-r--r-- 2 luzelin luzelin 122 Jul 28 09:50 H1
6755399441374992 -rw-r--r-- 2 luzelin luzelin 122 Jul 28 09:50 H2
3940649674055655 lrwxrwxrwx 1 luzelin luzelin   6 Jul 28 09:37 S1 -> source   //爆红错误

链接数看第3

总结:

  • 硬链接记录的是目标的inode,软链接记录的是目标的路径(分绝对路径和相对路径)。
  • 软链接就像是快捷方式,而硬链接就像是备份。
  • 软链接可以做跨分区的链接,而硬链接由于inode的缘故,只能在本分区中做链接。所以,软链接的使用频率要高很多。

为什么目录不支持硬链接

  那么为什么目录不支持硬链接呢?原因就是允许目录的硬链接可能会打破文件系统目录的有向无环图结构,这可能会导致一些遍历文件树的程序出错。出现子目录是父目录的情况,造成无限循环,比如ls -r, pwd

  为什么软链接(符号链接)没有这样的限制呢?可以理解为符号链接是一个独立文件,有自己的inode,在遍历到符号链接时,得到的是它本身的信息,而不是链接的那个文件

  当然如果一定要实现目录的链接,可以考虑软链接的方式或者挂载

  
  
参考:

inode详解

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值