用于显示文件夹和文件大小的命令
du -h
显示目前在 Linux 系统上的文件系统磁盘使用情况统计
df -i
一、问题和现象
1.1、空文件夹占多少空间
1.1.1、创建一个空文件夹,查看空间使用情况
结论:空文件夹占用4K空间
1.2、文件占多少空间
1.2.1、创建一个空文件,查看空间使用情况
结论:空文件不占用空间
1.2.2、写入一个字符到空间,查看空间使用情况
结论:写入一个字符的文件,占用4K空间
二、分析问题前的知识点:
文件系统的原理
三、分析分析
3.1、文件夹和文件都属于文件,只是文件夹属于特殊的文件,文件夹中保存着文件属性信息,所以文件夹和文件都有对应的inode
3.2、下图是创建一个文件后,inode的信息变化。不管创建的文件还是文件夹,文件系统中的inode都会相应减少,所以至少使用了一个inode大小的空间,但是inode属于文件系统的控制信息,不在使用空间范畴里面。
3.3、本/dev/sda5使用ex4文件系统,对应的inode结构体信息
struct ext4_inode {
__le16 i_mode;
__le16 i_uid;
__le32 i_size_lo;
__le32 i_atime;
__le32 i_ctime;
__le32 i_mtime;
__le32 i_dtime;
__le16 i_gid;
__le16 i_links_count;
__le32 i_blocks_lo;
__le32 i_flags;
union {
struct {
__le32 l_i_version;
} linux1;
struct {
__u32 h_i_translator;
} hurd1;
struct {
__u32 m_i_reserved1;
} masix1;
} osd1;
__le32 i_block[EXT4_N_BLOCKS];
__le32 i_generation;
__le32 i_file_acl_lo;
__le32 i_size_high;
__le32 i_obso_faddr;
union {
struct {
__le16 l_i_blocks_high;
__le16 l_i_file_acl_high;
__le16 l_i_uid_high;
__le16 l_i_gid_high;
__le16 l_i_checksum_lo;
__le16 l_i_reserved;
} linux2;
struct {
__le16 h_i_reserved1;
__u16 h_i_mode_high;
__u16 h_i_uid_high;
__u16 h_i_gid_high;
__u32 h_i_author;
} hurd2;
struct {
__le16 h_i_reserved1;
__le16 m_i_file_acl_high;
__u32 m_i_reserved2[2];
} masix2;
} osd2;
__le16 i_extra_isize;
__le16 i_checksum_hi;
__le32 i_ctime_extra;
__le32 i_mtime_extra;
__le32 i_atime_extra;
__le32 i_crtime;
__le32 i_crtime_extra;
__le32 i_version_hi;
__le32 i_projid;
};
可以通过stat 命令查看inode信息
dyh@dyh-Virtual-Machine:~/project/TSpace/size$ stat 1.txt
文件:1.txt
大小:2 块:8 IO 块:4096 普通文件
设备:805h/2053d Inode:1984457 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1000/ dyh) Gid:( 1000/ dyh)
最近访问:2021-06-26 14:30:42.649933174 +0800
最近更改:2021-06-26 14:30:51.309569834 +0800
最近改动:2021-06-26 14:30:51.309569834 +0800
创建时间:-
3.4、发现个问题:文件名信息保存在哪个成员变量中,没看到有相应的成员变量
学习完第二步对应文章后就很清楚。文件保存的信息空间,即i_block指向的空间区域;那文件夹的i_block保存的是什么信心?文件夹对应的i_block指向的空间区域存放的就是一项一项下面这个结构体的内容,文件夹目录下的(文件或文件夹的inode)和(文件或文件夹的名字)。
struct ext4_dir_entry {
__le32 inode;
__le16 rec_len;
__le16 name_len;
char name[EXT4_NAME_LEN];
};
四、结论
4.1、创建空文件时,i_block没有指向存放内容空间,所以创建一个空文件的时候,不消耗空间,是0K大小;但是一旦往里面写数据,哪怕是一个字节,也会消耗4K的空间,因为i_block指向的空间区域是以4K大小为单位的,(跟内存的操作大小一致,方便pagecache的缓存)。所以尽量避免使用小文件,这样太浪费存储资源了。
4.2、那为什么创建的空文件夹需要消耗4K空间,而不是0K大小呢?
空目录下输入ls -l 查看一下,其实文件夹里面默认会创建本目录和上一次目录的信息,不是空内容,自然需要消耗空间了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)