当前位置: 首页 > 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 ~]# 

相关文章:

Linux中的软硬链接文件详解

概述 在Linux文件系统中,软连接(Symbolic Link)和硬连接(Hard Link)是两种重要的文件链接方式。它们都可以创建指向相同文件内容的多个“链接”,但在实现方式和特性上有所不同。 1. 硬连接(Ha…...

「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制

高级动画可以显著提升用户体验,为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画,包括弹性动画、透明度渐变和旋转缩放组合动画等示例。 关键词 高级动画弹性缓动自动动画缓动曲线 一、Animation 组件的高级缓动曲线 缓动曲线&#…...

pgsql数据量大之后可能遇到的问题

当 PostgreSQL 数据量增大时,可能会遇到以下问题: 查询性能下降:随着数据量的增加,查询可能会变得缓慢,尤其是在没有适当索引的情况下。大量的数据意味着更多的行需要被扫描和过滤,这会显著增加查询执行时间…...

Android 解决MTK相机前摄镜像问题

很莫名其妙的,前摄默认镜像,原来是为了前摄拍字体正确显示,比如自拍,前摄拍摄的人像虽左右镜像了,但如果后面有字牌显示,字体会显示正常而不是翻转。但现在需求是满足普遍的前摄原生代码不带镜像修改&#…...

在 Oracle 数据库中,SERVICE_NAME 和 SERVICE_NAMES 有什么区别?

在 Oracle 数据库中,SERVICE_NAME 和 SERVICE_NAMES 是两个相关的但略有不同的概念。它们都用于标识数据库服务,但使用场景和作用有所不同。下面详细解释这两个概念的区别: SERVICE_NAME 1. 定义: SERVICE_NAME 是一个单一的、…...

【Maven】——基础入门,插件安装、配置和简单使用,Maven如何设置国内源

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入: 一:Maven插件的安装 1:环境准备 2:创建项目 二…...

AIGC时代LaTeX排版的应用、技巧与未来展望

文章目录 一、LaTeX简介与基础设置二、常用特殊符号与公式排版三、图片与表格的插入与排版四、自动编号与交叉引用五、自定义命令与样式六、LaTeX在AIGC时代的应用与挑战七、LaTeX的未来展望《LaTeX 入门实战》内容简介作者简介目录前言/序言读者对象本书内容充分利用本书 在AI…...

二叉树的深搜

前言: 本章节更深入学习递归 计算布尔二叉树的值 思路: 1.函数头设计:dfs(root) 2.函数体:需要一个接收left 和 right 的值 并且根据root的值进行比较 3.递归出口:很明显 当为叶子节点的时候…...

JUC笔记之ReentrantLock

ReentrantLock 相对于synchronized它具备如下特点 可中断 可以设置超时时间 可以设置为公平锁 支持多个条件变量(多个wait set,不同于synchronized的wait set,ReentrantLock的wait set在同一条件下notify才能唤醒WATING状态的线程) 与synchronized一样,都支持可重入 …...

【含文档】基于ssm+jsp的图书管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定义了两个…...

pytorch知识蒸馏测试

import torch from torch import nn,optim import torch.utils import torch.utils.data import torch.utils.data.dataloader from torchvision import transforms,datasets...

mutable用法

mutable 关键字用于允许类的某个成员变量在 const 成员函数中被修改。通常,const 成员函数不能改变对象的任何成员变量,但将成员变量声明为 mutable 可以例外 class Hero { public:Hero():m_Hp(0), m_getHpCounter(0){}int getHp() const {m_getHpCounte…...

SQL语言基础

SQL(Struct Query Language)是结构化查询语言的简称,是一种在关系型数据库中定义和操纵数据的标准语言。 不要使用面向对象的思想学习SQL,因为它不是面向对象的语言目标 SQL语言简介(了解)从数据库数据检索数据(重点)子查询(重点)Oracle常用函数(掌握) …...

在USB电源测试中如何降低测试成本?-纳米软件

USB 电源模块在现代电子设备中广泛应用,其性能的稳定性和可靠性至关重要。然而,测试 USB 电源模块的成本可能会很高,这对于企业和研发机构来说是一个重要的问题。因此,寻找降低 USB 电源模块测试成本的方法具有重要的现实意义。 降…...

springboot - 定时任务

定时任务是企业级应用中的常见操作 定时任务是企业级开发中必不可少的组成部分,诸如长周期业务数据的计算,例如年度报表,诸如系统脏数据的处理,再比如系统性能监控报告,还有抢购类活动的商品上架,这些都离不…...

一篇文章理解CSS垂直布局方法

方法1&#xff1a;align-content: center 在 2024 年的 CSS 原生属性中允许使用 1 个 CSS 属性 align-content: center进行垂直居中。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…...

SpringBoot day 1105

ok了家人们&#xff0c;今天继续学习spring boot&#xff0c;let‘s go 六.SpringBoot实现SSM整合 6.1 创建工程&#xff0c;导入静态资源 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</…...

MySQL 完整教程:从入门到精通

MySQL 完整教程&#xff1a;从入门到精通 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;它使用结构化查询语言 (SQL) 来管理和操作数据。本文将详细介绍 MySQL 的基本概念、安装与配置、常用 SQL 语法、数据表的创建与管理、索引、视图、存储过程、触发器等高级特性…...

【贝叶斯公式】贝叶斯公式、贝叶斯定理、贝叶斯因子,似然比

一、是什么&#xff1f; 贝叶斯公式的本质在于它提供了一种在已有知识的基础上更新和调整我们对事件的信念的方式。具体来说&#xff0c;贝叶斯公式描述了后验概率&#xff08;即在观察到某些证据后更新的概率&#xff09;与先验概率&#xff08;即在没有观察证据之前的概率&a…...

[libos源码学习 1] Liboc协程生产者消费者举例

文章目录 1. CoRoutineEnv_t结构体用于管理协程环境 3 Liboc协程生产者消费者例子4 Liboc协程生产者消费者&#xff0c; 为什么队列不需要上锁&#xff1f;5. 两个协程访问资源不需要加队列吗5. 参考 1. CoRoutineEnv_t结构体用于管理协程环境 struct stCoRoutineEnv_t { stCo…...

10分钟搞定Android Studio中文界面:告别英文困扰,让开发效率翻倍提升

10分钟搞定Android Studio中文界面&#xff1a;告别英文困扰&#xff0c;让开发效率翻倍提升 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguag…...

长期项目使用Taotoken感受到的API服务稳定性与可靠性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 长期项目使用Taotoken感受到的API服务稳定性与可靠性 在持续数月的项目开发与线上服务运行中&#xff0c;我们团队将核心的AI能力构…...

Pseudogen:让代码说人话,你的智能代码翻译官

Pseudogen&#xff1a;让代码说人话&#xff0c;你的智能代码翻译官 【免费下载链接】pseudogen A tool to automatically generate pseudo-code from source code. 项目地址: https://gitcode.com/gh_mirrors/ps/pseudogen 你是否曾面对一段复杂的代码&#xff0c;感觉…...

告别电脑休眠烦恼:MouseJiggler鼠标抖动工具完全指南

告别电脑休眠烦恼&#xff1a;MouseJiggler鼠标抖动工具完全指南 【免费下载链接】mousejiggler Mouse Jiggler is a very simple piece of software whose sole function is to "fake" mouse input to Windows, and jiggle the mouse pointer back and forth. 项目…...

Gemini从部署到退役的全周期价值追踪:3类企业实测数据揭示87%团队忽略的关键衰减点

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Gemini从部署到退役的全周期价值追踪&#xff1a;3类企业实测数据揭示87%团队忽略的关键衰减点 在真实生产环境中&#xff0c;Gemini模型的价值并非随部署即达峰值&#xff0c;而是呈现典型的“倒U型衰减曲线”…...

Windows上的安卓应用安装神器:APK-Installer完全指南

Windows上的安卓应用安装神器&#xff1a;APK-Installer完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松安装安卓应用&#xff0c;又不想…...

DeepSeek-R1、V2、V3如何选?:3分钟掌握版本差异与业务匹配公式

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek-R1、V2、V3如何选&#xff1f;&#xff1a;3分钟掌握版本差异与业务匹配公式 DeepSeek-R1、V2、V3 是 DeepSeek 系列中面向不同推理场景演进的三个关键版本&#xff0c;其核心差异不在参数量堆叠&…...

10分钟快速掌握VideoDownloadHelper:浏览器视频下载终极指南

10分钟快速掌握VideoDownloadHelper&#xff1a;浏览器视频下载终极指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾遇到过这样的…...

人机协同决策:AI如何通过认知冲突提升专家判断力

1. 人机协同决策的认知悖论&#xff1a;当“不如你”的AI成为你的最佳搭档在医疗诊断室里&#xff0c;一位经验丰富的放射科医生正在审阅一张肺部CT影像。他的初步判断是良性结节&#xff0c;但屏幕角落弹出的AI辅助诊断系统却给出了“疑似恶性”的提示&#xff0c;置信度显示为…...

3步解锁:开源工具Applera1n完全指南——iOS 15-16激活锁绕过方案

3步解锁&#xff1a;开源工具Applera1n完全指南——iOS 15-16激活锁绕过方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n Applera1n是一款专为iOS 15-16系统设计的免费开源激活锁绕过工具&#xff…...