0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

新建一个空文件会不会占用磁盘空间

Wildesbeast 来源:21IC 作者:21IC 2020-12-06 09:51 次阅读

今天我们来思考一个简单的问题。在Linux下你用touch命令新建一个空文件: touch empty_file.txt 当操作完成后,是否要消耗掉我们的一些磁盘空间?需要的话,大概能消耗多少?嗯,是的,这个问题简单的超乎你的想象,但是不知道你否能给你自己一个满意的答案。

今天我们来思考一个简单的问题。在Linux下你用touch命令新建一个空文件:

touch empty_file.txt

操作完成后,是否要消耗掉我们的一些磁盘空间?需要的话,大概能消耗多少?嗯,是的,这个问题简单的超乎你的想象,但是不知道你否能给你自己一个满意的答案。

我前面的几篇文章都是介绍的磁盘物理层面的构成,但这对于理解文件相关的问题帮助可能还不够。从今天开始让我们从物理层往上走,到Linux文件系统原理里去寻找答案。

1 实践出真知

我觉得可能先丢开内核原理,直接动手操作来实验更有意思一些。你一定知道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

这下注意IUsed变成了12785020。

哈哈,我们的一个结论就出来了。新建一个空文件会占用一个Inode。

2 细说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字节。

3 文件名存到哪里了

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号等信息。

4 结论

1. 新建一个空文件需要消耗掉一个inode,用来保存用户、创建时间等元数据。

2. 新建一个空文件还需要消耗掉其所在目录的block中一定的空间,这些空间用来保存文件名,inode号等信息。

所以,看起来新建一个空文件而已,只要你想挖,真的能挖出很多知识的。最后分享一个我们团队里同学遇到的一个故障。我们的一台离线任务机直接歇菜了,重启后排查原因是inode被消耗光了。再追查发现一个进程创建了太多的空日志文件。虽然文件都是空文件,但是inode却被浪费光了。后来让负责的同学修改了创建日志文件的逻辑,删掉了多出来的空文件,该机器恢复正常。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39825
  • Linux
    +关注

    关注

    87

    文章

    10969

    浏览量

    206646
  • 磁盘
    +关注

    关注

    1

    文章

    336

    浏览量

    24872
收藏 人收藏

    评论

    相关推荐

    如何在Ubuntu系统中释放磁盘空间

    这个带有脚本的快速指南有助于清理旧的快照版本,并在 Ubuntu 系统中释放一些磁盘空间
    发表于 10-20 10:27 2194次阅读

    Linux磁盘空间异常爆满,该怎么查?

    在服务器运维过程中,我们时常会遇到这样的情况,收到服务器磁盘空间告警。
    发表于 11-29 09:00 660次阅读

    解决大家Protel99SE文档太大占磁盘空间的方法

    本帖最后由 qq601039293 于 2011-7-19 10:00 编辑 希望这个方法能解决大家的文件太大占用磁盘空间的方法,不喜勿喷,懂得可以无视,希望能帮助新人。{:soso_e100
    发表于 07-19 09:58

    PNA-X校准可以首先检查是否有足够的磁盘空间可用吗

    占用了大量磁盘空间,人们不会太乐意浪费3小时的校准时间在最后失败了。最后,我注意到当我重新启动计算机时,本地C:驱动器上还会出现大约3 GB的额外可用
    发表于 01-15 14:14

    在Linux下增加磁盘空间的步骤

    在给Linux分区时,总是有那么点吝啬,给的空间较小。在使用过程中,装上Matlab等大型软件后,才蓦然发现磁盘已没有空间,不过亡羊补牢为时不晚。Warning:对硬盘分区很危险,要
    发表于 07-11 08:42

    Linux的剩余磁盘空间利用技巧

    Linux利用剩余的磁盘空间
    发表于 07-30 14:28

    电脑磁盘空间不够用?NAS网络存储iSCSI轻松解决!

    ,轻松满足你的数据存储以及简单扩容的需求,举多得。 iSCSI Target 是网络磁盘空间,可以被iSCSI 服务器或NAS 存储设备(iSCSI initiator)通过网络
    发表于 10-12 16:30

    如何在Mac上清理磁盘空间?这些方法你用过了吗

    篓】或者直接将其拖动到废纸篓图标即可卸载。2、清空废纸篓将文件或应用程序移到废纸篓以后,如果没有清空废纸篓,那么仍然会占用大量的磁盘空间。因此可以定期清空废纸篓,右键点击废纸篓图标并选择【清倒废纸
    发表于 09-09 21:05

    请问根目录分区磁盘空间不够了怎么扩充?

    安装了些软件后,根目录磁盘空间使用率已经达到92%了,SD卡是32G的,实际只使用了16G,可不可以扩大根目录分区的容量,把后面16G也给分配到根目录分区?
    发表于 09-13 07:22

    Linux中的可用磁盘空间如何检查?

    跟踪磁盘利用率信息是系统管理员(和其他人)的日常待办事项列表之一。Linux 有一些内置的使用程序来帮助提供这些信息。df 命令意思是 “disk-free”,显示 Linux 系统上可用和已使用的磁盘空间
    的头像 发表于 07-25 18:53 3193次阅读
    Linux中的可用<b class='flag-5'>磁盘空间</b>如何检查?

    通过df命令显示磁盘空间使用情况

    这 df 命令显示文件系统上的设备名称、总块数、总磁盘空间、已用磁盘空间、可用磁盘空间和挂载点信息。
    的头像 发表于 05-16 11:30 1228次阅读

    服务器运维过程收到磁盘空间告警怎么办

    在服务器运维过程中,我们时常会遇到这样的情况,收到服务器磁盘空间告警:
    的头像 发表于 11-03 10:30 1375次阅读

    如何在Linux使用du命令统计目录文件的大小

    du命令是`disk usage`的缩写,打印文件或目录使用的磁盘空间量估算。这对于查找占用大量磁盘空间文件和目录非常有用。
    的头像 发表于 01-04 17:25 5127次阅读

    如何释放VMware虚拟磁盘未使用空间呢?

    在Windows 11中通过VMware安装Ubuntu 22.04做一些Linux相关的学习,刚安装的时候VMware虚拟磁盘空间也就6~7GB,但是没用几天,VMware虚拟磁盘空间就飙升
    的头像 发表于 08-28 10:15 2607次阅读
    如何释放VMware虚拟<b class='flag-5'>磁盘</b>未使用<b class='flag-5'>空间</b>呢?

    linux磁盘空间满了怎么清理

    和告警信息一致,接着我们就是要找到导致磁盘空间满的目录或文件 如何找到占用空间大的目录或文件? 一种比较笨的方法是,在根目录下,通过du -
    的头像 发表于 11-09 11:46 704次阅读
    linux<b class='flag-5'>磁盘空间</b>满了怎么清理