探索文件系统:软硬链接的奥秘

目录

1.文件系统

1.1 磁盘物理存储结构

1.2 磁盘逻辑存储结构

1.3 inode编号

2. 软硬链接

2.1 软链接

2.2 硬链接

2.3 目录文件的软硬链接


1.文件系统

在一台电脑中,大部分文件都不是被打开的,这些文件都在磁盘中进行保存。已经打开的文件需要管理,没有被打开的文件同样需要管理,所以需要文件系统

1.1 磁盘物理存储结构

磁盘是一种用于存储数据的硬件设备,通常分为机械硬盘(HDD)和固态硬盘(SSD)两大类。机械硬盘通过旋转的磁性盘片和磁头读写数据,而固态硬盘则使用闪存芯片,没有机械部件。因为大容量磁盘比较便宜,大型公司还是使用磁盘,我们这里讲解一下磁盘的结构。

磁盘的主要组成部分:

  • 盘片(Platter):表面覆盖磁性材料的圆形金属片
  • 磁头(Head):读写数据的电磁组件
  • 磁道(Track):盘片上的同心圆环
  • 扇区(Sector):磁道的最小存储单元(通常512字节或4K)
  • 柱面(Cylinder):所有盘片同一磁道组成的立体结构

一个盘面可以有很多个同心磁道,一圈磁道可以有很多扇区,扇区是磁盘最小的存储单元。

如果我们想向一个扇区写入,我们寻址的过程是这样的:

  1. 确定盘面
  2. 确定磁盘
  3. 确定扇区

1.2 磁盘逻辑存储结构

我们把磁盘抽象成连续的线性空间。

那我们如何寻找一个扇区呢,我们可以给每个扇区编号,比如1~100000第一面,100001~200000第二面,对磁盘的管理就变成了对数组的管理。

操作系统中,可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块为单位进行存取。一个文件块可以有多个扇区组成,这样可以更好的应用空间局部性原理,就可以理解为什么说磁盘是块设备了,即按照块的大小从磁盘中读取数据。

1.3 inode编号

文件系统时如何实现并找到我们的文件的呢?文件系统为每个文件分配一个inode编号,通过inode编号进行查找。

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

  • Datablocks:数据区存放文件内容。
  • inode Table(inode表):struct inode inode_table[N]

inode Table中有很多inode结构体,一般情况下一个文件一个inode,且在整个分区具有唯一性。不同分区可以装不同的操作系统。

struct inode
{大小,权限,拥有者,所属组,修改时间,inode编号,引用计数;int blocks[N];
}

inode存放文件的属性信息,Data blocks中存放文件的内容。其中inode编号不同表示不同文件,其中 block[N] 表示所用块的下标,N一般不会太大,比如N是15时,0~10使用直接映射,11~12使用二级映射,13~14使用三级映射,可以跨组存储。

  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。一个比特位表示一个块。
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以深入了解。
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏。超级块不是每个块组都有,一般只有3~4个块组有。

用户使用操作系统时使用的是文件名,而内核只使用inode编号,所有我们的目录文件中存储的就是该目录下文件与inode编号的映射。

inode编号同一分区内唯一,不同分区inode编号可以相同,那么操作系统如何判断相同inode编号的文件在那个分区的呢?

  • 访问文件时都是需要知道该文件的目录,不同目录创建时会通过挂载知道属于哪个分区。

2. 软硬链接

通过 ln -s 指令可以为文件建立软链接,不加 s 为文件建立硬链接。

ln -s 文件名 链接名

2.1 软链接

为log建立软连接,通过 ls -l -i  可以看到文件第一个属性是inode编号。

ln -s log log.soft.link

可以看到文件和其软链接inode编号不同,可以判断出这是两个不同的文件,软链接是一个独立的文件。软链接内容是指向目标文件的路径,类似于windows的快捷方式。

软链接的文件属性是 l,说明是链接文件。

2.2 硬链接

为hello文件创立一个硬链接。

ln hello hello.hard.link

可以看到普通文件与其硬链接inode编号相同,硬链接不是一个独立的文件,且文件属性是 - ,普通文件。

那硬链接是什么呢?硬链接是在指定的的目录内部添加一组映射关系(文件名<-> inode编号)。inode编号相同,访问磁盘时也是访问相同的inode。

第三个属性就是该文件的硬链接数,当一个文件的硬链接数是0时,该文件才算是真正地被删除。在文件系统层面,inode内部有引用计数,表明有几个文件名与inode编号有映射关系

2.3 目录文件的软硬链接

创建一个新文件和一个新目录

mkdir newdir
touch newfile

可以发现新普通文件的硬连接数时1,而新目录的硬连接数是2。我们可以通过 ls -a,可以看到 . 和 .. 两个隐藏目录文件,. 代表当前目录,.. 代表上一级目录。本级的 newdir 和 newdir 中的 . 都指向该目录,所以新建目录的硬连接数是2,当 newdir 中每新建一个目录,newdir 的硬链接数都会加1,因为在 newdir 中新建的目录中都有 .. 指向 newdir 。

. 与 .. 都属于目录的硬链接,但是用户是不能给目录文件建立硬链接。因为在执行一些查找命令时会通过目录查找,会陷入循环,且硬链接文件是普通文件,可能绕过权限检查,当然还存在其他等等问题。

用户是可以为目录建立软链接的,因为软链接可以通过文件属性 l 分辨出。

本篇结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92183.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3x3矩阵教程

3x3矩阵教程 1. 简介 三维矩阵是线性代数中的重要概念&#xff0c;用于表示三维空间中的线性变换。本教程将介绍如何使用C实现三维矩阵的基本运算和变换。 2. 代码实现 2.1 头文件 (matrix3x3.h) #ifndef MATRIX3X3_H #define MATRIX3X3_H#include <array> #include <…

深度学习前置知识

文章目录介绍数据操作张量张量的定义1. **张量的维度&#xff08;Rank&#xff09;**2. **张量的形状&#xff08;Shape&#xff09;**简单的数据预处理&#xff08;插值线性代数微积分概率论1. 基本概念(1) 随机试验与事件(2) 概率公理&#xff08;Kolmogorov公理&#xff09;…

XSS学习总结

一.XSS概述 跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;攻击者通过在网页上注入恶意脚本代码&#xff0c;从而在用户的浏览器上执行恶意操作。这些脚本可以是 JavaScript、HTML 或其他网页脚本语言。一旦用…

计算机网络中:传输层和网络层之间是如何配合的

可以把网络层和传输层想成一个“快递系统”&#xff1a; 网络层&#xff08;IP 层&#xff09; 邮政系统&#xff1a;只负责把“包裹”&#xff08;IP 数据报&#xff09;从 A 地搬到 B 地&#xff0c;不保证顺序、不保证不丢、不保证不重复。传输层&#xff08;TCP/UDP 层&am…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户登录实现

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解用户登录实现 视频在线地址&#xff1a; …

Redis主从复制数据同步实现原理详细介绍

文章目录一、主从复制的概念二、全量复制&#xff08;完整重同步&#xff09;三、增量复制&#xff08;部分重同步&#xff09;1. 增量复制的核心思想2. 增量复制的实现3. 复制偏移量&#xff08;replicationoffset&#xff09;4. 复制积压缓冲区&#xff08;replicationbacklo…

docker 软件bug 误导他人 笔记

DockerDesktopInstaller.exe install --installation-dirX:\AI-AI\docker\pro\ 由于 Docker官方随便修改安装命令&#xff0c;这个在4.4一下是无法使用的&#xff0c;存在误导他人

Python 进阶(六): Word 基本操作

目录 1. 概述2. 写入 2.1 标题2.2 段落2.3 表格2.4 图片2.5 样式 3. 读取 1. 概述 Word 是一个十分常用的文字处理工具&#xff0c;通常我们都是手动来操作它&#xff0c;本节我们来看一下如何通过 Python 来操作。 Python 提供了 python-docx 库&#xff0c;该库就是为 Wo…

OpenLayers 入门指南【三】:API概要

目录一、官方文档二、核心类三、总结一、官方文档 首页右侧有四个栏目分别是 Docs(文档):也可以理解为使用指南&#xff0c;涵盖一下四个模块 Quick Start(快速入门)&#xff1a;介绍如何快速引入并使用OpenLayers快速构建一个地图应用FAQ(问答)&#xff1a;介绍一些常见问题的…

JAVA面试宝典 -《Kafka 高吞吐量架构实战:原理解析与性能优化全攻略》

&#x1f680; Kafka 高吞吐量架构实战&#xff1a;原理解析与性能优化全攻略 随着大数据技术在日志收集、埋点监控、订单流处理等场景的普及&#xff0c;Kafka 已成为流处理架构中的核心组件。它之所以能在海量数据场景下保持高吞吐、低延迟&#xff0c;源于其在架构层面和底…

把sudo搞坏了怎么修复:报错sudo: /etc/sudo.conf is owned by uid 1000, should be 0

今天部署 NFS 的时候一不小心给/etc目录下所有的文件都所有者给改了&#xff0c;然后使用sudo的时候就出现了下面的问题&#xff1a; sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudo.conf is owned by uid 1000, should be 0 sudo: /etc/sudoers i…

VUE前端项目开发1.0.1版本

项目包含用户权限管理、表单提交、数据上传下载、仪表盘可视化等功能&#xff0c;非常适合新手从零开始学习Vue3前端开发&#xff0c;下述包含所有开发源代码&#xff0c;敬请食用 废话少说先上图: 登陆界面: 仪表盘管理系统: 用户管理: 对于普通用户只有仪表盘和个人信息界…

低代码平台能否完全取代传统前端开发

低代码平台不能完全取代传统前端开发&#xff0c;主要原因包括灵活性有限、性能优化能力不足、复杂定制需求难以实现。 低代码平台尽管能快速开发出相对标准化的应用&#xff0c;但在处理复杂、个性化的业务需求时&#xff0c;明显表现出不足。尤其在需要精细化控制UI界面、高性…

Git 中如何比较不同版本之间的差异?常用命令有哪些?

回答重点1&#xff09; git diff <commit1> <commit2> &#xff1a;比较两个指定的提交之间的差异。2&#xff09; git diff <branch1> <branch2> &#xff1a;比较两个分支之间的差异。3&#xff09; git diff <path> &#xff1a;比较工作目录…

MySQL 8.0 OCP 1Z0-908 题目解析(32)

题目125 Choose three. Identify three functions of MySQL Enterprise Monitor. □ A) Analyze query performance. □ B) Start a logical backup. □ C) Determine the availability of monitored MySQL servers. □ D) Centrally manage users. □ E) Start a MySQL Enterp…

Spring处理器和Bean的生命周期

Spring处理器和Bean的生命周期Spring处理器是对Bean对象的的开发可以对BeanDifinition进行操作&#xff0c;例如动态添加、修改BeanDefinition、动态修改Bean。&#xff0c;也可以在Bean对象创建后对Bean对象进行代理增强。注意&#xff1a;对于处理器要又一个正确的认知&#…

Spring Framework源码解析——BeanFactory

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl1. BeanFactory 概述 BeanFactory 是 Spring IoC 容器的最基础接口&#xff0c;它定义了获取、配置和管理 Bean 的核心方法。它是 Spring 框架中容器体系的顶层接口之一&#…

C# 计算梯形面积和周长的程序(Program to calculate area and perimeter of Trapezium)

梯形是至少有一对边平行&#xff0c;其他两条边可以不平行的四边形。平行边称为梯形的底&#xff0c;其他两条边称为梯形的腿。平行边之间的垂直距离称为梯形的高。公式 &#xff1a; 梯形面积&#xff1a; 0.5 * (a b) * h梯形周长&#xff1a; a b c d例子&#xff1a; 输…

【计算机考研(408)- 数据结构】数组和特殊矩阵

数组和特殊矩阵 数组 数组的定义 数组是由n(n>1)个相同类型的数据元素构成的有限序列。每个数据元素称为一个数组元素&#xff0c;每个元素在n个线性关系中的序号称之为该元素的下标&#xff0c;下标的取值范围称为数组的维界。 数组是[[线性表]]的推广&#xff0c;一维数组…

Agent架构与工作原理:理解智能体的核心机制

Agent架构与工作原理&#xff1a;深入理解智能体的核心机制 AI Agent的核心组成部分 一个完整的AI Agent通常由以下几个核心模块组成&#xff1a; 1. 规划模块&#xff08;Planning Module&#xff09; 规划模块是Agent的"大脑"&#xff0c;负责制定行动策略。它接收…