太长不想看:
硬链接:就是给文件起个别名,inode和文件内容是一样的,不能跨文件系统,不能对不存在的文件创立链接。
软连接:类似与window是快捷方式,软连接就是普通文件,文件里面存的是被链接文件的地址,
可以跨文件系统,可以对不存在的文件创立链接。
文件的组织:
在Linux文件被分为两部分:文件元数据(文件名、inode)和用户数据(数据块)
|--------------------------------------------------
|文件名 —> inode —> 数据块
|--------------------------------------------------
|<--------元数据------>|<-用户数据------>|
用户的真实数据存储在数据块,系统为了方面对数据的管理对每个文件添加了文件元数据,其中inode记录了文件的创建、修改时间,文件宿主、数据块地址等信息(不包括文件名),inode是文件的唯一标识(而非文件名,文件名的存在是方面人类识别和操作)。
我是可掠过的题外话:
既然inode中不包含文件名,那我们操作文件名,例如$cd Dowload是怎么实现的呢?
这时候就要说一下目录是什么鬼了,Linux系统对目录和文件一样对待,即目录也是文件,目录中存的是当前目录下的文件信息罢了。这些信息包括:偏移量、inode、文件名。
|----偏移量—|------inode—|---文件名—|
| 0 |6684632|.
| 16 |6684639|…
| 32 |6684684|Makefile
| 48 |6684679|Dowload
每个进程有自己的当前工作目录,当使用$cd Dowload命令时便会在进程当前工作目录中查找对应文件名从而获取其inode(6684679),然后获得Dowload文件中数据。
正文
为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)
硬链接:
link oldfile newfile
ln oldfile newfile
硬链接是对已有起的别名,既然是别名,不能无中生有对不存在的文件其别名,oldfile必须是已存在的文件。另外,newfile与oldfile共用inode,即硬链接不会产生新的inode。
由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
- 文件有相同的 inode 及 data block;
- 只能对已存在的文件进行创建; 不能交叉文件系统进行硬链接的创建;
- 不能对目录进行创建,只可对文件创建;
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件
为何不能对目录创建硬链接,是因为,每个目录下有两个隐藏文件(.<本地目录>和…<上层目录>),通过$ll可以看到,而这两个文件本身就是硬链接,即.文件的inode和文本见的inode相同,可以通过$ls -i或stat参看文件inode。若对目录使用硬链接,会造成环路。
软连接:
ln -s oldfile newfile
链接就是一个普通文件,只是数据块内容有点特殊(数据块中存放的内容是另一文件的路径名的指向)。软链接有着自己的 inode 号以及用户数据块。
因此,软连接没有硬链接那么多限制:
- 软连接有自己的inode文件属性和权限
- 可对不存在的文件创立软连接
- 软连接可跨文件系统
- 软连接可对文件或目录创建
- 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。