一个空文件夹和空文件占多少空间?

2023-05-16

用于显示文件夹和文件大小的命令

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;		/* File mode */
	__le16	i_uid;		/* Low 16 bits of Owner Uid */
	__le32	i_size_lo;	/* Size in bytes */
	__le32	i_atime;	/* Access time */
	__le32	i_ctime;	/* Inode Change 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_lo;	/* Blocks count */
	__le32	i_flags;	/* File flags */
	union {
		struct {
			__le32  l_i_version;
		} linux1;
		struct {
			__u32  h_i_translator;
		} hurd1;
		struct {
			__u32  m_i_reserved1;
		} masix1;
	} osd1;				/* OS dependent 1 */
	__le32	i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
	__le32	i_generation;	/* File version (for NFS) */
	__le32	i_file_acl_lo;	/* File ACL */
	__le32	i_size_high;
	__le32	i_obso_faddr;	/* Obsoleted fragment address */
	union {
		struct {
			__le16	l_i_blocks_high; /* were l_i_reserved1 */
			__le16	l_i_file_acl_high;
			__le16	l_i_uid_high;	/* these 2 fields */
			__le16	l_i_gid_high;	/* were reserved2[0] */
			__le16	l_i_checksum_lo;/* crc32c(uuid+inum+inode) LE */
			__le16	l_i_reserved;
		} linux2;
		struct {
			__le16	h_i_reserved1;	/* Obsoleted fragment number/size which are removed in ext4 */
			__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;	/* Obsoleted fragment number/size which are removed in ext4 */
			__le16	m_i_file_acl_high;
			__u32	m_i_reserved2[2];
		} masix2;
	} osd2;				/* OS dependent 2 */
	__le16	i_extra_isize;
	__le16	i_checksum_hi;	/* crc32c(uuid+inum+inode) BE */
	__le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
	__le32  i_mtime_extra;  /* extra Modification time(nsec << 2 | epoch) */
	__le32  i_atime_extra;  /* extra Access time      (nsec << 2 | epoch) */
	__le32  i_crtime;       /* File Creation time */
	__le32  i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
	__le32  i_version_hi;	/* high 32 bits for 64-bit version */
	__le32	i_projid;	/* Project ID */
};

可以通过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;			/* Inode number */
	__le16	rec_len;		/* Directory entry length */
	__le16	name_len;		/* Name length */
	char	name[EXT4_NAME_LEN];	/* File name */
};

四、结论
4.1、创建空文件时,i_block没有指向存放内容空间,所以创建一个空文件的时候,不消耗空间,是0K大小;但是一旦往里面写数据,哪怕是一个字节,也会消耗4K的空间,因为i_block指向的空间区域是以4K大小为单位的,(跟内存的操作大小一致,方便pagecache的缓存)。所以尽量避免使用小文件,这样太浪费存储资源了。
4.2、那为什么创建的空文件夹需要消耗4K空间,而不是0K大小呢?
空目录下输入ls -l 查看一下,其实文件夹里面默认会创建本目录和上一次目录的信息,不是空内容,自然需要消耗空间了。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个空文件夹和空文件占多少空间? 的相关文章

随机推荐