【问题标题】:in ext2File system pulling super block& group descriptor is easy.ButWhat abt pulling specific inode as there can be mny inodes each may relate 2 file在 ext2File 系统中拉超级块和组描述符很容易。但是拉特定 inode 因为可能有 mny inode 每个可能涉及 2 个文件
【发布时间】:2022-01-17 13:02:46
【问题描述】:

因此,在文件系统中提取超级块(即,如果我的 sda 存储是 ext2 格式)很容易。我只需要跳过 1024 个字节就可以从 sda 存储中获取超级块

lseek(fd, 1024, SEEK_SET);
read(fd, &super_block, sizeof(super_block));

并且提取组描述符也非常容易(只有当我通过查看代码正确理解时)

lseek(fd, 1024 + [block_size_ext_1024_bytes]=1024, SEEK_SET);
read(fd, &block_group, sizeof(block_group));
or
lseek(fd, 1024 + 1024, SEEK_SET);
read(fd, &block_group, sizeof(block_group));

1024=基本偏移

但我并不感到舒服,因为我发现真正的挑战是提取 inode 只有我有文件名。我知道文件名存储在目录结构中,所以第一个挑战是从那里提取目录结构,在目录结构中我可以获得索引节点号。并且从 Inode 编号中我可以提取 inode 结构。但我不知道如何在 ext2 格式的图像中提取目录结构。谁能告诉我这个?谢谢

【问题讨论】:

  • 磁盘上没有特定的“目录”结构。目录是一个普通文件,其中的数据是一个 inode-filename 映射。它有据可查,并且可以通过放置例如ext2 inode directory 在您最喜欢的搜索引擎中。
  • @Someprogrammerdude 你提到了where the data is an inode-filename mapping 那么它是与文件名的inode 编号映射还是这个映射是什么我需要两个东西来映射?那么is it my choice to keep this mapping info anywhere 如果我将inode 编号映射到filaname?我可以在其中保存以从文件名中检索 inode 号。我可以将它保存在存储在其他计算机上的某个文本文件中吗?对吗?
  • 请阅读例如piazza.com/class_profile/get_resource/il71xfllx3l16f/…(我在 Google 中使用 ext2 inode directory 时的第一击)。
  • @Someprogrammerdude 它说小软盘上的空闲块可以在从 41 到 -1439 的块中找到,软盘显示在你发送的 pdf 中。所以软盘设备上第一个空闲块的偏移量是first_free_block=(Base offset+1024x41) 如果使用 ext2 文件系统,这个偏移量对于大型存储设备也可以相同吗?你能告诉我这个吗

标签: c filesystems ext2


【解决方案1】:

是的,拉超级块只是在 ext2 中跳过 Base_Offset=1024 字节然后像这样读取它

lseek(fd, BASE_OFFSET + block_size, SEEK_SET);
//BASE_OFFSET for EXT2 == 1024
read(fd, &super_block, sizeof(super_block));
block_size = 1024 << super_block.s_log_block_size;
printf("Block size is [%d]\n",super_block.s_log_block_size);

超级块的大小由 s_log_block_size 给出。该值将块的大小表示为 2 的幂,以 1024(特别是 ext2)字节为单位。因此,0 表示 1024 字节块,1 表示 2048 字节块,依此类推。要计算块的大小(以字节为单位):

unsigned int block_size = 1024 << super.s_log_block_size;   /* block 

如果需要硬编码 1024,super.s_log_block_size 始终为 0,并且 super.s_log_block_size 是 2 的倍数,因此如果 1024 块大小 super.s_log_block_size 应该为 0

然后我可以提取组描述符。因此,对于我的图像,只有一个组描述符。我不知道如果我有 1TB 的存储空间并且文件系统是 ext4,我会有多少描述符。可能有人会告诉我这个。

像这样通过进一步向前移动 1024 字节来提取组描述符

  lseek(fd, BASE_OFFSET + block_size, SEEK_SET);
  read(fd, &block_group, sizeof(block_group));

我认为这给出了找出在 ext2 中存储有多少组描述符的想法

unsigned int group_count = 1 + (super_block.s_blocks_count-1) / super_block.s_blocks_per_group;

例如在我的设备映像上它有 128 个块,所以第一个块总是引导信息,第二个块包含超级块,第三个块包含第一个组描述符——仍然想知道我的第二个组描述符的偏移量是多少如果我的存储空间有更多空间。请有人对此有所了解

继续,提取特定inode的公式是寻找特定inode的偏移量

lseek(fd, BLOCK_OFFSET(block_group->bg_inode_table)+(inode_no-1)*sizeof(struct ext2_inode), SEEK_SET);

bg_inode_table可以用来提取inode

组描述符通过 bg_block_bitmap、bg_inode_bitmap 和 bg_inode_table 字段告诉我们块/[inode bitmaps] 和 inode 表(稍后描述)的位置。

现在提取 root inode=(should be ino_num=2) 例如我只需要这样做

lseek(fd, BLOCK_OFFSET(block_group->bg_inode_table)+(2-1)*sizeof(struct    ext2_inode),
   SEEK_SET);

inode表的第一个块的块号存储在组描述符的bg_inode_table字段中。

所以 inode 表来帮助查找特定的 inode

要提取目录结构,我只需要使用 inode.i_block[0] 数组。最后一步填写

每个 i_block 元素都是可以以这种方式使用的数字。基本上是一个指针指向包含带有 inode 的文件内容的实际块

  lseek(...BASE_OFFSET+(i_block[x]-1)*block_size...)

对于 ext2,block_size 始终为 1024

这样我可以读取ext2文件系统中包含目录结构的块

阅读

  void *block;
  read(fd, block, block_size);  

上面一行给了我第一个映射到特定 inode 的目录

我可以简单地做一个循环来获取所有条目

http://www.science.smith.edu/~nhowe/teaching/csc262/oldlabs/ext2.html

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 2012-09-01
    • 2014-11-07
    • 2015-09-07
    • 2020-06-12
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多