linux——文件系统
- 被打开的文件放到内存中
- 没有被打开的文件放到磁盘
1. 硬件-->磁盘
- 磁盘的存储基本单位:扇区(512字节)
512字节写入到磁盘,磁盘如何转动:
磁盘写入的时候是向柱面进行批量写入的
CHS地址:cylind header sector
柱面,磁头,扇区:由这三个CHS地址就能够找到位置
将每一个柱面平面展开就成为了一个线性结构:磁带例子--->卷起来,拉出来一条线。
抽象成线性结构之后,就相当于是一个数组,访问这个数组下标就可以访问磁盘文件。
os访问磁盘不以扇区为单位,而是以块儿为单位,一般为4KB(可以调整),一块一般为8个扇区
- 文件系统使用磁盘块儿,是以4KB为单位的
2. 文件系统
文件 = 内容+属性。
文件属性存储在inode里面,文件内容存在Data Block里面。
block bitmap
-
- 对应记录data block中那些数据空间被占用
- data block中有多少个bit,block bitmap中就有多少bit
inode bitmap
-
- 对应记录inode table
- inode table中有多少个bit,inode bitmap中就有多少bit
- block bitmap和inode bitmap通过置0或者1的方式标识对应空间的占用情况。
- 在删除数据的时候,将iNode/blockbitmap置0,恢复数据的时候将位图里面各个位置置1就行。
- 每个组里面有多少个inode,data block就决定了整个block group,分别决定了其它的一些块儿信息。
- inode和data block是跨组(block group)的
- inode不能跨分区(partition),所以在同一个分区内部,inode编号,块号都是唯一的。
- 如何确定文件在那个inode里面:除模运算。
上图各个模块儿解释
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相
同的结构组成。政府管理各区的例子
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,
未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的
时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个
文件系统结构就被破坏了
GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没
有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
数据区:存放文件内容
格式化: 在使用之前将super block,GDT,block bitmap,inode bitmap这几个字段全部清0——》》写入文件系统的管理信息。
super block
不是所有的组里面都要包含super block,只有个别包含
每个block group中都有super block,他们里面的内容完全一样,为了保证super block的安全性,会在每一个block group中备份以保证文件系统的安全,如果一个block group中的super block挂掉,可以从其他的block group中恢复。
OS如何管理磁盘:
- OS会将每个partition的super block,GDT的信息加载到内存中,使用链表将他们链接起来,对链表管理,就是对文件系统的增删查改。
- 将inode bitmap和block bitmap置0或者1就行了
如何根据inode找到data block:
- 在struck inode中存储了一个data block的编号信息,根据inode就可以找到文件数据。
linux下如何看待目录 :
- 目录也有自己的inode,他也是按照内容和属性相分离存储的。目录的内容保存的是文件名和inode的映射关系,文件名和inode是互为键值,都是唯一的。所以在磁盘中保存文件没有了目录的概念,磁盘中保存的所有数据就是inode和数据。目录和普通文件保存方案一样。
- 文件名不会作为属性保存在文件的inode中,保存在当前文件所需的目的数据内容当中
- 访问磁盘上的文件只认inode。打开路径+文件名—>
- 先打开所在路径。读取目录里面的数据内容,得到文件名和inode的映射关系,文件名→inode→inode 进行文件内的查找
- 找到一个目录也要找到一个目录名的inode的,如何找到呢?→开机的时候固定打开“/”目录。→找到任何文件都必须要有路径。
-
- 访问文件的时候进程提供路径,进行路径解析。
- 自己提供的文件名+文件路径组成了文件。
- OS在进行路径解析的时候,会把我们历史访问的所有的目录(路径)形成一颗多叉树,进行保存。—>linux系统树状目录结构。—>目录结构是内存级(里面是临时数据)的。—>实验现象:在第一次查目录文件的时候会比较慢,第二次后面就会快很多。
-
文件加载过程:
磁盘→分区→格式化→我们依旧不能使用这个分区。我们的分区,一定要和特定的一个目录进行关联→通过进入这个目录,就相当于进入这个分区→挂载。要使用分区就需要挂载得到目录。
inode存储文件属性结构:
3. 软硬链接
软连接
软连接是一个独立的文件,因为他有独立的inode number
软连接能干啥:相当于是windows下的快捷方式
软连接内容保存的是文件的路径
设置软连接:
- 增加软连接:
//为文件建立软链接
ln -s ./soft.txt soft_link
//为目录建立软链接
ln -s ./FileSystem/ link_file
- 删除软连接
直接rm 删除对应的文件就可以了
硬链接
ln code.c code-hard
硬链接本质不是一个独立的文件,没有独立的inode。本质是一组新的文件名和目标inode number的映射关系。
硬链接数相当于是一个引用计数。
硬链接作用:
- 对文件进行备份
- 任何一个目录文件下都有一个” . ”文件,这个文件就是当前目录的硬链接。所以目录的硬链接数为2。
- 硬链接只能给普通文件进行建立,linux系统下,不支持给目录建立硬链接
- . 和 .. 本质是对目录进行硬链接
- 为什么不允许用户给目录进行硬链接:
-
- 容易形成路径环问题
- 因为软链接是一个独立的文件,所以不存在成环问题。