Linux系统编程10_硬链接与软链接

理解硬链接和软链接概念前,需要先了解文件和iNode相关背景知识:

Linux系统编程5_文件描述符:https://www.cnblogs.com/grooovvve/p/14076856.html

Linux系统编程9_iNode机制:https://www.cnblogs.com/grooovvve/p/14214029.html

索引节点(inode)
要了解链接,我们首先得了解一个概念,叫索引节点(inode)。

在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号,我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。

文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。系统是通过索引节点(而不是文件名)来定位每一个文件。

硬链接:

保存在系统的每一个文件,系统会对该文件创建一个索引节点。
在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。
硬链接是指通过索引节点对文件的链接。
硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。

对于硬链接的读写和修改等操作和软链接是一样的。
在硬链接中如果删除原文件会引起“引用计数”减1的变化,只要“引用计数”不为零,则硬链接文件仍然存在,而且保留了原有的内容 ,这样就可以防止误操作删除源文件。但是硬链接文件只能在同一个文件系统中。

软链接:

符号链接又称为软链接,和windows的快捷方式相似,符号链接文件中并不包括实际的文件数据,而只是包括了它指向文件的路径。

它可以链接到任意文件和目录,包括处于不同文件系统的文件以及目录。当用户对链接文件操作时,系统会自动的转到对源文件的操作,但是删除链接文件时,并不会删除源文件。

软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,

而且在软链接的 block 中,写的不是真正的数据,而仅仅是指向文件的文件名及 inode 号。



硬链接的特点:

硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。

硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,

目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。

硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,

没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。



相关操作:

ln命令来建立硬链接。

//源文件是被链接的文件,注意:软链接的文件必须写成绝对路径

ln 源文件 目标文件 

ln -s 源文件 目标文件

ls -i     //可以查看inode号码,inode 号就相当于文件 ID

软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;

其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多;

而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接



查找文件的步骤:

当我们查找一个文件,比如 /root/test 时,要经过以下步骤:

1、首先找到根目录的 inode(根目录的 inode 是系统已知的,inode 号是 2),然后判断用户是否有权限访问根目录的 block。

2、如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号。

3、通过 /root/ 目录的 inode 号,可以查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block。

4、如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号。

5、通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block。

6、如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问。



参考链接:

Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版:http://c.biancheng.net/view/740.html

原文地址:https://www.cnblogs.com/grooovvve/p/14214098.html