目录
ln链接命令
ln是linux系统中用于创建硬链接和软链接的命令,英文原意make links between file,命令所在路径/bin/ln,是一个所有用户都有权限操作的命令!主要的功能是在文件间建立链接。本教程以CentOS 7系统环境为例,并结合应用场景为大家清晰明了的介绍ln操作命令的使用方法和实际用途!
ln命令的语法格式如下:
【语法格式】
ln [选项] 源文件 目标文件
选项描述(仅介绍最常用的选项,如需查看帮助文档可输入ln --help)
选项(注意大小写) | 作用 |
-s | 建立软链接文件(如果不加-s选项默认创建硬链接文件) |
-f | 如果目标文件已经存在,加-f则强制删除目标文件后再建立链接文件 |
1.硬链接实验
【1-1】首先在根目录创建两个空目录a和b;
mkdir /a /b
执行结果
[root@localhost /]# mkdir /a /b [root@localhost /]# ls / a b bin boot dev etc home lib lib64 ljp media mnt opt proc root run sbin srv sys tmp tools usr var |
【1-2】在a目录下创建一个空文件CC;
touch /a/CC
执行结果
[root@localhost /]# touch /a/CC [root@localhost /]# ls /a/ CC |
【1-3】现在可以正式开始实验了,我们先为a目录下的CC文件创建一个硬链接,并挂载到b目录下,然后将硬链接文件改名为DD;
ln /a/CC /b/DD
此时硬链接已建立,我们输入ll -i /a/ /b/查看一下创建情况;
执行结果
[root@localhost /]# ln /a/CC /b/DD [root@localhost /]# ll -i /a/ /b/ /a/: 总用量 0 51651196 -rw-r--r--. 2 root root 0 11月 28 20:43 CC /b/: 总用量 0 51651196 -rw-r--r--. 2 root root 0 11月 28 20:43 DD |
通过上图可以看出,硬链接文件DD的信息和源文件CC几乎相同,这个为什么呢?请看下图和解释:
【操作说明】
□硬链接原理:首先我们要先搞明白一个事情,在Linux系统中任何一个目录和文件都有独自的Inode和block,对于文件, block保存的是文件的数据,但对于目录,block保存的是这个目录下所有子文件或子目录对应的Inode,所以,无论我们是访问目录或文件都得通过Inode来找到对应的block,才能访问和修改其数据。
□其次,通过上图我们可以看出,a和b都是根下的子目录,是保存在根下的block里面的,a和b也都有自己的Inode和block,我们先看看a目录的block,其实保存的是CC的文件的Inode,而CC文件也是有自己的Inode和block的,CC的block保存的是文件的实际数据;再次,我们再看看b目录的block,保存的是DD文件的Inode,但DD是由CC链接而来的硬链接文件,和CC文件用的是同一个Inode;
由此不难看出,无论你是访问a目录的CC或者b目录的DD文件时,其实都是通过Inode(51651196)指向CC这个文件;
所以,即使是你删除了a目录的CC文件,或者b目录的DD文件,只要你不是同时删除两个文件,CC文件的数据都还在,也能正常访问,因为这是硬链接的一个特性,硬链接的数据都是同步进行的;
□但硬链接的标记不清,不能跨分区使用,也不能链接目录,局限也挺大,得根据业务需求来选择;
□硬连接是不会建立inode的,他只是在文件原来的inode link count域再增加1而已,一旦删除源文件,系统调用会检查inode link count的数值,如果他大于等于1,那么inode不会被回收。因此文件的内容不会被删除。
2.软链接实验
软链接的理解相对简单一些,你可以把它理解成Windows系统下的文件或目录的快捷方式;
【2-1】还是以a目录的CC为源文件,将CC文件链接到b目录取名EE;
ln -s /a/CC /b/EE
此时软件链接已建立,我们输入ll -i /a/ /b/查看一下创建情况;
执行结果
[root@localhost a]# ln -s /a/CC /b/EE [root@localhost a]# ll -i /a/ /b/ /a/: 总用量 0 51651196 -rw-r--r--. 2 root root 0 11月 28 20:43 CC /b/: 总用量 0 51651196 -rw-r--r--. 2 root root 0 11月 28 20:43 DD 61586 lrwxrwxrwx. 1 root root 5 11月 29 16:48 EE -> /a/CC |
【2-2】可以看到b目录下的EE文件是指向a目录的CC文件的,并且Inode是不一样的,具体逻辑见示意图:
操作说明
□通过上面的示意图可以看出,CC和EE文件都有自己不同的Inode和block, CC的block保存的是CC的实际数据,而EE是软链接文件,它的block保存的是CC的Inode,换句话说,EE的block除了保存CC文件的Inode外,没有其他意义,所以删除EE文件对CC文件是没有任何影响的,但是如果是删除了CC文件,EE文件也失去了意义。
□和硬链接文件一样,无论你是从a目录或b目录修改文件,数据都是够同步的, 因为最终的访问都是的软链接指向源文件,唯一不同的是软链接文件是没有实际数据的,只保存源文件的Inode,而数据都是保存在源文件里的,而且软链接能跨分区和链接目录,而硬链接不能。
□使用软链接时需要注意,一定要用绝对路径,例如ln -s abc /abc会报错,正确的是ln -s /abc /abc;