技术解析

ext4 文件系统的 inode 是 256 字节,核心结构是 160 字节
0
2021-07-05 01:26:31
idczone

今天在复习《鸟哥的私房菜-基础学习篇》,看到 inode 大小为 128bytes ,想看下这 128 字节里面到底是什么样的。于是我查了下 google ,发现 ext2/3 是 128 字节, ext4 是 256 字节了。

官方介绍: https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Size

它说 ext4 的 inode 结构最后面新加了 28 字节( i_extra_isize = 28 ),是 156 字节 (在 2013 年),然后我查了下 ext4_inode 的代码:

https://gist.github.com/liuxu0315/9687560faab54bff77b06e91a93ab5dc

以为我眼花了,算了好几遍,怎么算都是 32 字节, ext4 的 inode 结构应该是 160 字节才对。我一想,可能是官方 wiki 太老了, ext4 的代码在 2013 年之后改动过,于是我到 github 上 clone 了 linux 源码,用 git log 一查,果然被改过。

    $ git clone https://github.com/torvalds/linux.git
    $ cd linux
    $ git log -L 753,761:fs/ext4/ext4.h

输出:

commit 8b4953e13f4c5d9a3c869f5fca7d51e1700e7db0
Author: Theodore Ts'o <[email protected]>
Date:   Sat Oct 17 16:15:18 2015 -0400

    ext4: reserve code points for the project quota feature
    
    Signed-off-by: Theodore Ts'o <[email protected]>

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -687,8 +690,9 @@
        __le16  i_extra_isize;
        __le16  i_checksum_hi;  /* crc32c(uuid+inum+inode) BE */
        __le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
        __le32  i_mtime_extra;  /* extra Modification time(nsec << 2 | epoch) */
        __le32  i_atime_extra;  /* extra Access time      (nsec << 2 | epoch) */
        __le32  i_crtime;       /* File Creation time */
        __le32  i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
        __le32  i_version_hi;   /* high 32 bits for 64-bit version */
+       __le32  i_projid;       /* Project ID */

可以看见在 2015 年 10 月的时候加了“__le32 i_projid; /* Project ID */”,所以比 2013 年的 ext4_inode 多了 4 字节,为 160 字节。

顺便贴上我的 blog ,只谈技术。 我是个新手,有对我文笔有建议的希望能直接指出,谢谢。

http://www.cnblogs.com/liuxuzzz/


貌似向后兼容的。

inode 看成 Linode 的举手。

对的
EXT4_GOOD_OLD_INODE_SIZE 128
...
EXT4_GOOD_OLD_REV 0 /* The good old (original) format */
...
/* s 一般是 super_block */
EXT4_INODE_SIZE(s) (((s)->s_rev_level == EXT4_GOOD_OLD_REV) ? \
EXT4_GOOD_OLD_INODE_SIZE : \
(s)->s_inode_size)

/*s_inode_size :
sbi 是 ext4_sb_info , sb=superblock
*/
if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) {
sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE;
sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO;
} else {
sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
...

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服