赞
踩
了解了 Linux 系统底层文件的存储状态后,接下来学习 ln 命令。
ln 命令用于给文件创建链接,根据 Linux 系统存储文件的特点,链接的方式分为以下 2 种:
ln 命令的基本格式如下:
[root@localhost ~]# ln [选项] 源文件 目标文件
选项:
【例 1】创建硬链接:
- [root@localhost ~]# touch cangls
- [root@localhost ~]# ln /root/cangls /tmp
- #建立硬链接文件,目标文件没有写文件名,会和原名一致
- #也就是/tmp/cangls 是硬链接文件
【例 2】创建软链接:
- [root@localhost ~]# touch bols
- [root@localhost ~]# In -s /root/bols /tmp
- #建立软链接文件
这里需要注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。这是初学者非常容易犯的错误。
ln创建硬链接
我们再来建立一个硬链接文件,然后看看这两个文件的特点。
- [root@localhost ~]# touch test
- #建立源文件
- [root@localhost ~]# ln /root/test /tmp/test-hard
- #给源文件建立硬链接文件 /tmp/test-hard
- [root@localhost ~]# ll -i /root/test /tmp/test-hard
- 262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /root/test
- hard
- 262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /tmp/test-hard
- #查看两个文件的详细信息,可以发现这两个文件的 inode 号是一样的,"ll"等同于"ls -l"。
这里有一件很奇怪的事情,我们之前在讲 inode 号的时候说过,每个文件的 inode 号都应该是不一样的。inode 号就相当于文件 ID,我们在查找文件的时候,要先查找 inode 号,才能读取到文件的内容。
但是这里源文件和硬链接文件的 inode 号居然是一样的,那我们在查找文件的时候,到底找到的是哪一个文件呢?我们来画一张示意图,如图 2 所示。
在 inode 信息中,是不会记录文件名称的,而是把文件名记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及 inode 的对应;而文件的 block 中记录的才是文件实际的数据。
当我们查找一个文件,比如 /root/test 时,要经过以下步骤:
硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。
我们通过实验来测试一下。
- [root@localhost ~]# echo 1111 >>/root/test
- #向源文件中写入数据
- [root@localhost ~]# cat /root/test
- 1111
- [root@localhost ~]# cat /tmp/test-hard
- 1111
- #源文件和硬链接文件都会发生改变
- [root@localhost ~]# echo 2222 >> /tmp/test-hard
- #向硬链接文件中写入数据
- [root@localhost ~]# cat /root/test
- 1111
- 2222
- [root@localhost ~】# cat /tmp/test-hard
- 1111
- 2222
- #源文件和硬链接文件也都会发生改变
- [root@localhost ~]# rm -rf/root/test
- #删除源文件
- [root@localhost ~]# cat /tmp/test-hard
- 1111 2222
- #硬链接文件依然可常读取

ln创建软链接
软链接也称作符号链接,相比硬链接来讲,软链接就要常用多了。我们先建立一个软链接,再来看看软链接的特点。
- [root@localhost ~]# touch check
- #建立源文件
- [root@localhost ~]# ln -s /root/check /tmp/check-soft
- #建立软链接文件
- [root@localhost ~]# ll -id /root/check /tmp/check-soft
- 262154 -rw-r--r-- 1 root root 0 6月 19 11:30 /root/check
- 917507 lrwxrwxrwx 1 root root 11 6月 19 11:31 /tmp/ check-soft -> /root/check
- #软链接和源文件的 inode 号不一致,软链接通过 -> 明显地标识出源文件的位置
- #在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件
再强调一下,软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。
软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多,而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接。
软链接完全可以当作 Windows 的快捷方式来对待,它的特点和快捷方式一样,我们更推荐大家使用软链接,而不是硬链接。
大家在学习软链接的时候会有一些疑问:Windows 的快捷方式是由于源文件放置的位置过深,不容易找到,建立一个快捷方式放在桌面,方便查找,那 Linux 的软链接的作用是什么呢?
笔者个人觉得,软链接主要是为了照顾管理员的使用习惯。比如,有些系统的自启动文件 /etc/rc.local 放置在 /etc 目录中,而有些系统却将其放置在 /etc/rc.d/rc.local 中,那么干脆对这两个文件建立软链接,不论你习惯操作哪一个文件,结果都是一样的。
如果你比较细心,则应该已经发现软链接和源文件的 inode 号是不一致的,我们也画一张示意图来看看软链接的原理,如图 3 所示。
图 3 软链接示意图
我们测试一下软链接的特性。
- [root@localhost ~]# echo 111>>/root/check
- #修改源文件
- [root@localhost ~]# cat /root/check
- 111
- [root@localhost ~]# cat /tmp/check-soft
- 111
- #不论是源文件还是软链接文件,数据都发生改变
- [root@localhost ~]# echo 2222 >>/tmp/check-soft
- #修改软链接文件
- [root@localhost ~]# cat /tmp/check-soft
- 111
- 2222
- [root@localhost ~]# cat /root/check
- 111
- 2222
- #不论是源文件还是软链接文件,数据也都会发生改变
- [root@localhost ~]# rm -rf/root/check
- #删除源文件
- [root@localhost ~]# cat /tmp/check-soft
- cat: /tmp/check-soft:没有那个文件或目录
- #软链接无法正常使用

软链接是可以链接目录的,例如:
- [root@localhost ~]# mkdir test
- #建立源目录
- [root@localhost ~]# ln -s /root/test/ /tmp/
- [root@localhost ~]# ll -d /tmp/test
- lrwxrwxrwx 1 root root 11 6月 19 12:43 /tmp/test->/root/test/
- #软链接可以链接目录
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。