扇区一般就是操作系统进程I/O操作最小的单位。
既然,是作为最小单位,那么每一个扇区存储的内容应该是一样多的,但是,我们可以观察到每一个扇区的大小是不一样,那怎么办?
为了保证扇区的存储大小一致,所以,每一个不同磁道的扇区的存储数据密度是不一致的
柱面:就是由每一个盘面上半径相同的磁道组成的空心圆柱
磁头:每一个盘面上都会有点一个读取数据的机械结构(注意:磁头和盘面只是离得非常近,两者之间是不接触的)
磁头和盘片的运动轨迹:盘片是依靠中心圆中主轴上的马达高速转动。磁头则是横向运动(如下图)
两者之间保持一个合适的速度差,使得磁头可以扫过盘面的每一块区域。
如果,为了让磁盘找到目标文件,在硬件层面上是使用CHS定位寻址法。
这样通过柱面,磁头,扇区三个参数,就确定了数据的位置。
这样每一个文件,不就是多个扇区组成的吗。这样就确定文件的位置了
我们看到这种磁带的黑色长线就是,他储存数据的地方,通过转动中央的两个孔来实现对数据的读取。
由此,我们联想到可不可以把所有的磁盘空间抽象的转化为一个长数组,把对数据的增删查改转化为对数组的增删查改。
那么这样从抽象地址转化到具体的地址,要增加一步:LBA地址 * 8+(0,1,2,3,4,5,6,7)这样才能算出一个扇区在这个线性结构中的具体位置。
Linux下文件的特点: 文件 = 属性 + 内容
肯定没问题的是,我们描述一个文件的属性,肯定是使用一个结构体,而且是一个统一的结构体(那么文件属性的大小就是确定的,是一个固定的值)
但是,文件的内容完全是随机的,根本就没有一个固定的大小。
所以,Linux在存储文件方面采用了属性和内容分开存储的方式
我们可以很明显的看到,在这个结构体中并没有文件名,在OS内部我们不用文件名来标识文件,我们采用inode编号来唯一标识该文件。
ll -i :显示文件inode编号
我们一个磁盘一般来说都是512GB和1TB的大容量的,直接要管理这么大一块的内存空间显然是非常困难的,所以我们可以采用一下分治的思想,将空间划分为一小块,一小块的,然后将管理逻辑复制到每一个小块上。
前文提到了inode 是一个存储文件属性的结构体,那么inode table就是一块存储inode的数组空间。
inode Bitmap 是一个对位图的应用,每一个比特位就对应这inode Table 里的数组下标,用0/1来标识,该块的数组下标的内存是否被使用。
Data Block 以4KB为基本大小的数组,用来存放文件的内容。
blocks Bitmap也是对位图的应用,每一个比特位于Data Blocks的数组下标一 一对应,用来表示这块内存是否被使用。
Boot Block:只存在0号盘面、0号磁道、1号扇区中,即:分组0前,其作用是辅助开机,如:引导OS启动、检测文件系统状态、加载其他引导程序等。
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子。
在结构体inode内部有一个 int block[15]的数组用来记录Data Block 数组中的数组下标。
在block[0,12]中的每一个位置记录的就是Data Block数组中的下标,记录的那个数组块,存储的也是文件内容。
很明显,如果每一个Block数组只能记录一个4KB的数据块,那一个文件能够存储的空间也不大。但是,由于属性的大小是固定的,我们也不好对数组进行扩容。
Block[12,14]这两块空间指向的Data Block中的4KB数据块中存储的数据不是文件内容,而是其他的4KB空间(这些4KB空间中存储的是文件内容)----- 这样就造成了类似于二级索引的结果。
而Block[15]这块空间则是采用三级索引,指向的4KB空间中存储的是Data Block 数组的下标,而这些数组下标的4KB空间,内部存的其他的Data Block 数组的下标,而这些数组下标所指向的空间才是存储着文件内容
文件是不是一定会存在一个目录里面?----- 那是肯定的 那么目录是不是也是一个文件?---- 是的,目录也是一个文件 那么目录这个文件中存储的文件内容是什么呢?
直接给出结论:目录中存放的内容就是文件名与文件inode的映射关系
对于文件的增删改操作,最开始都是要先归结于查,得先找到文件,才能对文件进行操作吧!
我们之前提到了inode实在分组里面是唯一的,但是,在分区中inode是不唯一的,所以,我们如何在查找文件的时候通过文件名,来准确得出那个文件是我们需要的。
我们已知的是目标文件的文件名和他的路径,所以,当我们查找到一个文件的时候,我们都通过路径去逆向的查找,在目录xzy中查找file-operating目录的inode编号,但是此时目录xzy的inode编号未知,所以在home目录查找xzy目录的编号,最终到达根目录的时候(根目录的inode编号是已知的),最后回溯一下,这样就可以得到目标文件的inode了
你看这就是,我电脑下的两大分区,C盘和D盘
df -h 查看Linux系统下的分区
向我们对磁盘的操作中就有格式化这种操作,其实上就是清空磁盘中的内容,为磁盘装入全新的文件管理系统。 (每个不同的分区可以装不同的EXT文件系统)
通过解析文件路径(字符串前缀匹配),可以确定哪个目录是文件路径的一部分,从而推断出文件存储在哪个分区上。
挂载的本质:将存储设备上的文件系统,与文件系统(Super Block)中的某个目录(挂载点,dentry)建立关联关系,使得用户可以通过访问挂载点目录来间接访问文件系统上的所有数据。
在这个过程中,Super Block提供了文件系统的全局信息,dentry通过目录下缓存机制来加速文件名的查找,它提供了文件名到inode的快速映射,使得用户可以通过文件名快速访问文件数据。
在这里我就简单的将挂载认为是,为了让分区也能得以区分,把他们放在不同的目录下。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有