从文件的组成到硬链接和软链接的区别

文件的组成

在Linux 中表示一个文件通常是通过两个部分表示的,它们分别是:用户数据(user data)、元数据(meta data)。

用户数据:真实记录文件内容的数据,这些数据是存放在一个个大小相等的数据块中(data block )。
元数据:文件的属性,例如,文件类型、索引号、属主属组、文件大小等(文件名不属于文件属性)。我们用索引号(inode号)来表示每一个文件的元数据。


inode号的内容

inode包含文件的元信息,具体来说有以下内容:

   * 文件的字节数
  * 文件拥有者的User ID
  * 文件的Group ID
  * 文件的读、写、执行权限
  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  * 链接数,即有多少文件名指向这个inode
  * 文件数据block的位置
可以用stat命令,查看某个文件的inode信息:

系统如何搜索文件内容

在Linux 中,inode号才是文件的唯一标识,而不是文件名。每个inode都有一个号码,在Unix/Linux系统内部不使用文件名,而是通过inode号来识别文件的。实际上,系统内部是通过以下三个步寻找文件内容的:

  1. 首先,系统通过输入的文件名找到对应的inode号码;
  2. 然后通过这个inode号码,找到inode的信息;
  3. 通过inode信息找到文件数据的block块的位置,读取数据。

硬链接

硬链接实际上就是文件的一个别名,可以通过'ls -li'查看到硬链接和源文件的inode号是相同的。
他们的文件数据的block块都指向磁盘的同一个位置。所以硬链接被删除,文件不会被删除,删除源文件,硬链接也依然有效。所以想删除一个文件,就要删除他的所有硬链接和源文件。而且硬链接只能对文件进行创建。

  1. 文件有相同的inode和data block
  2. 只能对已经存在文件进行创建
  3. 不能对目录进行创建
  4. 删除一个硬链接文件,并不影响其他有相同inode号的文件
[root@whb test]# ll
total 4
-rw-r--r-- 1 root root 11 Dec  6 15:01 abc.txt
[root@whb test]# ln abc.txt vvv.txt        #创建硬链接
[root@whb test]# ls -li      #他们的inode号相同
total 0
201621461 -rw-r--r-- 2 root root 0 Dec  6 15:42 abc.txt
201621461 -rw-r--r-- 2 root root 0 Dec  6 15:42 vvv.txt.txt
[root@whb test]# cat abc.txt 
I help you
[root@whb test]# cat vvv.txt 
I help you
[root@whb test]# rm -rf abc.txt           #删除硬链接的源文件
[root@whb test]# ll
total 4
-rw-r--r-- 1 root root 11 Dec  6 15:01 vvv.txt     
[root@whb test]# cat vvv.txt         #文件内容还在
I help you

#目录无法创建硬链接
[root@whb test]# mkdir test        
[root@whb test]# ll
total 0
-rw-r--r-- 2 root root 0 Dec  6 15:42 abc.txt
drwxr-xr-x 2 root root 6 Dec  6 15:44 test
-rw-r--r-- 2 root root 0 Dec  6 15:42 vvv.txt
[root@whb test]# ln test/  test2     #显示硬链接不允许对目录操作1
ln: ‘test/’: hard link not allowed for directory

软链接

软链接与硬链接不同,软链接用户数据块中存放的内容是另一文件的路径名的指向。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:

  1. 软链接有这自己的文件属性和权限,比如inode号
  2. 软链接可对文件和目录创建
  3. 可对不存在的文件或者目录创建软链接
  4. 软链接可交叉文件系统;
  5. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
[root@whb ~]# touch    test.log
[root@whb ~]# ll
total 0
-rw-r--r--. 1 root root 0 Dec  5 19:58 test.log
[root@whb ~]# ln -s  test.log   test        #相对路径创建
[root@whb ~]# ll
total 0
lrwxrwxrwx. 1 root root 8 Dec  5 19:58 test -> test.log
-rw-r--r--. 1 root root 0 Dec  5 19:58 test.log
[root@whb ~]# ln  -s  /root/test.log   /root/test.txt       #绝对路径创建
[root@whb ~]# ll
total 0
lrwxrwxrwx. 1 root root  8 Dec  5 19:58 test -> test.log
-rw-r--r--. 1 root root  0 Dec  5 19:58 test.log
lrwxrwxrwx. 1 root root 14 Dec  5 19:59 test.txt -> /root/test.log

[root@whb ~]# cp -a   test.txt   /opt/
[root@whb ~]# ll /opt/
total 4481024
-rw-r--r--. 1 root root 4588568576 Dec  3 20:08 CentOS-7-x86_64-DVD-1810.iso
lrwxrwxrwx. 1 root root         14 Dec  5 19:59 test.txt -> /root/test.log
[root@whb ~]# cp -a test  /opt/
[root@whb ~]# ll /opt/
total 4481024
-rw-r--r--. 1 root root 4588568576 Dec  3 20:08 CentOS-7-x86_64-DVD-1810.iso
lrwxrwxrwx. 1 root root          8 Dec  5 19:58 test -> test.log     #失效
lrwxrwxrwx. 1 root root         14 Dec  5 19:59 test.txt -> /root/test.log

[root@whb ~]# ln -s  /root/data/   /opt/data        #对目录创建软连接
[root@whb ~]# ll /opt/
total 4481024
-rw-r--r--. 1 root root 4588568576 Dec  3 20:08 CentOS-7-x86_64-DVD-1810.iso
lrwxrwxrwx. 1 root root         11 Dec  5 20:05 data -> /root/data/
lrwxrwxrwx. 1 root root          8 Dec  5 19:58 test -> test.log
lrwxrwxrwx. 1 root root         14 Dec  5 19:59 test.txt -> /root/test.log
[root@whb ~]# 

#可对不存在的文件和目录创建软链接
[root@whb test]# ll
total 0
[root@whb test]# ln -s abc abc_link
[root@whb test]# ll      #由于源文件不存在,所有此软链接实际上是无效的
total 0
lrwxrwxrwx 1 root root 3 Dec  6 22:07 abc_link -> abc

软连接与硬链接的区别:

1.从概念:软连接相当于Windows上面的快捷方式,硬链接就是有相同的inode号的文件
2.从创建:ln -s 创建软连接,ln命令默认创建硬链接
3.从创建对象:软连接可以对文件目录创建,可以跨区创建,而硬链接只能对文件创建
4.从删除原理:
删除软连接,对源文件和硬链接没有影响
删除硬链接,对源文件和软连接也是没有影响
删除源文件,对硬链接没有影响,软连接会失效,出现红底白字闪烁
只有删除了源文件和所有的硬链接文件,文件才回被真正的删除。

点赞

发表回复