linux下软链接和硬链接

背景知识

在Linux的文件系统中,文件(目录也是一个文件)都由inode和block两部分组成。inode和block都有相应的编号,在文件系统格式化的时候就已经确定下来了。

  • block:记录了实际文件的内容(一个block大小一般在1K,2K,4K这是格式化是确定的),一个文件会占用一个或多个block
  • inode:记录了文件的属性(读写权限,所有者等)及文件内容所在的block号,一个文件仅占用一个inode,不同文件有不同的inode号

目录其实也是一个文件,也有inode和block号。而block则是记录这个目录下的所有文件的文件名与该文件名对应的inode号。在文件的inode中并没有文件名的记录,文件名的记录在目录的block中。

读取一个文件:

  1. 通过文件所在目录的block中记录的文件名,找到对应文件的inode号
  2. 文件对应的inode记录了文件内容所在的block号
  3. 通过读取相应block,就可以读取到文件的内容了

通过ls -i可以列出文件的inode

zzd@ubuntu:/$ 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
root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0  311 20:29 a

仔细观察第三列的数据,从1变成2了
root@debian:/home/sda4/xvr/debug/test# ln a b
root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 2 root root 0  311 20:29 a
3157589 -rw-r--r-- 2 root root 0  311 20:29 b

通过硬链接你可以任意操作文件a/b,并且所做的任何更改都会作用到这两个文件(例如:新增/删除/修改文件权限等),因为其实a和b这两个文件名,代表的都是inode:3157589

a和b都没有执行权限
root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 2 root root 0  311 20:29 a
3157589 -rw-r--r-- 2 root root 0  311 20:29 b

这里只给a增加了可执行权限x
root@debian:/home/sda4/xvr/debug/test# chmod u+x a

看,a和b都有可执行权限了
root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rwxr--r-- 2 root root 0  311 20:29 a
3157589 -rwxr--r-- 2 root root 0  311 20:29 b

当你删除一个硬链接时,对应inode的链接数就会-1,当某个inode的链接数减到0时,系统就会释放这个inode和相应的block,从而达到删除文件的目的

当把b删除后,对应3157589的链接数变成1了,当变成0时,就会删掉
root@debian:/home/sda4/xvr/debug/test# rm b
root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0  311 20:29 a

你应该有听到过,硬链接不能跨文件系统创建,也不能创建目录的硬链接,那你知道究竟是为什么吗?

  1. 为什么硬链接不能跨文件系统

    • 如果有了解过linux的文件系统,你会知道,每个文件系统都有自己的inode table(也就是说,不同的文件系统有自己独立的inode号,在这个文件系统inode号3157589和另一个文件系统的inode号3157589不是同一个文件)
  2. 为什么不能创建目录的硬链接

    • 根据我个人的理解,这个主要是防止造成死循环。例如你在/a/b 目录下新建了一个 /a的硬链接,那这样就会导致目录可以无限的延长下去

在这里插入图片描述

软链接

好了,有了硬链接的知识,再来看软链接就好理解很多了。事实上,软链接就是再建立一个独立的文件,而这个文件会让数据的读取指向它link的那个文件名

root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0  311 20:56 file1

通过下面软链接file2的inode号,应该就能知道,其实file1和file2是两个不同的文件
root@debian:/home/sda4/xvr/debug/test# ln -s file1 file2
root@debian:/home/sda4/xvr/debug/test# ll -i
3157589 -rw-r--r-- 1 root root 0  311 20:56 file1
3157590 lrwxrwxrwx 1 root root 5  311 20:57 file2 -> file1

用readlink命令查看file2这个软链接实际的文件内容,你会发现,其实file2文件的内容就是file1!
root@debian:/home/sda4/xvr/debug/test# readlink file2 
file1

由于只是利用文件来作为指向的动作,所以,当把源文件file1删除之后,file2这个链接文件就不能打开了

看,明明只是删除了file1,但是就连file2也打不开了
root@debian:/home/sda4/xvr/debug/test# rm file1
root@debian:/home/sda4/xvr/debug/test# cat file2
cat: file2: 没有那个文件或目录
root@debian:/home/sda4/xvr/debug/test# ll -i
3157590 lrwxrwxrwx 1 root root 5  311 20:57 file2 -> file1

其实,linux下的软链接可以和windows的快捷方式划上等号
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值