Linux 文件知识 补充

目录与文件

路径解析

目录亦是文件,存文件与 inode 号的映射关系所以,访问文件,需打开当前目录。

但是,我们要访问当前目录,去哪找?也就是说,当前工作目录的 inode 去哪找?想向上想,我们打开当前目录,要从上级目录找,那又如何找?

实际上,我们打开一个文件,要把路径中所有目录全部解析,从根目录开始,这个过程叫做 Linux 路径解析访问文件,本质是进程访问,进程的 CWD 提供路径。

最开始的路径从哪来?根目录,其下又有许多缺省目录,所以,你新建的任何文件,都是在系统指定目录下新建的,由系统和用户共同构建 Linux 路径结构。

路径缓存

每次访问文件,都从头开始,未免太慢!所以 Linux 会缓存历史路径结构有个维护树状路径结构的内核结构体叫:struct dentry 。

所以当你打开一个目录,第一次会比较慢,后面就会变快。

挂载分区

我们通过 inode 号在指定分区找文件,但是我们知道 inode 是不能跨分区的,那我们怎么知道我们在哪个分区呢?

路径解析过程中,内核会通过挂载点切换文件系统(分区),inode 只在当前文件系统内有效,无需跨分区识别

什么意思呢?我们假设一个一个分区是一栋栋由 "连廊"(挂载点)连接的的 "楼",inode 是楼里面的房间号。根目录永远属于系统的主分区(我们假设叫 A 楼),当内核根据用户需求行动,在该分区中找到了 home 目录,发现它是一个挂载点,也就是说:home 是 A 楼到 B 楼之间的连廊。所以内核在接下来的操作,就来到了另一个分区进行。

所以,inode 只在 "当前这栋楼" 里是唯一的,内核永远是先确定 "在哪栋楼",再用 inode 找房间,自然就不存在跨分区的问题了!

软硬链接

硬链接

在 Linux 中,其实可以让多个文件名对应同一个 inode ,这种操作叫做硬链接

我们使用 ln 命令可以将两个文件硬链接起来,当我们查看它们的 inode 号,就会发现完全一样:

从硬链接的规则其实不难想到一种情况:创建硬链接时,目标文件不能预先存在

所以硬链接其实是一种备份操作。

内核会记录一个文件的硬链接数:

所以删除一个文件时会干两件事:1.在目录中将对于的记录删除。2.将硬链接数 -1 ,之后如果为 0 ,则释放对应磁盘空间。

当我们创建一个空目录,会看到:

我们以前就知道,. 表示当前目录,. . 表示上级目录。现在再看它们的硬链接数,你能想到什么呢?. 在上级目录有一份,在自己里面有一份,所以硬链接数为 2,而**. .**相同,但是多了其下级目录里面的一份,所以硬链接数为 3。

软链接

硬链接是通过 inode 引用另一个文件,而软链接是通过名字引用另一个文件。

软链接产生的新文件和被引用文件的 inode 是不一样的,我们用一个例子来搞清楚软链接的作用:

code.exe 是 code.c 形成的可执行文件,运行之后打印:hello I'm code.c 。

通过 code 引用 code.exe ,当我们运行 code ,结果和运行 code.exe 完全一样!

可能到这还有点难以理解,但是,联想一下我们的 Windows 电脑,电脑的桌面上有很多软件的图标,当我们双击图标,就可以打开对应的文件。但是我们删除图标,真正的文件并不会被删除,因为那只是一种快捷方式。那么,软链接,不就是 Linux 创建快捷方式的操作吗!!!

相关推荐
阿里云大数据AI技术10 小时前
阿里云 EMR AI 助手正式发布:从问答工具到全栈智能运维助手
运维·人工智能
你好潘先生16 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
orion571 天前
Missing Semester Class1:course overview and introduction of shell
linux
SkyWalking中文站1 天前
认识 Horizon UI · 6/17:Trace 探索器
运维·监控·自动化运维
用户120487221611 天前
Linux驱动编译与加载
linux·嵌入式
程序员老赵1 天前
服务器文件不想 SFTP 上传?Docker 跑个 File Browser,浏览器就能管理
服务器·docker·开源
火车叼位1 天前
写给初级开发者:SSL、SSH、HTTPS 与证书体系全解析
运维
vivo互联网技术2 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
用户805533698032 天前
Input 子系统架构:Core、Handler、Driver 三层是怎么协作的
linux·嵌入式