软连接与硬链接

    xiaoxiao2021-03-25  213

    硬链接与软链接的关系 <一> 硬链接(hard link): 指向文件的索引节点。      与同一个文件建立硬链接的目录项的索引节点号是相同的。 e.g. 创建               file1                (52473, file1)    ()中的是索引节点号和文件名 对file1建立硬链接   file2                (52473, file2)                   file3                 (52473, file3) 当建立了硬链接文件后,3个文件具有相同的索引节点号,它们都指向了同一文件的文件内容,因此文件大小相同。 注:硬链接不可以在不同文件系统的文件间建立链接 <二>符号链接(symbolic link): 又称软链接。 符号链接类似于windows操作系统的快捷方式。 e.g. ln -s file1 file1.soft。

    什么是链接?

    链接简单说实际上是一种文件共享的方式,是 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 都指向同一个文件在硬盘中的区块软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径。 file1和file1.soft各自有不同的文件名和索引节点号 file1.soft的文件内容:file1的路径名,大小为5个字节。 注:符号链接文件可以跨越不同文件系统    若链接指向的文件从一个目录移动到另一个目录下,就无法通过符号链接访问它。    因为符号链接文件含有源文件在文件结构中的路径信息,所以建立符号链接需要一个索引节点,需要占用空间。
    转载请注明原文地址: https://ju.6miu.com/read-1689.html

    最新回复(0)