软链接与硬链接

204 阅读3分钟

软链接 vs 硬链接:

节点索引(Inode index)

在 Linux 系统中保存在磁盘分区中的文件,系统都会分配一个叫 Inode index 的节点索引,通过这个索引就能够获取到相关文件的内容及信息,并且多个文件可以指向同一个节点索引。当文件的索引节点还存在一个以上的链接时,删除其中一个链接并不影响索引节点本身和其他的链接。当文件移动后节点索引所指向的文件地址会自动变化。

软连接(Symbolic Link)

软链接即符号链接,就像一个文件的快捷方式,它直接指向原始文件而不是文件的节点索引。打开软链接文件修改内容时实际修改的是源文件。删除源文件,软连接这个快捷方式就访问不到源文件了,也就失去了意义成了死链接。

创建软链接命令:

/*
source: 源文件或文件夹(如果用相对路径,target移动后会找不到目标文件)
target: 要建立的软连接目标文件或文件夹(不用预先创建)
*/
ln -s <source> <target>

假如有这样一个目录结构:

//目录结构
node/
├── bin/
├── lib/
|   └── node_modules/
|       └── npm/
|           └── bin/
|           |    └── npm-cli.js
|           └── lib/
|               └── cli.js

------------分割线-------------
//npm-cli.js内容
#!/usr/bin/env node
require('../lib/cli.js')(process)

我们在 node/bin 目录内创建 npm-cli.js 的软链接:

$ ln -s ../lib/node_modules/npm/bin/npm-cli.js npm

执行命令后会在 node/bin 目录下生成一个带箭头的软连接文件npm:

还可通过ls -li命令查看:

//在node/bin目录执行
$ ls  -li
=>
//2895655为节点索引,lrwxrwxrwx的第一个字符表示文件类型:l表示符号链接
2895655 rwxrwxrwx@ 1 xinghunm  staff  38 Sep 18 12:05 npm -> ../lib/node_modules/npm/bin/npm-cli.js

//在node/lib/node_modules/npm/bin下执行
$ ls  -li
=>//2883280为节点索引,-rwxr-xr-x@的第一个字符表示文件类型:-表示普通文件
2883280 -rwxr-xr-x@ 1 xinghunm  staff    54 Mar 23  2023 npm-cli.js

可以看到软链接(npm)和源文件(npm-cli.js)的节点索引是不一样的。

当我们查看npm文件的内容时实际是查看其链接的文件npm-cli.js(源文件)的内容:

//npm内容
#!/usr/bin/env node
require('../lib/cli.js')(process)

路径'../lib/cli.js'实际是以源文件(npm-cli.js)路径为当前路径,而不是npm文件所在位置。

硬链接(Hard Link)

所谓的硬链接就是通过节点索引来引用文件,而不是像软链接那样直接引用文件。

创建硬链接命令:

/*
source: 源文件
target: 要建立的软连接目标文件(不用预先创建)
*/
ln <source> <target>

以软连接示例中的目录结构为例,我们在 node/bin 目录内创建 npm-cli.js 的硬链接:

$ ln ../lib/node_modules/npm/bin/npm-cli.js npm

通过ls -li命令查看:

//在node/bin目录执行
$ ls  -li
=>
2883280 -rwxr-xr-x@ 2 xinghunm  staff  54 Mar 23  2023 npm

//在node/lib/node_modules/npm/bin下执行
$ ls  -li
=>
2883280 -rwxr-xr-x@ 1 xinghunm  staff    54 Mar 23  2023 npm-cli.js

可以看到硬连接(npm)和源文件(npm-cli.js)的节点索引是一样的。

我们创建的硬链接npm实际是npm-cli.js的副本,其大小一致,指向内存同一片空间。当然这和拷贝是不一样的,拷贝是完全复制了一份新的,内存空间也是不一样的。而硬链接或软链接都不会将源文件完全复制一份。

总结

  • 软连接支持对目录和文件进行链接而硬链接只支持对文件进行链接;
  • 删除软链接的源文件软链接将成死链接,而删除硬链接源文件,源文件内容仍能通过硬链接访问(节点索引的个数不为零);
  • 移动以相对路径创建的软链接的源文件,软链接会找不到源文件而无法使用,而对于硬链接移动其源文件则不受影响;
  • 软链接以存放另一个文件的路径的形式存在(有自己的inode,占用较小),硬链接以文件副本的形式存在(inode一样,同一内存空间)
  • 软链接可以跨不同的文件系统而而硬链接不可以;