Linux硬链接、软链接

2023-09-20 23:40:33

硬链接是一个目录条目(在基于目录的文件系统中),它将一个名称与一个文件关联起来。因此,每个文件必须至少有一个硬链接。为文件创建额外的硬链接可以使该文件的内容可以通过额外的路径访问(即通过不同的名称或在不同的目录中)这会导致别名效应(alias effect):进程可以通过任意路径打开文件并修改其内容。相比之下,文件的软链接或“快捷方式”不是指向数据本身的直接链接,而是指向一个硬链接或另一个软链接的引用。

在我看来硬链接可以理解为数据的指针,而软链接则是指针的指针

硬链接

每个目录本身都是一个特殊的文件,只是它包含一个文件名列表。因此,多个硬链接到目录是可能的,这可以创建一个循环目录结构,而不是像树一样的分支结构。因此,有些文件系统禁止对目录创建硬链接。

此外,还有其他一些硬链接限制

  • 硬链接只能创建在同一文件系统上。这也很好理解,不同文件系统文件实现都不一样

  • 指向单文件硬链接最大数量收到引用计数器大小限制

并且,硬链接存在使处理目录树程序复杂化的问题,比如tar。

兼容posix的操作系统,如Linux、Android、macOS和Windows NT系列,支持对同一个文件的多个硬链接,具体取决于文件系统。例如,NTFS和ReFS支持硬链接,而FAT不支持。

软链接

实现软链接方式有两种

  • 慢符号链接:将符号链接信息作为数据存储在普通文件中。该文件包含指向链接目标的文本引用,文件模式位表示该文件的类型是符号链接。
  • 快符号链接:允许将目标路径存储在用于在磁盘(inode)上存储文件信息的数据结构中。该空间通常存储分配给文件的磁盘块地址的列表。因此,目标路径较短的符号链接会被快速访问。具有快速符号链接的系统在目标路径超出可用的inode空间时,通常会退回到使用原始方法。

尽管快符号链接在inode中存储链接值会保存一个磁盘块和一个磁盘读取操作,但操作系统仍然需要解析链接中的路径名,这总是需要读取额外的inode,通常还需要读取其他(可能是许多)目录,处理文件的列表和每个文件的inode,直到找到与链接的路径分量匹配的路径。只有当链接指向同一个目录中的文件时,“快速符号链接”才能提供比其他符号链接更好的性能。

绝大多数兼容posix的实现都使用了快速符号链接。但POSIX标准并不要求为符号链接实现与普通文件相同的全部文件状态信息。这使得实现可以使用其他解决方案,例如将符号链接数据存储在目录项中。

在unix中实际是怎么实现

在unix中,文件由数据部分和文件名称补充组成

  • 数据部分:关联inode,储存实际数据在哪里、文件权限等信息
  • 文件名称部分:携带文件名和inode number

在文件名称部分存在不止一个指向同一个inode number,那么这样的文件称之为硬链接

硬链接只有在所有引用的硬链接文件删除之后,文件数据才会被删除。相比于所有指向的指针消失了,才会被垃圾回收

软链接即使删除了,对引用的文件也没有影响

如果引用的文件被移动、重命名或者删除,那么该软链接会仍然指向旧文件位置

对于某些特殊文件类型,其数据部分携带指向另一个文件的路径,那么操作系统就会认为是路径,从而重定向打开。而这种文件就是软链接

那么对于目录,就是文件的文件名部分与其他文件的文件名部分一起存储的一个特殊的文件。

当构建一个目录时,它最初是由两个特殊文件的文件名(...)部分填充的。是指向当前目录和当前目录直接父目录的文件的硬链接。

Linux建立软硬链接命令

具体建立软、硬链接操作如下

# 为文件f.file建立软链接
ln -s f.file softlink.file
# 为文件f.file建立硬链接
ln f.file hardlink.file

Ref

  1. https://en.wikipedia.org/wiki/Hard_link
  2. https://linuxgazette.net/105/pitcher.html
  3. https://en.wikipedia.org/wiki/Symbolic_link
更多推荐

Laravel框架 - IOC容器详解

IOC容器代码好了,说了这么多,下面要上一段容器的代码了.下面这段代码不是laravel的源码,而是来自一本书《laravel框架关键技术解析》.这段代码很好的还原了laravel的服务容器的核心思想.代码有点长,小伙伴们要耐心看.当然小伙伴完全可以试着运行一下这段代码,然后调试一下,这样会更有助于理解.<?php//

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接:http://tecdat.cn/?p=24492此分析的目的是构建一个过程,以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括1258天的股票收益(点击文末“阅读原文”获取完整代码数据)。介绍为了解释每日收益率方差的一小部分,我们使用Box-Jenk

docker 安装 redis

文章目录redis单机版1.拉取redis镜像并创建数据卷目录2.复制和修改redis.conf3.启动redis容器4.进入容器并连接redisredis一主两从集群搭建1.复制三份redis.conf2.启动master和slave3.查看关系和数据测试redis高可用集群搭建1.复制三份sentinel.conf

基于微信小程序的语言课学习系统设计与实现(源码+lw+部署文档+讲解等)

前言💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗👇🏻精彩专栏推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言一年一度的中秋节就快到了,平台也有各种各样的中秋发文活动,正在翻阅时偶然间我看到了这篇文章:《兔饼大作战》:吃月饼、见月亮,还能咬自己?|欢庆中秋特制版-掘金(juejin.cn)大家肯定比较熟悉了,这个游戏的内核就是贪吃蛇,作者也是对玩法做了很多调整,趣味性十足,同时加入兔饼、月亮等元素增加节日氛围,可以说创意性

【C++】仿函数和priority_queue(优先级队列)

目录一、仿函数二、priority_queue(优先级队列)1、概念:2、使用:3、数组中第K个最大元素4、priority_queue的模拟实现一、仿函数①、概念:仿函数,即函数对象。一种行为类似函数的对象,调用者可以像函数一样使用该对象,其实现起来也比较简单:用户只需实现一种新类型,在类中重载operator()即

Vue中的路由介绍以及Node.js的使用

🏅我是默,一个在CSDN分享笔记的博主。📚📚🌟在这里,我要推荐给大家我的专栏《Vue》。🎯🎯🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都能满足你的需求。我会用最简单易懂的语言,带你走进Vue的世界,让你从零开始,一步步成为JAVA大师。🚀🏆🌈让我们在Vue的世界里畅游吧!🌈🎁如果感觉还

【C++进阶】:哈希

哈希一.unordered_map二.底层结构1.哈希概念2.解决哈希冲突1.闭散列2.开散列在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2Nlog_2Nlog2​N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数

你对Spring Security使用场景以及底层原理有了解吗?

SpringSecurity使用场景有哪些?SpringSecurity是一个基于Spring框架的安全性解决方案,提供了全面的身份验证、授权和安全功能。它可以应用于多种场景以确保应用程序的安全性和保护敏感资源。以下是一些常见的SpringSecurity的使用场景:用户登录和认证:SpringSecurity可以处理

在Java开发中无法绕开的框架:SpringBoot

SpringBoot简介SpringBoot是一个基于Spring框架的快速开发框架,它的出现极大地简化了Spring应用的开发流程。SpringBoot通过自动配置和约定大于配置的方式,让开发者可以快速搭建一个可运行的、独立的、生产级别的应用程序。SpringBoot的优点不仅仅在于它的快速开发,还在于它的可扩展性和

【校招VIP】前端操作系统之存储管理加密

考点介绍加密算法有很多,如不可逆的摘要算法MD5、SHA(安全哈希算法),可逆的Base64编码,对称加密算法DES、AES,还有非对称加密算法DH、RSA等。那是不是说明我们可以使用任何一种加密算法就能保证网站的安全性,答案是否。前端操作系统之存储管理加密-相关题目及解析内容可点击文章末尾链接查看!一、考点题目1.下

热文推荐