zoukankan      html  css  js  c++  java
  • 二、Linux系统硬链接和软链接详细介绍与实践

    链接的概念

    linux系统中,链接可分为两种:一种被称为硬链接(Hard LinK),另一种被称为软链接或符号链接(Symbolic Link)。在默认不带参数的情况下,执行ln命令创建的链接是硬链接。

    硬链接

    硬链接是指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode Index)或者Index

    Linux系统中,多个文件名指向同一索引节点(Inode)是正常且允许的。一般这种链接就称为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了硬链接)。为什么为文件建立了硬链接就会防止数据误删呢?

    因为文件系统的原理是,只要文件的索引节点(Inode Index)还有一个以上的链接(仅仅删除了该文件指向)。只删除其中一个链接并不影响索引节点本身和其他的连接(即数据实体并未被删除),只有当最后一个链接被删除后,此时如果有新数据要存储到硬盘时,被删除文件的数据块及目录的链接才会被释放,空间被新数据占用覆盖。此时,数据就再也无法找回了。也就是说,在linux系统中,删除文件(其实目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解,后文会讲和进程占用也有关)。提示:硬链接就相当于文件的另外一个入口。

    软链接

      软链接有时也称为符号链接(Symbolic Link)。软链接文件就类似与Windows系统中的快捷方式。它实际上是一个特殊的文件,在软链接中,软链接文件实际中就是一个文本文件,这个文件中包含有软链接指向另一文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。

    示例演示

    文件演示

    [root@localhost ~]# mkdir /test/oldboy -p
    [root@localhost ~]# cd /test/oldboy/
    [root@localhost oldboy]# touch oldboyfile   #创建一个测试文件oldboyfile
    [root@localhost oldboy]# ln oldboyfile oldboyfile_hard_link  #创建一个oldboyfile的一个硬链接文件oldboyfile_hard_link
    [root@localhost oldboy]# ln -s  oldboyfile oldboyfile_soft_link  #创建一个oldboyfile的一个软链接文件oldboyfile_soft_link
    
    [root@localhost oldboy]# ls -li
      #-i参数可查看文件的inode节点信息
    total 12
    810403 -rw-r--r-- 2 root root  0 May  1 03:43 oldboyfile
    810403 -rw-r--r-- 2 root root  0 May  1 03:43 oldboyfile_hard_link
    810404 lrwxrwxrwx 1 root root 10 May  1 03:44 oldboyfile_soft_link -> oldboyfile
    

    截图更清晰

    总结:从上面的示例结果中可以看到,硬链接文件oldboyfile_hard_link

    与源文件oldboyfileinode节点号相同,均为810403,然而软链接文件oldboyfile_soft_linkinode节点号与源文件odboyfile不同,为810404

    目录示例

    [root@localhost oldboy]# mkdir oldboydir   #创建一个测试文件oldboydir
    [root@localhost oldboy]# ln oldboy
    oldboydir/            oldboyfile_hard_link  
    oldboyfile            oldboyfile_soft_link  
    [root@localhost oldboy]# ln oldboydir oldboydir_hard_link
    ln: `oldboydir': hard link not allowed for directory   #目录无法创建硬链接
    [root@localhost oldboy]# ln -s oldboydir oldboydir_soft_link   #但目录可以创建软链接,在生产环境也经常用到。
    [root@localhost oldboy]# ls -lirt
    total 24
    810403 -rw-r--r-- 2 root root    0 May  1 03:43 oldboyfile_hard_link
    810403 -rw-r--r-- 2 root root    0 May  1 03:43 oldboyfile
    810404 lrwxrwxrwx 1 root root   10 May  1 03:44 oldboyfile_soft_link -> oldboyfile
    810405 drwxr-xr-x 2 root root 4096 May  1 03:53 oldboydir
    810406 lrwxrwxrwx 1 root root    9 May  1 03:55 oldboydir_soft_link -> oldboydir
    提示:红色部分为本例

    截图更清晰

     总结:ln命令不能对目录创建硬链接,到哪可以对目录创建软链接,对于目录的软链接也是生产场景常用的功能。

    删除示例

    [root@localhost oldboy]# echo "this is oldboyfile" > >oldboyfile
    [root@localhost oldboy]# cat oldboyfile
    this is oldboyfile
    [root@localhost oldboy]# cat oldboyfile_hard_link 
    this is oldboyfile
    [root@localhost oldboy]# cat oldboyfile_soft_link 
    this is oldboyfile
    [root@localhost oldboy]# rm -f oldboyfile   #删除原始文件,其实就是删除了一个文件的硬链接

     

    截图更清晰:

    [root@localhost oldboy]# cat oldboyfile_hard_link 
    this is oldboyfile
    提示:奇怪,内容还在,其实这就是因为有oldboyfile_hard_link硬链接存在,因此即使删除了oldboyfile,但是仍有硬链接指向文件的INODE节点,所以,此时文件才不会被释放被删除,当删除文件oldboyfile时,仅仅删除了oldboyfile到该文件INODE节点的连接而已。
    [root@localhost oldboy]# cat oldboyfile_soft_link 
    cat: oldboyfile_soft_link: No such file or directory
    总结:通过上面的测试可以看出:当删除原始文件oldboyfile,硬链接oldboyfile_hard_link不受影响,而oldboyfile_soft_link失效。

    链接总结

    有关文件

    通过以上的测试,可以得到以下几个结论:

    1.删除软链接oldboyfile_soft_link,对oldboyfile,oldboyfile_hard_link无影响;
    2.删除硬链接oldboyfile_hard_link,对oldboyfile,oldboyfile_soft_link也无影响;
    3.删除oldboyfile,对硬链接oldboyfile,oldboyfile_hard_link没有影响,导致软链接oldboyfile_soft_link失效。
    4.同时删除源文件oldboyfile,硬链接oldboyfile_hard_link,整个文件会真正的被删除。
    5.很多已经设备中的快照功能,就是利用了硬链接的原理。

    有关目录

    1.对于目录,不可以创建硬链接,但可以创建软链接

    2.对于目录的软链接是生产环境中采用的技巧

     

     

     

     

  • 相关阅读:
    正则表达式--断言
    ie6兼容性处理
    git log 高级用法
    html-文件上传设置accept类型延时问题
    sublime text3 -- JavaScript Completions
    Git进行fork后如何与原仓库同步
    Redis的数据结构及应用场景
    PHP手册-函数参考-日期与时间相关扩展
    什么是缓存
    MySQL的连接方式、事务、性能优化
  • 原文地址:https://www.cnblogs.com/zhongguiyao/p/9021552.html
Copyright © 2011-2022 走看看