目录
- [Linux文件 = 文件名 + inode](#Linux文件 = 文件名 + inode)
- [引用计数(link count)机制](#引用计数(link count)机制)
- [硬链接(Hard Link) 一般只针对文件](#硬链接(Hard Link) 一般只针对文件)
- [软链接/符号链接(Symbolic Link) 针对目录和文件](#软链接/符号链接(Symbolic Link) 针对目录和文件)
- 挂载(Mount)
- 总结
Linux文件 = 文件名 + inode
在Linux里 一个文件由两部分组成
①文件名 比如fileA.txt 它只是一个"名字标签"
②inode文件身份证 它记录了文件真实数据存放位置;文件大小;权限;创建时间;数据块指针
引用计数(link count)机制
每个inode都会记录:有多少个文件名指向我 可以用命令ls -l查看
-rw-r--r--2user 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共享 | 路径引用 | 文件系统映射 |
