链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。为解决文件的共享使用,Linux系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。
硬链接
一个文件可能有多个文件名,这些文件名可能属于同一个目录,也可能位于不同的目录。
它们指向同一个inode,即若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。
由于linux下的文件是通过索引节点(Inode)来识别文件,硬链接也可以认为是一个指向文件索引节点的指针,系统并不为它重新分配inode
每添加一个一个硬链接,文件的链接数就加1,删除一个则链接数减1。删除一个硬链接文件并不影响其他有相同 inode 号的文件。
硬链接创建的格式为
ln 源文件名 新链接名
Inode结构中有记录文件链接个数的变量,这个变量的个数对应文件有多少个链接。若一个文件的链接数大于1,则删除文件时,系统仅仅删除了相应的目录项,链接变量值减一,并不真正删除文件,除非这个文件的链接全被删除,即链接变量个数减为0,文件才被彻底删除,因为这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
[root@localhosttestdir]# stat 12.txt
File:鈥2.txt鈥
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device:802h/2050d Inode: 1575536 Links: 1
Access:(0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access:2019-01-30 15:53:56.737472559 +0800
Modify:2019-01-30 15:53:56.737472559 +0800
Change:2019-01-30 15:53:56.737472559 +0800
Birth: -
[root@localhosttestdir]#
[root@localhosttestdir]# ln 12.txt 12
[root@localhosttestdir]# stat 12
File:鈥2鈥
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device:802h/2050d Inode: 1575536 Links: 2
Access:(0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access:2019-01-30 15:53:56.737472559 +0800
Modify:2019-01-30 15:53:56.737472559 +0800
Change:2019-01-30 16:39:38.783479972 +0800
Birth: -
[root@localhosttestdir]# stat 12.txt
File:鈥2.txt鈥
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device:802h/2050d Inode: 1575536 Links: 2
Access:(0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access:2019-01-30 15:53:56.737472559 +0800
Modify:2019-01-30 15:53:56.737472559 +0800
Change:2019-01-30 16:39:38.783479972 +0800
Birth: -
[root@localhosttestdir]#
[root@localhosttestdir]# rm 12
rm:
remove regular empty file 鈥2鈥y
[root@localhosttestdir]# stat 12.txt
File:鈥2.txt鈥
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device:802h/2050d Inode: 1575536 Links: 1
Access:(0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access:2019-01-30 15:53:56.737472559 +0800
Modify:2019-01-30 15:53:56.737472559 +0800
Change:2019-01-30 16:41:13.992845965 +0800
Birth: -
[root@localhosttestdir]#
大多数系统不允许创建一个目录的硬链接。
关于目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。删除文件时,该文件的链接数减1,如果删除目录项后该文件的链接数为零,这时系统才把真正的文件从磁盘上删除。
软连接
软连接是linux 下与硬链接对应的一种连接方式,类似于window下的快捷方式,软连接可以在其他分区中,软连接文件与原文件具有不同的inode码。读取连接文件,系统会自动将访问者导向原文件,无论读取那个文件,最终读取的是原文件。
软连接又称符号链接(symbolic link),它只不过是指向源文件的指针。软链接没有任何文件系统的限制,任何用户可以创建指向 文件/目录的符号链接。甚至可以跨越不同机器、不同网络对文件进行链接。
创建文件的软链接时,软链接会使用一个新的inode,所以软链接的inode号和文件的inode号不同(表明他们是两个不同的文件)。软链接的数据块里存放着指向源文件的路径,删除源文件,软链接也无法使用了则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接),因为文件的路径不存在了;删除软链接对原文件没有任何影响。当然软链接也有硬链接没有的缺点,因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移。
软链接的创建格式为
ln -s 源文件名 新链接名
[root@localhosttestdir]# ln -s 11.txt 11
[root@localhosttestdir]# ll
total8
-rw-r--r--1 root root 0 Jan 30 15:54 10
lrwxrwxrwx1 root root 6 Jan 30 16:57 11 ->11.txt
-rw-r--r--1 root root 0 Jan 30 15:54 11.txt
[root@localhosttestdir]# rm 11.txt
rm:
remove regular empty file 鈥1.txt鈥y
[root@localhosttestdir]# ll
total8
-rw-r--r--1 root root 0 Jan 30 15:54 10
lrwxrwxrwx1 root root 6 Jan 30 16:5711 -> 11.txt #文件失效(显示红色,并闪烁显示),
[root@localhosttestdir]#
[root@localhosttestdir]# cat 11
cat:11: No such file or directory
[root@localhosttestdir]# cat 11.txt
cat:11.txt: No such file or directory
[root@localhosttestdir]# touch 11.txt #重新创建源文件
[root@localhosttestdir]# ll
total8
-rw-r--r--1 root root 0 Jan 30 15:54 10
lrwxrwxrwx1 root root 6 Jan 30 16:57 11 ->11.txt #指向正常
-rw-r--r--1 root root 0 Jan 30 17:00 11.txt
[root@localhosttestdir]#
网友评论