关于Linux中的链接

来源:互联网 发布:数据加密保密性 编辑:程序博客网 时间:2024/05/31 06:24

转载进注明出处:http://blog.csdn.net/footman_/article/details/6871688

1 索引节点(index node)

       Linux文件系统中,每个磁盘柱面都存在2个部分,即索引节点inode和实际数据块block。内核为每个文件分配一个称为索引节点的inode(该inode在系统中是唯一的),inode包含了文件的所有者、文件长度、文件所在的设备、指向文件block在磁盘上所在位置的指针等等。

       文件系统就是通过inode定位到每一个文件的,而不是通过文件名。每个文件系统各自对它们的inode进行编号,在访问文件时,inode号被复制到内存中,使得系统快速找到其对应的block,但这个inode号并不存储在inode中,而是存储在目录项中(directory entry)。

       通过“ls -i”命令可以查看文件的inode号。

2 目录项(directory entry)

         目录项就是一个存储文件inode号和文件名的结构。目录项内存储着文件inode号和文件名(这里的文件名指的是完整路径名),但目录项和inode号并不是一一对应的,多个目录项目可以存储同一个inode号(但是文件名不能重复),也就是说多个目录项可以对应于同一个文件。

       常见的文件重命名过程就是对目录项进行操作的过程。当在不更换文件系统情况下为一个文件更名时,该文件的实际内容并未移动,只需构造一个指向现有inode的新目录项,并解除与旧目录项的链接。这是使用目录项的好处之一。

3 硬链接(hard link)

         文件存在多少个具有相同inode号的目录项,就称这个文件有多少个硬链接。硬链接类似于一个文件多个名字,创建硬链接时内核不必为它重新分配新的inode。

“ls -l”命令中的count值就是表示该文件有多少个硬链接。

3.1 创建硬链接

         创建硬链接的命令是ln。

例如:


1、创建一个空文件:toucholdfile,并向其写入数据,此时查看oldfile的hard link为1;

2、创建一个hardlink:ln oldfile newfile表示在当前目录下创建一个oldfile的硬链接,该硬链接的文件名为newfile;

3、此时可以看到oldfile和newfile的hard link都增为2,并且这2个文件保持同步更新,删除其中一个并不影响另一个。

3.2 硬链接的限制

1、硬链接通常要求链接和文件位于同一个文件系统中

例子:

       本机上的Linux运行于虚拟机中,Linux和Win的共享目录为/mnt/hgfs/Share,该目录的文件系统和Linux内部的文件系统不一样,在这种情况下创建硬链接为出现什么问题呢?


       从执行结果可以看出,硬链接不支持链接文件和源文件不在同一个文件系统中。

2、不允许为目录创建硬链接


4 符号链接(symbolic link,也称软链接)

         符号链接也是一种文件,和硬链接不同,该文件在数据区实际内容包含了该符号链接所指向的文件的名字。符号链接是指向一个文件的间接指针。

4.1 创建符号链接

         任何用户都能创建符号链接,并且符号链接的创建并不受文件系统的限制,也就是说符号链接可链接不同文件系统中的文件,类似与Windows下的快捷方式。

         符合链接的创建方式和硬链接类似,只要在ln命令后添加参数-s即可。

例子:


       从例子中可以看出,newfile是一个符号链接(在lrwxrwxrwx前的l已指明),创建符号链接并不会影响到链接计数。而且需要注意的是创建的符号链接和链接的对象是两个不同的文件,所以例子中两个文件的inode号是不一样的。

4.2 符号链接作为函数参数

       当使用以名字引用文件的函数时,应当了解该函数是否处理符号链接。也就是该函数是否能跟随符号链接到达它所链接的文件。若该函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。否则,路径名参数将引用链接本身,而不是该链接指向的文件。(如lstat函数支持,而stat函数不支持)。

         比如,用open打开文件时,如果传递给open函数的路径名是一个符号链接,那么open跟随此链接达到指定的文件,若此链接所指向的文件不存在,则open出错。

       但同时用O_CREAT和O_EXCL两者调用open函数时,若路径名引用符号链接,open将出错返回,并将erron设置为EEXIST。这种处理方式的意图是堵塞一个安全漏洞,使具有特权的进程不会被诱骗对不适当的文件进行写操作。

4.3符号链接和硬链接的比较

1、硬链接源文件和链接文件共用一个inode号,说明它们是同一个文件,且文件大小一样,而符号链接源文件和链接文件是不同的两个文件,所以系统需要分配额外的空间建立新的inode;

2、符号链接在文件属性上(在stat结构中的st_mode指明)明确指明了symbolic link,而硬链接则没有,因为其本质和源文件完全一样;

3、创建符号链接时,链接计数不会增加;

4、由于硬链接源文件和链接文件一样,所以可以随意移动;而符号链接则不行,如果移动原文件,再访问链接文件,则访问不到;

5、无论是硬链接还是符号链接,都和源文件保持同步更新。

5链接计数

         每个inode中都有一个链接计数,从上面可知,链接计数就是hard link数。这个链接计数对于内核来说很重要,因为只有当某个文件的链接计数为0,内核才能删除该文件,也就是释放该文件占用的磁盘空间。

5.1目录文件链接计数

       任何一个非目录文件,新创建时其链接计数为1,而目录文件则不一样。任何一个叶目录(不包含其他任何目录的目录)的链接计数总是2,即有2个目录项指向该目录。

       如,在dir目录下执行“mkdir subdir”,则subdir目录的链接计数为2,即“在subdir目录中的.”指向subdir, “在dir目录中的subdir”也指向subdir,而dir目录的链接计数为3,即“在dir目录中的.”、“在subdir中的..”和“dir父目录中的dir”。

       换种表达方式就是,对于subdir,有2种表示方式,一种是在dir目录中的subdir,如在dir中执行“cd subdir”表示访问subdir,另一种就是在subdir目录的. ,如在subdir中执行“cd .”表示访问subdir。

       对于dir,一种是在其父目录中的dir,如在dir父目录中执行“cd dir”访问dir,另一种是在dir中的. ,如在dir目录中执行“cd .”访问dir,最后一种则是在子目录中的 .. ,如在其子目录subdir中执行“cd ..”访问dir。


       父目录中的每一个子目录都会使该父目录的链接计数增1。比如上述的dir目录,如果再创建一个子目录,则该dir的链接计数就增为4。

5.2内核删除文件或目录

         内核在决定是否删除某个文件或目录时首先看的就是链接计数,当链接计数为0是,内核再检查是否打开该文件或目录的进程数也为0,当两者都为0时就删除(即释放占用的磁盘空间)。

         知道了内核的这个特性,可以编写诸如“防止进程崩溃时遗留临时文件”这样的程序。


原创粉丝点击