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