【命令星级】 ★★★★★
【功能说明】
ln命令可用理解为英文单词link的缩写,其功能是创建文件间的链接(make links between files),链接类型包括硬链接(hard link)和软链接(符号链接,symbolic link)。
【语法格式】
ln [option] [source] [target]
ln [选项] [源文件或目录] [目标文件或目录]
**说明:**ln命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
【选项说明】
表2-14针对该命令的参数选项进行了说明。
表2-14 ln命令的参数选项及说明
前面说过,链接分为硬链接(Hard Link)和软链接(符号链接,symbolic link)两种,它们的含义具体如下。
硬链接(Hard Link):创建语法为“ln 源文件 目标文件”,硬链接生成的是普通文件(-字符)。
软链接或符号链接(Symbolic Link or Soft Link):创建语法为“ln -s 原始文件 目标文件(目标文件不能事先存在)”,软链接生成的是符号链接文件(l类型)。
下面的输出就显示了源文件、硬链接、软链接相关的文件信息:
[root@centos7 ~]# touch neteaglefile
[root@centos7 ~]# ln neteaglefile neteaglefile_hardlink
[root@centos7 ~]# ln -s neteaglefile neteaglefile_softlink
[root@centos7 ~]# ll -hi neteaglefile*
33789207 -rw-r--r--. 2 root root 0 Oct 21 16:22 neteaglefile
33789207 -rw-r--r--. 2 root root 0 Oct 21 16:22 neteaglefile_hardlink
33789208 lrwxrwxrwx. 1 root root 12 Oct 21 16:22 neteaglefile_softlink -> neteaglefile
硬链接是指通过索引节点(Inode)进行的链接。在CentOS 6及以前的Linux(ext2、ext3、ext4)默认文件系统中,存在于在磁盘分区中的文件不管是什么类型都会为它分配一个唯一的编号,这个编号就称为索引节点编号(Index Inode),简称Inode,各个文件对应的这个索引节点编号就类似于我们生活中的身份证号码,在Linux同一文件系统中该编号是唯一的。
在Linux系统中,多个文件名指向同一个索引节点(Inode号相同)(Inode)是正常且被允许的。这种情况下的两个文件就称作互为硬链接文件,本质上就是相同文件的两个名字(类似真名和网名一样,都表示一个人)。在同一个分区/文件系统中,Inode号码相同的文件一定是硬链接文件。
硬链接文件就相当于是原始文件的另外一个访问入口。硬链接的作用之一是允许一个文件拥有多个有效的文件名(多个访问入口,类似于超市的多个入口),这样用户就可以建立硬链接到重要的文件上,为避免“误删”源数据加一份保险(很多应急存储的快照功能就应用了这个原理,增加一个快照就多了一个硬链接,多了一个硬链接就会增加一层数据的安全)。
因为文件系统(ext)的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接,那么只删除其中的一个硬链接(即仅仅删除了该文件的链接指向)并不会影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有在文件的最后一个硬链接被删除之后,此时如果有新数据要存储到硬盘上,或者系统通过类似的fsck做磁盘检查的时候,被删除的文件的数据块及目录的链接才会被释放,空间将被新数据占用并覆盖。当然,这样一来,数据就再也无法找回了。
也就是说,在Linux系统中,删除静态文件(没有进程调用的文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会进一步介绍其与进程的占用也有关)。一个静态文件被彻底删除的条件就是该文件的硬链接数量为零。
下面给出一个文件的多个硬链接的形象图以帮助大家理解,图2-3即为硬链接原理图。
图2-3 文件硬链接原理图
根据硬链接示意图可以知道,当删除oldboyfile和pldboyfile_hard_link两者任意之一时,只相当于删除了该文件到Inode之间的连接,通过未删除的文件名依然可以访问到文件实体。
硬链接的创建方法为直接执行命令“ln 源文件 目标文件(硬链接文件)”,具体实例演示代码如下:
[root@centos7 ~]# echo "I am neteagle" >neteaglefile #创建源文件。
[root@centos7 ~]# cat neteaglefile #查看。
I am neteagle
[root@centos7 ~]# ln neteaglefile neteaglefile_hard_link #创建硬链接。
[root@centos7 ~]# cat neteaglefile_hard_link #查看硬链接,内容与源文件相同。
I am neteagle
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link #查看索引节点。
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile #索引节点是相同的,链接数为2.
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile_hard_link #索引节点是相同的。
[root@centos7 ~]# rm -f neteaglefile #删除源文件。
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link
ls: cannot access neteaglefile: No such file or directory #源文件已删。
34509286 -rw-r--r--. 1 root root 14 Oct 12 18:49 neteaglefile_hard_link #链接数变为1.
[root@centos7 ~]# cat neteaglefile_hard_link #内容依然存在,数据没有丢失。
I am neteagle
[root@centos7 ~]# ln neteaglefile_hard_link neteaglefile #反过来创建硬链接。
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile #又回来了,链接数又都为2了。
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile_hard_link
[root@centos7 ~]# cat neteaglefile #文件回来了,内容又有了。
I am neteagle
硬链接知识小结
软链接(Soft Link)也称为符号链接(Symbolic Link,symlink)。Linux里的软链接文件就类似于Windows系统中的快捷方式。软链接文件实际上是一个特殊的文件,文件类型用字母l表示。可以将它理解为一个文本文件,这个文件中包含有软链接,其指向的是另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。
软链接的创建方法为:执行命令“ln -s 源文件 软链接文件”。
要想创建软链接,那么目标文件将是不能存在的,这个文件是要用ln命令创建的,创建软链接必须要有源文件,即针对哪个文件做软链接。
软链接文件的基本示意图如图2-4所示。
在图2-4中,软链接文件通过自身的Inode(存放原始文件路径信息,而不是Block),读到了软链接信息,并指向了原始文件,进而读到原始文件名,以及原始文件的Inode,再通过原始文件的Inode读到原始文件的内容(Block),这就是访问软链接文件来读取数据的原理。
早期的软链接是读取自己的Block以获取原始文件的路径名信息,但是这样的访问方式效率很低,对于Linux(POSIX系统)系统来说,还有一种更好的方法,称为fast symlinks,原理就是软链接的Block不存放源文件位置了,而是直接将源文件位置存放在Inode里面,即省事又更快捷【1】。
文件的软链接示例代码如下:
[root@centos7 ~]# ll -i neteaglefile neteaglefile_hard_link
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile_hard_link
[root@centos7 ~]# ln -s neteaglefile neteaglefile_soft_link #创建软链接文件。
[root@centos7 ~]# ll -i neteaglefile*
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile
34509286 -rw-r--r--. 2 root root 14 Oct 12 18:49 neteaglefile_hard_link
34509287 lrwxrwxrwx. 1 root root 12 Oct 12 19:21 neteaglefile_soft_link -> neteaglefile #软链接文件的Inode和文件类型都是不同的,可见软链接文件是单独的文件。
[root@centos7 ~]# cat neteaglefile_soft_link #查看软链接文件的内容,内容是neteaglefile的内容。
I am neteagle
[root@centos7 ~]# readlink neteaglefile_soft_link #查看软链接文件的指向,指向的是neteaglefile。
neteaglefile
[root@centos7 ~]# rm -f neteaglefile #删除原始文件。
[root@centos7 ~]# cat neteaglefile_soft_link #访问软链接会提示“找不到文件或目录”。
cat: neteaglefile_soft_link: No such file or directory
[root@centos7 ~]# ls -l neteaglefile*
-rw-r--r--. 1 root root 14 Oct 12 18:49 neteaglefile_hard_link
lrwxrwxrwx. 1 root root 12 Oct 12 19:21 neteaglefile_soft_link -> neteaglefile #出现底闪烁故障。
目录的软链接示例代码如下:
[root@centos7 ~]# mkdir neteagledir #创建一个测试目录neteagledir。
[root@centos7 ~]# ln neteagledir neteagledir_hard_link
ln: ‘neteagledir’: hard link not allowed for directory #目录不允许创建硬链接,这时为什么呢?
[root@centos7 ~]# ln -s neteagledir neteagledir_soft_link #但可以创建软链接,特别提示:目录的软链接在生产场景中经常会用到,硬链接用得不多。
[root@centos7 ~]# ll -irt
73033 drwxr-xr-x. 2 root root 6 Oct 12 19:31 neteagledir
34509288 lrwxrwxrwx. 1 root root 11 Oct 12 19:38 neteagledir_soft_link -> neteagledir
提示:代码中加粗部分为本例生成的结果。
小结一下,ln命令不能对目录创建硬链接,但可以对目录创建软链接,针对目录创建软链接,也是生产场景运维中常用的功能。
在遇到这样的面试题时,可以从以下几个方面去解答。
1)答分类:在Linux系统中,链接可分为两种,一种称为硬链接(Hard Link),另一种称为符号链接或软链接(Symbolic Link)。
2)答概念:硬链接文件与源文件的Inode节点号相同,而软链接文件则相当于Windows下面的快捷方式(Inode节点号与源文件不同)。
3)答创建:默认在不带参数的情况下,ln命令创建的是硬链接,带-s参数的ln命令创建的是软链接。
4)答特点。具体又可分为以下几点来说明。
a)不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常用到。
b)软链接可以跨文件系统,硬链接不可以跨文件系统。
c)删除软链接文件,对源文件及硬链接文件无任何影响。
d)删除文件的硬链接文件,对源文件及软链接文件无任何影响。
e)删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状)。
f)同时删除源文件及其硬链接文件,整个文件才会被“真正”的删除。
5)答案例:硬链接用处不多,可以用来对重要文件做快照以防止误删,对目录建立软链接在工作中很常用,例如,安装软件会适用nginx-1.10作为目录,安装完后设置软链接为nginx,即保持了版本号标识,又方便使用,以及方便后续的软件升级。
【命令星级】 ★★☆☆☆
【功能说明】
使用cat命令查看软链接文件时,会发现只能看到源文件的内容,看不到软链接文件的真实内容。因此需要使用readlink命令,它能够帮助我们查看符号链接文件的真实内容。
【语法格式】
readlink [option] [file]
readlink [选项] [文件]
**说明:**readlink命令以及后面的选项和文件,每个元素之间都至少要有一个空格。
【选项说明】
表2-15针对该命令的参数选项进行了说明。
表2-15 readlink命令的参数选项及说明
**范例2-50:**查看符号链接文件的内容。
[root@centos7 ~]# ll -h /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Oct 20 16:13 /usr/bin/awk -> gawk
[root@centos7 ~]# readlink /usr/bin/awk #可用查看到这个软链接文件的真实内容。
gawk
[root@centos7 ~]# readlink -f /usr/bin/awk #使用-f参数会将最后一个非符号链接文件显示出来。
/usr/bin/gawk