1.Linux链接概念:from http://blog.csdn.net/?ticket=ST-169549-hHb5c4z6HHHDGc1U3kbZ-passport.csdn.net
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。另外一种连接称之为符号连接(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 私有指针 */
};