硬链接是别名;软链接关键在于路径

2015年12月1日 20:00:13

结论在前:如果不使用相对路径,则软链接、硬链接再怎么交叉混用都不会有问题。

  • ln 直接创建硬链接到目标目录,和创建到当前目录,再mv到目标目录,效果一致。硬链接就是别名,全场通用。注意其应用限制。
  • ln 的软链接关键在于依据路径是否能查找到文件。软链接的关键在于路径。
  • cp 操作,总是拷贝原文件到新副本,和链接毫无关联。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rmq@baba-db01:~/lib> ls -l | grep source
-rwxr-xr-x 1 rmq mq 3893576 Dec 1 09:08 source
rmq@baba-db01:~/lib> ln source source.ln #创建硬链接
rmq@baba-db01:~/lib> ln -s source source.lns_relative #使用相对路径创建软连接
rmq@baba-db01:~/lib> ln -s /data/rmq/lib/source source.lns_absolute #使用绝对路径创建软连接
rmq@baba-db01:~/lib> ln source.lns_relative source.lns_relative.ln #创建软连接的硬链接
rmq@baba-db01:~/lib> ln source.lns_absolute source.lns_absolute.ln
rmq@baba-db01:~/lib> ls -li | grep source #查看文件类型、inode值
106570762 -rwxr-xr-x 2 rmq mq 3893576 Dec 1 09:08 source
106570762 -rwxr-xr-x 2 rmq mq 3893576 Dec 1 09:08 source.ln
106570766 lrwxrwxrwx 2 rmq mq 20 Dec 1 09:34 source.lns_absolute -> /data/rmq/lib/source
106570766 lrwxrwxrwx 2 rmq mq 20 Dec 1 09:34 source.lns_absolute.ln -> /data/rmq/lib/source
106570765 lrwxrwxrwx 2 rmq mq 6 Dec 1 09:34 source.lns_relative -> source
106570765 lrwxrwxrwx 2 rmq mq 6 Dec 1 09:34 source.lns_relative.ln -> source
rmq@baba-db01:~/lib>

1-1. 硬链接和原文件是无法区分的,都是 ‘-’ 文件类型(文件);
1-2. 软链接相当于windows系统下的快捷方式,但是区分相对路径、绝对路径;【建议不要用相对路径】
1-3. 软链接的硬链接是 ‘l’ 文件类型(link);硬链接其实就是别名。

2-1. cp操作, 依据相对路径创建的软链接?依据文件类型不再为 ‘l’ ,猜测已失效。但是实际上cp 是不复制软链接、硬链接的
——实际验证【补充验证方法】,是有效的。因为文件类型不再,且文件大小与原文件(非软链接)大小一致,猜测cp softlinkname 实际拷贝的是原文件,而不是快捷方式。可通过删除源文件验证。
2-2. 依据绝对路径创建的软链接?同上
2-3. cp操作,硬链接其实都已失效;
——参考2-1,cp操作拷贝的是原文件,是针对文件类型为 ‘-’ 的文件,是(A)对原文件的userdata(datablock)创建副本、绑定新的metadata(inode、filename),或者(B)没有创建userdata(datablock)的副本,只是绑定了新的metadata(inode、filename)。参考rm 操作、inode和链接计数器(link count),估计应该是前者A。
2-4. 综上,cp操作之后都文件类型肯定是 ‘-’(暂不考虑目录‘d’),且硬链接数目肯定是 1
2-5. 对不存在的文件nielong创建软链接niel,然后cp niel 提示文件不存在。变相证明了 2-1的论点。下图:

3-1. mv 操作,依据相对路径创建的软链接失效,在当前目录中映射“source”文件失败;在其基础上的硬链接同样映射“source”文件失败;
3-2. 原文件的硬链接?依据 inode 值,猜测有效。
——经验证,有效。
3-3. 依据绝对路径创建的软链接?在当前目录中映射“/data/rmq/lib/source”文件成功;在其基础上的硬链接?同上;

结论在最后

综述:如果不使用相对路径,则软链接、硬链接再怎么交叉混用都不会有问题。

  • ln 直接创建硬链接到目标目录,和创建到当前目录,再mv到目标目录,效果一致。硬链接就是别名,全场通用。注意其应用限制。
  • ln 的软链接关键在于依据路径是否能查找到文件。软链接的关键在于路径。
  • cp 操作,总是拷贝原文件到新副本,和链接毫无关联。

延伸阅读:理解 Linux 的硬链接与软链接