Linux的软链接与硬链接
- 1,创建硬链接:
- 2,创建软链接:
- 3,软链接是什么
- 4,软链接文件的权限
- 5,硬链接是什么
- 6,做个小实验
- 总结
- 问题:为什么有软链接了(快捷方式)还需要硬链接?
1,创建硬链接:
ln 默认创建的是硬链接
touch file1
ln filename1 h1
2,创建软链接:
ln -s file1 s1
ls -l
可以查看文件的硬链接数 和 字节数(文件大小)
3,软链接是什么
查看文件和查看它的软链接,内容是一样的,即 cat file1
和cat s1
结果是一样的
可是软链接的大小并不是和原文件一样大,(用ls -l查看其字节数),因为它就是原文件的路径。
同样给file创建软链接file.s:
此时file.s大小为4字节:
用ln -s ./file file.s2
创建,其大小就是6字节:
如果把软链接file.soft放到别的目录下,cat file.soft
会报错没有该目录。因为软链接的内容就是原文件的目录,在别的文件夹下,相当于在别的文件夹下面cat ./file
,而那个文件夹下面并没有该文件。
windows里某个文件夹的快捷方式无论放在哪里都能打开到那个原文件夹(文件同理)。
Linux下想实现这种功能,那就得用绝对路径了:
ln -s 绝对路径 s3
该软链接的大小也变成13字节了:
注意,~
是用户目录的缩写,虽然创建的时候用的它,但是由上面是13字节可以得知,软链接的内容并不是~/file,不然就是6字节了
所以其实软链接就是个特殊的文件,文件的内容是被链接文件的路径(相对路径还是绝对路径看自己咋创建的)
但是查看它的时候,却是被链接文件的内容。
4,软链接文件的权限
原文件的权限如上,而软链接文件是全开放的rwxrwxrwx,这个只是代表软链接文件自己的权限(任何人都可以访问这个软链接),但是原文件的权限还是原先的-rw-rw-r–,至于能不能通过这个软链接来对原文件进行读写和修改,还得看源文件的权限(硬链接的权限则和原文件一样)
5,硬链接是什么
给file创建一个硬链接file.h,用ls -l
查看硬链接计数,文件file的硬链接计数起始值是1,现在变成2了
创建n个硬链接,那么硬链接计数是n+1;
对一个硬链接文件进行修改,其它文件也跟着变————这个在windows系统里没有类似机制
这个其实像指针,即多个指针指向同一个变量,可以通过指针来修改该变量。
其实就是文件系统里的inode
,用stat 文件名
可以查看inode,就是个编号,然后每个硬链接的inode一模一样
,都是原文件的inode号:
所有修改某个硬链接,那直接是找到对应的inode去修改的
硬链接的文件权限,也就和原文件一模一样,删除一个硬链接rm file.h -r
,只是硬链接计数-1,只有当硬链接计数为0时,这个文件才能被删除
软链接的inode则和原文件不同,因为它是不同的文件:
关于inode:
inode(index node)是一个存储文件或目录元数据的数据结构。每个文件或目录在文件系统中都有一个唯一的inode,该inode包含了文件或目录的属性信息和指向文件数据块的指针:
当我们访问一个文件时,操作系统会根据文件路径找到相应的inode,然后通过inode中的指针找到文件的实际数据块。inode的存在可以提高文件系统的性能,因为它可以减少文件路径的查找时间,同时也方便了文件的管理和操作。
注意:inode只存储文件和目录的元数据信息,而不包含文件的实际内容。文件的实际内容存储在数据块中,inode中的指针指向这些数据块
6,做个小实验
vi创建一个文件file,写上hello word
对file创建一个软链接s1和两个硬链接h1、h2,然后把file移动到别的目录下,可以看到软链接那有警报,闪烁:
软链接的文件类型是l,这个是链接的意思,而硬连接的文件类型是-,即文件(ASCII或二进制):
具体的可以用file h1
查看,是ASCII,如下:
此时file不在当前目录下了,那像前面说的,cat s1肯定会报错,因为s1就是文件的路径,相当于cat 路径
,然后vim 打开s1,会创建新文件s1.。。。就像这个文件被删了一样。
但是查看硬链接却可以:
因为查看硬链接h1,就是查看inode=138896292指向的文件。这个时候用vim打开h1,查看到的也是和file一样的内容,是hello word,h1文件的大小也和file一样是11字节,因为他们三个都是指向同一个文件。
删除原文件file或移动,其软链接就会失效,因为该路径指向的文件不存在了;删除软链接则就是删除一个目录文件,对原文件毫无影响;
删除原文件file则会使得硬连接数-1,h1和h2依然能查看原文件内容(因为这三个是平等的,都是同一个inode),删除硬链接同理。
总结
在Linux系统中,硬连接和软连接(也称为符号链接或软链接)都是文件系统中用于创建链接的方式,但它们有一些区别。
硬连接(Hard Link):
-
硬连接是通过在文件系统中创建一个新的目录项,将其链接到已存在的文件上来实现的。
-
硬连接与原始文件共享相同的inode,它们在文件系统中被视为相同的文件。
-
当任何一个硬链接被删除时,原始文件和其他的硬链接都不会受到影响,只是硬链接计数-1。只有当所有的硬链接和原始文件都被删除时,文件的内容才会被释放。原文件删除也是硬链接计数-1,硬链接和原文件是等价的,都是同一个inode。
它们实际上是同一个文件,只是文件名和路径不同。因此,对硬链接的修改会影响到原文件。
软连接(Symbolic Link):
- 软连接是创建一个指向目标文件或目录的特殊文件,它包含了目标文件的路径信息。
- 软连接与原始文件有不同的inode,它们在文件系统中被视为不同的文件。
- 当原始文件被删除或者移动时,软连接仍然存在,但是指向的目标文件将变为失效状态(因为软链接是原文件路径,此时会显示文件不存在)。删除软链接就是删除一个目录文件,对原文件毫无影响,它也没有软链接计数。
总结: 硬连接是文件系统中对同一个文件的多个链接,它们共享相同的inode和数据块,删除一个链接并不影响其他链接;而软连接是一个特殊的文件,它指向目标文件或目录的路径,删除或移动原始文件会导致软连接失效。硬连接不能跨越文件系统,而软连接可以跨越文件系统(一般一台linux是一个文件系统)。
注意文件权限:
硬链接的文件权限和原文件一样(毕竟共享同一个inode),而软链接则不是,它有自己的权限且默认是-rwxrwxrwx。通过软链接读的时候,权限是依据原文件的权限是否可读,而不是软链接文件本身(其本身是rwx全开)
问题:为什么有软链接了(快捷方式)还需要硬链接?
虽然软链接在某些方面更灵活,但硬链接也有其独特的优势。相对于软链接,硬链接占用的磁盘空间更小,因为它们共享相同的inode。另外,硬链接对于备份和恢复数据更方便,因为它们不会丢失或失效,即使目标文件或目录被删除