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


文章目录
- 引言
- 硬链接(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 相同:
abc和def的 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 文件有三个关键时间戳:
- Access Time (atime):最后访问时间(如
cat查看文件)。 - Modify Time (mtime):文件内容最后修改时间(如
echo写入)。 - Change Time (ctime):文件元数据最后修改时间(如权限、链接数变化)。
注意:
- 修改文件内容会更新
mtime和ctime。 - 创建硬链接会增加链接数,因此会更新
ctime。
实际应用示例
使用硬链接节省备份空间
cp -l data.txt backup/ # 用硬链接备份,共享相同数据块
用软链接管理多版本
ln -s /opt/app/v2.0/ /opt/app/current
查找所有硬链接文件
find /path -samefile filename # 根据 inode 查找
注意事项
- 避免循环软链接:如
a -> b且b -> a。 - 权限问题:软链接的权限是独立的,但最终访问权限由目标文件决定。
- 路径依赖:移动原文件会导致软链接失效,硬链接不受影响。
总结
| 场景 | 推荐链接类型 |
|---|---|
| 同文件系统备份 | 硬链接 |
| 跨文件系统引用 | 软链接 |
| 需要快捷方式 | 软链接 |
| 维护文件系统结构(. / …) | 硬链接 |
理解软硬链接的底层机制,能帮助开发者更高效地管理文件、设计存储方案。无论是通过硬链接实现低成本备份,还是利用软链接灵活组织项目结构,这两种工具都是 Linux 系统中不可或缺的利器。
相关文章:
[操作系统] 文件的软链接和硬链接
文章目录 引言硬链接(Hard Link)什么是硬链接?硬链接的特性硬链接的用途 软链接(Symbolic Link)什么是软链接?软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…...
RabbitMQ面试题及原理
RabbitMQ使用场景: 异步发送(验证码、短信、邮件…)MYSQL和Redis, ES之间的数据同步分布式事务削峰填谷 1. 消息可靠性(不丢失) 消息丢失场景: RabbitMQ-如何保证消息不丟失? 开启生产者确…...
SpringBoot中Get请求和POST请求接收参数详解
1、Get请求 1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须保持一致 RestController RequestMapping(“/user”) Slf4j public class DemoController { GetMapping("/query") public void getStudent(String name,Strin…...
分布式日志和责任链路
目录 日志问题 责任链问题 分布式日志 GrayLog简介 部署安装 收集日志 配置Inputs 集成微服务 日志回收策略 搜索语法 搜索语法 自定义展示字段 日志统计仪表盘 创建仪表盘 链路追踪 APM 什么是APM 原理 技术选型 Skywalking简介 部署安装 微服务探针 整合…...
h5 IOS端渐变的兼容问题 渐变实现弧形效果
IOS端使用渐变的时候有兼容问题 以下是问题效果,图中黑色部分期望的效果应该是白色的。但是ios端是下面的样子…… 安卓pc 支持: background-image: radial-gradient(circle 40rpx at 100% 0, #f3630c 40rpx, rgb(255, 255, 255) 50%);安卓pc ios支持…...
哈希算法--猜数字游戏
1.题目要求 输入两个位数相同的数,判断对应位置的数字是否相等,返回两个数。第一个数是数字和位置完全猜对的数字个数,第二个数是数字大小猜对但位置不对的数字个数 2.逐步编程 2.1 定义函数 def g(secret,guess):sec_dic{}gue_dic{}# 定义…...
idea生成自定义Maven原型(archetype)项目工程模板
一、什么是Maven原型(Maven archetype) 引自官网的介绍如下: Maven原型插件官网地址 这里采用DeepSeek助手翻译如下: Maven 原型 什么是原型? 简而言之,原型是一个 Maven 项目模板工具包。原型被定义为一…...
Redis面试常见问题——使用场景问题
目录 Redis面试常见问题 如果发生了缓存穿透、击穿、雪崩,该如何解决? 缓存穿透 什么是布隆过滤器? 缓存击穿 缓存雪崩 双写一致性(redis做为缓存,mysql的数据如何与redis进行同步呢?) …...
样式和ui(待更新)
element-plus 先在项目下执行安装语句执行按需导入的命令按照官方文档修改vitest.json sass样式定制 npm -i sass -D在项目下准备定制的样式文件 styles/element/index.scss(!注意这里是.scss文件在vitest.json 修改配置文件 Components({resolvers: [ElementPlusResolver(…...
大摩闭门会:250228 学习总结报告
如果图片分辨率不足,可右键图片在新标签打开图片或者下载末尾源文件进行查看 本文只是针对视频做相应学术记录,进行学习讨论使用...
线程(Thread)
一、概念 线程:线程是一个轻量级的进程 二、线程的创建 1、线程的空间 (1)进程的空间包括:系统数据段、数据段、文本段 (2) 线程位于进程空间内部 (3) 栈区独享、与进程共享文本段、…...
AI军备竞赛2025:GPT-4.5的“情商革命”、文心4.5的开源突围与Trae的代码革命
AI军备竞赛2025:GPT-4.5的“情商革命”、文心4.5的开源突围与Trae的代码革命 ——一场重塑人类认知边界的技术战争 一、OpenAI的“感性觉醒”:GPT-4.5的颠覆与争议 1.1 从“冷面学霸”到“温柔导师”:AI的情商跃迁 当用户输入“朋友放鸽子&…...
DeepSeek + 自由职业 发现新大陆,从 0 到 1 全流程跑通商业 IP
DeepSeek 自由职业 发现新大陆,从 0 到 1 全流程跑通商业 IP 商业定位1. 商业定位分析提示词2. 私域引流策略提示词3. 变现模型计算器提示词4. 对标账号分析提示词5. 商业IP人设打造提示词6. 内容选题策略提示词7. 用户人群链分析提示词8. 内容布局与转化路径设计提…...
Java进阶——常用工具类
日常开发中,Arrays、Collections 和 Objects 是非常实用的工具类,提供了丰富的功能,从而可以更高效地处理数组、集合和对象。本文将详细介绍这三个工具类的重要知识细节。 本文目录 一、 Arrays数组转集合并行排序优化Stream 支持 二、 Colle…...
【考试大纲】高级系统架构设计师考试大纲
目录 引言一、 考试说明1.考试目标2.考试要求3.考试科目设置二、 考试范围考试科目1:系统架构设计综合知识考试科目2:系统架构设计案例分析考试科目3:系统架构设计论文引言 最新的系统架构设计师考试大纲出版于 2022 年 11 月,本考试大纲基于此版本整理。 一、 考试说明…...
上位机知识篇---四种CPU架构交叉编译
文章目录 前言一、四种 CPU 架构1. x86/x86_64指令集位宽:应用场景编译工具 2. ARM指令集位宽:应用场景编译工具 3. MIPS指令集位宽应用场景编译工具 4. RISC-V指令集位宽应用场景编译工具 二、交叉编译1. 什么是交叉编译?定义应用场景 2. 交…...
隐式转换为什么导致索引失效
SELECT * FROM users WHERE id 123;这条语句失效的原因就是id是int类型的主键,比较的时候把id从int转化为字符串来比较了,而字符串的比较规则和int的比较规则明显不同,字符串是字典序比较的,还涉及到数据的长度,那为什…...
【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现
项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...
SpringBoot @Value 注解使用
Value 注解用于将配置文件中的属性值注入到Spring管理的Bean中。 1. 基本用法 Value 可以直接注入配置文件中的属性值。 配置文件 (application.properties 或 application.yml) 配置文件定义需要注入的数据。 consumer:username: lisiage: 23hobby: sing,read,sleepsubje…...
Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言安装JDK 17创建Spring Boot 项目 方式1:网页在线生成方式2&#…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
FTXUI::Dom 模块
DOM 模块定义了分层的 FTXUI::Element 树,可用于构建复杂的终端界面,支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...
多模态大语言模型arxiv论文略读(112)
Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题:Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者:Jea…...
uni-app学习笔记二十三--交互反馈showToast用法
showToast部分文档位于uniapp官网-->API-->界面:uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容,长度与 icon 取值有关。iconString否图…...
