文件的组成
在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号来识别文件的。实际上,系统内部是通过以下三个步寻找文件内容的:
- 首先,系统通过输入的文件名找到对应的inode号码;
- 然后通过这个inode号码,找到inode的信息;
-
通过inode信息找到文件数据的block块的位置,读取数据。
硬链接
硬链接实际上就是文件的一个别名,可以通过'ls -li'查看到硬链接和源文件的inode号是相同的。
他们的文件数据的block块都指向磁盘的同一个位置。所以硬链接被删除,文件不会被删除,删除源文件,硬链接也依然有效。所以想删除一个文件,就要删除他的所有硬链接和源文件。而且硬链接只能对文件进行创建。
- 文件有相同的inode和data block
- 只能对已经存在文件进行创建
- 不能对目录进行创建
- 删除一个硬链接文件,并不影响其他有相同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 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
- 软链接有这自己的文件属性和权限,比如inode号
- 软链接可对文件和目录创建
- 可对不存在的文件或者目录创建软链接
- 软链接可交叉文件系统;
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 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.从删除原理:
删除软连接,对源文件和硬链接没有影响
删除硬链接,对源文件和软连接也是没有影响
删除源文件,对硬链接没有影响,软连接会失效,出现红底白字闪烁
只有删除了源文件和所有的硬链接文件,文件才回被真正的删除。