Linux的硬链接和软链接到底有什么区别?

简介我们现代的操作系统需要防止程序崩溃导致信息丢失,需要将信息存储在文件之中 。而且文件能够被多个进程同时读取 。在linux中所以的资源,外设都抽象成了文件,所以就有了Linux中“一切皆文件”的特性 。当然有文件,肯定是不够的,总不能把所有的文件放在一起管理,实在是太乱,不易管理维护 。Linux就引入了目录的概念,在windows中可以称之为文件夹 。目录的引入就会让Linux的根文件系统外观上变成了一个层次分明的目录树 。如下图:
 

Linux的硬链接和软链接到底有什么区别?

文章插图
 
 
目录是什么?在Linux中“一切皆文件”,所以这个问题很好回答:目录也是文件 。目录中记录的是目录下文件名 。那既然是文件,如果在创建目录的时候,与当前目录下的文件或目录重名,就肯定会创建失败 。
好了,既然搞清楚了目录的概念,我们接着往下看 。
硬链接和软连接区别?在Linux中表示一个文件的方式是通过两个部分来分别表示的:用户数据(user data)与元数据(meta data) 。什么是用户数据呢?用户数据就是记录真实文件内容的数据,这些数据是存放在一个个大小相等的文件数据块中(data block) 。
元数据呢?其实就是这个文件的附加信息属性,例如:创建时间,文件大小等等这类信息 。我们用索引号(inode)来表示每一个不同文件的元数据(当然inode也是元数据的一部分) 。在Linux中,inode才是表示文件的唯一标识,而不是文件名 。下图展示了怎样通过文件名来找到文件内容的 。注意:元数据中并不包含文件名 。文件名只是为了方便用户识别和记忆罢了 。
 
Linux的硬链接和软链接到底有什么区别?

文章插图
 
 
 
使用什么命令可以查看inode号?
可以使用stat和ls -i 命令查看,如下图所示:
 
Linux的硬链接和软链接到底有什么区别?

文章插图
 
 
 
什么是硬链接?硬链接是指通过索引节点来进行连接 。也就是存在多个文件名指向同一个inode 。这样就可以将重要的文件建立硬链接,来防止“误删”的操作 。
命令:
link oldfile newfile 可以创建硬链接 。硬链接的inode是相同的,但是文件名不同,所以它有一些特性:
  1. 文件有相同的inode和data blocks;
  2. 不能对不存在的文件创建硬链接
  3. 不能跨文件系统创建(因为在各自文件系统下inode是唯一的,当跨文件系统就会出现inode重复的情况发生)
  4. 不能对目录创建,只能对文件进行创建
  5. 如果删除了一个硬链接文件,并不会影响其他的同inode文件(inode中存在链接计数器,删除一个硬链接相当于计数器减一,反之加一 。直到为0,删除inode)
 
【Linux的硬链接和软链接到底有什么区别?】 
Linux的硬链接和软链接到底有什么区别?

文章插图
 
 
例如:
# ls -li total 0// 只能对已存在的文件创建硬连接# link test.file test_hard.link link: cannot create link `test_hard.link' to `test.file': No such file or directory# echo "This is an original file" > test.file # cat test.file This is an original file # stat test.fileFile: `test.file' Size: 25 Blocks: 8 IO Block: 4096 regular file Device: 807h/2055d Inode: 660650 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) ... // 文件有相同的 inode 号以及 data block # link test.file test_hard.link | ls -li total 8 660650 -rw-r--r-- 2 root root 25 Sep 1 17:44 test_hard.link 660650 -rw-r--r-- 2 root root 25 Sep 1 17:44 test.file// 不能交叉文件系统# ln /dev/input/event5 /root/bfile.txt ln: failed to create test_hard link `/root/bfile.txt' => `/dev/input/event5': Invalid cross-device link// 不能对目录进行创建硬连接# mkdir -p test.dir/test # ln test.dir/ test_hardlink.dir ln: `test.dir/': test_hard link not allowed for directory # ls -iF 660650 test_hard.link 657948 test.dir/ 660650 test.file具体的解释可以参考硬链接的5点特性 。
什么是软链接?软连接就和硬链接完全不同,软连接是用户数据(data blocks)中记录的是另一个文件的路径名的指向 。可以理解为软连接其实就是一个普通的文件,只是他的内容非常的特殊 。所以软连接有他自己的inode号以及data blocks 。那我总结下软连接的特性:
  1. 软连接有自己的文件属性
  2. 可以对不存在的文件创建


    推荐阅读