Linux中的软链接、硬链接:都用在哪些场合?

李肖遥 2021-09-10 08:30


来源 | IOT物联网小镇

作者 | 道哥


最近,看到很多文章都在介绍 Linux 中的文件系统,其中就包括:inode 节点、软链接、硬链接等重要的概念。

于是就有小伙伴私信问我:这些概念我都懂,但是我能利用他们来完成什么工作呢?

或者说,在哪些情况下,软链接和硬链接能够提供提供更好的解决方案呢?

这篇文章我们就来简单梳理一下,软链接和硬链接的几个使用场景

什么是索引节点
什么是硬链接
什么是软链接

软链接应用之:灵活切换不同版本的目标程序
软链接应用之:动态库版本管理
软链接应用之:快捷方式

硬链接应用之:从不同角度对文件进行分类
硬链接应用之:文件多人共享
硬链接应用之:文件备份


文件和索引节点 inode

Linux 系统中,我们可以把一个文件看做 3 个组成部分:

  1. 文件名:从用户角度来描述一个文件;

  2. 文件内容:也就是文件中存储的那些数据;

  3. 文件的描述信息:文件的类型、所有者、创建时间等等,可以称之为元信息;

可以简单的做一个类比:

文件本身的内容,可以看做一个实实在在的人

文件的描述信息,可以看做是派出所里的户籍卡

户籍卡上记录了一个人的姓名、年龄、住址等信息,警察叔叔通过这个户籍卡,就知道这个人的一切描述信息,除了你脑袋里的知识。

回到计算机中,文件的所有信息都需要存储在硬盘上,因此就要对硬盘进行区域划分:不同的区域存储不同类型的数据,这就是文件系统的重要作用。

Linux 系统使用的 ext2/ext3 文件系统中,从硬盘上划分一块区域,用来存放文件本身的内容(数据),这块区域按照一个最小单位:块(block)来进行划分。

然后从硬盘上划分出另一块区域,专门用来存放所有文件的描述信息

每一个文件的描述信息,都用一个名为索引节点(inode)的数据结构来表示,所有文件的 inode 就统一放在这块硬盘区域中。

就像户籍卡上记录了一个人的住址一样,一个文件的索引节点(inode)中,也记录了这个文件的所有描述信息,包括:文件类型、所有者、创建时间等待,当然也包括文件内容存储在硬盘的哪些块(block)中

当我们调用打开文件 API 函数的时候,操作系统首先根据传入的文件路径,找到这个文件的 inode,然后进行一系列的权限检查操作,最后从 inode 中获得这个文件的内容存储在哪些块(block)中,从而可以对文件的内容进行读取、写入操作。

文件名称只是给我们用户来使用的,操作系统只是通过 inode 节点,来对文件进行管理的。

当我们创建一个新文件的时候,就同时创建了这个文件对应的 inode 节点。

当我们删除一个文件的时候,就同时删除了这个文件对应的 inode 节点。

此时,文件本身内容所在的那个块中,数据并不会被抹除掉,因此有些数据恢复软件就是利用这个特点来进行数据找回。

一句话总结:索引节点(inode)就像户籍卡,操作系统通过 inode 来管理所有的文件


硬链接

刚才已经说到,每一个文件都对应一个 inode 节点。

例如有一个文件 a.txt,文件内容长度是 1024 个字节,存放在硬盘上的某个块(block)中,假设就是第 10000 个块吧。

那么这个文件对应的 inode 节点中,就会把 10000 这个块记录下来。

同时,它还有一个 links 字段,表示:当前这个 inode 对应一个文件,此时 inode.links 的值为 1。

此时,如果我们用另一个文件名 a_hard_link.txt也来表示 a.txt 这个文件。

也就是说:虽然我们用了 2 个文件名称,但是本质上指向同一个文件,内容都指向第 10000 个块中存储的文件内容。

Linux 系统中提供了硬链接来支持这样的目的,它仅仅是把 inode 节点中的 links 字段的值 加1 即可,也就是 inode.links 的值变成了 2

硬链接的操作指令是:

$ ln a.txt b.txt

基于硬链接,用户就可以用不同的文件名来访问同一个文件,所有的操作最终修改的都是同一个文件。

如果仅仅从用户的角度来看,好像我们是在操作不同的文件,但是这些文件具有自动同步的功能。

这个行为有点类似于网盘

在云存储中有一个文件 hello.txt,然后我有两台电脑 AB,这两台电脑会把云端的文件 hello.txt 都创建一个镜像文件在本地,就好像这个文件就在自己的硬盘上一样。

当我在电脑 A 上操作 hello.txt 时,电脑 B 中的同名文件会自动更新。

因此,从行为上来看,硬链接就相当于是:文件拷贝 + 自动同步

再来看一下硬链接文件的删除操作。

在执行 $ ln a.txt a_hard_link.txt 指令之后,该文件对应的 inode 节点中,links值为 2

如果我们删除 a.txt,操作系统会把该文件对应的 inode 中的 links减1,结果为 1,操作系统发现不为 0,因此并不会删掉这个 inode

如果我们再删除 a_hard_link.txt,操作系统再次执行 inode.links 减1 动作,发现值变成了 0,于是就把这个 inode 删除了,于是这个文件就彻底不存在了。

这就相当于把一个人的户籍卡给注销掉了,从户籍管理角度看,这个人就不存在了。即使存在,也是一个黑户。

硬链接存在 2 个限制

  1. 不允许用户给目录创建硬链接,即:用户不可以,操作系统可以(想一下每个目录下的 . 和 ..);

  2. 只有在同一个文件系统中的文件,才能创建硬链接,也就是说:不能跨文件系统;


软链接

为了克服硬链接2 个限制,软链接被引入进来了。

软链接也叫符号链接,它是一个独立的文件。

软链接文件的内容是一个文本字符串,存储的是目标文件(即:链接到的文件)的路径名

这个路径名可以指向任意一个文件系统的任意文件或者目录,甚至可以指向一个不存在的文件。

与创建硬链接不同的是:当我们创建了一个软链接之后,操作系统会创建一个新的 inode 来表示这个软链接文件。

例如有一个文件 a.txt,我们创建一个软链接 a_soft_link.txt 来指向它:

$ ln -s a.txt a_soft_link.txt

此时,a.txta_soft_link.txt 各自都有自己的 inode 节点。

图中的绿色虚线,就表示软链接文件中的文件路径

正因为软链接文件中存储的仅仅是目标文件的路径字符串,所以可以表示任意一个文件系统中的文件,或者是目录。

当我们打开文件软链接 a_soft_link.txt 时,操作系统从 a_soft_link.txt 对应的 inode 数据结构中发现:这是一个软链接文件

于是操作系统就根据其中的路径信息,找到 a.txtinode 节点,从而对最终的目标文件进行操作。

再来看一下软链接文件的删除操作。

如果我们把目标文件 a.txt 删除掉之后,inode 节点会被删除掉,就相当于它的户籍卡被注销掉了。

此时再次打开软链接 a_soft_link.txt 时,虽然其中的路径信息仍然存在,但是系统此时却找不到 a.txt 对应的 inode 节点了。

因此,软链接就类似于与 Windows 系统中的快捷方式

当真正的目标文件被删除之后,快捷方式也就没有存在的意义了。


软链接应用之:灵活切换不同版本的目标程序

在开发的过程中,对于同一个工具软件,可能要安装多个不同的版本,例如:Python2Python3JDK8JDK9 等等。

此时就可以通过软链接来指定当前使用哪个版本。例如在我的电脑中:

$ ll -l /usr/bin/python*
lrwxrwxrwx 1 root root 9 12月 31 08:19 /usr/bin/python -> python2.7*
lrwxrwxrwx 1 root root 9 12月 31 08:19 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3492624 3月 2 04:47 /usr/bin/python2.7*
lrwxrwxrwx 1 root root 9 12月 31 08:19 /usr/bin/python3 -> python3.5*
-rwxr-xr-x 2 root root 4456208 1月 27 02:48 /usr/bin/python3.5*

当在终端窗口中输入:python 时,启动的是 python2.7 版本。

如果有一天我需要使用 python3.5 版本,只需要把软链接 python 指向 python3.5 即可。


软链接应用之:动态库版本管理

Linux 系统的动态库版本管理中,有一个 SONAME 的概念。

我们在编译一个动态链接库时,一般使用如下编译命令:

$ gcc -fPIC -shared -o libhello.so hello.c

在使用这个动态库时,需要链接这个库:-llibhello

简单的 demo 可以这么来写,但是如果遇到一些比较大的项目,需要执行严格的版本管理,那应该怎么来操作呢?

Linux 系统已经为我们想到了问题的解决方案,利用 SO-NAME

首先,在编译动态链接库文件时,就指定产生 SO-NAME,它会被存储在动态链接库 ELF 文件中。

我们来直接看一个优秀的开源工具 libevent 的例子:

$ ll /usr/lib/libevent-2.1.so*
lrwxrwxrwx 1 root root 17 Jul 27 2020 /usr/lib/libevent-2.1.so -> libevent-2.1.so.7
lrwxrwxrwx 1 root root 21 Jul 27 2020 /usr/lib/libevent-2.1.so.7 -> libevent-2.1.so.7.0.1
-rw-r--r-- 1 root root 412016 Jul 27 2020 /usr/lib/libevent-2.1.so.7.0.1

此时使用 readelf 命令来查看生成的动态库文件 libevent-2.1.so.7.0.1

$ readelf -a libevent-2.1.so.7.0.1 | grep SONAME
0x000000000000000e (SONAME) Library soname: [libevent-2.1.so.7]

它这么做有什么好处呢?

Linux 系统在查找动态链接库文件时,会到下面这 3 个默认目录下查找(当然然还有其他目录,比如:当前目录,LD_LIBRARY_PATH 指定的目录)

/lib: 存放操作系统最关键和基础的库文件;

/usr/lib: 存放一些非系统运行时所需要的关键库文件;

/usr/local/lib: 存放用户自己安装的一些第三方库文件;

系统中安装的所有动态链接库,借助 ldconfig 这个程序,会自动的创建、更新或者删除对应的 SONAME(它是一个软链接,链接到 实际的库文件),并把这些 SONAME 汇总到一个文件 /etc/ld.so.cache 中缓存起来。

这样,当动态库加载器查找动态库文件时,就可以直接在这个缓存文件中进行查找,加快了动态库的查找速度。


软链接应用之:快捷方式

利用软链接的快捷方式功能就比较好理解了,想一想:我们为什么在 Windows 的桌面上创建很多软件的快捷方式啊?

Linux 中同样如此!

比如:最近一段时间的工作,每次都要打开一个路径很深的文件。

如果在资源管理器中,一层一层的点击鼠标,是不是比较浪费时间

此时,就可以在桌面上创建一个软链接,每次直接双击就打开所链接的目标文件了。


硬链接之应用:从不同角度对文件进行分类

比如我有一个文件夹,存储了10 个G的照片。

这些照片中的人物、拍照地点、拍照时间都是不一样的。

现在,我既想根据照片中的人物进行分类,也想根据拍照地点进行分类,还想根据拍照时间进行分类,那该怎么办?

因为一张照片可能同时属于多个不同的分类,难道每个分类中都复制一张照片?这样也太浪费硬盘空间了!

解决方案是:

所有的照片仍旧放在一个总的文件夹中,然后创建不同的分类文件夹,在每个分类文件夹中,创建硬链接到目标照片文件。

这样的话,不仅对照片进行了分类,而且一点都不占用硬盘空间


硬链接应用之:文件多人共享

很多人同时对同一个文件进行维护的时候,如果大家都直接操作这个文件,万一不小心把文件删除了,大家就都玩完了!

此时,可以在每个人自己的私人目录中,创建一个硬链接

每次只需要对这个硬链接文件进行操作,所有的改动会自动同步到目标文件中。

由于每个人都是操作硬链接文件,即使不小心删除了,也不会导致文件的丢失

因为删除硬链接文件,仅仅是把该文件的 inode 节点中的 links减 1 而已,只要不为 0,就不会真正的删除文件。


硬链接之应用:文件备份

一些小伙伴有定期备份文件、清理文件的好习惯。

在备份的时候,如果是实实在在的拷贝一份,那真的是太浪费磁盘空间,特别是对于我这种只有 256G 硬盘空间的笔记本。

此时,就可以利用硬链接功能,既实现文件备份的目的,又节省了大量的硬盘空间,一举两得!

很多备份工具利用的就是硬链接的功能,包括 git 工具,当克隆本地的一个仓库时,执行 clone 指令:

git clone --reference <repository>

git 并不会把仓库中的所有文件拷贝到本地,而仅仅是创建文件的硬链接,几乎是零拷贝

来源整理于网络素材,版权归原作者所有,如有侵权,请联系删除,谢谢。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。

欢迎关注我的视频号:


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

李肖遥 公众号“技术让梦想更伟大”,作者:李肖遥,专注嵌入式,只推荐适合你的博文,干货,技术心得,与君共勉。
评论 (0)
  •   北京华盛恒辉无人机电磁兼容模拟训练系统软件是专门用于模拟与分析无人机在复杂电磁环境中电磁兼容性(EMC)表现的软件工具。借助仿真技术,它能帮助用户评估无人机在电磁干扰下的性能,优化电磁兼容设计,保障无人机在复杂电磁环境中稳定运行。   应用案例   目前,已有多个无人机电磁兼容模拟训练系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机电磁兼容模拟训练系统。这些成功案例为无人机电磁兼容模拟训练系统的推广和应用提供了有力支持。   系统功能   电磁环境建模:支持三维
    华盛恒辉l58ll334744 2025-04-17 15:10 82浏览
  • 一、行业背景与需求随着智能化技术的快速发展和用户对便捷性需求的提升,电动车行业正经历从传统机械控制向智能交互的转型。传统电动车依赖物理钥匙、遥控器和独立防盗装置,存在操作繁琐、功能单一、交互性差等问题。用户期待通过手机等智能终端实现远程控制、实时数据监控及个性化交互体验。为此,将蓝牙语音芯片集成至电动车中控系统,成为推动智能化升级的关键技术路径。二、方案概述本方案通过在电动车中控系统中集成WT2605C蓝牙语音芯片,构建一套低成本、高兼容性的智能交互平台,实现以下核心功能:手机互联控制:支持蓝牙
    广州唯创电子 2025-04-18 08:33 159浏览
  •   无人机电磁兼容模拟训练系统软件:全方位剖析   一、系统概述   北京华盛恒辉无人机电磁兼容模拟训练系统软件,专为满足无人机于复杂电磁环境下的运行需求而打造,是一款专业训练工具。其核心功能是模拟无人机在电磁干扰(EMI)与电磁敏感度(EMS)环境里的运行状况,助力用户评估无人机电磁兼容性能,增强其在复杂电磁场景中的适应水平。   应用案例   目前,已有多个无人机电磁兼容模拟训练系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机电磁兼容模拟训练系统。这些成功案例为
    华盛恒辉l58ll334744 2025-04-17 14:52 52浏览
  •   无人机蜂群电磁作战仿真系统软件,是专门用于模拟、验证无人机蜂群在电磁作战环境中协同、干扰、通信以及对抗等能力的工具。下面从功能需求、技术架构、典型功能模块、发展趋势及应用场景等方面展开介绍:   应用案例   目前,已有多个无人机蜂群电磁作战仿真系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机蜂群电磁作战仿真系统。这些成功案例为无人机蜂群电磁作战仿真系统的推广和应用提供了有力支持。   功能需求   电磁环境建模:模拟构建复杂多样的电磁环境,涵盖各类电磁干扰源与
    华盛恒辉l58ll334744 2025-04-17 16:49 111浏览
  • 一、行业背景与需求智能门锁作为智能家居的核心入口,正从单一安防工具向多场景交互终端演进。随着消费者对便捷性、安全性需求的提升,行业竞争已从基础功能转向成本优化与智能化整合。传统门锁后板方案依赖多颗独立芯片(如MCU、电机驱动、通信模块、语音模块等),导致硬件复杂、功耗高、开发周期长,且成本压力显著。如何通过高集成度方案降低成本、提升功能扩展性,成为厂商破局关键。WTVXXX-32N语音芯片通过“单芯片多任务”设计,将语音播报、电机驱动、通信协议解析、传感器检测等功能整合于一体,为智能门锁后板提供
    广州唯创电子 2025-04-18 09:04 155浏览
  • 【摘要/前言】4月春日花正好,Electronica就在浪漫春日里,盛大启幕。2025年4月15-17日,慕尼黑上海电子展于上海新国际博览中心成功举办。伴随着AI、新能源汽车、半导体的热潮,今年的Electronica盛况空前。请跟随Samtec的视角,感受精彩时刻!【 Samtec展台:老虎的朋友圈技术派对】借天时、占地利、聚人和,Samtec 展台人气爆棚!每年展会与大家相聚,总能收获温暖与动力~Samtec展台位于W3展馆716展位,新老朋友相聚于此,俨然一场线下技术派对!前沿D
    电子资讯报 2025-04-17 11:38 56浏览
  • 1. 在Ubuntu官网下载Ubuntu server  20.04版本https://releases.ubuntu.com/20.04.6/2. 在vmware下安装Ubuntu3. 改Ubuntu静态IP$ sudo vi /etc/netplan/00-installer-config.yaml# This is the network config written by 'subiquity'network:  renderer: networkd&nbs
    二月半 2025-04-17 16:27 114浏览
  •   无人机蜂群电磁作战仿真系统全解析   一、系统概述   无人机蜂群电磁作战仿真系统是专业的仿真平台,用于模拟无人机蜂群在复杂电磁环境中的作战行为与性能。它构建虚拟电磁环境,模拟无人机蜂群执行任务时可能遇到的电磁干扰与攻击,评估作战效能和抗干扰能力,为其设计、优化及实战应用提供科学依据。   应用案例   目前,已有多个无人机蜂群电磁作战仿真系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机蜂群电磁作战仿真系统。这些成功案例为无人机蜂群电磁作战仿真系统的推广和应用提
    华盛恒辉l58ll334744 2025-04-17 16:29 121浏览
  • 近日,全球6G技术与产业生态大会(简称“全球6G技术大会”)在南京召开。紫光展锐应邀出席“空天地一体化与数字低空”平行论坛,并从6G通信、感知、定位等多方面分享了紫光展锐在6G前沿科技领域的创新理念及在空天地一体化技术方面的研发探索情况。全球6G技术大会是6G领域覆盖广泛、内容全面的国际会议。今年大会以“共筑创新 同享未来”为主题,聚焦6G愿景与关键技术、安全可信、绿色可持续发展等前沿主题,汇聚国内外24家企业、百余名国际知名高校与科研代表共同商讨如何推动全行业6G标准共识形成。6G迈入关键期,
    紫光展锐 2025-04-17 18:55 180浏览
  • 置信区间反映的是“样本均值”这个统计量的不确定性,因此使用的是标准误(standard error),而不是直接用样本标准差(standard deviation)。标准误体现的是均值的波动程度,而样本标准差体现的是个体数据的波动程度,两者并非一回事,就如下图所显示的一样。下面优思学院会一步一步解释清楚:一、标准差和标准误,究竟差在哪?很多同学对“标准差”和“标准误”这两个概念傻傻分不清楚,但其实差别明显:标准差(Standard Deviation,σ或s):是衡量单个数据点相对于平均值波动的
    优思学院 2025-04-17 13:59 29浏览
  • 现阶段,Zigbee、Z-Wave、Thread、Wi-Fi与蓝牙等多种通信协议在智能家居行业中已得到广泛应用,但协议间互不兼容的通信问题仍在凸显。由于各协议自成体系、彼此割据,智能家居市场被迫催生出大量桥接器、集线器及兼容性软件以在不同生态的设备间构建通信桥梁,而这种现象不仅增加了智能家居厂商的研发成本与时间投入,还严重削减了终端用户的使用体验。为应对智能家居的生态割裂现象,家居厂商需为不同通信协议重复开发适配方案,而消费者则需面对设备入网流程繁琐、跨品牌功能阉割及兼容隐患等现实困境。在此背景
    华普微HOPERF 2025-04-17 17:53 89浏览
  •   无人机电磁环境效应仿真系统:深度剖析   一、系统概述   无人机电磁环境效应仿真系统,专为无人机在复杂电磁环境下的性能评估及抗干扰能力训练打造。借助高精度仿真技术,它模拟无人机在各类电磁干扰场景中的运行状态,为研发、测试与训练工作提供有力支撑。   应用案例   目前,已有多个无人机电磁环境效应仿真系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润无人机电磁环境效应仿真系统。这些成功案例为无人机电磁环境效应仿真系统的推广和应用提供了有力支持。   二、系统功能  
    华盛恒辉l58ll334744 2025-04-17 15:51 109浏览
我要评论
0
11
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦