【Linux进阶】文件系统8——硬链接和符号连接:ln
在Linux下面的链接文件有两种,
- 一种是类似Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);
- 另一种则是通过文件系统的inode 链接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link),这两种玩意儿是完全不一样的东西,现在就分别来谈谈。
1.硬链接(Hard Link,硬式链接或实际链接)
我们知道几件重要的信息,包括:
- 每个文件都会占用一个inode,文件内容由inode的记录来指向;
- 想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才能读取。
也就是说,其实文件名只与它所处的目录有关,但是文件内容则与它自己的inode有关。
那么想一想,有没有可能有多个文件名对应到同一个inode号码?
有的,那就是硬链接的由来,所以简单地说:硬链接只是在某个目录下新增一条文件名链接到某inode号码的关联记录而已。
由于linux下的文件是通过索引节点(Inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配inode。每添加一个一个硬链接,文件的链接数就加1。
我们看个例子
#根目录下创建文件夹hardlink,并且在hardlink内创建文件aa.txt
#查看其链接数为1,注意,此处链接数就是硬链接的次数
#创建硬链接
#往aa.txt文件中写入一些内容
#发现aa.link中也同样可以看到#删除aa.txt,aa.link依然可以正常查看内容,链接数 -1,inode不变
我们回过头来看这个例子
你有没有发现两个文件名都链接到1048579这个inode号码,所以你看看是不是所以您看看,是否文件的权限与属性完全一样?
因为这两个文件名其实是一模一样的文件,而且你也会发现第二个字段由原本的1变成2,那个字段称为链接,这个字段的意义为:有多少个文件名链接到这个inode 号码。如果将读取到正确数据的方式画成示意图,就类似下图:
上图的意思是,你可以通过User1或User2或User3的目录的inode指定的区块找到两个不同的文件名,而不管使用哪个文件名均可以指到那个 inode去读取到最终数据。那这样有什么好处?
- 最大的好处就是安全,如同上图中,如果你将任何一个文件名删除,其实inode与区块都还是存在的。此时你可以通过另一个文件名来读取到正确的文件数据。
- 此外,不论你使用哪个文件名来编辑,最终的结果都会写入到相同的inode与区块中,因此均能进行数据的修改。
一般来说,使用硬链接设置链接文件时,磁盘的空间与inode的数目都不会改变。
由图中可以知道,硬链接只是在某个目录下的区块多写入一个关联数据而已,既不会增加inode 也不会消耗区块数量。
我们接着上面那个例子来讲
那这时候,就有个疑问了,如果链接数只剩下一个,再次删除,会进行什么样的操作呢?
实际上,
- 如果我们这时候再删除aa.link这个文件,系统只会删除掉inode table中aa.link指向的inode信息,和hardlink 目录项中aa.link的相关信息。
- 然后会将aa.link inode指针(也就是硬链接)所指向的数据块设置为空闲的状态,告诉系统这些数据块可以被再次使用。
- 而里面的内容却不会被删除,直到新的数据覆盖为止!
这也就说明了,实际上 linux中被删除的文件数据是可以被找回的,只要相应的数据块没有被再次覆盖使用。
如果观察的再细致一些,我们会发现,为什么hardlink这个文件夹在创建后就会有两个链接数呢?
通过上述查看,我们可以看出,当进入hardlink目录下后,默认会有个 .的隐藏目录,而该目录也就是当前目录的意思,即hardlink目录。所以才会有两个链接数。
硬链接的制作中其实还是可能会改变系统的区块,那就是当你新增这条数据却刚好将目录的区块填满时,就可能会新加一个区块来记录文件名关联性,而导致磁盘空间的变化。不过,一般硬链接所用掉的关联数据量很小,所以通常不会改变inode与磁盘空间的大小
1.1.硬链接的缺点
1、无法跨分区,跨设备创建硬链接
[root@localhost hardlink]# ln aa.link /boot/
ln: failed to create hard link ‘/boot/aa.link’ => ‘aa.link’: Invalid cross-device link
因为每个分区都有自己独立的inode体系,
假设A分区的文件在B分区做了一个硬链接,此时访问B分区的此链接,按照我们想的是需要它访问A分区的inode,进行数据查询,但是它只会根据B分区的inode,在B数据块中查找数据。
就相当于两套独立的数据库,你不可能拿着A数据库的某个主键去B数据库搜索数据,是一样的道理。
2、无法创建文件夹/目录的硬链接
至于为何设置为无法创建文件夹,这里还是用反推来验证。
假设可以创建文件夹的硬链接:ln /hardlink /test/dir.link。那么有个问题,首当其冲。
hardlink目录下的 . 是当前目录的意思,此处代表hardlink,那dir.link中的 ‘.’是代表test目录呢?还是 hardlink目录呢?
其次,假设存在目录 /A/B.link 和 /B/A.link。如果B.link是B目录的硬链接,A.link是A目录的硬链接。那A.link既然是/A的链接,那它里面肯定有B.link。同理B.link里面肯定有A.link。这样依次循环 /A/B.link/A.link/B.link/A.link/…。就造成了死循环的现象。这也就是为什么不允许创建文件夹硬链接的原因了。
由于硬链接局限性比较多,所以工作中使用的不多。
2.符号链接(Symbolic Link,亦即是快捷方式)
相对于硬链接,符号链接可就好理解多了。
符号链接相当于我们 Windows 中的快捷方式,即如果你软链接一个目录,只是一个目录的快捷方式到指定位置,操作系统找这个快捷方式会直接找到真实目录下的文件。
基本上,符号链接就是建立一个独立的文件,而这个文件会让数据的读取指向它链接的那个文件的文件名。
由于只是利用文件来做为指向的操作,所以,当源文件被删除之后,符号链接的文件会【打不开了】,会一直说【无法打开某文件】,实际上就是找不到原始文件名而已。
创建软链接
由上图的结果我们可以知道两个文件指向不同的inode号码,当然就是两个独立的文件存在。
而且链接文件的重要内容就是它会写上目标文件的文件名,你可以发现上表中链接文件的大小为6B。因为箭头(-->)右边的文件名【aa.txt】总共有6个字母,每个字母占用1个字节,所以文件大小就是12B了。
但是事实真的是这样子吗?它真的存是是文件名吗?
事实上,软连接记录的是链接文件箭头后面的路径字符串大小
不信的话我们来验证一下
这里我们写入一些内容到aa.txt中
再次查看,原文件大小发生了改变,而链接文件大小依旧没变化。
这其实就是软链接的特性之一,因为软链接的inode指向的数据块保存的是 原文件的路径,如果没有路径,是由文件名,默认会在软链接所在路径查找
再次举例论证
ls.link大小正好是 /usr/bin/ls的路径字符串大小
软链接的使用,如果观察Centos7,会发现,既有使用相对路径创建的软链接,也有使用绝对路径创建的软链接。
而使用相对路径创建软链接,则有如下注意点:上图中,我们使用 ln -s …/aa.txt /tmp/aa.link在/tmp下创建了软链接,却发现,竟然提示报错!找不到aa.txt。
因为/tmp/aa.link在指向…/aa.txt 的过程中。它会以自己的路径为初始点去寻找aa.txt。即 /tmp/aa.link -> …/aa.txt,在系统看来,它会理解成。以aa.link所在路径为起点,回到上一级目录,去寻找aa.txt。很显然没有找到,所以报错。
创建的软连接,指向的文件,默认会以软链接的路径为主,去寻找指向的文件,所以创建时,请以软链接的路径作为起点路径 去写原文件的相对路径
那既然相对路径创建这么麻烦,为什么还要使用这种方式呢?
因为使用相对路径的话,迁移只要相对迁移,不会影响链接的使用,更加灵活。而绝对路径的软链接,则必须要求路径的正确性。
而由于软链接 inode指向的数据块只保存 原文件的地址字符串,所以可以跨分区、跨设备创建,并且文件夹也可以创建。
当然如果原文件被删除了,链接则也会失效,无法向硬链接那样拥有独立性。
基本上,符号链接的用途比较广,所以您要特别留意符号链接的用法,未来一定还会常常用到。
3、软链接与硬链接的区别
- 1、本质:
硬链接:同一个inode,只是多个名字。
软链接:是不同的文件,inode不同
- 2、跨分区
硬链接无法跨分区、跨设备建立,软链接可以
- 3、目录
硬链接无法创建目录硬链接,软链接可以
- 4、相互关系
硬链接没有主次之分,相互独立
软链接依赖于原文件,原文件被删除,软链接即不可用
- 5、链接数
硬链接会删除增加会影响链接数,软链接不会,因为inode不一样。
- 6、相对路径
硬链接创建时,原始文件路径是相对于当前路径。
软链接创建时,原始文件路径是 相对于软链接的路径
- 7、文件类型
硬链接的类型与原始文件类型一致,软链接则会显示 symbolic link
- 8、创建方式
硬链接创建:ln [原文件] [硬链接]
软链接创建:ln -s [原文件] [软链接]
4.关于目录的链接数量
或许您已经发现了,那就是,当我们以硬链接进行文件的链接时,可以发现,在ls-l所显示的第二字段会增加一才对,那么请教,如果建立目录时,它默认的链接数量会是多少?
让我们来想一想,一个空目录里面至少会存在些什么?
呵呵,就是存在.与..这两个目录。
那么,当我们建立一个新目录名称为/tmp/testing时,基本上会有三个东西,那就是:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/..
而其中/tmp/testing与/tmp/testing/.其实是一样的。都代表该目录,而/tmp/testing/.则代表/tmp 这个目录。所以说,当我们建立一个新的目录时,【新的目录的链接数为2,而上层目录的链接数则会增加1】
不信的话,我们来做个测试看看:
看,原本的所谓上层目录/tmp的链接数量由10增加为11,至于新目录/tmp/testing则为2。这
样可以理解目录链接数量的意义了吗?
相关文章:
【Linux进阶】文件系统8——硬链接和符号连接:ln
在Linux下面的链接文件有两种, 一种是类似Windows的快捷方式功能的文件,可以让你快速地链接到目标文件(或目录);另一种则是通过文件系统的inode 链接来产生新文件名,而不是产生新文件,这种称为硬链接&…...
代码随想录算法训练营Day64|拓扑排序(卡码网117)、dijkstra朴素版
拓扑排序 117. 软件构建 (kamacoder.com) 拓扑排序简单的说是将一个有向图转为线性的排序。 它将图中的所有结点排序成一个线性序列,使得对于任何的边uv,结点u在序列中都出现在结点v之前,这样的序列满足图中所有的前驱-后继关系。 拓扑排…...
neo4j 图数据库:Cypher 查询语言、医学知识图谱
neo4j 图数据库:Cypher 查询语言、医学知识图谱 Cypher 查询语言创建数据查询数据查询并返回所有节点查询并返回所有带有特定标签的节点查询特定属性的节点及其所有关系和关系的另一端节点查询从名为“小明”的节点到名为“小红”的节点的路径 更新数据更新一个节点…...
数据结构基础--------【二叉树基础】
二叉树基础 二叉树是一种常见的数据结构,由节点组成,每个节点最多有两个子节点,左子节点和右子节点。二叉树可以用来表示许多实际问题,如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念: 二叉树的深度&a…...
数据开源 | Magic Data大模型高质量十万轮对话数据集
能够自然的与人类进行聊天交谈,是现今的大语言模型 (LLM) 区别于传统语言模型的重要能力之一,近日OpenAI推出的GPT-4o给我们展示了这样的可能性。 对话于人类来说是与生俱来的,但构建具备对话能力的大模型是一项不小的挑战,收集高…...
webpack之ts打包
tsconfig.json配置 // 是否对js文件进行编译,默认false"allowJs": true,// 是否检查js代码是否符合语法规范,默认false(引入的外部文件有可能语法有问题)"checkJs": true, allowJs和checkJs基本是同时出现,因为有了allowJs 这个检查…...
MATLAB数据统计描述和分析
描述性统计就是搜集、整理、加工和分析统计数据, 使之系统化、条理化,以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础,实用性较强,在数学建模的数据描述部分经常使用。 目录 1.频数表和直方图 2 .统计量 3.统计…...
设计分享—国外后台界面设计赏析
国外后台界面设计将用户体验放在首位,通过直观易懂的布局和高效的交互设计,提升用户操作效率和满意度。 设计不仅追求美观大方,还注重功能的实用性和数据的有效展示,通过图表和图形化手段使数据更加直观易懂。 采用响应式布局&a…...
最小生成树(算法篇)
算法之最小生成树 最小生成树 概念: 最小生成树是一颗连接图G所有顶点的边构成的一颗权最小的树,最小生成树一般是在无向图中寻找。最小生成树共有N-1条边(N为顶点数)。 算法: Prim算法 概念: Prim(普里姆)算法是生成最小生…...
教师管理小程序的设计
管理员账户功能包括:系统首页,个人中心,教师管理,个人认证管理,课程信息管理,课堂记录管理,课堂统计管理,留言板管理 微信端账号功能包括:系统首页,课程信息…...
Selenium 等待
环境: Python 3.8 selenium3.141.0 urllib31.26.19 Chromium 109.0.5405.0 (32 位) # 1 固定等待(time) # 固定待是利用python语言自带的time库中的sleep()方法,固定等待几秒。 # 这种方式会导致这个脚本运…...
安装easy-handeye
一、aruco_ros配置 mkdir -p ~/ros_ws/src cd ~/ros_ws/src git clone -b melodic-devel https://github.com/pal-robotics/aruco_ros.git cd .. catkin_make 二、visp配置(需要联外网下载东西,不然会一直出问题) sudo apt-get install ros-melodic-…...
【面试题】MySQL 索引(第二篇)
1.索引 索引是数据库中的一个核心概念,它对于提高数据库查询效率至关重要。以下是索引的详细概念解析: 一、索引的定义 基本定义:索引是一个排序的列表,其中存储着索引的值和包含这些值的数据所在行的物理地址(或逻…...
4. 小迪安全v2023笔记 javaEE应用
4. 小迪安全v2023笔记 javaEE应用 大体上跟随小迪安全的课程,本意是记录自己的学习历程,不能说是完全原创吧,大家可以关注一下小迪安全。 若有冒犯,麻烦私信移除。 默认有java基础。 文章目录 4. 小迪安全v2023笔记 javaEE应…...
anaconda修改安装的默认环境
📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️如遇文章付费,可先看…...
MySQL 9.0 正式发行Innovation创新版已支持向量
从 MySQL 8.1 开始,官方启用了新的版本模型:MySQL 创新版 (Innovation) 和长期支持版 (LTS)。 根据介绍,两者的质量都已达到可用于生产环境级别。区别在于: 如果希望尝试最新的功能和改进,并喜欢与最新技术保持同步&am…...
基于Java+SpringMvc+Vue技术的智慧校园系统设计与实现
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…...
【蔬菜网元宇宙】—— 探索农业的未来之旅
在数字化时代的浪潮中,技术和创新不断塑造着我们的生活方式。现在,这种变革已经延伸到了农业领域。蔬菜网,一个专注于农产品供应链的领先平台,自豪地宣布我们正式迈入元宇宙的世界——一个全新的虚拟空间,旨在彻底改变…...
淘宝商品历史价格查询(免费)
当前资料来源于网络,禁止用于商用,仅限于学习。 淘宝联盟里面就可以看到历史价格 并且没有加密 淘宝商品历史价格查询可以通过以下步骤进行: 先下载后,登录app注册账户 打开淘宝网站或淘宝手机App。在搜索框中输入你想要查询的商…...
14-47 剑和诗人21 - 2024年如何打造AI创业公司
2024 年,随着人工智能继续快速发展并融入几乎所有行业,创建一家人工智能初创公司将带来巨大的机遇。然而,在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面,人工智能初创公司也面临着相当大的挑战。 让我来…...
WPF界面设计-更改按钮样式 自定义字体图标
一、下载图标文件 iconfont-阿里巴巴矢量图标库 二、xaml界面代码编辑 文件结构  对应的图标代码 Fonts/#iconfont 对应文件位置 <Window.Resources><ControlTemplate TargetType"Button" x:Key"CloseButtonTemplate"…...
开源项目的机遇与挑战
随着全球经济和科技环境的快速变化,开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目,以推动技术创新和实现协作共赢。本文将从开源项目的发展趋势、参与开源的经验分享,以及开源项目的挑战三个方…...
Linux实现CPU物理隔离
文章目录 背景使用 taskset 命令使用 cgroups案例 背景 在 Linux 上实现 CPU 的物理隔离(也称为 CPU 隔离或 CPU pinning),可以通过将特定的任务或进程绑定到特定的 CPU 核心来实现。这可以提高系统性能,尤其是在需要实时响应的应…...
springer latex模板参考文献不显示
原因 his is BibTeX, Version 0.99d (TeX Live 2024) The top-level auxiliary file: sn-article.aux I couldn’t open style file sn-mathphys-num.bst —line 2 of file sn-article.aux : \bibstyle{sn-mathphys-num : } I’m skipping whatever remains of this command I…...
使用Vue3、Pinia和Vite5打造高度还原的抖音仿制项目
douyin-vue 是一个模仿 抖音|TikTok 的移动端短视频项目。Vue 在移动端的"最佳实践",媲美原生 App 丝滑流畅的使用体验。使用了最新的 Vue 技术栈,基于 Vue3、Vite5 、Pinia实现。数据保存在项目本地,通过 axios-mock-adapter 库拦…...
stm32基本定时器
Driver_TIM6.c 需要注意立即进入中断问题,原因是预分频寄存器并没有更新预分频系数。 #include "Driver_TIM6.h" #include "Delay.h" /*** description: 给定时器6进行初始化* return {*}*/ void Driver_TIM6_Init(void) {/* 1. 给定时器6开启…...
网络安全基础-1
棱角社区:[~]#棱角 ::Edge.Forum* 专业名词 操作系统 文件下载 linux:下载命令 1. wget命令 wget是一个非常强大的命令行下载工具,支持HTTP、HTTPS、FTP等多种协议,并具备断点续传、递归下载等功能。 基本用法: 下载文件到…...
SSH远程访问及控制
目录 一、SSH远程管理 1、SSH定义 2、SSH客户端和服务端 3、SSH工作类型 3.1、对称加密 3.2、非对称加密 4、SSH工作原理 公钥传输原理 4.1、基本概念 4.2、工作过程 5、OpenSSH服务器 二、SSH远程登录方式 1、SSH直接远程登录 2、SSH指定端口登录 3、黑白名单 …...
Qt 绘图详解
文章目录 头文件和构造函数启用反锯齿功能绘制矩形绘制圆角矩形绘制椭圆绘制圆弧绘制弦绘制凸多边形绘制图片绘制直线绘制多条直线绘制多点连接的线绘制路径绘制扇形绘制点绘制文本擦除矩形区域填充矩形填充路径 头文件和构造函数 #include "mainwindow.h" #include…...
Python 爬虫与 Java 爬虫:相似之处、不同之处和选项
在信息时代,网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息,爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言,都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异,以帮助…...
廊坊市网站建设/百度关键词优化工具
Python标准库os的使用方法os.path.abspath(path) #返回绝对路径os.path.basename(path) #返回文件名os.path.commonprefix(list) #返回list(多个路径)中,所有path共有的最长的路径。os.path.dirname(path) #返回文件路径os.path.exists(path) #路径存在则返回True,…...
app开发用到的技术/郑州seo关键词优化公司
近日,Docker公司宣布启动一项Docker for Mac和Docker for Windows有限Beta测试计划。它们在Docker Toolbox上做了许多改进,主要包括: 更快更可靠:不再需要VirtualBox,Docker引擎运行在一个安装在xhyve(Mac …...
南昌网站建设讯息/2021百度热搜年度榜
为了评估模型拟合的好坏,通常用损失函数(觉得严格来说相当于下面的目标函数)来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。 每一个算法都有一个目标函数(objective f…...
网站建设挣钱吗/潍坊网站建设优化
0 序言泰勒公式,本质上是一种函数的近似,强大之处就在于可以将不同类型的函数,统一用多项式求和的形式进行替换,从而变成多项式的运算。本篇主要是标出常见的几个泰勒展开式、高阶无穷小的计算规则、泰勒公式使用时应该展开到第几…...
B2B第三方网站建设的流程/如何优化推广网站
1、需求 采用codemirror 6版本开发 ,要求:自定义代码提示 ,通过输入关键字,实现代码片段覆盖。 类似于Vscode中输入VueInit ,显示代码片段: <template lang""><div></div> &l…...
集团网站建设服务公司/成都seo公司
package work1;import java.util.Scanner;public class Test {//切记,类名一定要大写,这里我出现了一个错误,就是car类名小写,/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stubcar …...