【问题标题】:Does the inode actually point to an address in the Disk?inode 是否实际上指向磁盘中的地址?
【发布时间】:2015-05-27 09:46:42
【问题描述】:

Linux 文件系统中的 inode 是如何实际指向磁盘上的一个块的?它是否包含一个从 0 指向 2^63 - 1 的 64 位可寻址数字?还是在 inode 结构和实际磁盘地址之间有一层?

【问题讨论】:

    标签: c linux filesystems inode


    【解决方案1】:

    答案是视情况而定

    不同的文件系统以不同的方式存储 inode 信息。如果大小足够小,有些会将实际文件内容存储在 inode 结构中,有些会将虚拟或实际块编号存储为 32 或 64 位数字,有时甚至是另一种编码,有些会将偏移存储到磁盘空间中,大多数将存储更复杂的信息来处理跨越许多块的大文件...

    你可以在网上找到各种文件系统的详细信息,了解文件系统性能非常有趣。

    享受吧!

    【讨论】:

    • ...is the size is small enough 应该是...if the size is small enough?
    【解决方案2】:

    正如osdev wiki for ext2 inodes 所说:

    像块一样,每个 inode 都有一个数字地址。需要特别注意的是,与块地址不同,inode 地址从 1 开始。

    每个 inode 包含 12 个直接指针、一个单间接指针、一个双重间接块指针和一个三重间接指针。直接空间“溢出”到单间接空间,后者溢出到双重间接空间,后者溢出到三间接空间。

    直接块指针:有 12 个直接块指针。如果有效,则该值非零。每个指针都是包含此 inode 数据的块的块地址。

    单个间接块指针:如果一个文件需要超过 12 个块,则分配一个单独的块来存储存储其内容所需的剩余数据块的块地址。这个单独的块被称为间接块,因为它在 inode 和它的数据之间增加了一个额外的步骤(间接级别)。块中存储的块地址都是32位的,该块中存储地址的容量是块大小的函数。这个间接块的地址存储在“Singly Indirect Block Pointer”字段的inode中。

    双间接块指针:如果文件的块数超过 12 个直接指针和间接块的容量,则使用双间接块。双间接块是上述间接块的扩展,只是现在我们在 inode 和数据块之间有两个中间块。 inode 结构有一个“双重间接块指针”字段,如果需要,它会指向这个块。

    三重间接块指针:最后,如果文件需要更多空间,它可以使用三重间接块。同样,这是双重间接块的扩展。因此,三重间接块包含双间接块的地址,其中包含单个间接块的地址,其中包含数据块的地址。 inode 结构有一个“Triply Indirect Block Pointer”字段,它指向这个块(如果存在)。

    您可能知道在 VFS 中使用的 linux 中有一个逻辑 inode。
    VFS inode 数据结构保存有关磁盘上文件或目录的信息。

    struct inode {
        kdev_t                       i_dev;
        unsigned long                i_ino;
        umode_t                      i_mode;
        nlink_t                      i_nlink;
        uid_t                        i_uid;
        gid_t                        i_gid;
        kdev_t                       i_rdev;
        off_t                        i_size;
        time_t                       i_atime;
        time_t                       i_mtime;
        time_t                       i_ctime;
        unsigned long                i_blksize;
        unsigned long                i_blocks;
        unsigned long                i_version;
        unsigned long                i_nrpages;
        struct semaphore             i_sem;
        struct inode_operations      *i_op;
        struct super_block           *i_sb;
        struct wait_queue            *i_wait;
        struct file_lock             *i_flock;
        struct vm_area_struct        *i_mmap;
        struct page                  *i_pages;
        struct dquot                 *i_dquot[MAXQUOTAS];
        struct inode                 *i_next, *i_prev;
        struct inode                 *i_hash_next, *i_hash_prev;
        struct inode                 *i_bound_to, *i_bound_by;
        struct inode                 *i_mount;
        unsigned short               i_count;
        unsigned short               i_flags;
        unsigned char                i_lock;
        unsigned char                i_dirt;
        unsigned char                i_pipe;
        unsigned char                i_sock;
        unsigned char                i_seek;
        unsigned char                i_update;
        unsigned short               i_writecount;
        union {
            struct pipe_inode_info   pipe_i;
            struct minix_inode_info  minix_i;
            struct ext_inode_info    ext_i;
            struct ext2_inode_info   ext2_i;
            struct hpfs_inode_info   hpfs_i;
            struct msdos_inode_info  msdos_i;
            struct umsdos_inode_info umsdos_i;
            struct iso_inode_info    isofs_i;
            struct nfs_inode_info    nfs_i;
            struct xiafs_inode_info  xiafs_i;
            struct sysv_inode_info   sysv_i;
            struct affs_inode_info   affs_i;
            struct ufs_inode_info    ufs_i;
            struct socket            socket_i;
            void                     *generic_ip;
        } u;
    };
    

    【讨论】:

      【解决方案3】:

      对于 ext4 fs,请 参考https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout

      根据我对 ext4 的理解,磁盘分为多个块。存储在 inode 中的地址基本上是块号。所以,实际地址是block_number*block_size。

      "一般情况下,块大小为 4KiB(与 x86 上的页面大小和块层的默认块大小相同),但实际大小计算为 2 ^ (10 + sb.s_log_block_size) 字节"

      谢谢

      【讨论】:

        猜你喜欢
        • 2011-06-25
        • 2014-08-10
        • 2017-03-15
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        相关资源
        最近更新 更多