linux下软链接和硬链接
背景知识
在Linux的文件系统中,文件(目录也是一个文件)都由inode和block两部分组成。inode和block都有相应的编号,在文件系统格式化的时候就已经确定下来了。
- block:记录了实际文件的内容(一个block大小一般在1K,2K,4K这是格式化是确定的),一个文件会占用一个或多个block
- inode:记录了文件的属性(读写权限,所有者等)及文件内容所在的block号,一个文件仅占用一个inode,不同文件有不同的inode号
目录其实也是一个文件,也有inode和block号。而block则是记录这个目录下的所有文件的文件名与该文件名对应的inode号。在文件的inode中并没有文件名的记录,文件名的记录在目录的block中。
读取一个文件:
- 通过文件所在目录的block中记录的文件名,找到对应文件的inode号
- 文件对应的inode记录了文件内容所在的block号
- 通过读取相应block,就可以读取到文件的内容了
通过ls -i可以列出文件的inode
[email protected]:/$ ls -i
inode号
655361 drwxr-xr-x 2 root root 4096 Jun 3 2018 bin
393217 drwxr-xr-x 3 root root 4096 Jun 3 2018 boot
1054543 drwxrwxr-x 2 root root 4096 Apr 19 2017 cdrom
硬链接
文件名只与目录有关,但是文件内容则与inode有关。那么想一想,有没有可能有多个文件名对应到同一个inode号呢?那就是硬链接的由来。简单的说:创建一个硬链接,只是在某个目录下新增一笔文件名与inode号的关联记录而已。
你会发现两个文件名都链接到3157589这个inode号。再仔细观察你会发现,这两个文件名的权限/属性完全一样(前面有说到:inode记录的是文件的属性和block号)。而且,你也会发现,第三列的值从1变成2了,这个字段的意义为:有多少个文件名链接到这个inode号的意思
现在要新建一个文件 a 的硬链接 b
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0 3月 11 20:29 a
仔细观察第三列的数据,从1变成2了
[email protected]:/home/sda4/xvr/debug/test# ln a b
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 2 root root 0 3月 11 20:29 a
3157589 -rw-r--r-- 2 root root 0 3月 11 20:29 b
通过硬链接你可以任意操作文件a/b,并且所做的任何更改都会作用到这两个文件(例如:新增/删除/修改文件权限等),因为其实a和b这两个文件名,代表的都是inode:3157589
a和b都没有执行权限
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 2 root root 0 3月 11 20:29 a
3157589 -rw-r--r-- 2 root root 0 3月 11 20:29 b
这里只给a增加了可执行权限x
[email protected]:/home/sda4/xvr/debug/test# chmod u+x a
看,a和b都有可执行权限了
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rwxr--r-- 2 root root 0 3月 11 20:29 a
3157589 -rwxr--r-- 2 root root 0 3月 11 20:29 b
当你删除一个硬链接时,对应inode的链接数就会-1,当某个inode的链接数减到0时,系统就会释放这个inode和相应的block,从而达到删除文件的目的
当把b删除后,对应3157589的链接数变成1了,当变成0时,就会删掉
[email protected]:/home/sda4/xvr/debug/test# rm b
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0 3月 11 20:29 a
你应该有听到过,硬链接不能跨文件系统创建,也不能创建目录的硬链接,那你知道究竟是为什么吗?
-
为什么硬链接不能跨文件系统
- 如果有了解过linux的文件系统,你会知道,每个文件系统都有自己的inode table(也就是说,不同的文件系统有自己独立的inode号,在这个文件系统inode号3157589和另一个文件系统的inode号3157589不是同一个文件)
-
为什么不能创建目录的硬链接
- 根据我个人的理解,这个主要是防止造成死循环。例如你在/a/b 目录下新建了一个 /a的硬链接,那这样就会导致目录可以无限的延长下去
软链接
好了,有了硬链接的知识,再来看软链接就好理解很多了。事实上,软链接就是再建立一个独立的文件,而这个文件会让数据的读取指向它link的那个文件名
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0 3月 11 20:56 file1
通过下面软链接file2的inode号,应该就能知道,其实file1和file2是两个不同的文件
[email protected]:/home/sda4/xvr/debug/test# ln -s file1 file2
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0 3月 11 20:56 file1
3157590 lrwxrwxrwx 1 root root 5 3月 11 20:57 file2 -> file1
用readlink命令查看file2这个软链接实际的文件内容,你会发现,其实file2文件的内容就是file1!
[email protected]:/home/sda4/xvr/debug/test# readlink file2
file1
由于只是利用文件来作为指向的动作,所以,当把源文件file1删除之后,file2这个链接文件就不能打开了
看,明明只是删除了file1,但是就连file2也打不开了
[email protected]:/home/sda4/xvr/debug/test# rm file1
[email protected]:/home/sda4/xvr/debug/test# cat file2
cat: file2: 没有那个文件或目录
[email protected]:/home/sda4/xvr/debug/test# ll -i
3157590 lrwxrwxrwx 1 root root 5 3月 11 20:57 file2 -> file1
其实,linux下的软链接可以和windows的快捷方式划上等号