当前位置:网站首页>新建一个空文件占用多少磁盘空间?
新建一个空文件占用多少磁盘空间?
2020-11-06 21:04:00 【张彦飞allen】
今天我们来思考一个简单的问题。在Linux下你用touch
命令新建一个空文件:
touch empty_file.txt
操作完成后,是否要消耗掉我们的一些磁盘空间?需要的话,大概能消耗多少?嗯,是的,这个问题简单的超乎你的想象,但是不知道你否能给你自己一个满意的答案。
我前面的几篇文章都是介绍的磁盘物理层面的构成,但这对于理解文件相关的问题帮助可能还不够。从今天开始让我们从物理层往上走,到Linux文件系统原理里去寻找答案。
实践出真知
我觉得可能先丢开内核原理,直接动手操作来实验更有意思一些。你一定知道ls
这个命令你可以查看文件大小,那么让我们就用它来看一下。
# touch abcdefghigklmn.txt
# ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 17 17:49 empty.file
额,ls
命令告诉我这个空文件占用的是0。 文件的大小确实是0,因为我们还没有为该文件写入任何内容。但是我们现在要思考的是,一个空文件是否占用磁盘空间。所以直觉告诉我们这绝对不可能,磁盘上多出来一个文件,怎么可能一点空间开销都没有!
为了解开这个谜底,还需要借助df命令。输入df –i
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
......
/dev/sdb1 2147361984 12785019 2134576965 1% /search
这个输出帮我们展示了我们文件系统中inode的使用情况。注意IUsed是12785019。我们继续新建一个空文件
# touch empty_file2.txt
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
......
/dev/sdb1 2147361984 12785020 2134576964 1% /search
[@bjzw_46_76 temp]#
这下注意IUsed变成了12785020。
哈哈,我们的一个结论就出来了。新建一个空文件会占用一个Inode。
细说inode
那么inode里都存了哪些和文件相关的信息呢?我们再稍微看一下内核的源代码。大家可以下载一份linux的源代码。以ext2文件系统为例,在我下载的linux-2.6里的文件fs/ext2/ext2.h中,可以找到内核对于inode结构体的定义。该结构体较为复杂,主要存储除了文件内容以外的一些其他数据,我们选一些比较关键的截取出来:
struct ext2_inode {
__le16 i_mode; # 文件权限
__le16 i_uid; # 文件所有者ID
__le32 i_size; # 文件字节数大小
__le32 i_atime; # 文件上次被访问的时间
__le32 i_ctime; # 文件创建时间
__le32 i_mtime; # 文件被修改的时间
__le32 i_dtime; # 文件被删除的时间
__le16 i_gid; # 文件所属组ID
__le16 i_links_count; # 此文件的inode被连接的次数
__le32 i_blocks; # 文件的block数量
......
__le32 i_block[EXT2_N_BLOCKS]; # 指向存储文件数据的块的数组
......
可以看到和文件相关的所属用户、访问时间等都是存在inode中的。另外在include/linux/fs.h中,还有个VFS层面的inode的定义,这里咱就不发散了。使用stat命令就可以直接看到文件inode中数据。
# stat test
File: `test'
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: 801h/2049d Inode: 26 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-03-01 12:14:31.000000000 +0800
Modify: 2020-03-01 12:14:31.000000000 +0800
Change: 2020-03-01 12:14:31.000000000 +0800
每个inode到底是多大呢?dumpe2fs可以告诉你(XFS的话使用xfs_info)。
# dumpe2fs -h /dev/mapper/vgroot-lvroot
dumpe2fs 1.41.12 (17-May-2010)
......
Inode size: 256
Inode size表示每个Inode的大小。我的这台机器上,每个inode都是256字节。两个inode的大小正好对齐到磁盘扇区的512字节。
文件名存到哪里了
inode结构体都看完了,搞了半天不知道有没有发现一个问题,inode里并没有存储文件名!!那么,文件名到底跑哪儿去了?
在fs/ext2/ext2.h
中,我找到了如下文件夹相关的结构体
struct ext2_dir_entry {
__le32 inode; /* Inode number */
__le16 rec_len; /* Directory entry length */
__le16 name_len; /* Name length */
char name[]; /* File name, up to EXT2_NAME_LEN */
};
这个结构体就是我们司空见惯的文件夹。没错,文件名是存在其所属的文件夹数据结构中的,就是其中的char name[]
字段。和文件名一起,文件夹里还记录了该文件的inode等信息。
结论
-
- 新建一个空文件需要消耗掉一个inode,用来保存用户、创建时间等元数据。
-
- 新建一个空文件还需要消耗掉其所有目录的block中一定的空间,这些空间用来保存文件名,权限、时间等信息
所以,看起来新建一个空文件而已,只要你想挖,真的能挖出很多知识的。最后分享一个我们团队里同学遇到的一个故障。我们的一台离线任务机直接歇菜了,重启后排查原因是inode被消耗光了。再追查发现一个进程创建了太多的空日志文件。虽然文件都是空文件,但是inode却被浪费光了。后来让负责的同学修改了创建日志文件的逻辑,删掉了多出来的空文件,该机器恢复正常。
开发内功修炼之硬盘篇专辑:
- 1.磁盘开篇:扒开机械硬盘坚硬的外衣!
- 2.磁盘分区也是隐含了技术技巧的
- 3.我们怎么解决机械硬盘既慢又容易坏的问题?
- 4.拆解固态硬盘结构
- 5.新建一个空文件占用多少磁盘空间?
- 6.只有1个字节的文件实际占用多少磁盘空间
- 7.文件过多时ls命令为什么会卡住?
- 8.理解格式化原理
- 9.read文件一个字节实际会发生多大的磁盘IO?
- 10.write文件一个字节后何时发起写磁盘IO?
- 11.机械硬盘随机IO慢的超乎你的想象
- 12.搭载固态硬盘的服务器究竟比搭机械硬盘快多少?
我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术理论,也不只介绍实践经验。而是把理论与实践结合起来,用实践加深对理论的理解、用理论提高你的技术实践能力。欢迎你来关注我的公众号,也请分享给你的好友~~~
版权声明
本文为[张彦飞allen]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4746202/blog/4703259
边栏推荐
- The choice of enterprise database is usually decided by the system architect - the newstack
- Synchronous configuration from git to consult with git 2consul
- A brief history of neural networks
- Brief introduction of TF flags
- Installing ns-3 on ubuntu18.04
- Analysis of react high order components
- Cglib 如何实现多重代理?
- Filecoin主网上线以来Filecoin矿机扇区密封到底是什么意思
- keras model.compile Loss function and optimizer
- JVM memory area and garbage collection
猜你喜欢
PN8162 20W PD快充芯片,PD快充充电器方案
[C / C + + 1] clion configuration and running C language
Brief introduction and advantages and disadvantages of deepwalk model
一篇文章教会你使用HTML5 SVG 标签
axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
ES6学习笔记(四):教你轻松搞懂ES6的新增语法
How to encapsulate distributed locks more elegantly
keras model.compile Loss function and optimizer
2019年的一个小目标,成为csdn的博客专家,纪念一下
Music generation through deep neural network
随机推荐
小程序入门到精通(二):了解小程序开发4个重要文件
Natural language processing - wrong word recognition (based on Python) kenlm, pycorrector
How to customize sorting for pandas dataframe
华为云“四个可靠”的方法论
一篇文章教会你使用Python网络爬虫下载酷狗音乐
How to encapsulate distributed locks more elegantly
JVM memory area and garbage collection
Summary of common algorithms of linked list
High availability cluster deployment of jumpserver: (6) deployment of SSH agent module Koko and implementation of system service management
Simple summary of front end modularization
Electron application uses electronic builder and electronic updater to realize automatic update
Let the front-end siege division develop independently from the back-end: Mock.js
Interface pressure test: installation, use and instruction of siege pressure test
I think it is necessary to write a general idempotent component
Common algorithm interview has been out! Machine learning algorithm interview - KDnuggets
Architecture article collection
Arrangement of basic knowledge points
DRF JWT authentication module and self customization
I'm afraid that the spread sequence calculation of arbitrage strategy is not as simple as you think
If PPT is drawn like this, can the defense of work report be passed?