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
下一篇 2016-08-07

相关推荐

  • tomcat

      编程语言:硬件级:微码编程,汇编语言系统级:C,C++,…应用级:Java, PHP, Python, Ruby, Perl, C#, …Python: PVMStandard LibraryWeb Framework:Django, Flask, …Java:JVM,JDKbash:bash ex…

    Linux干货 2017-05-22
  • IP地址与网络配置方式

    IP 地址 它们可唯一标识IP网络中的每台设备 每台主机(计算机、网络设备、外围设备)必须具有唯一的地址 IP地址由两部分组成: (总共32位) 网络ID: 标识网络 每个网段分配一个网络ID 主机 ID: 标识单个主机 由组织分配给各设备   IP 地址分类 32位IP=网络ID+主机ID A 类: 前8位是网络ID位,后24位是主机ID位 00…

    2017-05-07
  • 初识Linux基础

    一:计算机的组成及其基本功能 计算机主要由五大基础部件组成:控制器,运算器,存储器,输入设备,输出设备. 控制器:计算机的核心组件,协调各程序的运行,对计算机的各项资源进行控制分配; 运算器:计算机实现算术运算以及逻辑运算的部件; 存储器:计算机用来存放数据和程序的基本部件。 存储器由若干存储单元组成,每个存储单元都有一个地址,计算机通过地址对存储单元进行读…

    Linux干货 2018-03-04
  • test

    test

    Linux干货 2016-08-08
  • Haproxy+Keepalived+Varnish+LAMP+Memcacked+NFS 实现WordPress站点的动静分离

    详细说明,请点击CSDN博客的连接地址:http://blog.csdn.net/yhy1271927580/article/details/70195158

    2017-04-16
  • N22—第五周作业

    1、显示当前系统上root、fedora或user1用户的默认shell; [root@localhost ~]# grep -E "^(root|fedora|user1)"  /etc/passwd |cut -d : -f 1,7 root:/bin/bash fedora:/bin/bash user1:/bin/bas…

    Linux干货 2016-09-11