软链接 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一样,同一内存空间)
- 软链接可以跨不同的文件系统而而硬链接不可以;