Linux下面的连接文件有2种:一种是类似与Windows的快捷方式功能的文件,可以让我们快速连接到目标文件,称为符号连接(symbolic link);另一种则是通过文件系统的inode连接产生新文件名,而不是产生新文件,称为硬连接(hard link)。

一、hard link(硬连接或实际连接)

在linux文件系统中,每个文件都会占用一个inode,文件内容由inode的记录来指向(block)。想要读取该文件,必须要通过目录记录的文件名来指向正确的inode号码才能读取。也即:文件名只与目录有关,文件内容与inode有关。hard link就是有多个文件名对应到同一个inode号码,它只是在某个目录下面新建一条文件名连接到某inode号码的关联记录而已。

实际连接的文件读取示意图如下:


根据上图,我们可以通过1或2的目录inode指定的block找到两个不同的文件名,而不管使用哪个文件名都可以指到real那个inode去读取到最终的数据。这样做的最大的好处就是安全。如果用户将任何一个文件名删除,其实inode和block都还是存在的。此时可以通过另一个“文件名”来读取到正确的文件数据。此外,不论使用那个文件名来编辑都可以将结果写入到相同的inode和block中。

一般来说,使用hard link设置连接文件时,磁盘的空间与inode数目都不会改变。它只是在某个目录下的block多写入一个关联数据而已。特殊情况就是,将要添加这条数据到某个block时它刚好满了,这样会导致磁盘空间的变化。不过,一般hard link用掉的关联数据都很小,所以通常不会改变inode与磁盘空间的大小。

注意:hard link仅能在单一文件系统里进行。

而且:不可以连接到目录。因为连接到目录的时候,连接的数据需要连同被连接的目录下面的所有数据都建立连接。


二、symbolic link(符号连接,即快捷方式)

它也叫软连接,是创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。当源文件被删除之后,symbolic link会打开不了。

符号连接文件读取示意图如下:


由1号inode读取到连接文件的内容仅有文件名,根据文件名连接到正确的目录去取得目标文件的inode。最终读取到正确的数据。

symbolic link会占用inode和block。

需要注意的是,改动symbolic link文件时,其实改动的就是源文件。

软连接可以跨文件系统,也可以和目录连接。

实例:

分别创建文件linktest的硬连接link1和软连接link2.ln命令不加任何参数时,默认创建硬连接。

可以看出,硬连接文件和源文件的属性完全相同,包括inode号码。

下面删除源文件,发现硬连接仍然可以读取,而软连接不能读取。


GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐