Linux系列04:简单理解inode、硬链接、软链接、挂载的概念

目录

  • [Linux文件 = 文件名 + inode](#Linux文件 = 文件名 + inode)
  • [引用计数(link count)机制](#引用计数(link count)机制)
  • [硬链接(Hard Link) 一般只针对文件](#硬链接(Hard Link) 一般只针对文件)
  • [软链接/符号链接(Symbolic Link) 针对目录和文件](#软链接/符号链接(Symbolic Link) 针对目录和文件)
  • 挂载(Mount)
  • 总结

Linux文件 = 文件名 + inode

在Linux里 一个文件由两部分组成

①文件名 比如fileA.txt 它只是一个"名字标签"

②inode文件身份证 它记录了文件真实数据存放位置;文件大小;权限;创建时间;数据块指针

每个inode都会记录:有多少个文件名指向我 可以用命令ls -l查看
-rw-r--r-- 2 user user 文件大小 fileA.txt

-表示fileA.txt是文件;2表示链接数是2

第一个符号是- 则2就表明有2个硬链接指向这个文件(如果第一个符号是d 链接数2指的是子文件夹个数是2)

删一个硬链接就变1 再删一个才变0 → 真实数据块才删除

硬链接(Hard Link) 一般只针对文件

本质:多个文件名指向同一个 真实文件数据 一个文件有多个"名字" 但内容只有一份

特点:删除原文件不影响使用(删掉的"原文件" 只是删了"文件名" 不是删数据本体);不占额外磁盘空间

缺点:不能跨分区;只能链接文件 不能链接目录
假设有文件fileA.txt 创建硬链接ln fileA.txt fileB.txt 此时:

创建一个新文件名fileB.txt 让它指向和fileA同一个inode

fileA.txt ─┐

├──> inode #12345 ──> 真实数据 数据只有一份;inode只有一个;但是"名字"变多了

fileB.txt ─┘

fileA.txt和fileB.txt内容完全一样 修改任意一个 另一个也会变

删除一个(只是删了个名字) 另一个还能用 因为它们共用同一个inode
执行rm fileA.txt 实际发生的是:

删除文件名fileA.txt 实际只是少了一个名字 但还有别的名字在用这个数据

fileB.txt ───> inode #12345 ──> 真实数据 inode还在;数据还在;fileB.txt仍然指向inode

当最后一个硬链接被删除时 rm fileB.txt

没有任何文件名指向inode (inode引用计数 = 0) 系统才会真正释放数据块

软链接/符号链接(Symbolic Link) 针对目录和文件

本质:创建一个"指向原文件路径"的快捷方式 类似于 Windows 的快捷方式

特点:可以跨分区;可以对文件夹创建 ;类似快捷方式 灵活

缺点:原文件删除就失效;占用少量空间用于存放原文件的路径(软连接有自己的数据块 主要存放了链接其他文件的路径)
假设ln -s fileA.txt linkA.txt 此时:

linkA.txt 只是一个"指路牌" 里面记录着fileA.txt的路径

如果原文件被删除 快捷方式就失效了(因为找不到路了)

挂载(Mount)

链接是文件 ↔ 文件的关系

挂载是外部文件系统 ↔ Linux文件树的关系

在Linux里 一切存储设备都必须"挂载"到目录树上才能访问

挂载是把某个存储设备如U盘/虚拟磁盘的文件系统 接入到Linux文件树中的某一个目录作为挂载点

在Linux中对挂载点这个目录的访问 实际上是在访问它对应存储设备的文件系统中的数据

假设插入一个U盘 在Linux中它可能是:/dev/sdb1(Linux一切皆文件 U盘被解析成sdb1这个文件 )

然后执行mount /dev/sdb1 /mnt/usb

就把U盘的文件系统挂载映射到/mnt/usb这个目录(挂载点)了 以后访问cd /mnt/usb 实际上是在访问U盘里的内容

总结

软链接和硬链接都会与原文件保持数据同步
软链接依赖原文件路径;硬链接共享原文件的inode数据块

硬链接针对文件 ;软链接针对目录和文件

对比 硬链接(共享inode) 软连接 挂载
本质 同一个文件多个名字 文件的快捷方式 路径引用 接入一个文件系统
类似 文件"别名" Windows快捷方式 插U盘
是否占新空间 ❌ 不占(共享inode) ✅ 占少量 ❌ 无关
删除源文件 ✅ 不影响 ❌ 失效 ❌ 无关
跨分区 ❌ 不行 ✅ 可以 ✅ 可以
可链接文件夹 ❌ 不行 ✅ 可以 ❌ 无关
底层原理 inode共享 路径引用 文件系统映射
相关推荐
哈__12 小时前
Linux生产环境MongoDB部署与安全加固:用户权限、防火墙、远程访问完整方案
linux·安全·mongodb
浅时光_c18 小时前
3 shell脚本编程
linux·开发语言·bash
Lucis__19 小时前
一文读懂TCP通信机制:基于相关API构建可靠性连接
linux·网络·tcp/ip
_深海凉_19 小时前
LeetCode热题100-有效的括号
linux·算法·leetcode
江湖人称小鱼哥20 小时前
Obsidian-Graphify-让你的笔记库自己长出知识图谱
笔记·知识图谱·obsidian·claude code·graphify·卡帕西
苦 涩21 小时前
考研408笔记之计算机网络(三)——数据链路层
笔记·计算机网络·考研408
零号全栈寒江独钓21 小时前
基于c/c++实现linux/windows跨平台获取ntp网络时间戳
linux·c语言·c++·windows
左手厨刀右手茼蒿1 天前
Linux 内核中的进程管理:从创建到终止
linux·嵌入式·系统内核
geinvse_seg1 天前
中小团队如何低成本搭建项目管理系统?基于 Ubuntu 的 Dootask 私有化部署实战
linux·运维·ubuntu
CSCN新手听安1 天前
【linux】高级IO,以ET模式运行的epoll版本的TCP服务器实现reactor反应堆
linux·运维·服务器·c++·高级io·epoll·reactor反应堆