一、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号码。
下面删除源文件,发现硬连接仍然可以读取,而软连接不能读取。