资讯动态

磁盘还有空间却写不进去:inode 用尽怎么定位

发布时间:2026/10/13 8:52:29 来源:尧图企业网站定制
授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、空间还有余量文件却建不出来1.1 事情通常是这样开始的靶场练到一半事情卡住了解压一个下载好的靶场包中途停住想新建一个文件试试权限建不出来拉起一个新环境环境自己起不来。这些动作各不相同共同点是——它们都需要往磁盘里写一个新东西。按最直觉的判断这应该是磁盘满了。于是你敲下df -h容量那一栏还有余量——磁盘满了这个解释被自己的命令否掉了可写不进去这件事还在。1.2 三句常见的解释和三句都不够的地方看起来的原因实际该查的账为什么这个解释不够磁盘真的满了容量块的余量容量那一栏明明还有余量这是df -h自己给出的判断刚才的删除没生效删除动作对应的对象删除与写不进去是两件事前者不解释后者统计没刷新重启就好你查的是哪一本账换一个参数看到的就是另一本账不用重启三种解释有个共同的毛病都只把空间当成一件事。而这类现象里空间是两件事——同一个盘上同时记着两本账一本记能装多少字节一本记能放多少个文件对象。你看到的余量只是其中一本的余量。1.3 本文只做一件事判断用尽的是哪一本账本文不写清理教程原因和之前一样清理动作与你的实际环境绑得太紧照搬别人的清单往往是误删而哪些占用可以安全清此前已有专文按分级讲透。本文只回答一个问题当容量还有余量、你却写不进去时怎么判断是不是文件数这一本账出了问题以及确认之后按什么顺序动手。两点先说清楚本文不引任何系统的报错原文一律用描述性说法也不给某个目录必须删的建议原因在第六章。本章可以带走的一句当界面告诉你还有空间、而你却写不进去时第一个该问的问题不是删什么而是用尽的是哪一本账。二、同一块盘上同时存在的两本账2.1 容量那一本按块算的账df -h之所以是所有人的第一反应是因为它回答的问题最直白这块盘还能装多少口径是按字节、按块去数的空间占用。GNU coreutils 的手册把df的口径收在一句选项说明里-i, --inodes的含义是「list inode informationinstead of block usage」列出 inode 信息而不是块用量。这句说明两件事默认df报的是块用量块用量与 inode 信息是互相替代的两套口径不是同一套数字的不同显示方式。2.2 文件数那一本按对象算的账第二本账记的是这个文件系统上还能容纳多少个文件对象计量单位不是字节是个数一个文件对象占多少字节和它消耗几个名额是两件独立的事。这就解释了第一章那个画面——容量账还有余量是因为第二本账先耗尽了。在 macOS 上甚至不用加参数——截至 2026-10-13本机man 1 df对-i的说明写着这个选项现在已经成了默认行为为的是与 Single UNIX Specification 第 3 版SUSv3一致要压掉它得反过来用-I。同一页还补了一个容易忽略的分支如果某个文件系统没有 inode用量百分比那一列显示的是-——第四章会用到这一点。2.3 两条动作两个口径2026-10-13 本机实测df-i/# 表头Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on⚠️代码待验证df-h# 容量那一本账按块算的余量df-i# 文件数那一本账inode 的用量与余量本机实测那一行给出的是 macOS 上的表头结构iused、ifree、%iused三列对应已用文件数、剩余文件数、已用占比。这本账从来不是隐藏的它就在你天天敲的那条命令里只是默认那一栏被块用量占了。后一块里的两条动作本批没有在 Linux 上跑过保留待验证标记。2.4 先划一条分界线本文讲的是宿主这一侧这里要把界线划清楚空间被几本账记着这件事最近被讲过但讲的是另一侧。容器靶场跑起来之后Docker 自己另有一套账——镜像和它的层、可写层、数据卷、构建缓存那一侧有自己的查看命令和分级判据本文不复述也不重复那张表。本文只处理一侧宿主文件系统上的两本账。两者是两把不同的尺子混着量就会得出错误的结论。比较项容器侧那套账另一篇本文这两本账谁在记Docker 自己宿主文件系统用什么看容器侧的专用查看命令df -h与df -i记的是什么镜像、容器、卷、构建缓存各自的占用块用量与文件对象数本文处理吗不处理只在需要时用一句话点到全文只处理这一侧本章可以带走的一句空间从来是两本账——一本按字节数一本按文件个数数df -h与df -i就是分别打开它们的两个参数。三、inode 号既有规范定义也有手册口径3.1 它不是某个工具编出来的概念很多人以为 inode 只是某个命令输出里的一个字段其实它在规范层就有位置。POSIX.1-2024 对stat()的规定里有一句把结构体成员逐个点名For all other file types defined in this volume of POSIX.1-2024, the structure membersst_mode,st_ino,st_dev,st_uid,st_gid,st_atim,st_ctim, andst_mtimshall have meaningful values.st_ino就在这份必须具备有意义取值的成员名单里——文件有一个稳定的编号是规范层面的设定不是某个文件系统随手加的所以文件数这本账可以被一致地观察。3.2 两条查看动作本机实测要看具体编号最顺手的是ls -i。这一条两侧手册都有措辞不同值得对照GNU coreutils 的ls(1)-i, --inode是「print theindex numberof each file」打印每个文件的索引号。本机 macOS 的man 1 ls-i是「For each file, print the file’sfile serial number(inode number).」——正文用的是文件序号括号里才补了一句同位说明。搜资料时不要死磕某个词同一个东西在不同手册里可能换了名字。2026-10-13 本机实测ls-i/tmp/demo.txt# 打印这个文件的编号stat-f%i %N/tmp/demo.txt# %i 就是编号那一项结论只有一句ls -i与stat -f %i %N取到的是同一个编号两条口径殊途同归。需要强调本文只写本批实测到的结构不写任何具体编号、也不做平台结论。3.3 为什么按大小统计的那些动作看不见它因为它统计的是大小大小账和个数账按不同单位在数一个小文件对大小账几乎没有贡献对个数账却贡献整整一个名额。当盘上堆的是又多又小的文件时大小账看起来很平个数账早就见底了。你用一本账的量具量不出另一本账的缺口。这里只说到两本账量具不同为止文件占用的空间和它的大小为什么会对不上是另一条轴上的题目本文不展开。动作它在看哪一本账给你的东西df -h容量按块这块盘还能装多少df -i文件数还能放多少个文件对象ls -i文件数某一个文件对象的编号stat -f %i %N文件数同上编号与名字一起给du一类按大小统计的动作容量一份按大小汇总的账对个数没有直接回答本章可以带走的一句inode 号是规范里就给文件对象准备的编号ls -i看单个、df -i看总量而按大小统计的动作永远量不出个数这一本账。四、为什么文件数建完之后就改不了4.1 一句可以直接当结论用的话如果本文只留一句官方原话应该是这一句。以 ext2/3/4 家族为例mke2fs手册对-i bytes-per-inode的说明里有Be warned thatit is not possible to change this ratio on a file system after it is created, so be careful deciding the correct value for this parameter.这句话解释了整套现象里最难接受的那一部分这不是一个磁盘满了的问题而是一个当初定死了、事后改不了的问题。容量不够还能算算要不要扩文件数不够你连扩这个方向的入口都没有——决定文件总数的那个比例在文件系统创建的那一刻就已经写定了。同一段还给出了比例的算法mke2fs按每bytes-per-inode个字节配一个 inode而且手册写明——比例越大建出来的 inode 越少。也就是说这块盘能放多少个文件在你格式化它的时候就已经算定之后写什么都不再改变这个总数。本文刻意不写比例的默认值也不写小文件多到什么程度会先用尽——本批没有核到官方口径。没有一手依据的数字本文一个都不填。4.2 数量可以覆盖但比例不能改同一条手册还给了另一个选项-N number-of-inodes。它的说明是「Overrides the default calculation of the number of inodes that should be reserved for the file systemwhich is based on the number of blocks and the bytes-per-inode ratio」落脚点是「This allows the user to specify the number of desired inodes directly.」两句放在一起读边界就清楚了能覆盖的是这次按默认算法算出来的数量不能改的是比例本身在创建之后不许动-N是建卷时的一个选择不是事后的补救手段。一个诚实的补充mke2fs在同段里提到调整容量时 inode 数量会跟着比例一起变化——这不影响 4.1 的结论能跟着变的是按这个比例重算一遍比例本身仍然不在事后可改之列。4.3 这条口径的适用范围必须说清楚mke2fs是 ext2/3/4 家族的工具所以 4.1 那一句只在它的适用范围内成立本文不外推到别的文件系统。因为这里有反例macOS 的df(1)手册专门留了一个分支——“如果该文件系统没有 inode用量百分比那一列显示-”见第二章。既然存在没有这套账的文件系统形态就不能反过来说哪个文件系统都一样。机制口径只写 ext2/3/4 家族一手依据来自mke2fs(8)其余文件系统本文不做结论。4.4 想看一个已建好的卷记了多少还有什么动作另有一类动作是直接读文件系统自己的记录。下面两条本批没有实测只用来说明有这一类手段。⚠️代码待验证dumpe2fs-h设备# 只打印超级块信息那一层tune2fs-l设备# 以另一条路径读同一类记录关于dumpe2fs的-h本批留存的手册原文只有一句可依据-h only display the superblock information and not any of the block group descriptor detail information只显示超级块信息不显示块组描述符的细节。这两条命令本批都没有跑过它们输出的具体字段本文一概不写。把这一章的动作按你想要的答案归一下想知道这个盘还剩多少个文件名额用df -i——macOS 侧本机实测Linux 侧待验证想知道某个文件对象的编号用ls -i或stat -f %i %N——本机实测且两者同源至于建卷时按什么比例算、能不能自己定数量答案在mke2fs(8)的-i与-N里本批已逐字核对而一个已建好的卷记了多少要用dumpe2fs -h或tune2fs -l本批未实测。本章可以带走的一句文件总数在创建文件系统的那一刻被一次算定官方手册明说这个比例建成之后不可能更改——所以这条路只能靠少放文件不能靠扩容。五、什么结构最容易先把文件数花完这一章只描述结构不写任何数量一个目录里有多少个文件对象取决于你自己放了什么别人的数字对你没有参考价值。5.1 类型一展开型——一个包变成一片文件最常见的结构手上是一个归档文件它是一个文件对象展开之后变成一整棵目录树树上每个条目都是一个文件对象。压着的时候它占大小那一本账展开之后它同时占两本账尤其吃个数那一本。关键在于一个归档里可以装又多又小的东西——零散脚本、配置、资源文件总字节数可能并不夸张展开出来的对象个数却可能非常可观。5.2 类型二依赖型——层级深、单个体积小、数量多第二类是各种依赖目录和检出目录包管理器铺开的依赖树、版本控制工具留下的内部目录、构建产物目录。结构特征是目录层级深、单个文件很小、文件个数多。这类结构最容易被低估它不是你主动放进去的你只是执行了一条安装或检出命令工具自己把树铺开了。5.3 类型三持续生成型——日志、缓存与临时产物第三类不是一次性展开的而是随时间累积的服务持续写日志、轮转不断产出历史文件、缓存目录里留着一份又一份中间结果、临时目录里堆着不再清理的碎片。5.4 为什么删掉最大的那个文件救不了因为两本账的计量单位不同。大文件在容量账上是重头在个数账上只值一个名额——一个文件无论多大都只消耗一个对象名额。你删掉它容量账立刻见效个数账只回收一格如果告急的本来就是个数的账这一格通常不够。反过来也一样真正吃掉个数账的往往是那些按大小排序时根本看不见的小文件。按大小排序找的是容量账的元凶不是个数账的元凶。结构类型它是什么样为什么吃文件数常见的来源展开型一个归档展开成一整棵目录树归档里可以装大量又小又碎的条目靶场包、归档文件解压依赖型层级深、单个小、数量多的目录树不是主动放的是工具铺开的依赖目录、检出目录、构建产物持续生成型每个不大但一直在增加随时间累积轮转不断产出新文件日志与轮转、缓存、临时目录附带展开容器相关内容在宿主上落地落地时同样会展开出一批文件对象镜像与层的内容这些结构里没有一个可以照着名字去删本章给的是哪一类结构容易出问题不是看到名字就动手怎么处理见下一章。本章的判据与两本账的查看动作可以收在一页里配套资料把块用量与文件数两本账的查看动作、以及第四章的官方口径整理成一页放在资料包里扫码即可获取本章可以带走的一句先把文件数花完的几乎总是又多又小的结构而不是那个最大的文件——所以按大小排序找不到元凶是正常的。六、确认之后怎么动手先量、再定位、再确认、再删这一章给的是动作顺序不是可以照抄的清单。顺序本身就是本章的全部内容。6.1 第一步先量先量两本账目的只有一个确认告急的到底是哪一本。⚠️代码待验证df-h路径# 容量这本账df-i路径# 文件数这本账这里有个顺手的细节把路径作为参数传给df报告的是这个路径所在的那个文件系统。macOS 的df(1)手册把这一点写在开头df显示的是指定已挂载文件系统的统计“or on the file system of which file is a part”或者某个文件所在的那个文件系统。可以把关心的目录直接丢给它先确认它在哪个文件系统上、还剩多少。第一步永远是量不是猜。6.2 第二步再定位确认是个数账告急之后才进入找元凶先看总面积最大的几个目录再问这里面的东西是文件多还是文件大。⚠️代码待验证find目录-xdev-typef|wc-l# 只数文件对象的个数不下探别的挂载点ls-i目录# 看目录里每个条目的编号-xdev是可依赖的写法本批留存的手册对它的说明是「Don’t descend into directories on other devices」不进入位于其它设备上的目录。如果不限制它统计会顺着挂载点跑到别的文件系统上去把别人的账算到自己头上定位从第一步就偏了。这两条动作本批没有在 Linux 上实测过参数写法以你所用系统的手册为准。6.3 第三步再确认定位出一个文件对象特别多的目录之后不要直接删中间必须夹一步确认这些文件对象是不是我确实不再需要的这一步不能省是因为文件多和可以删是两件事上一章列的依赖目录、检出目录、缓存目录里有的可以随时重建有的里面躺着你自己的改动或练习状态。判据不是它占了多少个名额而是我是否还需要它。6.4 第四步再删然后回到第一步到了这一步动作本身反而不重要重要的是三件事一次只动一小块。删完立刻回到第一步复量两本账。个数账的余量有没有回来是判断删对了没有的唯一依据——凭手感删就是第一章里那个删了没变化的循环。不要接受某个目录必删这类建议。任何一篇文章都不可能知道你那台机器上哪些文件是你还要的直接给出删这个目录就好的说法都跳过了前置确认这一步。动手之前想清楚能不能回退。能重建的东西和不能重建的东西处理态度本该不同。第几步做什么只允许用到什么完成后先量两本账各量一遍df -h/df -i确认告急的是哪一本再定位逐层缩小到某个目录find -xdev数个数、ls -i看条目知道对象集中在哪再确认问我是不是真的不要它了你自己的判断得出可动与不可动两组再删分小块处理无动作本身不是重点立刻回到第一步复量本章可以带走的一句顺序是先量、再定位、再确认、再删——跳过前两步是瞎删跳过第三步是乱删。七、总结与自查7.1 一条可以带走的判断链看到写不进去先量两本账而不是先删东西。如果容量账还有余量、个数账见底那就是本文这一类问题。记住方向性结论文件总数在建卷时算定官方明说比例建成之后改不了——所以处理方向是少放对象不是扩容量。用先量、再定位、再确认、再删的顺序动手每一小块处理完立刻复量。这条链子最值钱的地方在第三步很多人卡住不是因为不会敲命令而是方向搞错了——一直在容量账上使劲而告急的其实是个数账。7.2 一份自查清单自查项为什么问这一条我量过df -i了吗还是只看了df -h两本账要用两种量具我确认过这个路径在哪一个文件系统上吗目录可能不在你以为的那个盘上我是在猜元凶还是已经定位到某个目录了第一章那个循环的起点就是猜我要删的这批对象删了之后能重建吗两者处理态度不同我删的是个数账上的对象还是容量账上的删大文件对个数账几乎无用删完我复量了吗不复量就没有判断依据我有没有把容器侧那几本账混进来一起算两把尺子混着量结论一定是错的7.3 本文的使用限制本批实测到的只有 macOS 侧的结构df -i /的表头列名以及ls -i与stat -f %i %N取到同一编号这两件事。文中的 Linux 侧动作df -i、find -xdev、dumpe2fs -h、tune2fs -l一律保留待验证标记。机制口径只覆盖 ext2/3/4 家族一手依据是mke2fs(8)其余文件系统本文不做结论。不写任何比例或阈值数字也不写小文件多到什么程度会先用尽本批没有核到这类数字的官方口径。不引任何报错原文报错文本与发行版、工具版本强相关脱离环境引用没有价值。不给某个目录必删的硬建议只给动作顺序见第六章。本文不含任何攻击步骤、利用载荷与绕过手法只讲环境排查与只读观察。7.4 总结回到开头容量还有余量文件却建不出来。这不是命令写错了而是这块盘上同时记着两本账你先耗尽的是按个数记的那一本。而第二本账的总量在创建文件系统的那一刻就被算定官方手册对此的说法非常直白——建成之后这个比例不可能再改。所以处理方向只有一个让文件对象变少而不是指望空间变大。下面的资料把两本账的查看动作和四步顺序合成了一页配套资料把块用量与文件数两本账的查看动作、官方口径与四步动作顺序合并成一页放在资料包里扫码即可获取本章可以带走的一句先量两本账、再认方向——处理写不进去的第一原则是让对象变少而不是让空间变大。附表 A本文引用事实与官方出处对照表#事实一句出处来源名 具体位置核验日期本文位置1df -i, --inodes的含义是列出 inode 信息而不是块用量man7.org coreutils 9.11df(1)选项说明2026-10-13第 2、3 章2ls -i, --inode的含义是打印每个文件的索引号man7.org coreutils 9.11ls(1)选项说明2026-10-13第 3 章3macOSdf -i的含义是包含已用与空闲 inode 数量的统计本机man 1 dfmacOS-i项2026-10-13第 2 章4若某文件系统没有 inode则用量百分比一列显示-本机man 1 dfmacOS-i项2026-10-13第 2、4 章5-i现已成为默认行为以符合 SUSv3用-I可压掉该输出本机man 1 dfmacOS-i项2026-10-13第 2 章6df显示指定已挂载文件系统的统计或某个文件所在的那个文件系统本机man 1 dfmacOSDESCRIPTION 首段2026-10-13第 6 章7macOSls -i会打印每个文件的文件序号inode 号本机man 1 lsmacOS-i项2026-10-13第 3 章8stat结构体中st_ino属于必须具备有意义取值的成员之一POSIX.1-2024stat()2026-10-13第 3 章9-i bytes-per-inode指定字节/inode比例比例越大创建的 inode 越少man7.orgmke2fs(8)-i项2026-10-13第 4 章10“it is not possible to change this ratio on a file system after it is created”建成之后不可能更改这个比例man7.orgmke2fs(8)-i项2026-10-13第 4、7 章11-N number-of-inodes覆盖默认的 inode 数量计算该计算基于块数与上述比例man7.orgmke2fs(8)-N项2026-10-13第 4 章12调整文件系统容量时inode 数量会随之变化以维持该比例man7.orgmke2fs(8)-i项末句2026-10-13第 4 章13dumpe2fs -h只显示超级块信息不显示块组描述符的细节本批一手留存dumpe2fs(8)手册导出-h项2026-10-13第 4 章14find -xdev的含义是不进入位于其它设备上的目录本批一手留存 findutilsfind(1)手册导出-xdev项2026-10-13第 6 章15df -i /在 macOS 上的输出表头含iused、ifree、%iused三列本机实测macOS2026-10-13 本机实测第 2 章16stat -f %i %N 文件与ls -i 文件取到同一个文件序号本机实测macOS2026-10-13 本机实测第 3 章17本文所有 Linux 侧命令均未实测一律标注代码待验证本文说明2026-10-13全文附表 B术语速查表术语一句话解释易混点inode文件系统里标识一个文件对象的那条记录每个对象对应一条它不是文件大小也不随内容变大而变多inode 号某条 inode 记录的编号规范里由st_ino成员承载macOS 手册正文叫它文件序号同一个东西容量账块用量按字节、按块记的账回答还能装多少与文件数账是两套口径不是同一数字的两种显示文件数账按对象个数记的账回答还能放多少个文件一个文件无论多大都只消耗一个名额df -h与df -i打开两本账的两个参数-i是换成 inode 口径不是额外多显示一列iused/ifreedf -i输出里的已用与剩余文件数两列与块用量那几列不是同一本账%iused已用文件数占总量的百分比那一列有人误当容量百分比没有 inode 时该列显示-bytes-per-inode 比例建卷时每多少字节配一个 inode 号的设定手册明说建成之后不能改能选的只有建卷时那次-N number-of-inodes建卷时直接指定 inode 数量的选项它覆盖的是默认计算的结果不是事后补救手段-xdev统计时不进入挂载在别处的目录不加它统计会把别的文件系统的账算进来代码待验证表示该命令本批没有实际运行过与本机实测相对后者才是本文跑过的动作写在最后这篇用到的资料写这篇文章时我把磁盘空间这件事从头拆了一遍发现真正卡住大家的地方不是命令而是空间其实是两本账这个前提被漏掉了——一本按字节算一本按文件个数算。顺手也整理了几份配套的东西靶场环境对照表DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径Web 安全学习路线图从基础打牢到安全管理四个阶段各学什么常用靶场清单每个靶场练什么、适合哪个阶段资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看环境对照表那一份它是按哪一层出问题、就用哪一把尺子整理的跟本文这两本账的思路是一条线看完再回到你那台机器上跑一遍df -h和df -i比对着看一次以后就不用猜了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑