minix文件系统

1.minix总体介绍

        Linux最初使用是minix文件系统,后期的ex2文件系统,都是由minix文件系统升级而来,在minux中把对文件的管理抽象出了4个元对象,文件,超级块,目录项(并不只指目录也指文件项目),i节点。现如今的linux文件系统仍然使用这4个元对象管理文件系统,只不过其中的内容更加复杂。现在linux为了管理各种文件系统,把相应的操作函数都使用了函数指针分离,降低耦合性,抽象出各种文件系统公有的部分,其他部分进行了分离,因此学习minix文件系统有助于学习vfs虚拟文件系统。

2.minix存储结构说明

        minix系统储存结构如图所示,MINIX逻辑扇区跟磁盘扇区固定位1KB,其中各项目总体概要如下:

  1. 引导块:固定1KB大小,如果不是引导设备则这里面数据一般为空,当然也可以添加自己想要的数据。
  2. 超级块:整个磁盘的minix文件系统元信息或者说是统计信息,固定占用一块(1KB),统计有 i节点位图,逻辑块位图,i节点扇区大小,数据区个数等。
  3. i节点位图:i节点位图,是1BIT位,表示占用1个i节点,默认 BIT位0 置位1不使用,因为在没有i节点可用的情况下,会返回0,所以0位保留不使用,BIT1表示第一个i节点是否使用,因此如果只用1个块表示i节点位图,最大能表示 (8 * 1024 - 1 = 8191 个i节点),一般第一个 i节点表示根i节点(根目录),每个目录和文件都至少存在一个i节点。
  4. 逻辑块位图:逻辑块位图的每一位(除第0位,0位默认置1,因为没有数据块的时候返回0,所以保留0位)都表示数据区的数据块, BIT1表示第一个数据块。 
  5. i节点:主要存放,本i节点表示的数据类型,本i节点占用的数据扇区索引,本i节点文件的访问权限,本i节点数据大小,当该i节点为文件夹类型的时候,i节点索引的数据区存放的是目录项。当i节点是文件类型的时候,该i节点索引的数据区存放的是文件数据。
  6. 数据区:存放目录项或者文件数据。

各个块和目录项的数据结构:

  1. 超级块数据结构
    1. c语言代码示例
      /*
       * minix super-block data on disk
       */
      struct minix_super_block {
      	__u16 s_ninodes;
      	__u16 s_nzones;
      	__u16 s_imap_blocks;
      	__u16 s_zmap_blocks;
      	__u16 s_firstdatazone;
      	__u16 s_log_zone_size;
      	__u32 s_max_size;
      	__u16 s_magic;
      	__u16 s_state;
      	__u32 s_zones;
      };
    2. 详细解释
    3. 详细说明
      •  s_ninodes 表示设备上的 i 节点总数。
      • s_nzones 表示设备上以逻辑块为单位的总逻辑块数。
      • s_imap_blocks 和 s_zmap_blocks 分别表示 i 节点位图和逻辑块位图所占用的磁盘块数。s_firstdatazone 表示设备上数据区开始处占用的第一个逻辑块块号。
      • s_log_zone_size 是使用 2 为底的对数表示的每个逻辑块包含的磁盘块数。对于 MINIX 1.0 文件系统该值为 0,因此其逻辑块的大小就等于磁盘块大小,都是 1KB
      • s_max_size 是以字节表示的最大文件长度,这里不超过 4GB当然这个长度值将受到磁盘容量的限制。
      • s_magic 是文件系统魔幻数,用以指明文件系统的类型。对于 MINIX 1.0 文件系统,它的魔幻数是 0x137f。文件名长度为14是幻数为0x137F,文件名长度为30时幻术为0x138F。
        #define MINIX_SUPER_MAGIC	0x137F		/* minix v1 fs, 14 char names */
        #define MINIX_SUPER_MAGIC2	0x138F		/* minix v1 fs, 30 char names */
    4. 仅在内存中使用的字段可以忽略,最新的linux系统使用minix已经不像这样存储了。
  2. i节点数据结构
    1. c语言代码结构
      /*
       * This is the original minix inode layout on disk.
       * Note the 8-bit gid and atime and ctime.
       */
      struct minix_inode {
      	__u16 i_mode;
      	__u16 i_uid;
      	__u32 i_size;
      	__u32 i_time;
      	__u8  i_gid;
      	__u8  i_nlinks;
      	__u16 i_zone[9];
      };
    2. 各部分含义
    3. 详细说明
           i_mode 字段用来保存文件的类型和访问权限属性。其比特位 15-12 用于保存文件类型,位 11-9 保存 执行文件时设置的信息,位 8-0 表示文件的访问权限,见图 12-5 所示。

              文件中的数据存放在磁盘块的数据区中,而一个文件名则通过对应的 i 节点与这些数据磁盘块相联 系,这些盘块的号码就存放在 i 节点的逻辑块数组 i_zone[] 中。其中, i_zone[] 数组用于存放 i 节点对应文 件的盘块号。 i_zone[0] i_zone[6] 用于存放文件开始的 7 个磁盘块号,称为直接块。若文件长度小于等 于 7K 字节,则根据其 i 节点可以很快就找到它所使用的盘块。若文件大一些时,就需要用到一次间接块 了( i_zone[7] ),这个盘块中存放着附加的盘块号。对于 MINIX 文件系统一个盘块中可以存放( 1024 / 2) = 512 个盘块号,因此可以寻址 512 个盘块。若文件还要大,则需要使用二次间接盘块( i_zone[8])。二 次间接块的一级盘块的作用类似与一次间接盘块,因此使用二次间接盘块可以寻址 512*512 个盘块。参 见图 12-6 所示。所以对于 MINIX 文件系统 1.0 版来说,一个文件的最大长度为(7 + 512 + 512*512)= 262,663KB,刚好对应超级块里面的 最大文件长度 10 08 1C 00

              另外,对于/dev/目录下的设备文件来说,它们并不占用磁盘数据区中的数据盘块,即它们文件的长 度是 0 。设备文件名的 i 节点仅用于保存其所定义设备的属性和设备号。设备号被存放在设备文件 i 节点 的 zone[0] 中。这主要是在早期使用minix文件系统的linux,现在linux的 i 节点已经有专门表示设备号的变量:
      dev_t			i_rdev;
              当所有 i 节点都被使用时,查找空闲 i 节点的函数会返回值 0 ,因此, i 节点位图最低比特位和 i 节点 0 都闲置不用 i 节点 0 的结构被初始化成全零,并在创建文件系统时将 i 节点 0 的比特位置位。

              这里需要注意 i 节点的 i_mode 变量, 类型信息保存在对应 i 节点的 i_mode 字段中,并使用其高 4 比特位来表示。文件权限信息也保存在对应 i 节点的 i_mode 字段中,使用该字段的低 9 比特位表示三组(用户 用户组 其他)权限。

    4. 仅在内存中使用的字段可以忽略,在新的linux系统中已做修改
  3. 目录项数据结构
    1. 目录项c语言结构
      // 文件目录项结构。
      struct dir_entry {
       unsigned short inode; // i 节点号。
       char name[NAME_LEN]; // 文件名。NAME_LEN为30字节,因为幻数为0x138F
      };
    2. 说明:
      1. 在i结点类型为目录时,该i节点指定的数据区存放的数据为目录项。目录项可以是目录也可以是文件名字,具体由它指定的i节点类型指定。

         一个逻辑块可以放 1024/32 = 32 个目录项。有关文件的其它信息则被保存在该 i 节点号指定的 i 节点结构中,该结构中主要包括文件访问属性、宿主、长度、访问保存时间以及所在磁盘块等信息。每个 i 节点号的 i 节点都位于磁盘上的固定位置处。

        

3.minix实例分析

    在ubuntu上可以利用 mkfs.minix工具生成minix文件系统镜像:
dd if=/dev/zero of=minix.img bs=1KB count=32
mkfs.minix -1 minix.img
然后挂在镜像到test目录(test是自己创建的目录,挂载命令(sudo mount minix.img ./test)),在里面创建个文件 12345.txt 写入 “0123456789”  ,创建文件夹 ceshi,并在文件夹 ceshi 里面创建文件 abcde.txt写入 “hello word!”
        然后取消挂载(命令:sudo umount test),把镜像文件拷贝到windows系统,用winhex软件打开minix.img,按照上面的规定的数据分布可以观察磁盘上的超级块信息。

3.1. 超级块数据分析

在超级块中 i 节点总数:00 20        32 个i节点。

在超级块中第一个数据块:00 05  第5块开始时数据块。

在超级块中最大文件:10081C00

在超级块中总逻辑块数:00 1F        31个逻辑块。

                                                31=(31728+16)/1024

在超级块中i 节点位图所占块数 :00 01        1块。

3.2. i节点位图分析

1F-FE ,0号i节点保留,所以一共 32 个节点,已经使用了4个i节点。
       

 i节点位图 

        i 节点用于存放盘设备上每个文件和目录名的索引信息。 i 节点位图用于说明 i 节点是否被使用,同样是每个比特位代表一个 i 节点。对于 1K 大小的盘块来讲,一个盘块就可表示 8192 i 节点的使用状 况。与逻辑块位图的情况类似,由于当所有 i 节点都被使用时查找空闲 i 节点的函数会返回 0 值,因此 i 节点位图第 1 个字节的最低比特位(位 0 )和对应的 i 节点 0 都闲置不用,并且在创建文件系统时会预 先将 i 节点 0 对应比特位图中的比特位置为 1 。因此第一个 i 节点位图块中只能表示 8191 i 节点的状 况。

在超级块中逻辑块位图所占块数:00 01        1块。

3.3. 数据块位图

数据块位图
1F-F8,从数据块算一共 26 块数据区(位0保留),已经使用了4块。
       逻辑块位图用于描述盘上每个数据盘块的使用情况。 除第 1 个比特位(位 0)以外,逻辑块位图中每个比特位依次代表盘上数据区中的一个逻辑块 。因此逻辑块位图的比特位 1 代表盘上数据区中第一个数据盘块,而非盘上的第一个磁盘块(引导块)。当一个数据盘块被占用时,则逻辑块位图中相应比特位 被置位。由于当所有磁盘数据盘块都被占用时查找空闲盘块的函数会返回 0 值,因此逻辑块位图最低比 特位(位 0 )闲置不用,并且在创建文件系统时会预先将其设置为 1
数据区开始处占用的第一个逻辑块块号: 00 05 第5块开始的数据(从0开始数)。

 使用 2 为底的对数表示的每个逻辑块包含的磁盘块数:对于 MINIX 1.0 文件系统该值为 0,因此其逻辑块的大小就等于磁盘块大小,都是 1KB

最大文件长度:0x10081C00。
文件系统魔幻数:0x138F。

s_state:0x00。

s_zones:0x0000。

3.4. i节点区

 节点

        每个i节点占用32个字节

3.5. 数据区分析

        如果i节点是文件,则i节点指定的数据区位存放的是数据,如果i节点是目录则i接地那指定的数据区存放的是目录项。

根节点数据:目录项

数据

        从目录项可以查出 12345.txt  是2号节点,从2号节点可以查出数据区为6也就是 6*1024=6144地址处,在该地址处可以查出实际数据 0123456789.

4.文件查找过程

        在打开一个文件时,文件系统会根据给定的文件名找到其 i 节点号,从而通过其对应 i 节点信息找 到文件所在的磁盘块位置,见图 12-8 所示。例如对于要查找文件名 /usr/bin/vi i 节点号,文件系统首先 会从具有固定 i 节点号( 1 )的根目录开始操作,即从 i 节点号 1 的数据块中查找到名称为 usr 的目录项, 从而得到文件 /usr i 节点号。根据该 i 节点号文件系统可以顺利地取得目录 /usr,并在其中可以查找到 文件名 bin 的目录项。这样也就知道了 /usr/bin i 节点号,因而我们可以知道目录 /usr/bin 的目录所在位 置,并在该目录中查找到 vi 文件的目录项。最终我们可获得文件路径名 /usr/bin/vi i 节点号,从而可以 从磁盘上得到该 i 节点号的 i 节点结构信息。
        如果从一个文件在磁盘上的分布来看,对于某个文件数据块信息的寻找过程可用图 12-9 表示(其中 未画出引导块、超级块、 i 节点和逻辑块位图)。
        
        通过用户程序指定的文件名,我们可以找到对应目录项。根据目录项中的 i 节点号就可以找到 i 节 点表中相应的 i 节点结构。 i 节点结构中包含着该文件数据的块号信息,因此最终可以得到文件名对应的 数据信息。上图中有两个目录项指向了同一个 i 节点,因此根据这两个文件名都可以得到磁盘上相同的 数据。每个 i 节点结构中都有一个链接计数字段 i_nlinks 记录着指向该 i 节点的目录项数,即文件的硬链 接计数值。本例中该字段值为 2 。在执行删除文件操作时,只有当 i 节点链接计数值等于 0 时内核才会 真正删除磁盘上该文件的数据。另外,由于目录项中 i 节点号仅能用于当前文件系统中,因此不能使用 一个文件系统的目录项来指向另一个文件系统中的 i 节点,即硬链接不能跨越文件系统。 与硬链接不同,符号链接类型的文件名目录项并不直接指向对应的 i 节点。符号链接目录项会在对 应文件的数据块中存放某一文件的路径名字符串。当访问符号链接目录项时,内核就会读取该文件中的 内容,然后根据其中的路径名字符串来访问指定的文件。因此符号链接可以不局限在一个文件系统中, 我们可以在一个文件系统中建立一个指向另一个文件系统中文件名的符号链接。

         在每个目录中还包含两个特殊的文件目录项,它们的名称分别固定是 '.' '..'。'.'目录项中给出了当前目录的 i 节点号,而'..'目录项中给出了当前目录父目录的 i 节点号。因此在给出一个相对路径名时文 件系统就可以利用这两个特殊目录项进行查找操作。例如要查找../kernel/Makefile,就可以首先根据当前 目录的'..'目录项得到父目录的 i 节点号,然后按照上面描述过程进行查找操作。

         对于每个目录文件的目录项,其 i 节点中的链接计数字段值也表明连接到该目录的目录项数。因此 每个目录文件的链接计数值起码为 2。其中一个是包含目录文件的目录项链接,另一个是目录中'..'目录 项的链接。例如我们在当前目录中建立一个名为 mydir 的子目录,那么在当前目录和该子目录中的链接 示意图见图 12-10 所示。

        图中示出了我们在 i 节点号为 56 的目录中建立了一个 mydir 子目录,该子目录的 i 节点号是 123。 在 mydir 子目录中的'.'目录项指向自己的 i 节点 123,而其'..'目录项则指向其父目录的 i 节点 56。可见, 由于一个目录的目录项本身总是会有两个链接,若其中再包含子目录,那么父目录的 i 节点链接数就等 于 2+子目录数,因为子目录的 ‘..’目录指向父目录。

        文件查找时,首先根据路径查找目录项,从1号节点根节点开始查找,直到找到数据的索引节点,根据索引节点直接查出实际的数据位置,到该位置读取数据。

5.总结

总结:文件节点数据区存放指向文件数据的指针,目录项节点数据区存放目录的目录项和文件的目录项。目录的目录项和文件的目录项都为32字节(当minix版本为0x138F时,1块数据区可以存   1024 /32 = 32 个目录项)。

        在linux最初的时候就是使用的minix文件系统,学习minix文件系统有助于理解,linux VFS虚拟文件系统,超级块,目录项,文件,i节点。

minix镜像文件:【免费】minix文件系统镜像文件资源-CSDN文库

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值