怎样理解Linux的软连接和硬链接?

系统 Linux
我们现代的操作系统需要防止程序崩溃导致信息丢失,需要将信息存储在文件之中。而且文件能够被多个进程同时读取。在Linux中所以的资源,外设都抽象成了文件,所以就有了Linux中“一切皆文件”的特性。

 简介

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

 

目录是什么?

在Linux中“一切皆文件”,所以这个问题很好回答:目录也是文件。目录中记录的是目录下文件名。那既然是文件,如果在创建目录的时候,与当前目录下的文件或目录重名,就肯定会创建失败。

好了,既然搞清楚了目录的概念,我们接着往下看。

硬链接和软连接区别?

在Linux中表示一个文件的方式是通过两个部分来分别表示的:用户数据(user data)与元数据(meta data)。什么是用户数据呢?用户数据就是记录真实文件内容的数据,这些数据是存放在一个个大小相等的文件数据块中(data block)。

元数据呢?其实就是这个文件的附加信息属性,例如:创建时间,文件大小等等这类信息。我们用索引号(inode)来表示每一个不同文件的元数据(当然inode也是元数据的一部分)。在Linux中,inode才是表示文件的***标识,而不是文件名。下图展示了怎样通过文件名来找到文件内容的。注意:元数据中并不包含文件名。文件名只是为了方便用户识别和记忆罢了。

 

使用什么命令可以查看inode号?

可以使用stat和ls -i 命令查看,如下图所示:

 

什么是硬链接?

硬链接是指通过索引节点来进行连接。也就是存在多个文件名指向同一个inode。这样就可以将重要的文件建立硬链接,来防止“误删”的操作。

命令:

  1. link oldfile newfile  

可以创建硬链接。硬链接的inode是相同的,但是文件名不同,所以它有一些特性:

  1. 文件有相同的inode和data blocks;
  2. 不能对不存在的文件创建硬链接
  3. 不能跨文件系统创建(因为在各自文件系统下inode是***的,当跨文件系统就会出现inode重复的情况发生)
  4. 不能对目录创建,只能对文件进行创建
  5. 如果删除了一个硬链接文件,并不会影响其他的同inode文件(inode中存在链接计数器,删除一个硬链接相当于计数器减一,反之加一。直到为0,删除inode)

 

例如:

  1. # ls -li  
  2. total 0  
  3.   
  4. // 只能对已存在的文件创建硬连接 
  5. # link test.file test_hard.link  
  6. link: cannot create link `test_hard.link' to `test.file'No such file or directory  
  7.   
  8. # echo "This is an original file" > test.file  
  9. # cat test.file  
  10. This is an original file  
  11. # stat test.file  
  12.  File: `test.file' 
  13.  Size: 25           Blocks: 8          IO Block: 4096   regular file  
  14. Device: 807h/2055d      Inode: 660650      Links: 2  
  15. Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)  
  16. ...  
  17. // 文件有相同的 inode 号以及 data block  
  18. # link test.file test_hard.link | ls -li  
  19. total 8  
  20. 660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 test_hard.link  
  21. 660650 -rw-r--r-- 2 root root 25 Sep  1 17:44 test.file  
  22.   
  23. // 不能交叉文件系统 
  24. # ln /dev/input/event5 /root/bfile.txt  
  25. ln: failed to create test_hard link `/root/bfile.txt' => `/dev/input/event5':  
  26. Invalid cross-device link  
  27.   
  28. // 不能对目录进行创建硬连接 
  29. # mkdir -p test.dir/test  
  30. # ln test.dir/ test_hardlink.dir  
  31. ln: `test.dir/': test_hard link not allowed for directory  
  32. # ls -iF  
  33. 660650 test_hard.link  657948 test.dir/  660650 test.file 

具体的解释可以参考硬链接的5点特性。

什么是软链接?

软连接就和硬链接完全不同,软连接是用户数据(data blocks)中记录的是另一个文件的路径名的指向。可以理解为软连接其实就是一个普通的文件,只是他的内容非常的特殊。所以软连接有他自己的inode号以及data blocks。那我总结下软连接的特性:

  1. 软连接有自己的文件属性
  2. 可以对不存在的文件创建
  3. 软链接可以跨文件系统
  4. 软链接可以对目录创建
  5. 软链接创建不会造成链接计数器增加,因为就不是同一个inode
  6. 若链接的文件被删除了,该链接就是没有意义了,但是也可以重新创建。

下图展示下软链接的访问过程:

 

例如:

  1. # ls -li  
  2.  total 0  
  3.   
  4.  // 可对不存在的文件创建软链接 
  5.  # ln -s test.file test_soft.link  
  6.  # ls -liF  
  7.  total 0  
  8.  789467 lrwxrwxrwx 1 root root 8 Sep  1 18:00 test_soft.link -> test.file  
  9.   
  10.  // 由于被指向的文件不存在,此时的软链接 test_soft.link 就是死链接 
  11.  # cat test_soft.link  
  12.  cat: test_soft.link: No such file or directory  
  13.   
  14.  // 创建被指向的文件 test.file,test_soft.link 恢复成正常的软链接 
  15.  # echo "This is an original file_A" >> test.file  
  16.  # cat test_soft.link  
  17.  This is an original file_A  
  18.   
  19.  // 对不存在的目录创建软链接 
  20.  # ln -s test.dir test_soft.link.dir  
  21.  # mkdir -p test.dir/test  
  22.  # tree . -F --inodes  
  23.  .  
  24. ├── [ 789497]  test.dir/  
  25. │   └── [ 789498]  test/  
  26. ├── [ 789495]  test.file  
  27. ├── [ 789495]  test_soft.link -> test.file  
  28. └── [ 789497]  test_soft.link.dir -> test.dir/ 

具体的解释:略

责任编辑:武晓燕 来源: 技术原理君
相关推荐

2018-11-09 10:10:09

Linux硬链接软链接

2018-11-09 10:30:05

Linux硬链接软链接

2017-01-15 15:27:51

Linux软连接和硬链接

2019-11-01 11:06:02

Linux操作系统Windows

2020-06-01 19:00:42

Linux软链接硬链接

2022-02-28 09:44:09

Linux硬链接软链接

2023-11-15 08:27:46

Linux系统

2022-10-21 08:18:54

Linuxln 命令

2021-06-18 08:15:37

Linux软链接硬链接

2019-04-12 14:26:17

Linux命令文件

2011-01-11 10:29:35

Linux文件

2010-05-04 13:09:21

Unix操作系统

2019-09-24 19:00:41

Linuxrm命令unlink命令

2021-07-16 10:20:56

Linux 硬链接Linux 系统

2023-07-25 16:55:15

Linuxinode

2023-03-05 16:36:14

Linux链接目标文件

2019-12-10 09:53:27

LinuxCacheBuffer

2011-01-18 11:31:37

2010-07-09 10:13:42

UDP协议

2021-08-27 15:03:51

PythonC语言数组
点赞
收藏

51CTO技术栈公众号