1.认识磁盘

磁盘是一个机械设备,也是一个外设
1.磁盘构成:
盘片:
由铝合金或玻璃制成的圆形薄片,表面涂有磁性材料,数据以磁信号的形式存储在盘片上。
磁道:
是盘片中的一个个圆圈,由一个个磁道构成盘片
磁头:
用于读取和写入盘片上的磁信号,工作时悬浮在盘片表面(与盘片的距离极近,通常仅几纳米),不直接接触盘片。磁头是磁盘的一面对应一个
马达:
包括驱动盘片旋转的主轴马达和驱动磁头移动的音圈马达。
扇区:
是磁盘被访问的基本单元,最小容量为512字节,实际存储大小对应4KB大小,由磁盘中心沿各个方向所发出的射线相互之间在一个个磁道上所围成的区域,靠近中心密度大,可以把磁盘看作由无数个扇区所构成的存储介质,要把数据存储到磁盘就是要定位,哪一面Header(磁头定位),哪一个磁道Cylinder,哪一个扇区Sector,磁盘上采取CHS寻址法
2.工作原理:
主轴马达带动盘片高速旋转(常见转速有 5400 转 / 分钟、7200 转 / 分钟等),音圈马达控制磁头在盘片的不同磁道间移动,通过磁头感知或改变盘片表面的磁信号来实现数据的读写。读写效率低主要就在于磁头在不同磁道间定位目标扇区,所以就要求要有意识的将相关数据放在一起,提高查找效率,马达转速也有一定影响。整体运动越少效率越高,反之
3.特点:
优点:容量大、单位容量成本低,适合存储大量数据(如电影、备份文件等)。
缺点:由于存在机械运动,读写速度较慢,且抗震性较差,受到剧烈震动可能导致磁头损坏或盘片划伤,影响数据安全。
1.2对磁盘进行逻辑结构分析
将一个个磁道展开,相邻的磁道所展开得到的线性结构头尾相接,可以认为磁盘的逻辑结构可以抽象为线性数组,数组上可以划分不同区域,对应不同磁道,这些区域内还可以再划分对应不同的扇区,任意扇区都有其下标,逻辑扇区地址可与CHS寻址法相互转换
回归硬件,不仅是cpu有寄存器,其他外设也有,磁盘也有。磁盘作为外设,必须依赖寄存器 实现 "命令下发、状态查询、数据传输",这是计算机体系中 "主机与外设交互" 的基础逻辑。
"为什么 CPU 能控制磁盘读写"------ 本质是通过读写磁盘的寄存器,让磁盘控制器执行对应的操作。
2.文件系统
磁盘是典型的块设备,会进行分区被划分为一个个块block,一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设
定block大小为1024、2048或4096字节。
Boot Block :
是存储介质(如硬盘分区)开头的一个特殊区块,主要用于系统引导相关的功能,通常用于存放启动加载程序(boot loader)的部分代码,开机时读取其内容加载操作系统内核。并不属于文件系统的管理范围,而是被预留出来专门用于引导。文件系统的结构(如超级块、块组描述符等)从 boot block 之后开始。
Block Group :
ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成,结构如图所示,每一组间。政府管理各区的例子
1.超级块(Super Block) :
存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,所以它会存于某些组中,不会每个组都有这样效率低下
2.GDT(Group Descriptor Table) :
块组描述符,描述块组属性信息
3.块位图(Block Bitmap) :
Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
4.inode位图(inode Bitmap) :
每个bit表示一个inode是否空闲可用。删除一个文件时不需要把块中文件内容删除,只需将对应的比特位置0。删除=允许被覆盖
5.i节点表(inode Table) :
存放文件属性如文件大小,所有者,最近修改时间等;集中存储所有 inode 结构,每个元素就是一个 inode struct。
inode是单个文件的所有属性 ,128字节,一般一个文件一个inode,inode有唯一的编号,Linux文件属性中不包含文件名称,标识文件用的是inode编号 ;struct inode内还有管理Data blocks的数组,其中一部分下标为直接索引,直接对应块中文件内容,还有一部分为两级索引,存储文件的块号,同时这些块号的内容也被要求继续向下存储其他文件块号,以此可以用较小的int blocks[NUM]来管理整个Data blocks部分
6.数据区(Data blocks) :
存放文件内容,以块的形式呈现,大小通常为4KB,大于等于扇区大小512字节是为了预加载
7.格式化 :
每一个分区在被使用前,都必须提前先将部分文件系统信息提前设置进对应的分区中,其中块位图和inode位图都置0,方便我们后续使用这个分区或分组
注意 :
1.通过inode Table和Data blocks可得Linux的文件在磁盘中存储,是将属性和内容分开的
2.在同一个 ext2 文件系统中,不同块组间的块位图、inode 位图、inode 表、超级块、组描述符等核心结构的大小是固定的,这是由文件系统创建时的初始化参数(块大小、inode 密度、块组大小等)决定的。
问题 :
那么如何知道一个文件的inode编号,使用者从来都是使用文件名不关心inode,可是inode所有文件属性中没有文件名,其本身作为识别文件的唯一标识
- 如何理解目录?
目录也是文件,也有自己的inode,目录也要有自己的属性 ,因为文件=内容+属性,所以目录也存在自己的数据块,里面存放该目录下,文件的文件名和对应文件inode的映射关系;这就是为什么我们可以直接使用文件名,因为在当前目录的数据块中已经帮忙存好了映射关系,决定了同一个目录下不能有同名文件。
重新理解目录权限的概念:
1.目录下,没有w,无法创建文件:
首先文件系统定位到目标的inode,检查是否有该目录的w权限,w权限决定了是否能进入inode Table去新增一个inode struct,以及其他表中写入相关文件信息
2.目录下,没有r,无法查看文件:查看文件的本质是读取当前目录数据块中存储的文件名与inode的映射关系
3.目录下,没有x,无法进入这个目录:普通文件的x权限是 "执行文件内容"(如运行可执行程序),目录本身不是可执行的用户程序,其x权限不涉及 "执行数据",而是控制路径的可达性
- 既然目录也是文件,那么如何知道它的inode?
这就涉及到递归问题,当前目录的inode与目录名的映射关系存储在父目录的数据块当中,依次递归,根目录的文件名与inode映射是固定的,整个文件系统的全局映射是通过 "根目录→子目录→孙目录......" 的层级链逐级解析实现的,所以要访问一个文件得到其inode要加路径,从跟目录递归回来,我们平常可以直接使用文件名因为全局变量已存储好当前工作目录等相关路径
- 了解dentry缓存:
如果每次都这样递归得到一个文件的inode那么会存在效率问题,所以为加速文件路径解析,内存中专门有一个dentry缓存来存储经常或近期访问文件的文件名、路径层级关系及其对应的 inode 映射,是内核在内存中维护的 "目录项数据库",目的是减少磁盘 I/O,加速文件路径的解析过程
- 可通过指令stat+文件名的方式查看文件系统相关信息,ls-i命令查看文件inode
3.软硬链接

- 1.软链接
软链接是一个独立的文件,有独立的inode,也有独立的数据块,块内保存的是指向文件的路径,可以理解为指向一个文件的路标。
可以这么理解,Windows桌面上存在软件的快捷方式,但真正的可执行程序存储在C盘或D盘,快捷方式内存着到可执行程序的路径,点击快捷方式和直接点击可执行程序效果相同,快捷方式就是这个可执行程序的软链接
注意:软链接指向的目标文件删除,会失效
应用场景 :
1.可以通过file找到当前绝对路径下的file.txt,允许存在多个软链接,之间互不干扰通过任何一个软链接修改目标文件,所有软链接访问到的内容都会同步变化(因为它们指向同一个目标)。
2.在系统能找到的/usr/bin/路径下建立软连接,就可以不带路径执行程序
软链接本身不改变程序的位置,但其作用是将程序 "映射" 到PATH包含的目录中,让系统能在默认搜索路径中找到它。/usr/bin/是PATH中默认包含的目录之一,系统会自动在此处搜索命令。/usr/bin/目录下会出现一个名为myfile.exe的软链接,指向实际程序。注意这个指向的实际文件需要有执行权限
- 2.硬链接
硬链接不是一个独立的文件,它没有独立的inode。本质是在特定目录块中新增文件名和指向的文件的inode编号的映射关系
我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
应用场景:
通常用来进行路径定位,采用硬链接,可以进行目录间切换
注意:
Linux系统不允许对目录建立硬链接,是为了防止循环访问的问题,访问一个目录或文件需要访问其inode,当在一条绝对路径上存在硬链接时就会发生循环访问。
但是操作系统允许自己创建,因为相信自己不会出错,比如隐藏文件./...,分别是当前目录和上级目录的硬链接,是为了方便使用者进行目录切换,同时规定在进行访问时不能访问隐藏文件,这就避免了循环访问的问题