Linux总结一:文件系统

                                                                                         文件系统特性

1.概述

windows98以前的微软操作系统的文件系统是FAT32

windows2000以后的微软操作系统的文件系统是NTFS

Linux的正统文件系统是Ext2(Linux second extended file system,ext2fs)

默认情况下,windows操心系统是不会认识Linux的Ext2的。

由于新技术的普及,一个分区槽可以格式化为多个文件系统(例如LVM),也能够将多个分区槽合成一个文件系统(LVM,RAID),所以,目前我们可以称呼一个可被挂载的数据为一个文件系统,而不是一个分区槽。

 

2.文件系统是如何运作的?

Linux操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)通常会被存放在不同的区块,

    • 权限与属性放置到inode中,
    • 实际数据则放置到data block区块中。
    • 超级区块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量,使用量,剩余量等。

每个inode与block都有编号,至于这三个数据的意义可以简略的说明如下:

  • superblock:记录此filesystem的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式与相关信息等。
  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码。
  • block:实际记录文件的内容,若文件太大时,会占用多个block。

因为每个inode和block都有编号,而每个文件都会占用一个inode,因此,找文件可以通过找到inode然后再读取实际数据,这是一个比较有效率的做法。---这种数据存取的方法,称为 索引式文件系统(indexed allocation)。

                                                      

 

 

其他的文件系统,如FAT格式。这种文件系统没有inode存在,所以没有办法将这个文件的所有block在一开始就读取出来,每个block号码都记录在前一个block中,它的读取方式如下图:

                                                         

 

假设文件的数据依序写入1->7->4->15号的这四个block号码中,但是文件系统没有办法一口气就知道四个block号码,它需要一个个将block读出后,才知道下一个block在哪里。如果一个文件的数据写入的block过于分散,则磁盘读取头会多转好几个圈才能读取到这个文件的内容,这就有了所谓的【碎片整理】。

碎片整理的原因是文件写入的block太过于离散了,导致读取文件的效率很差。通过碎片整理可以把一个文件的block汇整在一起。

因此FAT的文件系统需要经常碎片整理一下。

Ext2是索引式文件系统,基本上不太需要常常进行碎片整理。

 

3.Linux的EXT2文件系统(inode)

Linux的filesystem里包含有inode/block/superblock等。

inode:记录文件的权限与相关属性;

block:记录文件的实际内容;

superblock:记录整个filesystem相关信息的地方,没有superblcok就没有filesystem;

 

文件系统一开始就将inode和block规划好了,除非重新格式化(或者利用resize2fs等指令变更文件系统大小),否则inode和block固定后就不再变动。

但是如果文件系统高达数百GB时,那么将所有的inode和block放一起是很不明智的,因为数量太庞大,不容易管理。

为此,EXT2文件系统在格式化的时候基本上是区分为多个区块群组(block group)的,每个区块群组都有独立的inode/block/superblock系统。

在整体规划中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区内可以安装开机管理程序。

                                                     

 

 

 data block(资料区块)

用于放置文件内容数据的地方。在EXT2文件系统中支持的block大小有1K,2K,及4K三种。格式化的时候block的大小就已经固定了,且每个block都有编号,以方便inode的记录。block大小决定该文件系统能够支持的最大磁盘容量与最大单一文件容量。

 

                               

Ext2文件系统的block有其他什么限制?如下:

  1. 原则上,block的大小和数量在格式化之后就不能再改变了;
  2. 每个block内最多只能够放置一个文件的数据;
  3. 如果文件大小大于block的大小,则一个文件会占用多个block数量;
  4. 若文件小于block大小,则该block的剩余空间将不能被其他文件使用;

 

inode table(inode 表格)

inode记录的文件数据包含以下:

  1. 该文件的存取模式(read/write/excute);
  2. 该文件的拥有者与群组(owner/group);
  3. 该文件的容量;
  4. 该文件建立或状态改变的时间(ctime);
  5. 最近一次读取时间(atime);
  6. 最近修改的时间(mtime);
  7. 定义文件特性的旗标(flag),比如:SetUID。。。;
  8. 该文件的真正内容的指向(pointer);

除此之外,inode还有其他的特色:

  1. 每个inode的大小均固定为128bytes(新的ext4与xfs可设定到256bytes);
  2. 每个文件都仅会占用一个inode;
  3. 文件系统能够建立的文件数量与inode的数量有关;
  4. 系统读取文件时需要先找到inode,分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。

 

                                               

12个直接指向:12 *1K =12K

间接:256*1K=256K

双间接:256*256*1K = 256^2K

三间接:256*256*256*1K = 256^3K

总额等于:16GB

所谓间接,就是再拿一个block来当作记录block号码的记录区,如果文件太大时,就会使用间接的block来记录编号。

为什么是256?

因为每笔block号码的记录会花去4bytes(1byte=8bit=8*1bit),因此1K的大小能记录256笔记录,因此一个间接(block)可以记录的文件大小=256*1K=256K。

间接:拿出一个block来记录;

双间接:第一层block指定256个第二层;每个第二层可以指定256个号码,因此总额是256*256*1K;

三间接:第一层block指定256个第二层;每个第二层指定256个第三层;每个第三层指定256个号码,因此总额是256*256*256*1K;

总额:将直接+间接+双间接+三间接 =12+256+256*256+256*256*256(k)=16GB

即:文件系统将block格式化为1k大小时,能够容纳的最大文件为16GB。

 

Superblock(超级区块)

记录整个filesystem相关信息的地方,没有superblcok就没有filesystem,记录的信息有:

  1. block与inode的总量;
  2. 未使用与已使用的inode/block数量;
  3. block与inode的大小(block为1,2,4K,inode为128bytes或256bytes);
  4. filesystem的挂载时间,最近一次写入数据的时间,最近一次检验磁盘(fsck)的时间等文件系统相关信息;
  5. 一个valid bit数值,若此文件系统已被挂载,则valid bit为0,若未被挂载,则valid bit为1.

一般来说,superblock的大小为1024bytes

 

Filesystem Description(文件系统描述说明)

这个区段可以描述每个block group的开始于结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,datablock)分别介于哪一个block号码之间。

 

block bitmap(区块对照表)

block bitmap记录哪些block是空的,哪些是满的。

 

inode bitmap(inode 对照表)

inode bitmap记录已使用与未使用的block号码。

 

在文件系统中,目录与文件是如何记录数据的?

在linux下的文件系统建立一个目录时,文件系统会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。

 

举例1:linux文件系统读取/etc/passwd的流程

1.读取根目录/的inode,检查inode规范的权限,确认有读取该block的权限rx;

2.从/的inode里读取 / 的block号码,找到该内容有etc/目录的inode号码;

3.读取etc/的inode号码,确认是否有etc/的读取权限r x;

4.读取etc/的block号码,再读取passwd文件的inode号码;

5.检查是否有passwd的读取权限r,再读取passwd的block号码;

6.从passwd的block号码块中把block内容的数据读出来。

 

举例2:新建一个文件或目录时,文件系统是如何处理的?

1.新增一个文件,首先确认新增文件的目录是否有w和x的权限;

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

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

4.将刚刚写入的inode与block数据同步更新inode bitmap与block bitmap,并更新superblock的内容。

 

上述例子牵扯出一个数据的不一致状态问题,例如:

在系统执行完第三步的时候,由于不知名的原因,导致系统中断,直接导致最后一个同步动作没有做完,这时候,就会发生metadata的内容与实际数据存放区产生不一致的情况了。

解决数据不一致状态的方法:

日志式文件系统

具体方法:

1.预备:当系统要写入一个文件时,会先在日志记录区块中记录某个文件准备要写入的信息;

2.实际写入:开始写入文件的权限与数据,开始更新metadata的数据;

3.结束:完成数据域metadata的更新后,在日志记录区块中完成该文件的记录;

这样的程序中,万一数据的记录过程中发生了问题,系统只需检查日志记录区块,就可以知道哪个文件发生了问题,针对该问题进行一致性检查即可,而不必针对整个filesystem去检查。

 

Linux文件系统的运作

所有的数据都要加载到内存之后,CPU才能对数据进行处理。在编辑的过程中,频繁的让系统写入磁盘会导致效率极低。因此,linux采用的是一个异步处理的方式,步骤如下:

当系统加载一个文件到内存之后,如果该文件没有被改动过,则在内存区段的文件数据被设定为干净的(clean)。

如果内存中的数据被改动过了,则标记为脏(Dirty)。此时所有动作还在内存中执行,并没有写入到磁盘中。

系统会不定时的将内存中设定为Dirty的数据写回磁盘,以保持磁盘与内存的一致性。

 

挂载点的意义

每个filesystem都有独立的inode/block/superblock等信息,这个文件系统需要链接到目录树,才能被用户使用。将文件系统和目录树结合的动作,称为【挂载】。

重点:挂载点一定是目录,该目录为进入该文件系统的入口。

命令: ls -lid / /boot

查看系统支持的文件系统:

cat /proc/filesystems

 

Linux核心是如何管理系统支持的这些文件系统的?

Linux系统通过一个名为Virtual Filesystem Switch的核心功能去读取filesystem的。即,整个Linux认识的filesystem都是VFS在进行管理。

假如 / 使用的是/dev/hda1,用的是ext3文件系统;

/home使用的是/dev/hda2,用的是reiserfs文件系统;

当用户读取数据的时候不需要指定用什么文件系统来读取,而是系统根据VFS的功能自行读取文件系统内的数据。

 

                                          

 

XFS文件系统简介

从CentOS7 开始,预设的文件系统从EXT4转为XFS文件系统了。原因如下:

EXT家族支持度最广,但是格式化超慢!遇到超大容量或者虚拟化技术,EXT4没有xfs来的合适。

xfs是被开发出来用于高容量磁盘以及高性能文件系统之用,相当适合现在的系统环境。几乎所有EXT4文件系统有的功能,xfs都具备。

xfs文件系统在资料的分布上主要划分为三个部分,数据区(data section),文件系统活动登录区(log section)以及一个实时运作区(realtime section)。

数据区(data section)

相当于Ext家族的block group,包含了整个文件系统的superblock,剩余空间管理机制,inode的分配与追踪等。另外由于inode与block是系统用到时才动态配置的,所以格式化动作超级快。

此外,与ext家族不同的是,xfs的block与inode有多种不同的容量可供设定,block容量范围512bytes~64K,inode容量范围256bytes~2M。

 

文件系统活动登录区(log section)

用于记录文件系统的变化,有点像日志区。文件的变化在这里记录下来,直到变化完整地写入数据区,该笔记录才会被终结。如果因为意外情况中断,则系统会检查登录区,借以快速修复文件系统。

因为系统所有动作都会在这个区块做记录,因此这个区块的磁盘活动非常频繁。而xfs可以指定外部的磁盘来作为xfs系统的日志区块,例如SSD磁盘作为xfs的登录区。

 

实时运作区(realtime section)

当有文件需要被新建的时候,xfs会在这个区段找到一个到数个extent区块,将文件放置在这个区块内,等分配完成,再写入到data section的inode与block中去。这个extent区块的大小在格式化的时候就先指定,最小值是4K,最大可以到1G。

 

文件系统的简单操作

1.磁盘与目录的容量

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

du:苹果文件系统的磁盘使用量(常用在推估目录所占容量);

                                        

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值