linux文件系统

linux文件系统最初为ext2,后面可能升级为了ext3或者ext4。我们window最常见的是NTFS,FAT32等。

1. 什么是文件系统

文件系统是管理文件的系统,讲了句废话。文件是存储在磁盘,磁盘是硬件。我们操作的是文件,最终会落到磁盘。我的理解为,文件系统是提供了一套文件管理规范,便于操作系统操作磁盘。

2. 磁盘简介

磁盘主要三部分硬件:

  • 圆形的磁碟盘(主要记录资料的部分)
  • 机械手臂,与在机械手臂上的磁碟读取头(可读写磁碟盘上的资料);
  • 主轴马达,可以转动磁碟盘,让机械手臂的读取头在磁碟盘上读写资料

linux中一切皆文件,磁盘的文件名如下定义:

  • /dev/sd[a-p][1-128]:为实体磁盘的磁盘档名
  • /dev/vd[a-d][1-128]:为虚拟磁盘的磁盘档名

3. 文件系统简介

linux文件系统主要由inode和block组成,inode记录文件的权限和属性,block记录数据。还有一个超级快superblock,具体描述如下:

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

4. block

  • 原则上,block 的大小(一般是4k)与数量在格式化完就不能够再改变了(除非重新格式化)
  • 每个 block 内最多只能够放置一个文件的数据(如果文件很小,那就浪费空间了,如果文件大于block大小,就好占用多个block)

5. inode

inode记录了文件的属性,主要包含:

  • 最近一次的读取时间(atime),最近修改的时间(mtime),文件建立或状态改变的时间(ctime)
  • 该文件的存取模式(read/write/excute)
  • 该文件的拥有者与群组(owner/group)
  • 文件容量
  • 该文件真正内容的指向 (pointer)

inode本身有一些固定限制:

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

6. superblock

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

7. dumpe2fs

查看superblock信息的shell命令,比如 dumpefs /dev/vda5

8. 与目录树关系

我们已经知道一个文件会占用一个inode和多个block。那么一个目录呢,一个目录会占用一个inode和至少一个block。inode记录这个目录的权限,block记录这个目录下面的内容,比如文件,就会包含文件名称和这个文件的inode号。如果是目录,也跟文件一样。
下面我们描述一下系统读取文件的过程,如图所示,我们要读取/etc/passwd文件内容:


image.png

用户身份为damon,是一个其他用户权限。过程如下:

  1. / 的 inode: 透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r 与 x) ;
  2. / 的 block: 经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521);
  3. etc/ 的 inode: 读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
  4. etc/ 的 block: 经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004);
  5. passwd 的 inode: 读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容;
  6. passwd 的 block: 最后将该 block 内容的数据读出来。
    这一段是毫(t)无(b)修(z)改(c)的拷贝。如果看不懂,我通俗的讲一下,是一层一层的读取,通过inode判断是否有权限,和判断下一层的inode号。直到到达最后一层所需要读取的文件。

9. 创建文件

  1. 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
  2. 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
  3. 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block 指向数据;
  4. 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。
    如果中间断点了,第四步没做怎么办,数据不一致了。linux也是采用比较通用的解决方案,记录日志的方式

10. 文件系统的运作

1.系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写;
2.承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
3.你可以手动使用 sync 来强迫内存中设定为 Dirty 的文件回写到磁盘中;
4.若正常关机时,关机指令会主动呼叫 sync 来将内存的数据回写入磁盘内;
5.但若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。

你可能感兴趣的