概述
在Linux文件系统中,软连接(Symbolic Link)和硬连接(Hard Link)是两种重要的文件链接方式。它们都可以创建指向相同文件内容的多个“链接”,但在实现方式和特性上有所不同。
1. 硬连接(Hard Link)
- 概念:硬连接是同一个文件在文件系统中的多个目录项,本质上是给同一个inode分配多个文件名。所有硬连接都指向同一个inode,即同一份数据。
- 特点:
- 硬连接与目标文件共享同一个inode,因此只在同一文件系统内有效。
- 删除目标文件或硬链接文件不会影响其他硬链接,只有当所有硬连接被删除后,文件数据才会真正被删除。
- 硬连接只能指向文件,不能指向目录。
- 创建命令:使用
ln [目标文件] [链接文件]
来创建硬连接。例如:ln /home/user/file.txt /home/user/hard_link_to_file
2. 软连接(Symbolic Link)
- 概念:软连接是一种指向文件或目录的引用,类似于Windows中的快捷方式。软连接文件包含目标文件的路径,当访问软连接时,系统会自动跳转到目标文件。
- 特点:
- 软连接是一个独立的文件,具有自己的inode(索引节点)。
- 软连接可以跨文件系统创建,即可以链接到不同分区上的文件。
- 软连接可以指向文件或目录。
- 如果目标文件被删除,软连接会失效,变成“断链”(Broken Link)。
- 创建命令:使用
ln -s [目标文件或目录] [链接文件]
来创建软连接。例如:ln -s /home/user/file.txt /home/user/link_to_file
总结
特性 | 软连接 | 硬连接 |
---|---|---|
是否共享inode | 否 | 是 |
跨文件系统 | 支持 | 不支持 |
指向类型 | 文件或目录 | 文件 |
失效情况 | 目标文件删除则失效 | 目标或链接删除不影响其他 |
软连接适合用于快捷访问不同位置的文件或目录,硬连接则更适合需要在同一文件系统中保留文件副本的场景。
原理
inode源码
以下结构体对应文件的inode的源码,其中不相关的部分已省略
struct ext2_inode {
...
__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
...
};
__le32 i_block[EXT2_N_BLOCKS]
: 文件数据块的指针数组,EXT2_N_BLOCKS
通常定义为 15。前 12 个是直接指向数据块的指针,后面 3 个分别是单重、双重、三重间接指针,用于存储文件内容的物理地址。
硬连接
硬连接文件和源文件使用同一个inode,只是这个inode有两个不一样的文件名称, 对应的结构体中的i_block
中存放的是数据块的具体地址。
软连接
软连接是一个全新的文件,为不同的inode,通常情况下,i_block
是用来存储文件数据块地址的。但在 EXT2 文件系统 中,有一个例外:对于小于 60 字节的软链接文件,i_block
会直接存储软链接目标路径,而不是数据块地址。这种设计是为了提高效率,因为短路径的软链接可以直接在 inode 中存储路径信息,从而避免为软链接额外分配数据块。
具体来说:
- 普通文件和较大的软链接文件:
i_block
中保存的是数据块的地址。 - 小的软链接文件(通常指目标路径少于 60 字节):
i_block
中直接保存路径字符串,而不是数据块地址。
这是 EXT2 文件系统的一种优化策略,使得对短路径的软链接访问更快,也减少了磁盘空间的使用。
示例
[root@ct7_node01 tmp]# ll /disk/ -i
total 17
12 -rw-r--r--. 2 root root 3 Nov 4 15:57 hlf
13 lrwxrwxrwx. 1 root root 4 Nov 4 15:57 slf -> srcf
12 -rw-r--r--. 2 root root 3 Nov 4 15:57 srcf
[root@ct7_node01 tmp]#
# 软连接的data blocks中存放的为原文件的路径即当前目录下的srcf
[root@ct7_node01 ~]# hexdump -s 128512 -n 128 /root/disk.img -C
0001f600 ff a1 00 00 04 00 00 00 6d 7e 28 67 66 7e 28 67 |........m~(gf~(g|
0001f610 66 7e 28 67 00 00 00 00 00 00 01 00 02 00 00 00 |f~(g............|
0001f620 00 00 00 00 01 00 00 00 73 72 63 66 00 00 00 00 |........srcf....|
0001f630 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0001f660 00 00 00 00 e0 90 fe e3 7a 01 00 00 00 00 00 00 |........z.......|
0001f670 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0001f680
[root@ct7_node01 ~]#
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Linux中的软硬链接文件详解
发表评论 取消回复