了解了被打开的文件,肯定还有没被打开的文件,就是磁盘上的文件。先从磁盘开始认识
磁盘
概念
内存是掉电易失存储介质,磁盘是永久性存储介质
磁盘的种类有SSD,U盘,flash卡,光盘,磁带。磁盘是外设,机械设备,访问慢,os也有提速的方式
磁盘物理结构
磁盘上面有盘片,伺服,磁头,音圈马达等
盘面上会存储数据,计算机只认识二进制,南极和北极,向磁盘写入数据本质就是改变磁盘上的正负极,磁头可以读取内容
磁盘的存储结构
磁盘有一个一个圈,每一个平看是一个盘面,一个盘面上每一圈圆叫磁道,将磁道分为了8份,每一份磁道就是扇区。磁道相同的盘面合在一起是一个柱面
磁盘寻道
磁盘怎么找到数据在哪里
在电脑中运行的时候,磁盘是在高速旋转,高速旋转让磁头悬浮在盘面上方,电脑找到地址后发送给磁头,驱动磁头臂精确寻道,找到数据存放的位置。读取数据时,磁头会移动到盘面上读取数据,读取完会回到起始位置。磁盘怎么确定数据在哪个扇区?
CHS寻址
要找到一个扇区,先确定在哪个面(对应哪个磁头),然后确定哪个磁道,最后确定在哪个扇区。
磁盘结构的抽象
磁带里面的塑料带就像磁盘的盘片,播放时会将磁带从一边卷到另一边。虽然是圆形的,但可以将磁带抽出来,就成了线性结构,里面分为很多部分。磁盘虽然是圆形的,也可以拉开抽象为线性结构,每一块就像一个扇区,访问一个扇区只需要知道下标,就像给每一个扇区编了号,这种寻址方式是LBA寻址。将LBA寻址转换为CHS寻址,就可以找到数据扇区
磁盘管理
将数据存储到磁盘变为存储到数组,找到扇区变为找到数组特定位置,这样对磁盘的管理变为对数组的管理,就方便了很多
一整个磁盘不好管理,可以将磁盘分为几个区,就可以转换为小分区的管理。 橙色部分是分区的信息,电脑启动的信息,不只存一份,还有几个备份,当启动出问题就可以拷贝过来恢复
上面的橙色部分就是BootBlock,一个分区还是大,可以划分为很多个快,其中每个块的结构如上图。
块组
虽然磁盘的基本单位是扇区,512字节,但是操作系统(文件系统)和磁盘进行IO的基本单位是:4KB(8*512byte),一个block块的大小,所以磁盘也叫块设备
为什么不以512字节为单位
1.如果给的太小,需要多次IO,效率会低
2.如果操作系统和磁盘一样的大小,万一磁盘基本大小编了,Os的源代码要不要改,硬件和软件(os)进行解藕
linux ext2文件系统,上图是磁盘文件系统图(内核内存映像有所不同),磁盘是典型的快设备,硬盘分区被划分一个个的block。一个block的大小是格式化的时候确定的,并且不可以更改,例如mke2fs的-b选项可以设定bloc大小为1024、2048或4096字节。而上图中启动快
- Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
- 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息,Super Block的信息被损坏,可以说整个文件系统结构就被破坏了
- GDT,Group Descriptor Tbale:块组描述符,描述块组属性信息,包含每个块组的总体信息,如数据位图的块号、索引节点位图的块号、索引节点表的起始块号、空闲数据块和 inode 的个数等。
- 块位图(Block Bitmap):假设有1000+个blocks,就有1000+个比特位,和block一一对应,每个bit表示一个哪个数据块被占用,哪个没被占
- inode位图(inode Bitmap):同上,表示inode是否空闲可用
- inode节点表:一个大小128字节的空间,所有文件inode空间的集合,需要标识唯一性,每一个inode块,都要有一个inode编号。一般一个文件,一个inode,一个inode编号。存放文件属性和大小,所有者,最近修改时间等
- data blocks:存放文件内容,多个4kb(扇区*8)大小的集合,保存的都是特定文件的内容
在上面的区分后,linux在存储文件时,内容和属性是分开存储的。文件=内容+属性,属性存在inode,内容存在data里。这样可以让一个文件的信息可追溯,可管理
在每个块组内写入相关的管理数据,整个分区就被写入了文件系统信息,这就是格式化
文件查找
找到文件,只要找到对应的inode编号,就能找到该文件的inode属性合集。那么文件的内容怎么知道,哪些块是这个文件的?
inode中存了文件的属性和同一个块组的编号
如果一个文件特别大,block数据块里不只可以放内容,也可以放其他块的编号,这样类似多叉树的机构,节点就会存在大量的数据块,就可以表示一个大文件
inode
文件属性第一串数字就是inode
找到inode编号,就能找到分区里特定的bg,然后有了inode属性和内容,怎么知道一个文件的inode编号 。在linux里,想找一个文件,首先知道的是文件名,但文件inode属性里并没有文件名,文件名是在哪里?
在linux目录下,有很多文件,但是同一个目录里没有重复的文件名。目录其实也是文件,有自己的inode,也有data block,data里就存文件名以及文件名和inode的映射关系,这两个互为key值。正因为目录也是文件,所以也有自己的权限,x就是进入目录,w创建文件,需要写入文件名,r显示文件名和属性,读取文件属性和内容
寻找inode编号,依托的是目录结构,所以相对路径和绝对路径的关键在于定位目录,才能读取目录里的文件。关于目录名怎么找到自己的inode,在linxu里有目录树结构,保存了目录之间的关系和目录名与inode的映射关系
创建文件
先找到目录所在的分区,然后找到块组,在inode bitmap找到没有被占用的编号,置为1,然后将文件的属性写入,比如权限,所属组,时间等,将datablock映射关系建立,block位图置为1。有了inode编号,还需要在目录block里写入文件名,编号和文件名映射关系。
删除文件
以文件名为key,找到对应文件的inode,将inode bitmap和block bitmap的内容修改为0,无占用。再将映射关系删掉就行了。有时候删部分文件只需要修改文件大小。所以删除文件比拷贝快的多,所以文件删除也是可以恢复,只需要找到inode,将inode bitmap恢复,将映射的数据块恢复。但是,如果这个inode和data block被再次占用覆盖了,就找不到了
查看文件
ls找到目录,显示目录的对应的文件名和文件属性
cat根据文件名找到文件inode,显示文件内容
磁盘空间或者块组还有空间,但文件创建失败
inode和block是固定的,如果一个申请不下来,就会出现这种情况