对于Linux文件系统的inode的理解

摘录于以下链接:

http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html

http://72333.blog.51cto.com/62333/12590

本文基于前人理解,如有不客观情况,请不吝赐教,共同进步!

首先说的是inode[索引节点,information node ],其次是要理解硬盘的文件存储才能对inode有全面的理解.

1.硬盘上最小的存储单位是扇区(sector),每个扇区存储512Bytes(=0.5KB)的数据. Linux文件系统读取硬盘的时候,不是逐个扇区读取数据,而是多个扇区同时读取,所以在Linux文件系统上有块的概念(block),是人为定义的概念,块是由多个扇区的组成的,是linux系统最小的文件存取单位.

2.文件数据的存储是在块里面,linux/unix里面检索文件数据通过inode(索引节点号)的,不是通过文件名,但是inode和文件名的关系是:在存储的时候,inode和文件名是放在同一张列表里面,作为一个链接。


PS:

No.1:当我们创建一个文件例如a.txt的时候,系统会分配一个inode(索引节点号)给予文件,(从创建文件到以后)文件的存取读写都是通过这个inode号来进行.这个inode节点号就是存储再文件夹里面的.

No.2:inode不单只包含了索引节点号,他还包含了文件数据的元数据(metadata),inode也是存储在块中。每个文件一旦创建即使没有数据都有相应inode.


N0.3:硬盘上的inode包含了文件的以下内容:

       * 文件的字节数。

  * 文件拥有者的User ID。
  * 文件的Group ID。
  * 文件的读、写、执行权限。
  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  * 链接数,即有多少文件名指向这个inode。
  * 文件数据在block的位置。

No.4:inode也可以理解为指针(pointer)。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
写一个完整的 Linux 文件系统需要涉及很多方面的知识,包括文件系统的原理、磁盘管理、文件存储、目录结构等等。这里只提供一个简单的文件系统实现的示例,用于展示文件系统的基本结构和实现方式。 首先,我们需要定义文件系统的基本结构。一个文件系统通常由以下部分组成: 1. 引导块:文件系统的第一个块,包含文件系统的基本信息和启动程序。 2. 超级块:文件系统的第二个块,包含文件系统的详细信息,如块大小、总块数、inode 数量等。 3. inode 区域:存储所有文件和目录的 inode,每个 inode 包含文件或目录的详细信息,如文件大小、创建时间、修改时间等。 4. 数据块区域:存储所有文件和目录的实际数据,这里使用简单的连续磁盘分配方式。 5. 目录区域:存储所有目录的详细信息,如目录名、目录下文件的 inode 等。 接下来,我们可以根据上述结构开始实现文件系统。以下是一个基本的实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define BLOCK_SIZE 512 #define INODE_SIZE 128 #define DIR_SIZE 32 struct super_block { int block_size; int total_blocks; int inode_count; int free_blocks; int free_inodes; int root_inode; }; struct inode { int id; int size; int block_count; int block_pointers[10]; }; struct directory { char name[28]; int inode_id; }; int main() { FILE *fp; int i, j; char *buffer = (char*)malloc(BLOCK_SIZE); struct super_block sb; struct inode inodes[256]; struct directory root_dir[64]; // 初始化超级块 sb.block_size = BLOCK_SIZE; sb.total_blocks = 1024; sb.inode_count = 256; sb.free_blocks = 1020; sb.free_inodes = 256; sb.root_inode = 0; // 初始化 inode 区域 for (i = 0; i < sb.inode_count; i++) { inodes[i].id = i; inodes[i].size = 0; inodes[i].block_count = 0; for (j = 0; j < 10; j++) { inodes[i].block_pointers[j] = -1; } } // 初始化根目录 strcpy(root_dir[0].name, "."); root_dir[0].inode_id = 0; strcpy(root_dir[1].name, ".."); root_dir[1].inode_id = 0; // 创建文件系统并写入数据 fp = fopen("myfs", "wb"); fwrite(&sb, sizeof(struct super_block), 1, fp); fwrite(inodes, sizeof(struct inode), sb.inode_count, fp); fwrite(root_dir, sizeof(struct directory), 2, fp); // 初始化数据块区域 memset(buffer, 0, BLOCK_SIZE); for (i = 0; i < sb.total_blocks - 2; i++) { fwrite(buffer, BLOCK_SIZE, 1, fp); } fclose(fp); free(buffer); return 0; } ``` 以上代码创建了一个简单的文件系统,并且写入了超级块、inode 区域和根目录。这个文件系统只支持固定大小的文件,每个文件最多占用 10 个数据块。实际文件系统的实现要比这个复杂得多,但这个示例可以帮助理解文件系统的基本结构和实现方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值