Linux学习——Linux磁盘与文件系统管理
2018年09月25日 20:41:05 菜到怀疑人生 阅读数:16
磁盘组成与分区复习
磁盘的组成部分:
- 圆形的盘片
- 机械手臂与手臂上的磁头
- 主轴马达,可以转动盘片,让机械手臂的磁头在盘片上读写数据
磁盘知识要点:
- 扇区为最小的物理存储单位,每个扇区的大小相同
- 将扇区组成一个圆,组成柱面,柱面是分区的最小单位
- 第一个扇区最重要,里面有磁盘主引导记录(MBR)以及分区表(分区表记录了各个分区的柱面范围)
- 分区分为主分区和扩展分区,扩展分区可以在分出逻辑分区,能被格式化的只有主分区与逻辑分区而已
- 磁盘分区后需要格式化,因为不同操作系统的文件系统不一样,格式化是在分区上建立文件系统,也就是告诉操作系统按照什么规则存取文件。
Linux文件系统的一些基本概念
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码
- block:用于记录文件的内容
- superblock:记录文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等
inode中记录了block的索引,只需要读取inode中block索引,就可以读取对应的block,这种数据访问方法称为索引式文件系统,文件系统一开始就将inode和block的数目规划好了,除非重新格式化,否则inode和block固定后不在变动
Linux的Ext2文件系统
文件系统结构:
为什么要分组呢?我觉得是因为inode以及block数量过大不易于管理,因此进行分组,每个组都会分配一定的inode以及block,查找文件时只需要到对应的组中查找即可,而每个组的inode以及block数目又不会过多,其实就和索引表差不多,进行分类以减少查找数目
block group中各部分的含义:
- data block(数据块):用来放置文件内容的地方,ext2文件系统支持的 block大小有1kb,2kb,4kb三种,每个block都有编号,block的大小会限制单一文件的最大值以及文件系统的总容量,对应关系如下表:
Block 大小 1KB 2KB 4KB 最大单一文件限制 16GB 256GB 2TB 最大文件系统总容量 2TB 8TB 16TB
如果文件小于block的大小,则该block剩余空间将不在被使用,如果文件大于block的大小,将会占用多个block数量
- inodetable(inode表格):主要记录文件的相关属性,包括:
- 文件的访问模式
- 文件的所有者和组
- 文件的大小
- ctime:文件创建或是状态改变的时间
- mtime
- 文件特性的标志,例如SetUID
- block指向
inode有一些其他特点:
- 每个inode大小固定为128字节
- 每个文件都会占用一个inode节点
- 系统读取文件时,首先找到inode,并分析inode记录的权限与用户是否相符合,相符合才读取block的内容
inode记录一个block需要花费4个字节,记录一个400MB的文件至少需要10万block,一个inode哪来这么多块呢?因此,我们 对inode的block进行了一些处理:12个直接,1个间接,1个双间接,1个三间接,结构如下:
- superblock(超级块):记录整个文件系统相关信息的地方,一般来说,superblock的大小为1024字节,除了第一个block group有superblock,其余block group不一定含有superblock,即使含有,也是第一个block group内的superblock的备份,主要记录的信息有:
- block以及inode1的数量
- 未使用与已使用的inode/block数量
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次校验磁盘的时间等文件系统的相关信息
- 一个validbit,若文件系统被挂载,载validbit为0,若没有被挂载,则validbit为1
- 文件系统描述说明:用于描述每个blockgroup的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,data block),应该只有含有superblock的block group有,
- block bitmap(块对应表):从块对应表可以知道哪些block是空的,当删除一个文件时,块对应表中对应的为会变为未使用
- inode bitmap(inode对照表):用于记录未使用的inode号码
相关命令:
-
#打印出设备对应的superblock以及blockgroup的相关信息
-
dumpe2fs [-bh] 设备文件名
-
参数:
-
-b:列出保留为坏道的部分
-
-h:仅列出superblock的数据,不会列出其他区段内容
-
可以使用df查看挂载信息
EXT2文件系统操作的细节
新建目录:
在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文件系统
EXT3是EXT2的升级版,向下兼容EXT3,EXT3中具有日志文件系统的功能,日志文件系统主要用于解决数据不一致问题(例如未将所有数据写入磁盘,忽然断电),日志文件系统解决数据不一致的方式如下(简要概括):
1、预备:当系统要写入一个文件时,首先在日志记录块中记录某个文件准备要写入的信息
2、实际写入:开始写入文件的权限与数据,开始更新meta data(例如superblock、block bitmap、inode bitmap)的数据
3、结束:写入完成后,在日志记录块中标记该文件,表示已经写入完毕,如果出现数据不一致现象,只需要检查日志文件块即可,不需要检查整个文件系统,并且数据可从日志记录块中恢复
Linux文件系统的操作
当系统加载一个文件时,会把这个文件标记为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:如果目标文件存在,先删除后创建
SWAP
学习docker时就见过这个SWAP,当时以为是虚拟内存(汗),swap主要在物理内存不够时,将某些内存中的程序暂时移动到swap(硬盘)中