在linux系统中,任何一个文件,都有一个inode与其对应,也就是说,在一个文件系统中,一个文件都有唯一的ino来标示他,那么在ext4系统中,ino是如何确定的哪?

当我们新创建的文件或目录时,会调用ext4_create函数,其调用路径是:ext4_create -> ext4_new_inode。就是在函数ext4_new_inode定义了inode->ino。

分析函数ext4_new_inode相关部分

struct inode *__ext4_new_inode(handle_t *handle, struct inode *dir,

umode_t mode, const struct qstr *qstr,

__u32 goal, uid_t *owner, int handle_type,

unsigned int line_no, int nblocks)

{

for (i = 0; i < ngroups; i++, ino = 0) {

err = -EIO;

gdp = ext4_get_group_desc(sb, group, &group_desc_bh);

if (!gdp)

goto out;

/* 1.在加载inode bitmap之前,先检查是否有free indode */

if (ext4_free_inodes_count(sb, gdp) == 0) {

if (++group == ngroups)

group = 0;

continue;

}

inode_bitmap_bh = ext4_read_inode_bitmap(sb, group);

/* 2.在inode位图中查找ino+1开始的下一个为0的位 */

ino = ext4_find_next_zero_bit((unsigned long *)

inode_bitmap_bh->b_data,

EXT4_INODES_PER_GROUP(sb), ino);

/* 3.检查free inode是否有效:(1) 大于inode_per_group,(2) 小与first_ino */

if (ino >= EXT4_INODES_PER_GROUP(sb))

goto next_group;

if (group == 0 && (ino+1) < EXT4_FIRST_INO(sb)) {

ext4_error(sb, "reserved inode found cleared - "

"inode=%lu", ino + 1);

continue;

}

/* 4.更新inode bitmap,若更新inode bitmap失败,重新搜索*/

ext4_lock_group(sb, group);

ret2 = ext4_test_and_set_bit(ino, inode_bitmap_bh->b_data);

ext4_unlock_group(sb, group);

ino++;      /* the inode bitmap is zero-based */

if (!ret2)

goto got; /* we grabbed the inode! */

next_inode:

if (ino < EXT4_INODES_PER_GROUP(sb))

goto repeat_in_this_group;

next_group:

if (++group == ngroups)

group = 0;

}

/* 5.更新group中的free_inodes_count变量 */

ext4_free_inodes_set(sb, gdp, ext4_free_inodes_count(sb, gdp) - 1);

if (S_ISDIR(mode)) {

ext4_used_dirs_set(sb, gdp, ext4_used_dirs_count(sb, gdp) + 1);

if (sbi->s_log_groups_per_flex) {

ext4_group_t f = ext4_flex_group(sbi, group);

atomic_inc(&sbi->s_flex_groups[f].used_dirs);

}

}

if (ext4_has_group_desc_csum(sb)) {

ext4_inode_bitmap_csum_set(sb, group, gdp, inode_bitmap_bh,

EXT4_INODES_PER_GROUP(sb) / 8);

ext4_group_desc_csum_set(sb, group, gdp);

}

ext4_unlock_group(sb, group);

/* 6.得到inode->ino */

inode->i_ino = ino + group * EXT4_INODES_PER_GROUP(sb);

}

步骤:

1. 在加载inode bitmap之前,先检查是否有free indode

2.在inode位图中查找ino+1开始的下一个为0的位

3.检查free inode是否有效:(1) 大于inode_per_group,(2) 小与first_ino

4.更新inode bitmap,更新失败重新搜索

5.更新group中的free_inodes_count变量

6. 得到inode->ino

 

因此可以通过inode->ino计算inode所处的group和block:

Group_id

=(inode->ino-1)/inodes_per_group

Inode_blkid

=first_inode_blk_in_group

+ ((inode->ino-1) % inodes_per_group) / (inodes_per_block);

Inode_offset

= first_inode_blk_in_group * blk_size

+ ((inode->ino-1) % inodes_per_group) * inode_size

其中:

之所以inode->ino-1原因是ext4系统不存在0号文件索引

(1) inode->ino:可以通过stat file_name获取;

(2) inodes_per_group:指每个group中inode的数目,见debugfs;

(3) first_inode_blk_in_group:指的是inode table的起始block id,可以debugfs获取;

(4) blk_size:逻辑块大小,可以debugfs获取;

(5) inode_size:一个inode在磁盘上存放所需的空间大小,可以debugfs获取;

(6) inodes_per_block:每个block所能存放inode的个数,可以通过blk_size/inode_size获取;

root@ubuntu:/mnt/ext4# debugfs /dev/sdc

debugfs 1.42 (29-Nov-2011)

debugfs:  stats

Filesystem volume name:   <none>

Last mounted on:          /mnt/ext4

Filesystem UUID:          883c6632-e61d-4420-b309-0695f321cf9d

Filesystem magic number:  0xEF53

Inode count:              327680

Fragments per group:      32768

Inodes per group:        8192

Inode blocks per group:  512

First inode:             11

Inode size:              256

Required extra isize:     28

Group  0: block bitmap at 321, inode bitmap at 337,inode table at 353

24217 free blocks, 8180 free inodes, 2 used directories, 8180 unused inodes

[Checksum 0x25aa]

Group  1: block bitmap at 322, inode bitmap at 338, inode table at 865

31423 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes

[Inode not init, Checksum 0x94f1]

Group  2: block bitmap at 323, inode bitmap at 339, inode table at 1377

32768 free blocks, 8192 free inodes, 0 used directories, 8192 unused inodes

[ext4]010 磁盘布局 - 如何查找inode的磁盘位置的更多相关文章

  1. [ext4]磁盘布局 - inode bitmap & table

    在[磁盘布局 group部分]已经介绍过ext4的整体布局,其中存在两个与inode有关的名称:inode bitmap和inode table. Inode bitmap,用于表示inode tab ...

  2. [ext4]磁盘布局 - group分析

    ext4文件系统的磁盘布局是先把磁盘分成一个个相同大小的block块(每个block块的大小默认是4K),然后把这些block块合成一个个group. group大小最大为256M(默认为256M), ...

  3. [ext4]04 磁盘布局 - Meta Block Groups

    Meta Block Groups,可以翻译为元块组集. 如果不采用Meta Block Groups特性,在每个冗余备份的超级块的后面是一个完整的(包含所有块组描述符的)块组描述符表的备份.如前所述 ...

  4. ext2磁盘布局

    概述           本篇博客主要关注ext2文件系统的磁盘布局,即ext2会在格式化时将磁盘划分成什么样子.   ext2磁盘布局   任何Ext2分区中的第一个块从不受Ext2文件系统的管理, ...

  5. centos、linux查找未挂载磁盘格式化并挂载?

    centos.linux查找未挂载磁盘格式化并挂载? df -h 查看当前linux服务器硬盘: fdisk -l /dev/sda   第一块硬盘 /dev/sdb   第二块硬盘 依此类推 以/d ...

  6. Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决

    微软在推出Win10系统以后,就向Win7和Win8.1系统用户提供了免费升级Win10系统的推送,但是用户在安装Win10系统的时候,却有一部分用户反映,遇到提示“无法安装Windows,因为这台电 ...

  7. Linux 查看磁盘容量、查找大文件、查找大目录

    Linux 查看磁盘容量.查找大文件.查找大目录 磁盘统计 查看磁盘使用情况 df -h 文件统计 查找/home 目录下大于800M的文件 find /home -type f -size +800 ...

  8. CentOS 6U7分区大于2TB的磁盘以及挂载大于16TB分区磁盘的解决方案

    一.内容介绍1.问题描述1).问题一 CentOS 6.x 在格式化大于16TB的ext4分区时,会提示如下错误: mke2fs 1.41.12 (17-May-2010)mkfs.ext4: Siz ...

  9. Disk:磁盘管理之LVM和系统磁盘扩容

    简介 小伙伴们好,好久不见,今天想给大家介绍一下关于磁盘管理的方法和心得:磁盘管理可谓运维工作中的重要内容,主要包括磁盘的合理规划以及扩缩容 常用的磁盘管理方法为LVM(Logical Volume ...

随机推荐

  1. 去掉标题栏的方法(使用requestWindowFeature(Window.FEATURE_NO_TITLE);为什么失效)

    使用requestWindowFeature(Window.FEATURE_NO_TITLE)隐藏标题栏失效的原因,可能是activity继承的是AppCompatActivity.下面详细介绍了使用 ...

  2. 今天给大家分享一下PS快捷键大全

    一.工具箱(多种工具共用一个快捷键的可同时按[Shift]加此快捷键选取) 矩形.椭圆选框工具 [M] 移动工具 [V] 套索.多边形套索.磁性套索 [L] 魔棒工具 [W] 裁剪工具 [C] 切片工 ...

  3. 用javascript实现base64编码器

    前面的话 base-64作为常见的编码函数,在基本认证.摘要认证以及一些HTTP扩展中得到了大量应用.在前端领域,也常常把图片转换为base-64编码在网络中传输.本文将详细介绍base64的原理及用 ...

  4. Java 中的数组

    1.声明数组String [] arr;int arr1[];String[] array=new String[5];int score[]=new int[3]; 2.初始化数组://静态初始化i ...

  5. (23)IO之打印流 PrintStream & Printwriter

    PrintStream PrintStream可以接受文件和其他字节输出流,所以打印流是对普通字节输出流的增强,其中定义了很多的重载的print()和println(),方便输出各种类型的数据. Pr ...

  6. SQL SERVER 报:由于数据移动,未能继续以 NOLOCK 方式扫描错误的解决办法。

    比如在某个表中使用 select xxx from xxx with(nolock) where xxxx 查询. 提示出错:由于数据移动,未能继续以 NOLOCK 方式扫描. 它有可能某些条件出错, ...

  7. 使用Topshelf组件构建简单的Windows服务

    很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方式也就会不同了.我个人觉得无论学习什么,都应该尝试着去了解 ...

  8. Android开发之自定义视图

    继承View 1.重写onMeasure(int wMeasureSpec,int hMeasureSpec)处理程序,这样可以标明视图尺寸 2.重写onDraw,以便绘制我们自己的自定义视图内 3. ...

  9. CSS3的新特性

    CSS3中增加的新特性: (1)选择器的种类 (2)字体 font (3)text-overflow (4)文本渲染 text-decoration (5)多列布局 column-count (6)R ...

  10. 走入PHP-变量、运算符

    通过define()定义常量: PHP 5.3.0之后,可以使用const关键字在类定义之外定义常量: 下面是PHP的几个魔术变量: PHP支持一个执行运算符:反引号(``),PHP将尝试将反引号中的 ...