Linux软硬链接之-ln命令

简介

Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。

Linux链接分两种,

  • 硬链接(Hard Link);
  • 软链接,即符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置信息。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

软连接

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

硬链接

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

硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为 索引节点号(Inode Index)。多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止误删 的功能。

硬连接 inode 会指向文件内容所在的数据块。与此同时,该文件内容所在的数据块的引用计数会加 1。当此数据块的引用计数大于等于 2 时,则表示有多个文件同时指向了这一数据块。一个文件修改,多个文件都会生效。当删除其中某个文件时,对另一个文件不会有影响,仅仅是数据块的引用计数减 1。当引用计数为 0 时,则系统才会清除此数据块。

因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。

硬连接 inode 会指向文件内容所在的数据块。与此同时,该文件内容所在的数据块的引用计数会加 1。当此数据块的引用计数大于等于 2 时,则表示有多个文件同时指向了这一数据块。一个文件修改,多个文件都会生效。当删除其中某个文件时,对另一个文件不会有影响,仅仅是数据块的引用计数减 1。当引用计数为 0 时,则系统才会清除此数据块。

所以,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

ln命令

ln命令为某一个文件在另外一个位置建立一个同步的链接。

语法:

1
2
3
4
ln [参数] [源文件或目录] [目标文件或目录]

# 其中参数的格式为
ln [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] [--help] [--version] [--]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 删除,覆盖目标文件之前的备份;
-b 或 --backup

# 建立目录的硬连接;
-d 或 -F 或 --directory

# 强行建立文件或目录的连接,不论文件或目录是否存在;
-f 或 --force

# 覆盖既有文件之前先询问用户;
-i 或 --interactive

# 把符号连接的目的目录视为一般文件;
-n 或 --no-dereference

# 对源文件建立软链接(符号连接),而非硬连接;
-s 或 --symbolic

# 用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,
# 预设的备份字符串是符号 ~,用户可通过 -S 参数来改变它;
-S<字尾备份字符串> 或 --suffix=<字尾备份字符串>

# 显示指令执行过程;
-v 或 --verbose

# 用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,
# 这个字符串不仅可用 -S 参数变更,当使用 -V 参数<备份方式>
# 指定不同备份方式时,也会产生不同字尾的备份字符串;
-V<备份方式> 或 --version-control=<备份方式>

# 在线帮助;
--help

# 显示版本信息。
--version

实例

建立硬链接

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件
touch source.txt

# 创建硬链接
ln source.txt hardsource.txt

# -i 选项表示列出每个文件的 inode 节点 ID
# 可以发现 source.txt 和 hardsource.txt 的 inode 号完全一致,
# 说明它们都指向了同一个数据块。
ls -il
总用量 0
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 hardsource.txt
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 source.txt

软连接

1
2
3
4
5
6
7
8
9
10
# 创建软链接
ln -s source.txt softsource.txt

# 列出 文件列表
# 注意:软链接文件的权限栏首字符为 l(L的小写字母),这也是软链接文件区别于普通文件的地方之一。
ls -il
总用量 0
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 hardsource.txt
1042589 lrwxrwxrwx 1 root root 10 8月 26 10:59 softsource.txt -> source.txt
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 source.txt