|
|
51CTO旗下网站
|
|
移动端

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

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

作者:源理君来源:技术原理君|2019-06-21 10:52
188bet uedbet 威廉希尔 明升 bwin 明升88 bodog bwin 明升m88.com 18luck 188bet unibet unibet Ladbrokes Ladbrokes casino m88明升 明升 明升 m88.com 188bet m88 明陞 uedbet赫塔菲官网 365bet官网 m88 help
188bet www.188bet.com bwin 平博 unibet 明升 188bet uk Ladbrokes 德赢vwin 188bet m88.com w88 平博88 uedbet体育 188bet 188bet 威廉希尔 明升体育app 平博88 M88 Games vwin德赢 uedbet官网 bodog fun88 188bet

 简介

我们现代的威廉希尔需要防止程序崩溃导致信息丢失,需要将信息存储在文件之中。而且文件能够被多个进程同时读取。在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/ 

具体的解释:略

【编辑推荐】

  1. 如何用Linux帮助你拼写?
  2. 你的Linux服务器果真得到保护了吗?
  3. Neofetch:在终端中显示Linux系统信息
  4. 在AppImage、Flathub和Snapcraft平台上搜索Linux应用
  5. Linux后端程序成长关键技术之底层体系结构
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

384人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

Spring Boot 爬虫搜索轻松游

Spring Boot 爬虫搜索轻松游

全栈式开发之旅
共4章 | 美码师

87人订阅学习

读 书 +更多

实时UML与Rational Rose RealTime建模案例剖析

本书将实时系统、实时统一建模语言、实时系统的统一开发过程和Rational Rose RealTime建模环境有机地结合起来,以案例为基础,系统地介绍了...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客