“五分钟学命令系列”之十三《ln命令》

ln是一个很神奇的命令,它可以创建一个文件的影子,也可以通过一个通道进入另一个地方。

一、建立硬链接

命令格式是“ln 目标 链接名称”

[[email protected] ~]# ll test.txt

-rw-r--r-- 1 root root 7 Oct 10 10:09 test.txt

[[email protected] ~]# ln test.txt linktext.txt

[[email protected] ~]# ll -i test.txt linktext.txt

4194881 -rw-r--r-- 2 root root 7 Oct 10 10:09 linktext.txt

4194881 -rw-r--r-- 2 root root 7 Oct 10 10:09 test.txt

建立好后,我们用ll -i命令来查看了文件的信息,其中-i选项表示列出每个文件的inode节点ID,我们可以发现test.txt和linktext.txt的inode号是完全一样的,都是4194881,这就说明它们都指向同一个数据块,这就是硬链接。

但要注意,硬链接不允许跨分区来建立,也就是不允许跨文件系统来建立,即使是同一类型的文件系统也是不行的。所以硬链接只能在一个分区内建立。

二、建立软链接

命令格式为“ln -s 目标 链接名称”

[[email protected] ~]# ln -s test.txt linktest.txt

[[email protected] ~]# ll -i test.txt linktest.txt

4194876 lrwxrwxrwx 1 root root 8 Oct 10 10:17 linktest.txt -> test.txt

4194881 -rw-r--r-- 1 root root 4 Oct 10 10:16 test.txt

建立好后,我们用ll -i命令来查看了文件的信息,可以查看到软链接linktest.txt和test.txt的inode号是不一样的,这说明他们完全指向两个不同的数据库快。而且,细心的朋友能够观察到软链接文件的权限栏首字符为l,这也是软链区别于普通文件的地方之一。

如果这个时候,我们删除了test.txt文件,则软链接linktest.txt就会变成红色字体,这表示警告,这是一个有问题的文件,它无法找到它所标识的文件test.txt了。

三、链接目录

1、硬链接目录

[[email protected] ~]# ln test linktest

ln: `test': hard link not allowed for directory

报错了,硬链接是不允许链接到目录。

2、软链接目录

[[email protected] ~]# ln -s test linktest

目录的软链接的建立是允许的,我建立了一个test目录的软链接linktest,以后我完全可以cd linktest来进入test目录了。

建立好后通过ll管道查看目录属性信息,可以看到linktest是软链接,而test是一个目录

[[email protected] ~]# ll|grep -E "test|linktest"

lrwxrwxrwx 1 root root 4 Oct 10 10:24 linktest -> test

drwxr-xr-x 2 root root 4096 Oct 10 10:22 test

四、为什么ln不允许硬链接到目录,而允许软链接到目录呢

“linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作硬连接。至于第一个限制,很好理解,而第二个就不那么好理解了。 我们对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进行限制呢?

如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许您会说,符号连接不也可以引入循环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。”

五、ln命令里面有一个-n选项的意思

它的官方解释是这样的:-n, –no-dereference  treat destination that is a symlink to a directory as if it were a normal file

在水木上有类似的一个帖子给出了一个清晰的例子,如下:

第一步:mkdir a b

第二步:ln -sf a c (这个时候c -> a)

第三步:如果执行