zoukankan      html  css  js  c++  java
  • Linux 文件系统

    文章引用自:鸟哥的 Linux 私房菜,经过部分修改


    Linux 文件系统中涉及的几个基本概念

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

    inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码

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


    inode 和 block 都有编号,找到一个文件的 inode 便可以找到存放文件的 block

    inode/block 資料存取示意圖

    这种文件系统统称为索引式文件系统

    不同于索引式,FAT 文件系统使用的是类似于链表的存储系统

    FAT檔案系統資料存取示意圖

    这种文件系统无法直接得到文件大小,并且在一个文件的 block 比较分散的时候,文件读取的性能便会降低,所以才有了“磁盘碎片整理”这一说法。

    注意:实际上,如果 Linux 的文件较大,而存储文件内容的 block 比较分散,也是会产生读取性能降低的问题。这时可以将文件系统的中的文件备份,格式化文件系统,然后将文件恢复回去即可解决。


    Ext2 文件系统

    文件系统在一开始便已经规划好所有的 inode 和 block,除非重新格式化或改变文件系统大小

    Ext2 文件系统在格式化式会分为多个 block group,每个 block group 都有自己的 superblock/inode/block。如下图

    ext2檔案系統示意圖


    data block

    用来存放文件内容,Ext2 支持的 block 大小有 1K、2K、4K 三种。

     Block 大小  1KB  2KB  4KB
     最大单个文件  16GB  256GB  2TB
     文件系统最大容量  2TB  8TB  16TB

    原则上 data blcok 的数量和大小只在格式化的时候确定

    每个 data block 只能存放一个文件的内容,也可以说一个文件使用的存储空间是以 data block 为单位的


    inode table

    inode 记录了存取模式(r/w/x)、owner、group、文件大小、ctime、atime、mtime、setuid、setgid、文件内容的指针。

    每个 inode 大小均为 128 byte

    每个文件只占用一个 inode,因此文件系统所能建立的总档案数目与 inode 数目有关,而 inode 的数目和大小在格式化时指定

    由于 inode 大小有限,且文件所在的 block 的数目可能很庞大,为了使用有限的空间记录庞大的 block 号码信息,所以文件系统将 inode 记录 block 号码的区域划分为 12 个直接记录区、1 个间接记录区、1 个双间接记录区、1 个三间接记录区。(每个 data block 号码需要 4 byte 空间)

    inode 結構示意圖

    这里的间接记录区就是将一个 data block 作为记录 block 号码的记录区。

    这样,在 block 大小为 1K 的文件系统中,一个 inode 可以记录的最大 data block 号码数量为:12 + 1K / 4 + 1K / 4 * 1K / 4 + 1K / 4 * 1K / 4 * 1K / 4 = 16 M,所以一个 inode 在 block 大小为 1K 的情况下可以记录的最大文件大小为 16G。

    (由于 Ext2 文件系统对于大于 2K 的 block 有限制,所以以上算法并不适用于 2K 和 4K 大小的 block)


    super block

    记录整个文件系统的信息:block 与 inode 的大小与总量、文件系统的挂载时间等相关信息

    由于文件系统中应该只有一个 super block,实际上除了第一个 block group 必须包含 super block,而其他的 block group 中的 super block 仅仅是第一个的备份


    文件系统描述(FileSystem Description)

    记录每个 block group 起始与结束的 block 号码,以及说明每个区段(superblock、block bitmap、inode bitmap、data block)分别介于哪个 block 号码之间。

    可使用 dumpe2fs 来查看此部分信息。


    区块对照表(block bitmap)

    记录每个 block 是否为空。

    在创建文件时查找空 block,并更新为非空;在删除文件时将不用的 block 更新为空。


    inode 对照表(inode bitmap)

    类似于 block bitmap,记录每个 inode 是否在使用。


    如果需要查询文件系统的信息,可以使用 dumpe2fs 命令


    目录在文件系统中的存储

    目录在的存储与文件相同。

    当创建一个目录时,文件系统为其分配一个 inode 和至少一个 data block(所以在 block 大小为 4K 的文件系统中,大多数的目录大小为 4096),inode 中记录目录的权限、属性、data block 号码等信息,而 data block 中记录的是目录下所有文件/目录的名称以及相应的 inode 号码。

    可以使用 ls -i 查看一个目录下的文件的 inode 号码


    创建文件的步骤

    1. 确定用户对文件所在目录具有 w 和 x 权限
    2. 在 inode bitmap 中找到没有使用的 inode,写入文件相关信息
    3. 在 block bitmap 中找到没有使用的 block 并写入文件内容,更新 inode 中的 block 号码信息
    4. 更新 inode bitmap、block bitmap,然后更新 superblock 内容

    日志式文件系统(Journaling Filesystem)

    Ext2 文件系统对于文件创建的操作是先写入 inode 再写入 block,所以如果在写入 inode 之后,创建操作中断,则会出现资料不一致状态

    系统在开机时会根据 super block 中的信息判断是否出现了资料不一致状态,可以使用 e2fsck 命令进行资料不一致状态的检查。这种检查非常费时。

    为了避免出现资料不一致状态,引入了日志式文件系统


    日志式文件系统引入一个日志区块,该区块记录文件创建或修改操作。

    日志式文件系统创建一个文件的步骤为:

    1. 准备:首先在日志记录区块中记录准备进行的文件操作的信息
    2. 实际操作:写入文件权限等信息,写入文件内容
    3. 结束:在日志记录区块中标记操作已完成

    这时,如果在文件操作过程中出现了问题,可以直接查询日志得到具体的错误,然后进行修复。

    Ext3 文件系统便是日志文件系统,它为 Ext2 的升级版。


  • 相关阅读:
    logging模块
    configparser模块
    hashlib模块
    shutil模块
    json与pickle模块
    random模块
    OS模块
    如何不使用共享内存实现windows与虚拟机中进行文件的传输
    结构体的定义方式(仅定义)
    数据结构练习之寻找顺序表中的主要元素
  • 原文地址:https://www.cnblogs.com/pangblog/p/3359852.html
Copyright © 2011-2022 走看看