Linux链接命令—ln命令
1 命令简要说明
命令名称:ln
命令英文原意:link
命令所在路径:/bin/ln
执行权限:所有用户
语法:ln -s [原文件][目标文件]
-s 创建软链接
原文件 想要生成链接文件的文件
目标文件 对原文件建立链接文件的文件名称
功能描述:生成链接文件
范例: $ln -s /etc/issue /tmp/issue.soft
创建文件/etc/issue的软链接/tmp/issue.soft
$ln /etc/issue /tmp/issue.hard
创建文件/etc/issue的硬链接/tmp/issue.hard
2 命令操作示例
(1)为系统中的issue文件创建一个软链接文件;
[root@localhost~]# ln -s /etc/issue /tmp/issue.soft
(2)为系统中的issue文件创建一个硬链接文件;
[root@localhost~]# ln /etc/issue /tmp/issue.hard
操作示意图如图1所示:
图1 创建链接文件
2.1 链接文件的特点
2.1.1 查看文件详细信息
对比观察软链接和硬链接文件的特点,首先查看一下文件详细信息:
(1)查看原文件的详细信息;
[root@localhost~]# ls -l /etc/issue
-rw-r--r--. 2 root root 47 5月 19 03:47 /etc/issue
(2)查看软链接的文件的详细信息;
[root@localhost~]# ls -l /tmp/issue.soft
lrwxrwxrwx. 1 root root 10 7月 26 21:48 /tmp/issue.soft -> /etc/issue
(3)查看硬链接的文件特点;
[root@localhost~]# ls -l /tmp/issue.hard
-rw-r--r--. 2 root root 47 5月 19 03:47 /tmp/issue.hard
操作示意图如图2所示:
图2 查看文件详细信息
2.1.2 软链接特征
(1)lrwxrwxrwx:文件类型+权限的标识比较特殊,可以看到:
a)文件类型部分(第一个字母)是“l”:
“-”--表示文件;“d”--表示目录;“l”--表示软链接;
b)权限部分(u,g,o)是三个rwx:表示所有的人都有全部的操作权限:
“r”--表示可读;“w”--表示可写;“x”--表示可执行;
c)软链接到底该怎么用?
软链接类似Windows快捷方式,可供用户方便快捷的找到一些文件资料或可执行文件,方便规划和管理。只是一个很简单的链接指向,并不是代表真正的文件资料或可执行文件本身。
d)注意:执行软链接的时候真正执行的是软链接所指向的原文件,所以,尽管在Linux系统中所有的软链接都具有完全一样的文件类型+权限标识(即lrwxrwxrwx),但是,当用户对软链接进行实际操作的时候真正所能执行的权限还是由该软链接所指向的原文件的操作权限决定的。
(2)软链接的文件很小
如上所示的软链接文件大小只有10字节,看起来很小,而原文件有47字节。事实上,哪怕原文件有上千个字节,它的软链接也差不多还是只有这么大。因为软链接仅仅只是一个符号链接,用于在执行时链接指向原文件而已,跟Windows的快捷方式是一个道理。
(3)软链接的文件显示信息中有一个箭头指向原文件
例如:/tmp/issue.soft -> /etc/issue
2.1.3 硬链接特征
(1)拷贝(cp -p)+同步更新
对比硬链接和原文件会发现,除了文件名所在目录不同之外,其他部分都是一模一样的,包括文件的大小。就类似于执行了保持文件属性的拷贝(cp -p)一样,包括文件的修改时间都是一致的。
相对于cp –p,有什么不同?
不同于cp –p,硬链接可以实现原文件的链接文件之间的同步更新。下面举一个示例,实现通过echo命令在任一文件末尾添加一行文字,查看相应的文件内容的同步更新状况。
1)查看原文件内容;
[root@localhost~]# cat /etc/issue
CentOS release6.8 (Final)
Kernel \r on an\m
2)查看硬链接文件内容;
[root@localhost~]# cat /tmp/issue.hard
CentOS release6.8 (Final)
Kernel \r on an\m
3)向原文件的文件末尾添加一行文字显示;
[root@localhost~]# echo "www.baidu.com" >> /etc/issue
4)查看原文件的文件内容;
[root@localhost~]# cat /etc/issue
CentOS release6.8 (Final)
Kernel \r on an\m
www.baidu.com
5)查看硬链接文件的文件内容同步更新结果;
[root@localhost~]# cat /tmp/issue.hard
CentOS release6.8 (Final)
Kernel \r on an\m
www.baidu.com
6)查看软链接文件的文件内容;
[root@localhost~]# cat /tmp/issue.soft
CentOS release6.8 (Final)
Kernel \r on an\m
www.baidu.com
可以看到硬链接文件的内容随着原文件内容的更新而同步更新了,但是软链接的内容好像也同样更新了,这是因为软链接本身就是一个链接指向而已,它所指向的文件内容就是原文件本身,而不管是我们修改了原文件本身,还是修改了硬链接文件,由于硬链接的同步更新机制,原文件内容都是会得到相应的更新的,所以在这里我们也会看到软链接的内容也会有相应的变化。
操作示意图如图3所示:
图3 硬链接的同步更新
为了凸显硬链接文件的特点,以示区分,下面再举一个示例:
7)将原文件复制备份到tmp目录下,然后删除原文件;
[root@localhost~]# cp /etc/issue /tmp/issue.bak
[root@localhost~]# rm /etc/issue
rm:是否删除普通文件 "/etc/issue"?y
[root@localhost~]#
8)原文件已删除的情况下查看软链接文件的内容;
[root@localhost~]# cat /tmp/issue.soft
cat:/tmp/issue.soft: 没有那个文件或目录
9)原文件已删除的情况查看软链接文件的文件特点;
[root@localhost~]# ls -l /tmp/issue.soft
lrwxrwxrwx. 1 root root 10 7月 26 21:48 /tmp/issue.soft-> /etc/issue
可以看到,删除原文件之后,软链接将找不到链接指向的文件了。同时软链接文件信息中软链接目录和所链接指向的原文件目录都会变成红色,并且原文件目录会一直闪烁。
10)原文件已删除的情况下查看硬链接文件的内容;
[root@localhost~]# cat /tmp/issue.hard
CentOS release6.8 (Final)
Kernel \r on an\m
www.baidu.com
可以看到,原文件就算丢失,硬链接文件也依然可以访问。
操作示意图如图4所示:
图4 删除原文件的情况下软链接和硬链接的详细信息
2.2 通过i节点识别
怎么样来判断一个文件是否是硬链接文件呢?
可以知道,软链接文件很好识别,只要查看文件详细信息就可以很好的判断一个文件是否是软链接文件。为了观察判断一个硬链接,我们再接着进行如下示例:
1)进入tmp目录下,查看所有文件;
[root@localhost~]# cd /tmp
[root@localhosttmp]# ls
issue.bak issue.hard issue.soft yum.log
2)为tmp目录下备份的issue文件创建软链接文件的硬链接文件;
[root@localhosttmp]# ln issue.bak issue.bak.hard
[root@localhosttmp]# ln -s issue.bak issue.bak.soft
3)查看备份的issue文件及其相应的软链接文件和硬链接文件的i节点信息;
[root@localhosttmp]# ls -i issue.bak issue.bak.hard issue.bak.soft
927514 issue.bak 927514 issue.bak.hard 927516 issue.bak.soft
操作示意图如图5所示:
图5 文件i节点信息
可以看到,原文件和硬链接文件是由同一个i节点标识的。
补充说明:每一个Linux的文件都有一个i节点,每一个进程都有一个进程标识号,每一个用户都有一个用户标识号,都是一个数字的标识,由内核来进行调度和管理。但是在Linux系统中,一个文件一定会有一个i节点,而一个i节点不一定只对应一个文件,硬链接就是一个很特殊的案例,所以当其中一个文件被删除后,另外一个文件依旧还可以存在。
硬链接的同步更新原理:当你对于一个文件进行写操作的时候,在内核的层面上实际上是针对的i节点进行操作的,而这个i节点同时映射到了两个文件,所以自然就可以同步更新了。
2.3 硬链接和软链接最常见的区别
(1)硬链接不能跨分区
1)尝试跨分区创建硬链接;
[root@localhosttmp]# ln /tmp/issue.bak /boot/issue.bak.hard
ln: 创建硬链接"/boot/issue.bak.hard"=> "/tmp/issue.bak": 无效的跨设备连接
示例说明:/tmp/issue.bak是表示在根分区下的,要通过硬链接将它链接到/boot分区下是不可行的,但是软链接可以执行此操作。
2)尝试跨分区创建软链接;
[root@localhosttmp]# ln -s /tmp/issue.bak /boot/issue.bak.soft
(2)硬链接不能针对目录使用
1)退回到根目录,尝试给tmp目录创建硬链接;
[root@localhosttmp]# cd
[root@localhost~]# ln /tmp /root/tmp.hard
ln: "/tmp":不允许将硬链接指向目录
2)尝试给tmp目录创建软链接;
[root@localhost~]# ln -s /tmp /root/tmp.soft
[root@localhost~]#
操作示意图如图6所示:
图6 硬链接和软链接最常见的区别