前言
linux系统中链接文件仔细区分可以分为软连接(符号链接)和硬链接。软链接比硬链接应用更广泛,所以也可以认为linux链接文件就是指软链接文件。
本文将会在第2部分介绍创建软链接和硬链接的基本命令,在第3部分从linux文件系统的角度出发,深入分析软连接和硬链接的区别。如果只是想简单了解一下如何创建链接文件,看第2部分内容即可。
创建链接文件的基本命令
2.1 创建连接的基本命令
都是通过命令ln创建,通过参数选项-s来区分软链接和硬链接。命令如下:
ln [选项] 源文件 目标文件 # ln 是link缩写
选项参数:
-s 表示创建软链接,没有选项“-s”则是创建硬链接。
-f 强制。如果链接文件已经存在,则会删除原来的文件重新创建
下面以linux系统中编译器的gcc文件举例,展示如何如何创建软链接和硬链接。
首先,通过which命令查看gcc所在的位置:
显示结果如下:
在/opt2/test目录下面分别创建一个gcc的软链接gcc-soft和硬链接gcc-hard:
ln -s /usr/bin/gcc /opt2/test/gcc-soft # 软链接
ln /usr/bin/gcc /opt2/test/gcc-hard # 硬链接
需要注意的是,创建软链接时,源文件必须写绝对路径。
cd到test目录下面,通过ls -l查看创建的软链接文件:
从上面的图可以看到:
软链接文件的属性显示为l(link file),硬链接为-。文件属性详细内容可参考文章:文件属性查看。
软链接文件会显示指向/usr/bin/目录下的源文件gcc,硬链接则不会显示。
最后可以简单测试一下创建的链接文件:
可以看到软链接和硬链接文件都可以执行成功,与源文件命令gcc --version效果一样,说明链接文件创建成功。
2.2 链接文件的删除
无论时软链接还是硬链接,删除都很简单,和普通文件一样,都是使用rm命令删除。例如:
rm -f gcc-soft # 删除软链接文件
这里需要注意的时:
删除软链接或硬链接都不会影响到原来的文件
如果删除原来的文件,软链接就会找不到源文件出错,硬链接依然可以。
软链接和硬链接的区别
3.1 linux文件系统
简单来讲linux ext4文件系统下,每个文件(包含目录)由inode、block两个部分组成。每个inode和block都有编号,根据编号都可以找到相关的inode或者block,也就可以获取文件的内容了。
inode,一般占内存较小,默认为128byte,用来记录文件的属性(rwx)、拥有者以及对应的block号。
block,占内存较大,默认为4kb。用来保存文件的真正内容。
需要对block中保留的真正内容做一个说明,对于非目录文件来说,真正内容就是具体的数据、文本等;对于目录文件来说,真正内容就是目录下面子目录、文件的名称和inode号。
下面以test目录为例,test目录下面有个hello.txt文本文件,里面内容是hello world!,还有一个子目录subdir,子目录里面包含一个文件data.dat,里面有保存了一些数据。test目录结构如下:
那么test目录下面的文件的inode和block关系示意图如下:
说明:
黑色数字代表inode号,红色数字代表block号。号码是随意取的,这里注意其中的对应关系即可
block黄色背景的是目录的block,白色背景的文件的block
如果要查找data.dat文件,查找顺序如下:
首先根据test目录的inode节点中的block号1000找到block1000 -- > 根据block1000中得知subdir的inode号2 -- > inode2中保存subdir block号为1002 --> block1002中data.dat inode号为3 --> inode3中保存的data.dat的block号1003 --> block1003中存储data.data的具体内容。
最后得到inode3就得到了data.dat的权限属性拥有者,而block1003中保存了实际内容。
3.2 软链接与硬链接
考虑给在tmp1目录下面给hello.txt增加一个软链接文件hello-soft.txt, 在tmp2目录下面给hello.txt增加一个硬链接文件hello-hard.txt.
从下的示意图可以看到:
增加软链接,会增加一个inode号2和对应的block1002,block1002中记录了源文件hello.txt的inode号1,故最终可以链接到源文件
增加硬链接,实际上并没有增加inode和block。只是在原来天tmp2目录的block中增加了一个inode号记录,好像hello.txt也是tmp2目录下的文件一样。
参考: