Linux内核中硬链接和软连接的深入分析

1.Linux链接概念:from http://blog.csdn.net/?ticket=ST-169549-hHb5c4z6HHHDGc1U3kbZ-passport.csdn.net

Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

【硬连接】
硬连接指通过 索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中, 多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说, 文件真正删除的条件是与之相关的所有硬连接文件均被删除

【软连接】

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。


测试命令:stat、touch、ln

创建一个名为dean的普通文件:touch dean 

内容:

/ # cat dean 
hello dean
hello boy

分析当前文件属性状态:

/ # stat dean 
  File: dean
  Size: 21              Blocks: 8          IO Block: 4096   regular file
Device: 1h/1d   Inode: 717         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/ UNKNOWN)   Gid: (    0/ UNKNOWN)
Access: 1970-01-01 00:03:34.000000000
Modify: 1970-01-01 00:02:26.000000000
Change: 1970-01-01 00:02:26.000000000

注:当前的Links为1

创建硬链接:/ # ln   dean  test1   //此命令创建一个test1硬链接,指向dean

再次分析dean文件属性:

/ # stat dean
  File: dean
  Size: 21              Blocks: 8          IO Block: 4096   regular file
Device: 1h/1d   Inode: 717         Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/ UNKNOWN)   Gid: (    0/ UNKNOWN)
Access: 1970-01-01 00:03:34.000000000
Modify: 1970-01-01 00:02:26.000000000
Change: 1970-01-01 00:06:22.000000000

注:当前的Links为2,证明有两个硬链接

再创建一个软链接:ln -s dean test2  //此命令创建一个test2软链接,指向dean

再次分析dean文件属性:

/ # stat dean
[  564.855409] Dean kernel/fork.c 1155 copy_process
[  564.860755] Dean pid=139 tpid=139  name=sh
  File: dean
  Size: 21              Blocks: 8          IO Block: 4096   regular file
Device: 1h/1d   Inode: 717         Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/ UNKNOWN)   Gid: (    0/ UNKNOWN)
Access: 1970-01-01 00:03:34.000000000
Modify: 1970-01-01 00:02:26.000000000
Change: 1970-01-01 00:06:22.000000000

注:当前的Links还是为2,证明还是只有两个硬链接,证明软连接只是一个符号链接

分析硬链接test1的文件属性

/ # stat test1
  File: test1
  Size: 21              Blocks: 8          IO Block: 4096   regular file
Device: 1h/1d   Inode: 717         Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/ UNKNOWN)   Gid: (    0/ UNKNOWN)
Access: 1970-01-01 00:10:58.000000000
Modify: 1970-01-01 00:02:26.000000000
Change: 1970-01-01 00:06:22.000000000

注:test1其实和dean的文件属性一模一样

分析软链接test2的文件属性

/ # stat test2 
  File: 'test2' -> 'dean'
  Size: 4               Blocks: 0          IO Block: 4096   symbolic link
Device: 1h/1d   Inode: 718         Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/ UNKNOWN)   Gid: (    0/ UNKNOWN)
Access: 1970-01-01 00:11:11.000000000
Modify: 1970-01-01 00:08:22.000000000
Change: 1970-01-01 00:08:22.000000000

注:test2其实就是一个符号链接,实际上是一个文本文件,其中包含的有另一文件的位置信息  File: 'test2' -> 'dean',

长度Size:4


删除dean,测试test1是否还存在:

/ # rm dean 

/ # stat test1
  File: test1
  Size: 21              Blocks: 8          IO Block: 4096   regular file
Device: 1h/1d   Inode: 717         Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/ UNKNOWN)   Gid: (    0/ UNKNOWN)
Access: 1970-01-01 00:10:58.000000000
Modify: 1970-01-01 00:02:26.000000000
Change: 1970-01-01 00:38:04.000000000

注:Links减为1,只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。

/ # cat test2 
cat: can't open 'test2': No such file or directory
/ # cat test1 
hello dean
hello boy
/ # 

from:http://blog.chinaunix.net/uid-8318378-id-2032221.html

(1 )软连接可以 跨文件系统 ,硬连接不可以 。实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc . ln -s aa.txt /root/bb 连接成功 。ln aa.txt /root/bb 失败 。
(2)关于 I节点的问题 。硬连接不管有多少个,都指向的是同一个I节点,会把 结点连接数增加 ,只要结点的连接数不是 0,文件就一直存在 ,不管你删除的是源文件还是 连接的文件 。只要有一个存在 ,文件就 存在 (其实也不分什么 源文件连接文件的 ,因为他们指向都是同一个 I节点)。 当你修改源文件或者连接文件任何一个的时候 ,其他的 文件都会做同步的修改 。软链接不直接使用i节点号作为文件指针,而是使用文件路径名作为指针。所以 删除连接文件 对源文件无影响,但是 删除 源文件,连接文件就会找不到要指向的文件 。软链接有自己的inode,并在磁盘上有一小片空间存放路径名.
(3)软连接可以对一个不存在的文件名进行连接 。
(4)软连接可以对目录进行连接。

软链接与硬链接,区别不仅仅是在概念上,在实现上也是不同的。区别:硬链接原文件&链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件&链接文件拥有不同的inode号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;链接数目是不一样的,软链接的链接数目不会增加;文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的,这用强调,因为是等同的嘛,而这里软链接显示的大小与原文件就不同了。建立软链接就是建立了一个新文件。当访问链接文件时,系统就会发现他是个链接文件,它读取链接文件找到真正要访问的文件。


到此,我们分析的差不多了,可以介绍一下inode节点在内核中表示:

/* 
 * 这里只介绍一些重要的属性
 */
struct inode {
    struct hlist_node    i_hash;     /* 散列表,用于快速查找inode */
    struct list_head    i_list;        /* 索引节点链表 */
    struct list_head    i_sb_list;  /* 超级块链表超级块  */
    struct list_head    i_dentry;   /* 目录项链表 */
    unsigned long        i_ino;      /* 节点号 */
    atomic_t        i_count;        /* 引用计数 */
    unsigned int        i_nlink;    /* 硬链接数 */
    uid_t            i_uid;          /* 使用者id */
    gid_t            i_gid;          /* 使用组id */
    struct timespec        i_atime;    /* 最后访问时间 */
    struct timespec        i_mtime;    /* 最后修改时间 */
    struct timespec        i_ctime;    /* 最后改变时间 */
    const struct inode_operations    *i_op;  /* 索引节点操作函数 */
    const struct file_operations    *i_fop;    /* 缺省的索引节点操作 */
    struct super_block    *i_sb;              /* 相关的超级块 */
    struct address_space    *i_mapping;     /* 相关的地址映射 */
    struct address_space    i_data;         /* 设备地址映射 */
    unsigned int        i_flags;            /* 文件系统标志 */
    void            *i_private;             /* fs 私有指针 */
};



你可能感兴趣的:(硬链接,软链接,linux内核)