一、前言之用户数据与元数据
在讲硬连接与软连接之前,我们需要明确2个概念:用户数据(user data)与元数据(metadata)。
什么是用户数据?什么是元数据?我用大家熟悉的windows系统举个例子。
对于上图的rocky文件夹,通过右键属性我们可以知道它的一些信息,比如文件名、创建时间、大小等数据,这种数据便是元数据,元数据是文件的附加属性。而用户数据则是文件数据块,数据块是保存文件实际内容的地方。
在Linux系统中,文件的元数据包含inode编号,inode编号是文件的唯一标识,操作系统可以通过inode编号找到文件存储用户数据的文件块。对操作系统不了解的同学看到这里可能有点懵,下面我对inode大概扩展说一下。
二、前言之inode编号
什么是inode编号?它也叫索引节点,是文件的一个属性,inode之于文件来说就相当于身份证编号之于人类,用来唯一的标识一个文件。
要理解inode,需要先了解一下文件存储。
文件存储是在硬盘上完成的,硬盘上最小的存储单位是“扇区”。操作系统读取硬盘数据的时候,不会去一个扇区一个扇区的找,这样找的效率非常低,所在操作是通过一次性连续的读取扇区来达到目的,也就是一次性读取一个“块”。一个块中包含多个连续的扇区,这里需要注意的是,扇区是物理层面实际存在的,而块是虚拟的概念,是文件系统的一个概念。另外,在磁盘的不同分区中,inode编号都是从1开始,也就是说它们的inode编号不是共用的,同一个inode编号在不同的分区中找到的数据是不一样的。
Linux系统如何通过inode找到用户数据?大致分为三步:
1、通过文件名和inode编号的映射找到文件名对应的inode编号;
2、通过inode编号获取inode中的信息
3、通过inode中信息找到用户数据所在的“块”
三、前言之ln命令
语法格式: ln [参数] [源文件或目录] [目标文件或目录]
参数 | 作用 |
空 | 对原文件常见硬连接 |
-s | 对原文件创建软连接 |
-f | 强制创建连接,即使目标文件存在 |
四、硬连接
1、本质
新增一个文件指向另外一个文件的inode,那么,这俩个文件互为硬连接。也就是多个文件名同时指向一个inode,这就是硬连接的本质。前文我们提到过,操作系统读取文件数据是通过inode去读取文件块的数据,也就是说这些互为硬连接的文件只是文件名(文件路径)不同罢了,通过它们获取到的数据是一致的。换个通俗易懂的说法,硬连接其实就是给原文件起了一个别名或者说支持了更多的文件路径去访问原文件数据。
2、实例
下面举个例子:
touch test.txt #在当前目录下创建test.txt文件
echo '123456' > test.txt #将字符写入到test.txt文件中
cat test.txt #查看test.txt的内容
ln test.txt test.txt.link #对test.txt新建一个硬连接test.txt.link
cat test.txt.link #查看test.txt.link的内容
ln test.txt.link test.txt.link2 #对test.txt.link新建一个硬连接test.txt.link2
cat test.txt.link2 #查看test.txt.link2的内容
思考:如果存在一个test.txt.link3,给他写入数据'654321',然后再以test.txt为原文件建立硬连接,查看test.txt.link3文件的时候,显示的数据是什么?
除此之外,还需要了解硬连接的一些特性:
a、不能跨分区和驱动器创建。因为每个分区的inode编号都是独立,无法共用同一个inode编号。
c、硬链接以文件副本的形式存在,但不占用实际空间。
d、删除一个硬链接文件并不影响其他有相同inode 号的文件。
e、不能交叉文件系统进行硬连接的创建。
五、软连接
1、本质
软连接也被称之为符号连接(symbolic Link)。软连接是建立一个独立的文件,这个文件的指向是目标的文件名,也就是这个文件中存储的原文件的路径信息。需要注意的是,创建的软连接文件的inode编号并不是一样的,而且占用了一个新的inode编号。
ln -s /root/abc.txt abc.txt.link
ln -s /root/abc.txt.link abc.txt.link
如上图所示,我建立了2个软连接,当我查看或修改abc.txt.link2的内容时,会先根据自己的文件名找到文件的inode编号,进而找到文件块中保存的原文件abc.txt.link的地址。而abc.txt.link会重复上面的操作,通过原文件abc.txt的路径,找到abc.txt,查看或修改它。
细心的小伙伴会发现,我在建立软连接时,原文件的路径是用的绝对路径,这是为什么呢?因为目标文件是通过存储的原文件的路径来找到原文件的,如果我们因为原文件在当前目录下而不加路径的话,目标文件是找不到原文件,所以我们需要用原文件的绝对路径或者以目标为初始的原文件的相对路径。
六、总结--------硬连接与软连接的区别
选项 | 硬链接 | 软链接 |
本质 | 本质是同一个文件 | 本质不是同一个文件 |
跨设备/分区 | 不支持 | 支持 |
inode | 相同 | 不同 |
链接数 | 创建新的硬链接,链接数会增加,删除硬链接, 链接数减少 | 创建或删除,链接数不会变化 |
文件夹 | 不支持 | 支持 |
相对路径 | 原始文件相对路径是相对于当前工作目录 | 原始文件相对路径是相对于链接文件 的相对路径 |
删除原文件 | 是链接数减一,但链接文件的访问不受影响 | 链接文件将无法访问 |
文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
七、生产事故分享
这个是真事,某同学在公司服务器上准备删除一个软链接文件,他是这样写的:
rm -rf /路径/软链接文件名称/
结果就是把源文件下面的所有数据都给删除了 !emmmmmm这样的话似乎只能找专业的数据恢复公司来处理了,大家引起重视。
之于原因嘛,当然就是最后这个/了。
所以大家在删除软链接的时候不要手抖在后面多加个/哈。
PS:写的不对的地方请大家多多指正!