Linux文件系统:从inode理解软链接与硬链接

什么是inode?

在Linux磁盘存储文件系统中,我们以块划分磁盘为两部分:超级块(superblock)和数据块(data block);同时划分单文件为户数(user data)和元数据(meta data)两个部分。

  • 用户数据记录的是文件的真实内容。比如你的血液、骨骼和各器官等等。

  • 元数据这是附加于文件的属性信息。比如身高、体重、血型和年龄等等。通常包含了文件的大小、访问模式、归属(主和组)、权限、时间戳等等。

为了快速查找分别存储于超级块和数据块的文件,我们引进了索引节点inode(index node)。我们可以理解为元数据+数据块指针=inode。每个inode大小固定为128bytes,每个文件占用一个inode。但是有一个问题,需要记录的文件属性特别多,而且一个文件可能有很多很多block,而inode又太小(记录一个block要用4byte),怎么办?linux的解决办法是:将inode记录block号码的区域定义为12个直接、一个间接、一个双间接与一个三间接记录区。总共可记录的block数量为:12+256+256*256+256*256*256(K)=16G这只符合block大小为1K时的情况。

为了方便理解,我绘制的示例如下图:

wKiom1ecZgKwRz6bAAC_o2O7VB4610.png


Linux是如何查找文件的?

文件的文件名是不包含在inode结构里的,用户通过文件名来引用一个文件,文件名只是为了方便用户识别文件的。

每个inode都有一个编号,我们称为索引编号(inumber),两者虽然极为相似,并且互相关联,但他们却是两个不同的概念。 inode 指的是数据结构;而inumber实际上是 inode 的标识编号,因此也称其为 inode 编号 或者索引编号。索引编号只是文件相关信息中一项重要的内容。Linux的内核内存是通过索引编号定位inode,再从inode里的指针,定位到data block,从而找到文件的。

值得注意的是,目录也是文件,不过目录的 data block 里的数据是目录下的文件名(子目录)它的inode 号之间的映射构成的。

现在我们通过示图来展示 Linux 查找文件

1.假设有文件目录结构如下图:

wKiom1ecn-nyk7qMAAAeJ1kTy7o602.png

系统需要查找/testdir/A/b.txt文件,查找过程是

wKiom1edOQ3AdjhAAAJHnikK1h8934.gif


linux如何创建、删除、移动文件?

创建

当我们直接创建(或通过复制创建)一个普通文件/PATH/file时,系统会分配一个空闲的inode,在inode表中生成inumber,同时父目录/PATH的data block里添加file《═》inumber。这样一个新文件创建成功了。

rm删除

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

把数据块放在空闲列表中

删除父目录里的映射项

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

mv移动

1. 如果mv 命令的目标和源在相同的文件系统,作为mv  命令
   
    用新的文件名创建对应新的目录项

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

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

   
2. 如果目标和源在一个不同的文件系统, 由于inode不能跨文件系统,所以mv 需要在目标文件系统中执行相当于cp 和rm。


软链接和硬链接

为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名hard link 就是 file 的一个别名,他们有共同的 inode)。硬链接可由命令 link 或 ln 创建。如下是对文件 oldfile 创建硬链接。

硬链接:

wKiom1eentDwLwKUAABg5vuX5bE659.png

从上图中我们可以看到,硬链接与源文件是相同的inode和data block。因此

硬链接的特性为:


  • 只能对已存在的文件进行创建,创建硬链接会在inode里添加计数

           

  • 指向inode相同,与源文件的data block也相同

  • 不能对目录创建硬链接

  • 不能跨文件系统进行硬链接的创建

  • 创建硬链接会在硬链接父目录添加映射条目:hard link映射源文件inode

  • 删除一个硬链接文件,会在父目录清除该条映射,inode计数减一,所以不影响其他有相同 inode 号的文件。


     

硬链接展示:

源文件不存在, 无法创建硬链接:

 

wKiom1eeqAbhNrv5AAAYG0WlQBI604.png

不能对目录进行创建硬链接:

 

wKioL1eepw6AqBD3AAAPdaAzfp4261.png

不能跨文件系统创建硬链接:

wKiom1eeqVujeiCsAABO6p2D5IE953.png

与源文件有相同的inode,inode里计数增加1:

 

wKiom1eeqI_CeCPyAADfjNj_s-A119.png


软连接:

 
wKioL1eenzmTZVryAACSx5d6mCQ903.png

从上图中我们可以看到,软连接和源文件是两个独立inode的文件,因此

软链接的特性为:


  • 可以指向一个目录

  • 可以跨文件系统(分区)

  • 是一个指向源文件名称的指针,是个一个文件

  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode 的引用计数


     

软链接展示:

可以对目录创建软链接:

wKiom1eeqnqi2T-jAAAcA66lwkc466.png

可以跨文件系统创建软连接:

wKioL1eeq3rzyAbsAABL6t0Q5Us428.png

软链接是指向源文件的指针,与源文件是两个独立inode的文件:

wKioL1eerdTjOzLRAAD6GKcF9MU758.png


写在结束

本文描述了 inode 的结构体。通过索引节点结构体,区分硬链接与软链接的不同存在。

本文参考资料主要来源于:

《理解 Linux 的硬链接与软链接》http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#fig2

《学习 Linux,101: 创建和更改硬链接和符号链接》http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-104-6/

文中主要通过个人理解进行描述,由于初学Linux,限于本人水平有限,文中难免错误纰漏。欢迎各位看官不吝指教、讨论相关技术。谢谢。联系我:jacky18676887374@aliyun.com

原创文章,作者:昭其,如若转载,请注明出处:http://www.178linux.com/30437

(0)
上一篇 2016-08-07 22:05
下一篇 2016-08-07 22:05

相关推荐

  • 第四周作业

    cp、grep、sueradd、chmod、vim命令的一些用法

    Linux干货 2017-12-24
  • Nginx介绍及使用

       Nginx(engine x)是一个高性能的HTTP和反向代理服务器, 也是一个IMAP/POP3/SMTP服务器. Nginx是由IgorSysoev为俄罗斯访问量第二的Rambler.ru站点开发的, 第一个公开版本在2004年发布. 因为它的稳定性, 丰富的功能集, 示例配置文件和低系统资源的消耗而闻名. Nginx是一款轻量…

    Linux干货 2016-11-11
  • SSL应用系列之一:CA证书颁发机构(中心)安装图文详解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/140518        如果你需要在组织里发布exchange,或者需要给IIS配置SSL的访问方…

    Linux干货 2015-03-26
  • Bash基础命令操作

    Bash基础命令操作

    2018-03-18
  • 8.1作业

    8月1日作业 创建testuser uid 1234,主组:bin,辅助组:root,ftp,shell:/bin/csh home:/testdir/testuser [root@localhost ~]# useradd -u 1234 -g bin -G root,ftp&…

    Linux干货 2016-08-04
  • locate与find不得不说的事

    本文内容: locate与find 练习     locate与find是linux中最常用的两种查找方式,二者各有优缺点,locate查找迅速,却由于数据库非实时更新,导致可能查找不全,而find由于是从指定路径开始遍历,速度相对较慢,却更为准确,而且用法也更加灵活,因此find运用更加广泛,也是本文的重点。 文件查找: locate搜…

    Linux干货 2016-08-18