今天npm updatenpm install的时候,总是 ERR,我看下日志说是空间不足。人麻了,一看还几 G 的空间呢。

症状

总是提示空间不足,
$ xxx xxx xxxx desc: 设备上没有空间
但使用 df -h 命令一看:

$ df -h
文件系统        容量  已用  可用 已用% 挂载点
dev             961M     0  961M    0% /dev
run             971M  9.0M  962M    1% /run
/dev/sda3        26G   16G  8.7G   65% /

看到还有 8.7G 可用

网络搜索一番后,发现是 inode 满了。

百度百科解释:

inode 是 UNIX 操作系统中的一种数据结构,其本质是结构体,它包含了与文件系统中各个文件相关的一些重要信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分配给了 inode 表。

意思是每个文件,都会分配一个 inode 给它,一个设备的 inodes 是有限的,所以不是光看存储空间,还得看 inode 表是否分配满了。

然后我用df -ia命令一看,还真就没了,100%的占用

$ df -ia
文件系统        Inodes 已用(I) 可用(I) 已用(I)% 挂载点
proc                 0       0       0        - /proc
sys                  0       0       0        - /sys
dev             245844     472  245372       1% /dev
run             248479     680  247799       1% /run
efivarfs             0       0       0        - /sys/firmware/efi/efivars
/dev/sda3      1741488 1734148    7340     100% /

由上可见,这个/dev/sda3 的设备空间可用的 inode 是 1741488,用的只剩下 7340 了。

解决方案

要解决问题,先得知道这个问题是怎么来的。

主要有以下几种原因:

  1. 空目录多
  2. 空文件多
  3. 日志文件多
  4. 小文件多

小文件就算一百万个,可能也占用不了你 10G 的空间,空目录同样如此。但一个设备分配的 inode 有限,如果都被这些东西占用了,那就满了,所以要清理一些非必要的文件来释放可用的 inode。

思路有了,要怎么操作?最好的办法就是删除这些文件了。那么就先从日志文件和临时文件下手。

清理不必要的日志文件和临时文件

我个人使用的 Linux 一般情况不看日志文件的,如果有需要看日志的不用删除日志,可以用 find 查找多少天前的日志删除。

# 删除tmp目录的所有文件
sudo find /tmp -type f -exec rm {} \;
# 删除/var/log目录的所有文件
sudo find /var/log -type f -exec rm {} \;

清理空目录

这个还是不建议去操作根目录,如果删除了一些“必要”的空目录,比如 Arch 的 Pacman 包管理器就会报错(尽管不影响啥,但是不好看),需要手动把空文件夹建起来。所以下面的命令是删除家目录里的空文件。

# 遍历寻找0字节的文件,并删除
sudo find /home -type f -size 0 -exec rm {} \;

清理小文件

主要是用for i in /*; do echo $i; find $i | wc -l; done来查看每个文件夹有多少个文件

第一次查找根目录,发现/usr 目录简直多的离谱,直接就快满上了上面df -ia查看的 Inode 临近值。

Littlemoe-PC / # for i in /*; do echo $i; find $i | wc -l; done
/bin
1
……
/proc
220294
/root
165
……
/usr
1673019
/var
4842

第二次查找/usr 目录,发现/usr/share 目录有 1556134 个文件。

Littlemoe-PC /usr # for i in /usr/*; do echo $i; find $i | wc -l; done
/usr/bin
3185
/usr/include
33481
/usr/lib
79201
……
/usr/share
1556134
/usr/src
2

第三次查找/usr/share 目录,!!!我人傻了,居然是/usr/share/icons 目录!

Littlemoe-PC /usr # for i in /usr/share/*; do echo $i; find $i | wc -l; done
……
/usr/share/dhcpcd
6
/usr/share/dict
2
/usr/share/doc
41801
/usr/share/dpkg
……
144
/usr/share/icons
1437420
……
/usr/share/zsh
1174
Littlemoe-PC /usr #

现在知道删哪个了吧?清除/usr/share/icons 里面不需要的图标包……

我也是服了我自己,开头安装的时候乱装了一把图标包,最近 Syyu 的时候好像越更新越装越多了?比如一个图标包,给我分什么红橙黄绿青蓝紫版本,我淦。但我实际一直在用的只有一款,所以我把没用的全部删除了。没想到最小占用的图标包尽然是这次问题的罪魁祸首,我麻了。

删除后的效果:

$ df -ia
文件系统        Inodes 已用(I) 可用(I) 已用(I)% 挂载点
proc                 0       0       0        - /proc
sys                  0       0       0        - /sys
dev             245844     472  245372       1% /dev
run             248479     680  247799       1% /run
efivarfs             0       0       0        - /sys/firmware/efi/efivars
/dev/sda3      1741488  524879 1216609      31% /

所有的一切,都恢复了正常。
又愉快的 npm 和 Syyu 了

总结

这次的问题,由于前期没有重视这个问题(其实压根不知道),贪图图标视觉上的三妻四妾造成这次不可挽回的错误,我承认,我有罪!

通过查找资料解决这个问题,学习到了 inode 的作用,下次查可用空间也应该查下这个才对。

还有就是:文件不规范,inode 两行泪。

End
本文作者:Author:   
文章标题:记一次问题修复:解决 Linux 磁盘空间不足但又足之 inode 爆满问题
本文地址:https://moelitt.ml/archives/36.html     
版权说明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。并皆为“Littlemoe'Blog”原创,转载请保留文章出处。
Last modification:March 27, 2022
如果你觉得我的文章对你有用,请随意赞赏。