磁盘的组成部分:
磁盘知识要点:
inode中记录了block的索引,只需要读取inode中block索引,就可以读取对应的block,这种数据访问方法称为索引式文件系统,文件系统一开始就将inode和block的数目规划好了,除非重新格式化,否则inode和block固定后不在变动
文件系统结构:
为什么要分组呢?我觉得是因为inode以及block数量过大不易于管理,因此进行分组,每个组都会分配一定的inode以及block,查找文件时只需要到对应的组中查找即可,而每个组的inode以及block数目又不会过多,其实就和索引表差不多,进行分类以减少查找数目
block group中各部分的含义:
Block 大小 | 1KB | 2KB | 4KB |
最大单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统总容量 | 2TB | 8TB | 16TB |
如果文件小于block的大小,则该block剩余空间将不在被使用,如果文件大于block的大小,将会占用多个block数量
inode有一些其他特点:
inode记录一个block需要花费4个字节,记录一个400MB的文件至少需要10万block,一个inode哪来这么多块呢?因此,我们 对inode的block进行了一些处理:12个直接,1个间接,1个双间接,1个三间接,结构如下:
相关命令:
#打印出设备对应的superblock以及blockgroup的相关信息
dumpe2fs [-bh] 设备文件名
参数:
-b:列出保留为坏道的部分
-h:仅列出superblock的数据,不会列出其他区段内容
可以使用df查看挂载信息
新建目录:
在ext2下新建目录,会分配一个inode以及至少一个block给该目录,inode记录该目录的相关权限与属性,inode会记录初始时分配的block号码,block会记录目录下的文件名与该文件所占用的inode号码
新建文件:
1、确定用户对于欲添加文件的目录是否具有w与x的权限,若有的话才能添加
2、根据inode bitmap找到没有使用的inode号码,并将新文件的权限属性写入
3、根据block bitmap找到没有使用的block号码,并将实际数据写入到block中,且更新inode的block指向
4、将刚才写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的内容
读取文件:
系统通过挂载的信息可以找到挂载点的inode号码,此时就能够得到根目录的inode内容,并根据该inode读取根目录的block内的文件名数据,再一层一层往下读到正确的文件名
EXT3是EXT2的升级版,向下兼容EXT3,EXT3中具有日志文件系统的功能,日志文件系统主要用于解决数据不一致问题(例如未将所有数据写入磁盘,忽然断电),日志文件系统解决数据不一致的方式如下(简要概括):
1、预备:当系统要写入一个文件时,首先在日志记录块中记录某个文件准备要写入的信息
2、实际写入:开始写入文件的权限与数据,开始更新meta data(例如superblock、block bitmap、inode bitmap)的数据
3、结束:写入完成后,在日志记录块中标记该文件,表示已经写入完毕,如果出现数据不一致现象,只需要检查日志文件块即可,不需要检查整个文件系统,并且数据可从日志记录块中恢复
当系统加载一个文件时,会把这个文件标记为clean,若文件被更改,则会标记为dirty,此时并不会直接写入磁盘,linux每隔一段时间将标记为dirty的数据写回磁盘,可以手动使用sync命令强制内存中设置为dirty的数据写回磁盘,正常关机情况下,会自动调用sync指令
挂载就是将目录与文件系统相结合(并不是所有的目录都是挂载点),目录是该文件系统的入口,访问该目录就可以访问文件系统,文件系统最顶层的目录inode号码一般为2
VFS(虚拟文件系统):用来管理所有的文件系统(例如读取文件系统)
#可以查看linux支持的文件系统
ls -l /lib/modules/$(uname -r)/kernel/fs
#查看目前已经加载到内存中的文件系统
cat /proc/filesystems
#列出文件系统的整体磁盘使用量,[]表示可选
df [-ahikHTm] [目录与文件名]
参数:
-a:列出所有文件系统
-k:以kb为单位显示文件系统
-m:以mb为单位显示文件系统
-T:连同该分区的文件系统名也列出
-i:不用硬盘容量,以inode的数量显示
如果在命令中加上目录或是文件名,则会查看该目录或文件所在的分区,
使用这个命令有可能会看到/dev/shm这个目录,这个目录是用内存虚拟出来的磁盘空间,数据都存在内存中,并且不会自动写回到磁盘中
#评估目录或是文件的磁盘使用量
du [-ahskm] [目录或是文件]
参数:
-a:列出所有文件与目录占用的容量
-s:列出某个目录下每个目录所占用的容量
-S:不包括子目录的统计
du会将所有文件的大小均列出
硬连接:在某个目录下新建一个文件名连接到某个inode,此时会增加inode的引用计数,当引用计数为0时,文件才会被删除,硬连接不会消耗inode与block数量,不能跨文件系统创建硬连接,不能建立目录的硬连接
软连接:相当于windows中的快捷方式,只是记录文件的路径,软连接会占用inode与block
#创建软硬连接
In [-sf] 源文件 目标文件
参数:
-s:不加任何参数相当于创建硬连接,-s表示软连接
-f:如果目标文件存在,先删除后创建
学习docker时就见过这个SWAP,当时以为是虚拟内存(汗),swap主要在物理内存不够时,将某些内存中的程序暂时移动到swap(硬盘)中