Linux_Ext系列文件系统基本认识(一)
✨✨ 欢迎大家来到小伞的大讲堂✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏:LInux_st
小伞的主页:xiaosan_blog制作不易!点个赞吧!!谢谢喵!!
1. 硬件认识
机械磁盘作为计算机中唯一的一个机械设备,虽然他的访问速度慢于机械硬盘,但因其容量大,价格便宜,被服务器所选中。
1.1 磁盘物理结构
扇区:是磁盘存储数据的基本单位,512字节,块设备
如何定位一个扇区呢?
- 可以先定位磁头 (header)
- 确定磁头要访问哪一个柱面(磁道)(cylinder)
- 定位一个扇区(sector)
- CHS地址定位
- 扇区是从磁盘读出和写入信息的最小单位,通常大小为512字节。
- 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头
- 磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据
- 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
- 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
- 圆盘(platter)数:就是盘片的数量
- 磁盘容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
1.2 磁盘的逻辑结构
磁带上面可以存储数据,我们可以把磁带“拉直”,形成线性结构
逻辑上我们可以把磁盘想象成一卷磁带
这样每一个扇区,就有了一个线性地址(其实就是数组下标),这种地址叫做LBA
某一磁道展开,如一维数组
当我们将磁道展开,如二维数组
在柱面上的磁道,扇区个数是一样的
当柱面展开,就组成了多维数组
寻址一个扇区:先找到哪一个柱面(Cylinder),在确定柱面内哪一个磁道(其实就是磁头位置,
Head),在确定扇区(Sector),所以就有了CHS。
我们之前学过C/C++的数组,在我们看来,其实全部都是一维数组:
每一个扇区都有一个下标,我们叫做LBA(LogicalBlockAddress)地址,其实就是线性地址。
那我们如何找到LBA地址呢,我们需要通过CHS地址转化成LBA,CHS转换LBA地址,这是有硬件本身磁盘来做的
1.3 CHS&&LBA地址
CHS转成LBA:
- 磁头数*每磁道扇区数=单个柱面的扇区总数
- LBA=柱面号C*单个柱面的扇区总数+磁头号H*每磁道扇区数+扇区号S-1
- 即:LBA=柱面号C*(磁头数*每磁道扇区数)+磁头号H*每磁道扇区数+扇区号S-1
- 扇区号通常是从1开始的,而在LBA中,地址是从0开始的
- 柱面和磁道都是从0开始编号的
- 总柱面,磁道个数,扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。
LBA转成CHS:
- 柱面号C=LBA//(磁头数*每磁道扇区数)【就是单个柱面的扇区总数】
- 磁头号H=(LBA%(磁头数*每磁道扇区数))//每磁道扇区数
- 扇区号S=(LBA%每磁道扇区数)+1
- "//":表示除取整
从现在开始,磁盘就是一个元素为扇区的一维数组,数组的下标就是每一个扇区的LBA地址。OS使用磁盘,就可以用一个数字访问磁盘扇区了。
2.文件系统
2.1 "块"概念
当操作系统读取硬盘数据,并不会一个个扇区读取,这样效率太低,而是通过连续读取多个扇区,即被称为“快”
硬盘的每个分区是被划分为一个个的”块”。一个”块”的大小是由格式化的时候确定的,并且不可
以更改,最常见的是4KB,即连续八个扇区组成一个”块”。”块”是文件存取的最小单位。
注意:
- 磁盘就是一个三维数组,我们把它看待成为一个"一维数组",数组下标就是LBA,每个元素都是扇区
- 每个扇区都有LBA,那么8个扇区一个块,每一个块的地址我们也能算出来。
- 知道LBA:块号=LBA/8
- 知道块号:LAB=块号*8+n.(n是块内第几个扇区)
2.2 “inode”概念
文件=数据+属性,当我们用ls -l 除了能看到文件名,还能看到文件属性
-rwxr-xr-x. 1 root root 7438 "9⽉ 13 14:56" a.out
-rw-r--r--. 1 root root 654 "9⽉ 13 14:56" test.c
每行包含7列:
- 模式
- 硬链接数
- 文件所有者
- 组
- 大小
- 最后修改时间
- 文件名
ls -l 读取存储在磁盘上的文件信息,然后显示出来
其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息
[root@localhost linux]# stat test.cFile: "test.c"Size: 654 Blocks: 8 IO Block: 4096 普通⽂件
Device: 802h/2050d Inode: 263715 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-09-13 14:56:57.059012947 +0800
Modify: 2017-09-13 14:56:40.067012944 +0800
Change: 2017-09-13 14:56:40.069012948 +0800
到这我们要思考一个问题,文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存
文件的元信息(属性信息),比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。
- Linux下文件的存储是属性和内容分离存储的
- Linux下,保存文件属性的集合叫做inode,一个文件,一个inode,inode内有一个唯一的标识符,叫做inode号
- 文件名属性并未纳入到inode数据结构内部
- inode的大小一般是128字节或者256,我们后面统一128字节
- 任何文件的内容大小可以不同,但是属性大小一定是相同的