当前位置: 首页 > news >正文

Linux中的软硬链接文件详解

概述

在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 ~]# 

http://www.lryc.cn/news/477230.html

相关文章:

  • 「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
  • pgsql数据量大之后可能遇到的问题
  • Android 解决MTK相机前摄镜像问题
  • 在 Oracle 数据库中,SERVICE_NAME 和 SERVICE_NAMES 有什么区别?
  • 【Maven】——基础入门,插件安装、配置和简单使用,Maven如何设置国内源
  • AIGC时代LaTeX排版的应用、技巧与未来展望
  • 二叉树的深搜
  • JUC笔记之ReentrantLock
  • 【含文档】基于ssm+jsp的图书管理系统(含源码+数据库+lw)
  • pytorch知识蒸馏测试
  • mutable用法
  • SQL语言基础
  • 在USB电源测试中如何降低测试成本?-纳米软件
  • springboot - 定时任务
  • 一篇文章理解CSS垂直布局方法
  • SpringBoot day 1105
  • MySQL 完整教程:从入门到精通
  • 【贝叶斯公式】贝叶斯公式、贝叶斯定理、贝叶斯因子,似然比
  • [libos源码学习 1] Liboc协程生产者消费者举例
  • Python OpenCV 图像改变
  • k8s按需创建 PV和创建与使用 PVC
  • 揭秘云计算 | 2、业务需求推动IT发展
  • 【系统面试篇】进程与线程类(2)(笔记)——进程调度、中断、异常、用户态、核心态
  • 基于MySQL的企业专利数据高效查询与统计实现
  • 热成像手机VS传统热成像仪:AORO A23为何更胜一筹?
  • Spring IoC——依赖注入
  • Linux 中,flock 对文件加锁
  • CentOS下载ISO镜像的方法
  • Node.js 入门指南:从零开始构建全栈应用
  • MYSQL 真实高并发下的死锁