ln是link的缩写,在Linux中ln命令的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要再每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录存放该文件,然后在其他的目录下用ln命令链接它就可以,不必重复的占用磁盘空间。

命令格式

ln [参数][源文件或目录][目标文件或目录]

"ln -b" 如果目标目录中已经有同名的文件,那么在覆盖之前先进行备份
"ln -f" 如果目标目录中已经有同名的文件,无需提示,直接覆盖
"ln -i" 人机交互,如果目标目录中已经有同名的文件,则提示是否进行覆盖
"ln -n" 把软链接视为一般目录(说明:范例中我会详细解释)
"ln -s" 创建软链接
"ln -v" 详细显示操作进行的步骤。(v为verbose的意思)

选择参数:
-S “-S<字尾备份字符串> ”或 “--suffix=<字尾备份字符串>”
-V “-V<备份方式>”或“--version-control=<备份方式>”
--help 显示帮助信息
--version 显示版本信息

命令功能

Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种:硬链接(hard link)、软链接(symbolic link), 硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统

软链接

  • 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 软链接可以 跨文件系统,硬链接不可以
  • 软链接可以对一个不存在的文件名进行链接
  • 软链接可以对目录进行链接

硬链接:

  • 硬链接,以文件副本的形式存在。但不占用实际空间
  • 不允许给目录创建硬链接
  • 硬链接只有在同一个文件系统中才能创建

两点注意事项:

  • ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其他的文件都会发生相同的变化
  • ln 的链接又分为软链接和硬链接两种,软链接就是[ln -s 源文件 目标文件],它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接[]

硬链接和软链接的原理及区别

如果想要清除了解ln命令,则必须先了解ext文件系统是如何工作的。我们直到分区的格式化就是写入文件系统,而我们的Linux目前使用的是ext4文件系统。如果用一张示意图来描述ext4文件系统:

将容器中目录映射到文件夹 linux目录映射到另一个目录_硬链接

ext文件系统(linux文件系统)

ext4文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的inode(i节点)信息;剩余的大部分用于保存block信息。

inode的默认大小为128Byte,用来记录文件的权限(r, w, x)、文件的所有者和属性、文件的大小、文件的状态改变时间(ctime, change time)、文件的最近一个读取时间(atime, access time)、文件的最近一次修改时间(mtime, modify time)、文件的数据真正保存的block编号。每个文件需要占用一个inode。如果仔细查看,就会发现inode中是不记录文件名的,因为文件名记录在文件所在目录的block中。

block的大小可以是1KB、2KB、4KB,默认为4KB。block用于实际的数据存储,如果一个block放不下数据,则可以占用多个block。例如,有一个10KB的文件需要存储,则会占用3个block,虽然最后一个block不能沾满,但也不能再放入其他文件的数据。这3个block有可能是连续的,也有可能是分散的。

由此,我们可以知道一下2个重要的信息:

  1. 每个文件都独自占用一个inode,文件内容由inode的记录来指向
  2. 如果想要读取文件内容,酒席需借助目录中记录的文件名找打该文件的inode,才能成功找到文件内容所在的block块。

ln命令

了解了Linux系统底层文件的存储状态后,接下来学习ln命令

ln命令用于给文件创建链接,根据Linux系统存储文件的特点,链接的方式分为一下2种:

  • 软链接:类似于Windows系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录
  • 硬链接:文件的基本信息都存储在inode中,而硬链接指的就是给一个文件的inode分配多个文件名,通过任何一个文件名,都可以找到此文件的inode,从而读取该文件的数据信息。

硬链接

在文件系统里,每一个文件都会有一个索引节点(inode index),这个索引节点用来标识这个文件,硬链接就是通过这个索引节点来进行链接。只有在同一文件系统中的文件之间才能创建硬链接,不能对目录进行创建,但是这个硬链接又可以建立多个,也就是可以有多个文件指向同一个索引节点,或者说一个文件可以拥有多个路径名,因此一个文件可以对应多个文件名。

将容器中目录映射到文件夹 linux目录映射到另一个目录_硬链接_02

同途中可以看出源文件(c.py)和硬链接文件(b.py)的索引节点是相同的,所以源文件和硬链接文件是指向同一个索引节点的。

目录问什么不能创建硬链接?

如果给目录创建硬链接,目录树就变成了环形结构。当我们要定位目录下的文件时,就无法通过名字直接定位了。

软链接

在Linux系统中都会包含多个文件系统,这些文件系统都会位于不同的磁盘或者分区。但是硬链接只能在同一文件系统下创建,这样有些不方便,这时候就需要软链接了

在Linux系统下,软链接可以实现文件或者目录的共享,就像Windows下的快捷方式一样。

我们可以简单把软链接的内容当成是一个链接或一个路径,当我们使用软链接的时候就是通过软链接的内容去访问这个链接或这个路径的内容,就像我们使用www.baidu.com这个链接访问百度,或者在ubuntu下使用sudo vim /etc/network/interfaces去访问/etc/network/interfaces这个路径里的内容。

前面提到硬链接只能在同一文件系统下创建,那么软链接就不会有这个限制,可以理解为软链接的产生就是为了摆脱这个限制的。

软链接文件可以是指向任意一个文件系统下的任意文件或目录,不仅如此,软链接还可以指向一个不存在的文件,但是不能对不存在的文件创建硬链接。

ln -s source_file softlink_file    #创建软链接
rm -f softlink_file   #删除软链接
两个在实际场景中使用到软链接的地方:
  1. 有时候我们总是需要执行很多的命令,而且执行的这些命令又是对应不同的目录的路径,有些路径真是又长有难记,敲出整个路径真是费劲,效率也变低了,这时候软链接的作用就体现出来了,把这些又长又臭的路径创建一个软链接到当前的路径下,是不是路径简单多了。
  2. 我在虚拟机里面安装了好多种交叉编译器,然后不同的编译器有可能就会用到不同的第三方库,做法肯定是将头文件放到编译器的路径下,编译程序的时候就会自动找到头文件,但是这个库文件会比较大,如果每一种编译器都要用的话,每个都搬过去比较占空间,这时候软链接的作用就来了,通过创建软链接的方式,我们创建软链接放过去,将这个库文件共享,这样不也可以减少磁盘空间的占用嘛。

在实际应用中,硬链接使用较少,软链接会使用的多