文件大小/实际占用空间

设备块/文件块

磁盘最小单位是扇区,也称为设备块,大小512byte
文件系统一次io的大小是IO Block,一般是4096byte,即8个扇区。这也是文件系统读写磁盘的最小单位。
ls 文件大小
du 实际占用空间

文件存储

存储数据的区域全都是Block,我们叫做数据区域;存储元数据的区域是inode区域;
文件系统初始化时,就会把这两个区域分配好,然后通过两张bitmap数组记录每个block和inode的使用情况。df -i可以查看当前inode区域使用情况

每次新建一个文件,IUsed就会加1。

inode结构

struct ext2_inode {
    __le16  i_mode;     /* File mode */
    __le16  i_uid;      /* Low 16 bits of Owner Uid */
    __le32  i_size;     /* Size in bytes */
    __le32  i_atime;    /* Access time */
    __le32  i_ctime;    /* Creation time */
    __le32  i_mtime;    /* Modification time */
    __le32  i_dtime;    /* Deletion Time */
    __le16  i_gid;      /* Low 16 bits of Group Id */
    __le16  i_links_count;  /* Links count */
    __le32  i_blocks;   /* Blocks count */
    __le32  i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
};

其中,i_block[EXT2_N_BLOCKS] 数组,里面存储的是 block 的编号,即block 所在的位置。EXT2_N_BLOCKS 是一个宏定义,值为 15 ,前12个直接索引,后三个分别是一级、二级、三级索引。

写文件时,首先把数据部分按照4k大小切分,然后存储到空闲的 block 上,最后把block位置记录到inode上;读文件时,先从inode结构中读出block位置,然后到数据区域读出磁盘数据、依次拼接。

文件和目录在文件系统中的表示

假如创建一个100KBytes+1bytes大小的文件,那么linux将分配1个inode与26个block来储存该文件! 即使是多了1个字节,也要额外占用1个block。另外,由于inode仅有12个直接索引,因此还需要再占用一个block(充当一级索引)来记录区块编号。 因此,总共就需要占用27个block。
因为目录也是文件,但目录中存放的是什么内容呢?
目录中存放的内容是该目录下所有文件的文件名,所以目录的block存放的就是该目录下所有文件的文件名和对应的inode编号。 可以理解为目录下存放的就是一张文件名和inode关系列表。

stat命令显示size


其中size就是ls看到的文件大小【也是inode结构中的i_size属性】
blocks是实际占用的物理磁盘块数,即du看到的文件占用 = blocks * 512Byte

posted @ 2024-02-12 18:33  LdreamerD  阅读(110)  评论(0)    收藏  举报