你的位置:首页 > 操作系统

[操作系统]Linux 硬链接与软链接


在 Linux 的文件系统中,磁盘块分成了 3 个部分。一部分称为数据区,用来存放文件内容。另一部分称为 inode 表,用来存放文件属性。第三部分称为超级块,用来存放文件系统本身的属性。文件的内容和属性分开存放,文件的属性存储在一个称为 inode 的数据结构中,inode 存放在 inode 表里,每个 inode 有一个唯一的编号对应其在 inode 表中的位置。

Linux 中有两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接也称为符号链接(Symbolic Link)。

 

硬链接

硬链接其实已存在文件的另一个名字,链接与原来的文件并没有什么区别,它们共享一个 inode,而 inode 包含了一个文件的所有属性。当为一个文件创建硬链时,内核不会分配新的 inode。

huey@huey-K42JE:~/huey/linux/cmdline$ touch f1huey@huey-K42JE:~/huey/linux/cmdline$ ln f1 f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 010272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f110272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f1-hard

系统并没有为 f1-hard 分配新的 inode,f1-hard 的 inode 与 f1 一致,这说明了它们是同一个文件的两个名字。创建链接后,f1 和 f1-hard 的链接数也由 1 增加到 2。再看看使用 rm 命令的过程:

huey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 010272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f110272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ rm f1huey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 010272788 -rw-rw-r-- 1 ng ng 0 Apr 20 15:33 f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ rm f1-hardhuey@huey-K42JE:~/huey/linux/cmdline$ ls -litotal 0

当删除文件的时候,系统只是将文件的链接数减一,直到文件的链接数为 0 时,系统才会将磁盘的文件内容删除。

硬链接有两个重要的限制:
1) 硬链接不能引用自身文件系统之外的文件。即链接不能引用与该链接不在同一磁盘分区的文件。
2) 硬链接不能引用目录(有些 Linux 版本允许超级用户使用 -d 选项创建引用目录的链接)。

 

符号链接

符号链接是为了克服硬链接的局限性而创建的。符号链接是通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针。从这点来看,符号链接与 Windows 的快捷方式很相似。符号链接指向的文件与符号链接自身几乎没有区别。例如,将一些内容写进符号链接里,那么这些内容同样也写进了引用文件。而当删除一个符号链接时,删除的只是符号链接而没有删除引用文件。如果先于符号链接之前删除引用文件,那么这个链接依然存在,但是不指向任何文件。此时,这个链接就称为坏链接。ls 命令一般会用不同的颜色来显示坏链接,比如红色。

软链接相比硬链接有个不足的地方是:由于软链接包含引用文件的路径信息,所以如果引用文件移动到其他目录,链接则变成一个坏链接。

 

ln 命令格式

ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)

 

ln 命令参数

--backup[=CONTROL]
  如果指定的链接名已经存在,为该同名文件创建备份文件

-b
  类似 --backup 选项,但不接受参数。

-d, -F, --directory
  允许超级用户创建目录的硬链接(注:由于系统限制很有可能会失败,即使是超级用户)

-f, --force
  如果指定的链接名已经存在,则覆盖该同名文件

-n, --no-dereference
  如果指定的链接名是一个引用目录的符号链接,则将其当作是普通文件

-i, --interactive
  如果指定的链接名已经存在,提示是否覆盖该同名文件

-s, --symbolic
  创建符号链接而非硬链接

-S, --suffix=SUFFIX
  使用 SUFFIX 作为备份文件的后缀

-v, --verbose
  显示链接过程的信息

--help display this help and exit
  打印帮助信息

--version
  打印版本信息

 

ln 实例

a) 创建硬链接

ln testfile testfile-hard

b) 创建符号链接

ln -s testfile testfile-sym

c) 强制创建链接,如果指定的链接名已经存在,则覆盖该同名文件

ln -f testfile testfile-hard

d) 为被覆盖的文件创建备份

ln -bf testfile testfile-hard

e) 为被覆盖的文件创建备份,并以 ".~[num]~" 作为后缀

ln -f --backup=numbered testfile testfile-hard

f) 为被覆盖的文件创建备份,并指定备份文件的后缀为 ".bak"

ln -bf -S '.bak' testfile testfile-hard

 

ln 的 -n 选项

使用 man ln 命令,-n 选项的释义是 "treat destination that is a symlink to a directory as if it were a normal file",如何理解?

假设有 a、b 两个目录,还有一个指向 a 目录的软链接 c:

huey@huey-K42JE:~/huey/linux/cmdline$ mkdir a bhuey@huey-K42JE:~/huey/linux/cmdline$ ln -s a c

现在如果要使软链接 c 改为指向 b 目录而执行下面这条命令:

huey@huey-K42JE:~/huey/linux/cmdline$ ln -sf b c

这并不能达到预期的效果,而是会在 c 的引用目录(即 a 目录)里创建 b 目录的软链接。这种情况下, -n 选项会将软链接 c 当作一个普通文件而被覆盖:

huey@huey-K42JE:~/huey/linux/cmdline$ ln -sfn b c

 




大连旅游线路报价大连旅游攻略大全大连旅游路线推荐大连自驾游攻略大连旅游线路大全夫子庙金陵灯会:感受年俗灯会奇景 冬日让你感受不一样的火焰山 雍和宫门票_雍和宫门票价格 最新中国游客到尼泊尔旅游签证办理程序 爱上清静的平乐古镇 世园会金条开卖按金价算 灯红酒绿的伊斯坦布尔_到土耳其看妖娆的肚皮舞娘 神秘河西走廊 桃花源漂流在黄山哪里?黄山桃花源漂流怎么去? 黄山桃花源漂流开漂了吗?桃花源漂流几月开漂? 世园会分会场国学公园免费开放吗?青岛世园会分会场国学公园怎么样? 世园会城阳分会场介绍?青岛世园会城阳分会场有什么好玩的活动? 2015元旦深圳免费好玩景点有哪些?深圳元旦带孩子家人去什么地方好玩? 2015元旦深圳哪里有活动?深圳元旦带孩子家人好玩的地方有哪些? 2015长隆欢乐世界元旦活动?元旦广州番禺长隆欢乐世界门票优惠价格? 2015元旦广州免费好玩景点有哪些?广州元旦带孩子家人去什么地方好玩? FDPF10N60ZUT Datasheet FDPF10N60ZUT Datasheet FDPF12N60NZ Datasheet FDPF12N60NZ Datasheet FDPF17N60NT Datasheet FDPF17N60NT Datasheet 火车票可以提前几天买票 火车票可以提前几天买票 火车票可以提前几天买票 观澜版画村好玩吗 观澜版画村好玩吗 观澜版画村好玩吗 深圳儿童公园好玩吗 深圳儿童公园好玩吗 深圳儿童公园好玩吗