zoukankan      html  css  js  c++  java
  • 初始Linux软硬链接

    转载

    https://blog.csdn.net/libaineu2004/article/details/85918682

    用实践让你明白“软链接”和“硬链接”的区别

    展开

    一、原理

    在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号inode 。

    软连接,其实就是新建立一个文件,这个文件就是专门用来指向别的文件的(那就和windows 下的快捷方式的那个文件有很接近的意味)。软链接产生的是一个新的文件,但这个文件的作用就是专门指向某个文件的,删了这个软连接文件,那就等于不需要这个连接,和原来的存在的实体原文件没有任何关系,但删除原来的文件,则相应的软连接不可用(cat那个软链接文件,则提示“没有该文件或目录“)

    硬连接是不会建立inode的,他只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。相反是软连接会重新建立一个inode,当然inode的结构跟其他的不一样,他只是一个指明源文件的字符串信息。一旦删除源文件,那么软连接将变得毫无意义。而硬链接删除的时候,系统调用会检查inode link count的数值,如果他大于等于1,那么inode不会被回收。因此文件的内容不会被删除。
    硬链接实际上是为文件建一个别名,链接文件和原文件实际上是同一个文件。可以通过ls -i来查看一下,这两个文件的inode号是同一个,说明它们是同一个文件;而软链接建立的是一个指向,即链接文件内的内容是指向原文件的指针,它们是两个文件。
    软链接可以跨文件系统,硬链接不可以;
    软链接可以对一个不存在的文件名(filename)进行链接(当然此时如果你vi这个软链接文件,linux会自动新建一个文件名为filename的文件),硬链接不可以(其文件必须存在,inode必须存在);
    软链接可以对目录进行连接,硬链接不可以。
    两种链接都可以通过命令 ln 来创建。ln 默认创建的是硬链接。
    使用 -s 开关可以创建软链接。

    二、实践

    https://www.jianshu.com/p/dde6a01c4094

    什么是链接?

    链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。

    它是用来干什么的?

    你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS X 中的替身),Linux 中常用它来解决一些库版本的问题,通常也会将一些目录层次较深的文件链接到一个更易访问的目录中。在这些用途上,我们通常会使用到软链接(也称符号链接)。

    软链接和硬链接的区别是?

    下面我们进入正题,来探讨一下软硬两种链接到底有什么区别?

    首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。

    那区别在哪呢?在底层的原理上。

    为了解释清楚,我们首先在自己的一个工作目录下创建一个文件,然后对这个文件进行链接的创建:

    $ touch myfile && echo "This is a plain text file." > myfile
    $ cat myfile
    This is a plain text file.
    

    现在我们创建了一个普通地不能再普通的文件了。然后我们对它创建一个硬链接,并查看一下当前目录:

    $ ln myfile hard
    
    $ ls -li
    
     
    25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 hard
    
    25869085 -rw-r--r-- 2 unixzii staff 27 7 8 17:39 myfile
    

    在 ls 结果的最左边一列,是文件的 inode 值,你可以简单把它想成 C 语言中的指针。它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失。

    你也看到了,这两个文件就如同一个文件一样,inode 值相同,都指向同一个区块。

    然后我们修改一下刚才创建的 hard 链接文件:

    $ echo "New line" >> hard
    
    $ cat myfile
    
     
    This is a plain text file.
    
    New line
    

    可以看到,这两个文件果真就是一个文件。
    下面我们看看软链接(也就是符号链接)和它有什么区别。

    $ ln -s myfile soft
    
    $ ls -li
    
     
    25869085 -rw-r--r-- 2 unixzii staff 36 7 8 17:45 hard
    
    25869085 -rw-r--r-- 2 unixzii staff 36 7 8 17:45 myfile
    
    25869216 lrwxr-xr-x 1 unixzii staff 6 7 8 17:47 soft -> myfile
    

    诶,你会发现,这个软链接的 inode 竟然不一样啊,并且它的文件属性上也有一个 l 的 flag,这就说明它与之前我们创建的两个文件根本不是一个类型。

    下面我们试着删除 myfile 文件,然后分别输出软硬链接的文件内容:

    $ rm myfile
    
    $ cat hard
    
     
    This is a plain text file.
    
    New line
    
    
     
    $ cat soft
    
     
    cat: soft: No such file or directory
    

    之前的硬链接没有丝毫地影响,因为它 inode 所指向的区块由于有一个硬链接在指向它,所以这个区块仍然有效,并且可以访问到。
    然而软链接的 inode 所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径,然而这个文件已经被删除了,所以自然就会显示无法找到该文件了。

    为验证这一猜想,我们再向这个软链接写点东西:

    $ echo "Something" >> soft
    
    $ ls
    
     
    hard myfile soft
    

    可以看到,刚才删除的 myfile 文件竟然又出现了!这就说明,当我们写入访问软链接时,系统自动将其路径替换为其所代表的绝对路径,并直接访问那个路径了。

    总结

    到这里我们其实可以总结一下了:

    硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
    软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。
    以下是我的一些理解,如有错误,还请各位指点

    1、当删除myfile时,相当于删除了myfile以及myfile指向空间的指针,此时因为还存在hard,所以这块存储空间不会被回收

    2、之后,又通过向soft中写入内容。因为soft中保存着指向的绝对地址,所以会在原路径生成一个myfile文件,同时指向新开辟的存储“Something”的空间

  • 相关阅读:
    第一章 基础知识
    第1条:考虑用静态工厂方法代替构造器
    spring cloud(断路器——初学五)
    spring cloud(断路器——初学四)
    spring cloud(服务消费者(利用feign实现服务消费及负载均衡)——初学三)
    在阿里云的ubuntu服务器上安装xampp时出现unable to realloc unable to realloc 8380000 bytes错误
    laravel中ubuntu下执行php artisan migrate总是报错
    windows下安装php依赖关系管理工具composer
    apk下载的网址生成一个二维码
    android apk的签名和权限问题
  • 原文地址:https://www.cnblogs.com/shenxiaodou/p/12361440.html
Copyright © 2011-2022 走看看