今天我们来思考一个简单的问题。在linux下,你用touch命令创建一个空文件:touchempty_file.txt操作完成后,是不是要消耗我们一些磁盘空间?如果需要,它能消耗多少?嗯,是的,这个问题比你想象的要简单,但不知道你能不能给自己一个满意的答案。前面几篇文章介绍的都是磁盘的物理组成,但这可能不足以帮助理解文件相关的问题。从今天开始,让我们从物理层上去,在Linux文件系统的原理中寻找答案。真正的知识来自实践。我觉得先抛开核心原理,直接动手实验,可能会更有趣。你一定知道可以用ls命令查看文件大小,那我们就用它来看看吧。#touchabcdefghigklmn.txt#ls-ltotal0-rw-r--r--1rootroot0Aug1717:49empty.file好吧,ls命令告诉我这个空文件占0。file确实是0因为我们还没有向文件写入任何内容。但是我们现在要考虑的是一个空文件是否占用磁盘空间。所以我们的直觉告诉我们,这是绝对不可能的。磁盘上多了一个文件,怎么可能一点空间开销都没有!为了解开这个谜团,还需要用到df命令。输入df–i#df-iFilesystemInodesIUsedIFreeIUse%Mountedon....../dev/sdb121473619841278501921345769651%/search此输出帮助我们显示文件系统中inode的使用情况。注意IUsed是12785019,我们继续新建一个空文件#touchempty_file2.txtdf-iFilesystemInodesIUsedIFreeIUse%Mountedon....../dev/sdb121473619841278502021345769641%/search[@bjzw_46_76temp]#注意IUsed变成了12785020。哈哈,我们的一个结论出来了。创建一个新的空文件会占用一个inode。下面详细说一下inode,那么inode中存储了哪些与文件相关的信息呢?我们再来看看内核的源代码。你可以下载一个linux源代码。以ext2文件系统为例,在我下载的linux-2.6的文件fs/ext2/ext2.h中,可以找到内核中inode结构的定义。结构比较复杂,主要存储了文件内容以外的一些其他数据。我们选择一些关键的进行拦截:structext2_inode{__le16i_mode;#文件权限__le16i_uid;#文件所有者ID__le32i_size;#文件字符段大小__le32i_atime;#最后一次访问文件的时间__le32i_ctime;#文件创建时间__le32i_mtime;#文件被修改的时间__le32i_dtime;#文件被删除的时间__le16i_gid;#文件所属组ID__le16i_links_count;#这个文件的inode被连接的次数__le32i_blocks;#文件中的块数...__le32i_block[EXT2_N_BLOCKS];#指向存储文件数据的块数组...可以看到inode中存储了与文件相关的用户、访问时间等。另外,在include/linux/fs.h中,也有VFS级别的inode定义,这里不再赘述。使用stat命令可以直接看到文件inode中的数据。#stattest文件:`test'大小:0块:0IO块:1024常规空文件设备:801h/2049dInode:26链接:1Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root)Access:2020-03-0112:14:31.000000000+0800Modify:2020-03-0112:14:31.000000000+0800Change:2020-03-0112:14:31.000000000+0800How大是inode?dumpe2fs可以告诉你(对XFS使用xfs_info)。#dumpe2fs-h/dev/mapper/vgroot-lvrootdumpe2fs1.41.12(17-May-2010)......Inodesize:256Inodesize表示每个Inode的大小。在我的机器上,每个inode是256字节。两个索引节点的大小正好与磁盘扇区的512字节对齐。文件名保存在哪里?inode结构我都看了一遍,看了半天不知道有没有发现问题。inode不存储文件名!!那么,文件名去??哪儿了?在fs/ext2/ext2.h中,我找到了以下文件夹相关的结构structext2_dir_entry{__le32inode;/*索引节点号*/__le16rec_len;/*目录条目长度*/__le16name_len;/*名称长度*/字符名称[];/*文件名,最大为EXT2_NAME_LEN*/};这个结构就是我们常用的文件夹。没错,文件名存在于其所属文件夹的数据结构中,也就是其中的charname[]字段。文件夹中除了文件名外,还记录了文件的inode等信息。结论创建一个空文件需要消耗一个inode,用于保存用户和创建时间等元数据。创建一个空文件也需要在其所有目录的块中占用一定的空间。这些空间用于保存文件名、权限和时间等信息。因此,看起来创建一个空文件只是一个新的空文件。只要你想挖,就真的可以挖。出了很多知识。最后分享一个我们组里一个同学遇到的失败。我们的一台离线任务机器直接停止工作了。重启后,原因是inode耗尽。进一步的跟踪显示一个进程创建了太多的空日志文件。虽然文件都是空文件,但是浪费了inode。后来负责的同学修改了创建日志文件的逻辑,删除了多余的空文件,机器就恢复正常了。练内功练硬盘特技:1、开盘:剥去机械硬盘的硬外衣!2.磁盘分区也暗示技术水平。3、机械硬盘速度慢,容易坏,如何解决?4.拆解SSD结构5.一个新的空文件占用多少磁盘空间?6.一个只有1字节的文件实际占用多少磁盘空间?7、为什么文件太多时ls命令会卡住?8.理解格式化原理9.读取文件一个字节实际会发生多少磁盘IO?10.文件写入一个字节后什么时候开始写磁盘IO?11、机械硬盘的随机IO比你想象的要慢。12、服务器配置固态硬盘比机械硬盘快多少?我的公众号是“练内功练功”。在这里,我不是简单地介绍技术理论,也不是只介绍实践经验。而是理论联系实际,用实践加深对理论的理解,用理论提高技术实践能力。欢迎关注我的公众号,分享给你的朋友吧~~~
