Linux 磁盘与文件系统(EXT2)简介(2)

5)block 的大小是在格式化时就已经确定了的,除非重新格式化(或者使用 resize2fs 等命令改变文件系统大小),否则 block 的大小固定后就不再改变;

6)block 大小的不同,会导致文件系统能够支持的最大磁盘容量及最大单一文件容量不相同,在 EXT2 文件系统中:

block大小    1KB     2KB     4KB   
最大单一文件大小    16GB    256GB    2TB  
最大文件系统容量    2TB    8TB    16TB  

7)EXT2 文件系统在格式化时,会将磁盘分为多个块组(block group),每个 block group 都有独立的inode/block/super block 。

2.2、inode(索引节点)

  既然我们已经知道文件数据存放在 block 中,那么如何找到所需的 block 呢,这就需要用到 inode 了。 inode 是文件系统中的一个特殊的数据块,存放了文件属性相关的信息,包括文件的创建/修改日期、文件的创建者、文件的大小、文件在磁盘上的存放位置以及文件的访问权限等。在 Linux kernel 2.6.34 版本, /include/linux/fs.h 文件中有对 inode 结构体的定义,可以作为参考:

struct inode {
    struct hlist_node  i_hash;
    struct list_head    i_list;        /* backing dev IO list */
    struct list_head    i_sb_list;
    struct list_head    i_dentry;
    unsigned long      i_ino;
    atomic_t            i_count;
    unsigned int        i_nlink;
    uid_t              i_uid;
    gid_t              i_gid;
    dev_t              i_rdev;
    unsigned int        i_blkbits;
    u64                i_version;
    loff_t              i_size;
#ifdef __NEED_I_SIZE_ORDERED
    seqcount_t          i_size_seqcount;
#endif
    struct timespec    i_atime;
    struct timespec    i_mtime;
    struct timespec    i_ctime;
    blkcnt_t            i_blocks;
    unsigned short      i_bytes;
    umode_t            i_mode;
    spinlock_t          i_lock;    /* i_blocks, i_bytes, maybe i_size */
    struct mutex        i_mutex;
    struct rw_semaphore i_alloc_sem;
    const struct inode_operations    *i_op;
    const struct file_operations    *i_fop;    /* former ->i_op->default_file_ops */
    struct super_block              *i_sb;
    struct file_lock                *i_flock;
    struct address_space            *i_mapping;
    struct address_space            i_data;
#ifdef CONFIG_QUOTA
    struct dquot        *i_dquot[MAXQUOTAS];
#endif
    struct list_head    i_devices;
    union {
        struct pipe_inode_info    *i_pipe;
        struct block_device      *i_bdev;
        struct cdev              *i_cdev;
    };

__u32                i_generation;

#ifdef CONFIG_FSNOTIFY
    __u32                i_fsnotify_mask; /* all events this inode cares about */
    struct hlist_head    i_fsnotify_mark_entries; /* fsnotify mark entries */
#endif

#ifdef CONFIG_INOTIFY
    struct list_head    inotify_watches; /* watches on this inode */
    struct mutex        inotify_mutex;    /* protects the watches list */
#endif

unsigned long        i_state;
    unsigned long        dirtied_when;    /* jiffies of first dirtying */

unsigned int        i_flags;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12108.html