[操作系统] 文件的软链接和硬链接

news2025/4/16 2:57:22


文章目录

  • 引言
  • 硬链接(Hard Link)
    • 什么是硬链接?
    • 硬链接的特性
    • 硬链接的用途
  • 软链接(Symbolic Link)
    • 什么是软链接?
    • 软链接的特性
    • 软链接的用途
  • 软硬链接对比
  • 文件的时间戳
  • 实际应用示例
    • 使用硬链接节省备份空间
    • 用软链接管理多版本
    • 查找所有硬链接文件
  • 注意事项
  • 总结

引言

在 Linux 文件系统中,文件名与文件数据的关系并不像表面看起来那样简单。真正标识文件的是 inode(索引节点),而文件名只是 inode 的别名。这种设计衍生出了两种特殊的文件关联方式:硬链接(Hard Link)软链接(Symbolic Link,又称软链接)。本文将深入探讨它们的原理、区别及实际应用。


硬链接(Hard Link)

什么是硬链接?

硬链接是多个文件名指向同一个 inode 的映射关系。通过 ln 命令可以创建硬链接:

touch abc
ln abc def  # 创建硬链接
ls -li      # 查看 inode

输出示例:

263466 -rw-r--r-- 2 user group 0 Sep 15 17:45 abc
263466 -rw-r--r-- 2 user group 0 Sep 15 17:45 def
  • inode 相同abcdef 的 inode 均为 263466
  • 链接数:inode 的硬链接数会递增(此处为 2)。

硬链接的特性

  • 共享数据写时计数的原理,所有硬链接指向同一份磁盘数据。
  • 独立性:删除任意一个硬链接不会影响其他链接,只有当链接数归零时,文件才会被真正删除。
  • 限制
    • 不能跨文件系统创建(inode 是文件系统局部的)。
    • 不能对目录创建硬链接(避免循环引用)。

硬链接的用途

  • 文件备份:创建重要文件的硬链接,防止误删。
  • 文件系统结构:目录中的 .(当前目录)和 ..(上级目录)本质上是硬链接,所以目录文件的硬链接数会被当前目录的.和下一级目录的..影响。
  • ... 是文件系统内部实现的硬链接,用于维护目录树结构。
  • 用户无法手动为目录创建硬链接,但文件系统自身在底层使用硬链接机制。

用户手动建立目录硬链接的话会破坏文件系统的树状结构,形成路径环问题


软链接(Symbolic Link)

什么是软链接?

软链接是一个独立的文件,其内容存储的是目标文件的路径。通过 ln -s 创建:

ln -s abc abc.soft  # 创建软链接
ls -li

输出示例:

263563 -rw-r--r-- 2 user group 0 Sep 15 17:45 abc
261678 lrwxrwxrwx 1 user group 3 Sep 15 17:53 abc.soft -> abc
  • inode 不同:软链接有自己的 inode(261678)。
  • 文件类型l 表示链接文件,-> 指向目标路径。

软链接的特性

  • 灵活性
    • 可跨文件系统创建。
    • 可指向目录或文件。
  • 依赖性:删除原文件后,软链接会变成“悬空链接”(Dangling Link)。
  • 路径解析:可以是绝对路径或相对路径(相对于软链接的位置)。

软链接的用途

  • 快捷方式:快速访问深层目录中的文件。
  • 版本管理:如 /usr/bin/python 指向具体版本(如 python3.11)。
  • 动态切换:在配置文件中指向不同环境(开发、生产)。

软硬链接对比

特性硬链接软链接
inode与原文件相同独立 inode
跨文件系统❌ 不支持✅ 支持
指向目录❌ 不允许✅ 允许
原文件删除后仍可访问(链接数减 1)失效(悬空链接)
存储内容直接映射 inode存储目标路径字符串
文件大小与原文件相同等于路径字符串长度
应用场景备份、文件系统结构快捷方式、动态引用

文件的时间戳

Linux 文件有三个关键时间戳:

  1. Access Time (atime):最后访问时间(如 cat 查看文件)。
  2. Modify Time (mtime):文件内容最后修改时间(如 echo 写入)。
  3. Change Time (ctime):文件元数据最后修改时间(如权限、链接数变化)。

注意

  • 修改文件内容会更新 mtimectime
  • 创建硬链接会增加链接数,因此会更新 ctime

实际应用示例

使用硬链接节省备份空间

cp -l data.txt backup/  # 用硬链接备份,共享相同数据块

用软链接管理多版本

ln -s /opt/app/v2.0/ /opt/app/current

查找所有硬链接文件

find /path -samefile filename  # 根据 inode 查找

注意事项

  1. 避免循环软链接:如 a -> bb -> a
  2. 权限问题:软链接的权限是独立的,但最终访问权限由目标文件决定。
  3. 路径依赖:移动原文件会导致软链接失效,硬链接不受影响。

总结

场景推荐链接类型
同文件系统备份硬链接
跨文件系统引用软链接
需要快捷方式软链接
维护文件系统结构(. / …)硬链接

理解软硬链接的底层机制,能帮助开发者更高效地管理文件、设计存储方案。无论是通过硬链接实现低成本备份,还是利用软链接灵活组织项目结构,这两种工具都是 Linux 系统中不可或缺的利器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像

【TI毫米波雷达】DCA1000的ADC原始数据C语言解析及FMCW的Python解析2D-FFT图像 文章目录 ADC原始数据C语言解析Python的2D-FFT图像附录:结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput informati…

LeeCode题库第三十九题

39.组合总和 项目场景: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同…

B/B+树与mysql索引

数据结构操作网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(log n)O(log n) B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着&#xf…

【踩坑随笔】`npm list axios echarts`查看npm依赖包报错

npm list axios echarts查看npm依赖包出现以下报错,原因就是包的版本匹配问题,按照提示降axios版本或者自己升找合适的got版本,我这里是选择了降版本。本文记录仅做解决思路参考不一定适配大家的实际情况。 weed-detection-system1.0.0 E:\P…

leetcode日记(74)合并两个有序数组

还是很简单很基础的。一开始在思考后面补的全是0怎么知道0是原本数组的还是要替换成nums2的元素的&#xff0c;后来发现其实一开始可以直接剔除nums1后的n个元素…… 使用双指针&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vecto…

【数据结构】堆与二叉树

一、树的概念 1.1 什么是树&#xff1f; 树是一种非线性的数据结构&#xff0c;其由 n 个 ( n > 0 ) 有限节点所组成的一个有层次关系的集合。之所以称其为树&#xff0c;是因为其逻辑结构看起来像是一颗倒挂的树。 在树中&#xff0c;有一个特殊的节点称为根节点&#xf…

游戏引擎学习第128天

开始 然而&#xff0c;我们仍然有一些工作要做&#xff0c;渲染部分并没有完全完成。虽然现在已经能够运行游戏&#xff0c;而且帧率已经可以接受&#xff0c;但仍然有一些东西需要进一步完善。正在使用调试构建编译版本&#xff0c;虽然调试版本的性能不如优化版本&#xff0…

自然语言处理:词频-逆文档频率

介绍 大家好&#xff0c;博主又来给大家分享知识了。本来博主计划完成稠密向量表示的内容分享后&#xff0c;就开启自然语言处理中文本表示的讲解。可在整理分享资料的时候&#xff0c;博主发现还有个知识点&#xff0c;必须得单独拎出来好好说道说道。 这就是TF-IDF&#xf…

快速在本地运行SpringBoot项目的流程介绍

目录 前言 一、环境配置 1.1Java环境 1.2Maven环境 1.3IntelliJ IDEA安装 1.4MySql安装 二、项目导入与启动的过程 2.1Maven镜像和本地仓库 2.1.2镜像配置 2.1.3配置本地仓库 2.2导入项目与启动 2.2.1加载Maven设置 2.2.2配置jdk与java版本 2.2.3创建数据库 2.2…

SpringBoot 端口配置

在Spring Boot中&#xff0c;配置应用程序的监听端口有多种方式。以下是常见的几种方法&#xff1a; 1. 通过 application.properties 或 application.yml 文件配置 application.properties server.port8081application.yml server:port: 8081如果没有显式配置 server.port…

Python 数据结构 4.单向链表

惟愿春日不迟&#xff0c;相逢终有时 —— 25.3.2 一、单向链表的基本概念 1.单向链表的概念 对于顺序存储的结构&#xff0c;最大的缺点就是&#xff1a;插入 和 删除 的时候需要移动大量的元素&#xff0c;所以基于前人的智慧&#xff0c;他们发明了链表。 链表是由一个个结…

LeeCode题库第四十题

40.组合总和II 项目场景&#xff1a; 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示…

玩转大模型——deepseek本地部署与ollama 非C盘安装之ChatBox配置

文章目录 ollama安装ollama是什么DeepSeek是什么下载地址非C盘安装配置大模型目录大模型下载安装deepseek-r1:1.5b安装deepseek-r1:7b ChatBox安装参考资料 ollama安装 ollama是什么 Ollama 是一个专注于本地运行大型语言模型的工具。它允许用户在本地环境中部署和运行各种开…

DAV_postgresql_3-schema

schem介绍&#xff1a; 什么是schema? 用户对象的集合叫做模式 不同模式下的对象可以同名 可以把用户下对象根据业务分类&#xff0c;不同的对象放在不同的模式 一个用户可以创与拥有多个模式 一个模式只能属于一个用户 普通用户创建模式需要授权指定数据库下的创建权限…

Hive-04之存储格式、SerDe、企业级调优

一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE&#xff08;行式存储&#xff09; 、SEQUENCEFILE(行式存储)、ORC&…

信号和槽

connect(信号发送者&#xff0c;发送的信号&#xff0c;信号接收者&#xff0c;信号的处理); 信号函数和槽函数的参数必须是一样的&#xff0c;但信号的参数可以多余槽函数的参数&#xff08;前面的参数类型必须一致&#xff09; 是控件和控件间的信号传递&#xff0c;这两个…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(八) 聊天框用户列表

简单画了个聊天框 就是咱们的HomePage.jsx 1.后端接口开发 在server/src/index.js 新增 messagesRoutes 先引入 import messageRoutes from ./routes/message.route.js // 消息接口 app.use(/api/messages, messageRoutes) 在routes文件夹下新建message.route.js 有3个路…

关于后端使用Boolean或boolean时前端收到的参数的区别

当后端使用的是Boolean时&#xff0c;调用的方法是setIsLoginUser&#xff0c;前端收到的参数的参数名是isLoginUser 而当后端使用的是boolean时&#xff0c;调用的方法是setLoginUser&#xff0c;前端收到的参数的参数名是loginUser 封装类和基本数据类型在使用时需要注意这…

智能称重搬物寻迹小车(论文+源码)

1 系统设计方案确定 本次设计的总系统有以下几个模块分别是避障模块&#xff0c;循迹模块&#xff0c;二维码扫描电路&#xff0c;称重电路&#xff0c;LCD显示电路和电机驱动模块&#xff0c;而且这几个模块都是由单片机stm32控制的&#xff0c;整个系统的框图如下图所示。其…