Linux 下软链接和硬链接的区别
在 Linux 系统中,一切都是文件,然而为了区分不同类型的事物,我们有了:
- 普通文件
- 目录文件
- 链接文件
- 设备文件
Linux 下的链接
前置
vi 1.txt
#输入test
#:wq
Linux 系统下可以通过 ln 命令来进行文件链接
ln -s 1.txt ll.txt
通过 ls -li
查看当前目录,可以发现
9700383 -rw-r--r-- 1 root root 5 Jan 31 11:52 1.txt
9699855 lrwxrwxrwx 1 root root 5 Jan 31 11:55 ll.txt -> 1.tx
其中 ll.txt 就是一个文件链接
ln
指令默认创建的是硬链接,如果加入了-s
参数,则会生成一个软链接。
硬链接
先来看看 ln 默认创建的硬链接,由于 Linux 下的文件是通过索引节点(Inode)来识别文件,在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号 (Inode Number)。
在 Linux 中,多个文件名指向同一索引节点是存在的,所以硬连接指通过索引节点来进行的连接,即每一个硬链接都是一个指向对应区域的文件。
以刚才的 1.txt
文件,建立他的硬链接来看
ln 1.txt hl.txt
9700383 -rw-r--r-- 2 root root 5 Jan 31 11:52 1.txt
9700383 -rw-r--r-- 2 root root 5 Jan 31 11:52 hl.txt
前面的 9700383
是文件的 inode,可以简单把它想成 C 语言中的指针,它指向了物理硬盘的一个区块,事实上文件系统会维护一个引用计数,只要有文件指向这个区块,它就不会从硬盘上消失,这里我们会发现,这两个文件拥有相同的 inode,通过查看文件内容也会发现是同一个文件:
硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能,由于对应该目录的索引节点有一个以上的连接,假设我们删除了原始的 1.txt
文件:
rm -f 1.txt
cat hl.txt
# test
此时文件的内容依然存在,所以只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个链接被删除后,文件的数据块及目录的连接才会被释放,也就是说,文件才会被真正删除
软链接
以刚才的软连接 ll.txt
为例:
cat ll.txt
## cat: ll.txt: No such file or directory
## 此时文件已经不存在
软链接又叫符号链接,这个文件包含了另一个文件的路径名,例如在上图中,ll.txt
就是 1.txt
的软连接,1.txt
是实际的文件,ll.txt
包含的是对于 1.txt
的 inode 的记录。
软连接可以是任意文件或目录,可以链接不同文件系统的文件,在对符号文件进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作,但删除链接文件时,系统仅仅删除链接文件,而不删除源文件本身,这一点类似于 Windows 操作系统下的快捷方式。
软链接和硬链接的区别
软链接 | 硬链接 | |
---|---|---|
inode | 软链接源文件 & 链接文件拥有不通的 inode 号,表明他们是两个不同的文件 | 硬链接原文件和链接文件共用一个 inode 号,就像一个文件有多个文件名,说明他们是同一个文件 |
文件属性 | 软链接明确写出了是链接文件 | 硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系 |
跨越文件系统建立 | 支持 | 不支持 |
链接数目 | 软链接的链接数目不会增加,文件大小是不一样的(可以理解为快捷方式和对应源文件之间的关系) | 硬链接文件显示的大小是跟原文件shi |