转自:https://www.jianshu.com/p/dde6a01c4094
什么是链接?
链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件。
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
命令格式
ln [参数][源文件或目录][目标文件或目录]
命令功能
链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。
软链接和硬链接的区别是?
首先,从使用的角度讲,两者没有任何区别,都与正常的文件访问方式一样,支持读写,如果是可执行文件的话也可以直接执行。
那区别在哪呢?在底层的原理上。
为了解释清楚,我们首先在自己的一个工作目录下创建一个文件,然后对这个文件进行链接的创建硬链接
$ 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 -li
inode值 文件类型权限 连接计数 文件拥有者 文件群组 大小 修改日期 名称
25869085 -rw-r–r-- 2 unixzii staff 27 7 8 17:39 hard
在 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
下面我们试着删除 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 都指向同一个文件在硬盘中的区块
- 以文件副本的形式存在,但不占用实际空间。
- 硬链接只有在同一个文件系统中才能创建
软链接: - 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块
- 访问时替换自身路径。
- 软链接可以对目录进行链接
- 软链接可以对一个不存在的文件名进行链接
- 软链接可以 跨文件系统
这里有两点要注意:
4. ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;
5. ln的链接又分软链接和硬链接两种
- 软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间
- 硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。