首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inode是否真的指向磁盘中的地址?

inode是否真的指向磁盘中的地址?
EN

Stack Overflow用户
提问于 2015-03-24 14:54:00
回答 3查看 2.2K关注 0票数 2

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

EN

回答 3

Stack Overflow用户

发布于 2015-03-24 15:16:40

答案是,这取决于

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

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

享受吧!

票数 1
EN

Stack Overflow用户

发布于 2015-03-24 15:20:05

正如在ext2 inode的osdev wiki中所说:

块类似,每个inode都有一个数字地址。与块地址不同,inode地址从1开始,这一点非常重要。

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

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

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

双间接块指针:如果文件包含的块多于12个直接指针和间接块所能容纳的块,则使用双间接块。双间接块是上面描述的间接块的扩展,只是现在我们在索引节点和数据块之间有两个中间块。inode结构有一个“双间接块指针”字段,它在必要时指向这个块。

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

正如您可能知道的,在linux中有一个逻辑inode,它用于VFS。

VFS inode数据结构保存有关磁盘上的文件或目录的信息。

代码语言:javascript
复制
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;
};
票数 0
EN

Stack Overflow用户

发布于 2015-04-06 18:39:17

有关ext4文件系统,请参阅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)字节计算

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29226587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档