关于 Linux 环境中软链接和硬链接的理解
阅读了大量的资料后,觉得关于软链接和硬链接的问题有了一定的了解。
经过测试,本文会对这方面的知识作出一定的解释和说明。以下内容均为本人测试结果,大家可以在各种基于 linux 内核的系统上进行同步测试
首先,我们来看一下下面关于地址问题的例子
touch 123 //我们创建一个名为 123 的文件
ls -i //使用 ls -i 命令查看文件 123 的 inode 值
此时,返回值为
926561 123
说明我们创建的文件 123 的 inode 值为 926561
之后,我们执行下面的代码
mv 123 ../123 //利用 mv 指令将文件 123 移动到上级目录下
cd .. //返回上级目录
ls -i //使用 ls -i 命令查看文件 123 的 inode 值
此时,返回值为
926561 123
我们发现,文件 123 的 inode 值并没有发生改变
总结:使用 mv 指令移动文件的时候,并不会更改文件的 inode 值。
我们再来看看下面这个例子,我们继续对之前 mv 指令移动后的文件 123 进行操作
cp 123 789 //利用 cp 指令,复制文件 123 ,复制后的文件名为 789
ls -i //利用 ls -i 命令查看文件 123 和 789 的 inode 值
此时,返回值为
926561 123 928115 789
我们发现,复制出来的 789 的 inode 值发生了变化
总结:使用 cp 指令复制文件的时候,会对文件的 inode 值作出更改。
这里可能有的人就要问了,你这名字都不一样,是不是 inode 值和文件名有关系啊?
不会,我们可以使用 cp 123 ../123 指令将文件 123 复制到上级目录下,我们会发现复制出来的文件 123 的 inode 值依旧是改变的。
这里的 inode 值不变的情况,我们就称作 硬链接 ,inode 值发生变化的则称为 软链接 (也叫符号链接)。建立这种链接的好处在于可以解决 Linux 的文件共享问题,还可以有隐藏文件路径,增加权限安全及节省存储等效果。
硬链接和软链接也有它们的一些特性
硬链接的特性:
①文件有相同的 inode 及 data block
②只能对已存在的文件进行创建
③不能对交叉文件系统进行硬链接的创建
④不能对目录进行创建,只可以对文件进行创建
⑤删除一个硬链接文件,并不会影响其他拥有相同 inode 值的文件
软链接的特性:
①软连接有自己的文件属性及权限等
②可对不存在的文件或目录创建软链接
③软链接可以交叉文件系统
④软链接可以对文件或目录进行创建
⑤创建软链接的时候,链接计数 i_nlink 不会增加(这个可以看一下 Linux 内核中关于 inode 结构体的定义)
⑥删除软链接并不影响被指向文件,但若被指向的原文件被删除,则相关链接被称为 “死链接”(即 dangling link)。此时,若被指向文件被重新创建,死链接便恢复为软链接
这些特性均可以通过指令去测试,在这里我们就不一一测试了,大家如果有什么问题可以在下方留言
基于本人的理解,硬链接和软链接的特性和区别可以读一下下面本人创作的小故事来记忆一下。
硬链接的感觉就像烧好了一盘菜,本来你在一个人享用,突然过来一个人,和你一起吃这盘菜。这个时候,如果谁走了,都不会影响这盘菜的价值,依旧有人去吃完它,除非你人都走光了,那就相当于存储全部释放了,菜一丢,毫无痕迹保留。
而软链接的感觉则像是烧好了一盘菜,本来你一个人正在享用,这时候过来的人说他想吃和你点的一模一样的菜,但是不想一起吃,所以他自己点了一份。这个时候你如果离开了,他则会对菜产生一种怀疑,是不是菜有问题,所以无法继续吃下去。这个时候如果有人回来了,继续去吃第一份饭,他就会放下这种怀疑,继续吃直到吃完。
还有一个我们经常使用的指令 ln ,大家都知道它是用来创建文件链接的。请看以下的例子
ln 123 456 //建立链接
ls -i //利用 ls -i 命令查看文件 123 和 456 的 inode 值
此时,返回值为
926561 123 926561 456
我们发现,建立链接后的 456 的 inode 值并没有发生变化
总结:使用 ln 指令创建文件链接的时候,默认创建的就是硬链接
那么如何使用 ln 创建软链接呢?很简单,加上 -s 就可以了
ln -s 123 666 //建立符号链接(软链接)
ls -i //利用 ls -i 命令查看文件 123 和 666 的 inode 值
此时,返回值为
926561 123 925722 666
我们发现,建立链接后的 456 的 inode 值发生了变化
总结:使用 ln -s 指令创建文件链接的时候,默认创建的就是软链接
以上的内容均为本人的个人理解,如果有什么纰漏的地方,还希望大家多多指出。如果有什么疑问,也可以在下方留言给我
stay hungry! stay foolish!
上一篇: 在MySQL中使用序列的简单教程
下一篇: exp