linux(六)文件系统


Linux中所有数据都是以文件的形式呈现,所以整个linux系统最重要的地方就是这个目录树。

Linux系统使用的是目录树架构,但是我们的文件数据其实是放在磁盘分区槽当中的,文件系统与目录树的关系是通过挂载实现的。

目录树上不仅可以挂载本地文件系统,还可以挂载NFS。NFS可以使用购买的网络硬盘,也可以使用局域网上的其他机器上的目录。

1 挂载

所谓挂载就是利用一个目录当成进入点,将磁盘分区槽的数据放在该目录下,也就是说进入该目录就可以读取该分区槽的意思。

1.1 开机挂载

我们可以编辑这两个文件,实现开机挂载/etc/fstab /etc/mtab

1.2 loop挂载

普通挂载我们可以把块设备挂载到文件系统的目录中,loop挂载可以把归档文件挂载到文件系统的目录中。但是要注意的是,该归档文件必须是linux可以识别的文件系统,比如ios文件,它是CD上用的文件系统,linux是认识的,但是像jar,tar,zip这样的文件只是一种压缩格式,本身不是文件系统,即使通过loop mount挂载上去,直接访问它也读不出什么数据。

1.2.1 挂载iso文件

这个挂载没有成功,可能iso文件有误,后面再看原因

1.2.2 大文件loop挂载

当我们在安装系统进行分区时,我们只有一个根分区,后来我们想建立另外一个分区,但是已经没有多余的容量进行额外的分区了,这时我们可以制作一个大文件,然后将这个文件挂载,感觉上我们又多了一个分区槽。

使用dd命令创建大文件

 挂载

2 文件种类

1 文本文件

2 二进制文件

linux当中的可执行文件(sh除外),比如cat、date这些命令文件。

3 目录文件

4 链接

5 设备文件

与系统周边及存储等相关的文件,通常放在/dev目录下

3 文件系统的inode、block、superblock

标准的Linux文件系统Ext2,是一种索引式的文件系统,包含了superblock,inode和block。

superblock:记录文件系统的整体信息,包括inode/block总量、使用量、剩余量,以及文件系统格式与相关信息。

inode:记录文件的属性,一个文件占用一个inode

block:实际记录文件的内容,若文件太大,会占用多个block

 文件系统最前面的Boot Sector是启动扇区,这个启动扇区可以安装开机管理程序,这种方式可以使我们将不同的开机管理程序安装到不同文件系统最前面,而不用覆盖整个磁盘唯一的MBR。

3.1 datablock

datablock是用来放数据的地方,一般block大小设置为4K。格式化时,block大小就固定了,且每个block都有编号,以方便inode记录。

block的大小和编号在格式化后就不能再改变了

每个block最多只能放置1个文件的数据

如果文件数据大于block大小,则一个文件会占用多个block

3.2 inode

inode记录的内容包括:

文件拥有者和群组

文件大小

文件创建时间ctime

文件最近一次读取时间atime

文件最近一次修改时间mtime

文件权限,rwx,SUID,SGID,SBIT

指向datablock的指针

inode的特点:

每个inode大小为128byte

每个文件占用1个inode

3.3 superblock

superblock是记录整个filesystem相关信息的地方,包括

block与inode总量

未使用与已使用的block/inode

block与inode大小

filesystem挂载时间

superblock大小为1024byte

3.4 block bitmap和inode bitmap

block bitmap记录了所有block是否被使用的情况

inode bitmap记录了所有inode是否被使用的情况

3.5 文件存取过程

假设我们要新增一个文件,文件系统的操作步骤是:

1先确定用户对当前目录是否有w与x权限,有才能新增

2根据inode bitmap找到没有使用的inode号码,并将新文件的权限/属性写入这个inode

3根据block bitmap找到没有使用的block号码,并将实际的数据写入block中,且更新inode所在block指向保存数据的block

4将刚刚写入的inode与block数据同步到inode bitmap和block bitmap,并更新superblock

缺点:以上步骤如果中间突然出现断电的情况,将会出现数据不一致的情况。

3.6 日志式文件系统

为了解决ext2存在可能会发生的数据不一致性的情况,ext2的升级版ext3/4支持日志。

日志式文件系统会单独分出来一些磁盘容量记录日志,当系统要写入一个文件时,会先在日志记录区块中记录某个文件准备要写入的信息;写入数据;完成写入数据后在日志记录区块中完成该文件的记录。

3.7 文件系统是异步的

当系统加载一个文件到内存后,如果该文件没有被修改过,则设定内存区段的文件为clean。但是当内存中的文件被修改,则设定内存区段的文件为Dirty。系统会不定时的刷脏到硬盘(sync命令)。

4 文件系统容量

4.1 df

列出文件系统的整体磁盘使用量

-h人类易于阅读的格式显示

-T文件系统类型

-a所有,包括基于内存的文件系统,并不占用磁盘

-i以inode数量来显示

 单独目录文件系统使用情况

 4.2 du

du -h 列出目录大小

 du -ah 列出目录和文件的大小

du –sh 列出某一目录下的文件和目录的大小,包括子目录

 5 链接

5.1 硬链接

创建一个硬链接

 [root@localhost ~]# ln /etc/crontab . 

查看他们的inode编号

我们发现,他们的inode编号一样。因为一个文件对应一个inode,所以这两个是同一个文件。

如果/etc/crontab删除,读取/root/crontab不受影响

 在inode区块中,1是/root的inode编号,2是/etc的inode编号,在两者的block中存储了crontab的inode编号为663660,这个inode编号指向crontab文件的实际block。

5.2 软链接

创建软链接

 [root@localhost ~]# ln -s /etc/crontab crontab2 

查看他们的inode编号

软链接就是创建一个独立的文件crontab2,而这个文件访问实际上是访问的crontab

如果crontab删除,我们再读取crontab2时会报错。