如何解决服务器存储 inode 耗尽的问题
创始人
2024-03-02 16:58:06
0

今天群里一朋友遇到这样一个问题,明明硬盘只用了 30% 左右的空间,但是却无法写入文件。使用 df -iT 命令查看文件系统使用情况时,发现根目录的 inode 使用率竟然是 100%。后来通过聊天得知,原来他的服务器主要用于存储 1KB 左右的小文件,这一下就破案了。

inode 主要用来记录文件的属性,及此文件的数据所在的块编号。每一个文件会占用一个 inode,因此如果都是小文件的话,那么就会出现 inode 已经耗尽,但文件系统还有很大的空闲空间,从而无法写入新文件。

如何获得更多的 inode

其实在创建 ext4 文件系统时,我们可以使用 -T small 参数来获得更多的 inode,从而优化对小文件的存储。接下来我们通过一个示例来看看效果。

这是两块相同大小的硬盘:

root@debian:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0    1G  0 disk
└─sdb1   8:17   0 1023M  0 part
sdc      8:32   0    1G  0 disk
└─sdc1   8:33   0 1023M  0 part

首先使用默认参数给 /dev/sdb1 创建文件系统:

root@debian:~# /sbin/mkfs.ext4 /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 261888 4k blocks and 65536 inodes
Filesystem UUID: 8935c902-df71-4808-b547-c85b6fd37a46
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

从输出中可见,该文件系统有 261888 个 4KB 大小的块和 65536 个 inode。

然后使用 -T 参数对 /dev/sdc1 创建文件系统:

root@debian:~# /sbin/mkfs.ext4 -T small /dev/sdc1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 1047552 1k blocks and 262144 inodes
Filesystem UUID: f521096d-a5a1-41c9-bbf7-e6102e74e87a
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553,
        1024001

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

从输出中可见,该文件系统有 1047552 个 1KB 大小的块和 262144 个 inode。

也可以通过以下方式对比两个文件系统的 inode 数量:

root@debian:~# mkdir default small
root@debian:~# mount /dev/sdb1 default/
root@debian:~# mount /dev/sdc1 small/
root@debian:~# df -iT
Filesystem     Type      Inodes IUsed   IFree IUse% Mounted on
/dev/sdb1      ext4       65536    11   65525    1% /root/default
/dev/sdc1      ext4      262144    11  262133    1% /root/small

从以上示例中我们可以看出,在使用 -T small 参数后,inode 数量多了近 20 万个!

注意: 这样做也是有代价的。在使用默认参数创建 ext4 文件系统时,默认数据块大小为 4KB,而使用 -T small 参数后,数据块大小为 1KB。这就意味着我们存储一个同样大小的文件,使用 -T small 参数创建的文件系统存储该数据时,占用的数据块更多,数据更分散,如果文件较大,会直接影响文件的读取速度

mke2fsmkfs.ext4)的 -T 参数指定了如何使用该文件系统,以便 mke2fs 可以为该用途选择最佳的文件系统参数,其支持的使用类型在配置文件 /etc/mke2fs.conf 中定义,可以使用逗号分隔指定一个或多个使用类型

inode 不足的解决方法

当你已有的文件系统上出现 inode 不足的问题时,除了备份数据、重建分区并恢复分区数据外,还有两种临时解决方案:

1、删除文件大小为 0 的空文件,可以使用如下命令查找:

find PATH -name "*" -type f -size 0c 

注意: 使用 -size 参数时,不要用 -size 1k,这个表示占用空间为 1KB,而不是文件大小为 1KB,应该使用 -size 1024c 才表示文件大小为 1KB。

2、可以定期对历史小文件进行打包、归档,以减少文件数量。


作者简介:一个喜欢瞎折腾的 IT 技术人员,懂得不多,但是喜欢和有共同兴趣爱好的朋友交流、学习

(题图:MJ/9a66155a-772e-41f1-b29d-c3d4161f7853)


via: http://www.yanjun.pro/?p=128 作者:老颜随笔 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

相关内容

安装CentOS至联想36...
核心配置确认与环境准备 对于联想ThinkSystem SR365...
2025-06-10 11:40:26
海信宣布:开源66项三筒洗...
当技术从“护城河”变成“铺路石”,当竞争从“零和博弈”转向“生态共...
2025-06-03 13:10:45
Flink- 物理分区、S...
物理分区         随机分区(shuffle&...
2025-06-01 15:16:47
Win11的两个实用技巧系...
Win11怎么把C盘分成几个盘?Win11电脑磁盘分区的方法近期有...
2025-05-31 02:52:07
如何在CentOS上完整安...
安装CentOS前的必要步骤 在开始安装CentOS之前,请确保已...
2025-05-20 07:18:31
在CentOS系统执行纯文...
对于需要在服务器或低配置设备上部署操作系统的用户来说,选择文本模式...
2025-04-21 06:17:42

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...