文件大小/实际占用空间
设备块/文件块
磁盘最小单位是扇区,也称为设备块,大小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

浙公网安备 33010602011771号