最近出现了几次虚拟机存储空间占满,导致应用服务停止的情况(好吧,明显是管理员没有每天通过宿主机管理界面检查核实资源情况)。
笔者:国际认证信息系统审计师、软考系统分析师
一般地,对于这些在运行 CentOS 7 的虚机,执行一下
yum clean all
就已经可以释放出很多空间。这是因为yum并不会主动清除下载的升级安装包。
但这个操作仅仅只是清理了软件升级包的缓存,如果管理员有洁癖又或者强迫症,想全面清理,这肯定是不够的。
那么在Linux下是否也有类似Windows下那样的存储空间清理软件呢?
只有一个:BleachBit,地址是:
事实上,需要知道的是,在Linux下开发“通用”的存储空间清理软件是非常困难和复杂的:
Linux有众多的发行版,每个发行版都有可能因为自己的设计理念,而调整软件包的构成,包括配置文件的位置、运行文件的位置以及库文件的位置等等。
就算把范围缩窄,只是聚焦在单一发行版,比如CentOS,也还是有问题。在不同的大版本序列之间,比如CentOS 6 和 7,7 和 8 之间,软件包版本的差别引致安装后目录结构的差异都不小。
这样就造成了很难实现一个能适用于所有发行版,即使只是面向主流发行版。
BleachBit 花了相当大的努力解决这个问题。从其下载页面可以看到,该软件为支持不同的Linux发行版,相对于Windows只有一个安装包,在Linux方面专门分别实现了
CentOS 7、8
Debian 9、10、11
Fedora 33、34、35
Linux Mint 18.3、19.2、20.1
Ubuntu 16.04、18.04、20.04、21.10
openSUSE Leap 42.3 和 openSUSE Tumbleweed
合共6个发行版、18个具体版本的安装包。
因此,在下载前,确实要先分辨清楚需要面向使用的操作系统发行版。
刚好手头装了台Rocky Linux 8的虚机,于是实验一下BleachBit。在网站上,按CentOS 8版本下载BleachBit的rpm安装包并安装、运行。
从完善程度来说,软件已经做得相当不错。比如在软件首选项内容上,关键几个设置包括有:
1、覆盖文件内容以防被恢复
2、自定义删除路径
3、保留特定语言(后面介绍)
4、白名单功能。
在具体可以清理的软件方面,包括了
常见的桌面软件比如Firefox、Evolution,
系统运维相关的比如dnf/yum缓存的清理
操作历史比如bash、vim历史的清理
按特定文件名的深度搜索
在实现空间清理的同时,这个软件还提供了基于文件和基于空间的数据擦除功能,可以确保删除的文件不会被通过反删除工具找回来。
软件提供了自创的CleanerML语法(基于XML的标记语言),用户可以自行设计面向特定情况的清理器,扩展BleachBit的用途。
软件还有社区在创建和维护各种特定的清理器,对于伸手党来说简直就是福音:
更进一步地,对于Linux系统,BleachBit还提供了一些特别的功能,包括:
清理内存和交换分区:尤其是清理交换分区这个功能相当特别。
删除无效的链接:有经验的Linux系统管理员都知道随着软件包更新,少不了会遗留下一些无效的符号链接。
清理不使用的语言包:Linux多语言的本性导致必然存在不使用的语言包,对于空间极度紧张的场合确实有必要删除。
而对于系统管理员来说,BleachBit提供命令行参数界面,可以在脚本中调用,实现自动化清理。方法也非常简单。
首先观察和了解可以使用的参数,以及提供的清理器:
[root@vm ~]# bleachbit --help
Usage: 用法:bleachbit [选项] 清理器选项1 清理器选项2
Options:
-h, --help show this help message and exit
-l, --list-cleaners 列出清理器
-c, --clean 运行清理程序删除文件并进行其他永久更改
--debug 将日志级别设置为详细
--debug-log=DEBUG_LOG
将调试消息记录到文件
-s, --shred 粉碎指定的文件或文件夹
--sysinfo 显示系统信息
--gui 运行图形界面
-p, --preview 预览要删除的文件和进行的修改
--preset 在图形界面中使用选项组
--all-but-warning 启用所有无警告的选项
-w, --wipe-free-space
擦除给定路径中的可用空间
-v, --version 显示版本信息并退出
-o, --overwrite 覆盖文件来隐藏内容
--context-menu
检查清理器的数量足足有227个,列出来看看:
[root@vm ~]# bleachbit --list-cleaners | wc -l
227
[root@vm ~]# bleachbit --list-cleaners | less
adobe_reader.cache
adobe_reader.mru
adobe_reader.tmp
amsn.cache
amsn.chat_logs
amule.backup
amule.known_clients
amule.known_files
amule.logs
amule.temp
apt.autoclean
apt.autoremove
apt.clean
apt.package_lists
audacious.cache
(以下省略)
打算清空vim程序的历史记录,但不太放心,可以用-p参数预览会被清理的情况:
[root@vm ~]# bleachbit -p vim.history
删除 12.3kB /root/.viminfo
将恢复磁盘空间:12.3kB
要删除的文件:1
确认没有问题,用-c参数执行清理:
[root@vm ~]# bleachbit -c vim.history
删除 12.3kB /root/.viminfo
恢复的磁盘空间:12.3kB
已删除文件:1
就这么简单,作为Linux系统管理员,当然知道下一步就是选择合适的清理程序,把命令写成bash脚本扔到cron.daily每天运行一次就完事了。
看到这里,会有谨慎的系统管理员说,这不行,我对这类软件不完全信任,而且我管理的服务器重点不是清理这些能确定的范畴,而是各种由用户随意上传文件导致占用的空间!这些文件并不能简单地一删了之。
那么也可以看看下面这个小软件:
Top Disk Consumper Report Generator
这是一个还不怎么出名的命令行小程序,用bash脚本写成。这个工具是红帽公司一位相当有经验的高级存储顾问 Kimberly Lazarski 编写的。
顾名思义,这个软件的实质用途其实不是用于清理文件,而是查找出最占用存储空间的文件、目录和已删除的文件,给出报告清单。
本来在Linux的图形界面环境下,有若干类似的软件就是专门用于计算和显示文件夹和文件的存储占用分布的,比如Rocky Linux 8里面预装有的Disk Usage Analyzer,还支持两种不同的图形化的表示方式:
但这些软件都是图形化界面,不适合管理员在字符环境下使用。而如果使用du或者df,输出结果并不直观,需要对输出进行过滤筛选。
因此,Top Disk Consumper Report Generator 就可以填补这个需求空白。
这个小工具检查文件系统,报告总体可用空间、最大的文件、目录和旧文件,以及已删除但空间仍在使用的文件(即孤儿文件空间节点)。
孤儿文件空间节点:这是Linux文件系统的一种意外情况。文件被删除后空间节点没有正确释放,无法从根节点访问到。
安装过程很简单。以下是以下基本步骤(实际生产环境下建议clone到/opt目录下):
[root@vm ~]# dnf install git
[root@vm ~]# git clone https://github.com/klazarsk/storagetoolkit.git
[root@vm ~]# cd storagetoolkit
[root@vm storagetoolkit]# chmod a+x topdiskconsumer
需要时,可以自行设置添加系统路径,又或者在比如/usr/local/bin之类的目录内创建到该软件的符号链接:
[root@vm ~]# ln -s /root/storagetoolkit/topdiskconsumer /usr/local/bin/topdiskconsumer
这个脚本工具会输出文件系统上的总体磁盘使用情况报告,输入内容包括最大的20个文件、最大的20个目录,以及超过30天的20个最大文件,识别孤儿文件空间节点和给出文件句柄,方便管理员回收空间。
工具能输出HTML等格式的报告,还支持一些命令行参数,比较重要的参数包括指定输出文件数量、设定查找过程超时时间、跳过某种检查等。如果文件系统过于庞大,可以考虑使用这些命令行参数以提高检查速度。
下面是一次运行的输出实例:
[root@vm ~]# topdiskconsumer -l 3
#_# BEGIN REPORT
== Server Time at start: ==
2023年 02月 07日 星期二 23:30:00 CST
== Filesystem Utilization on [ / ]: ==
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/rl-root xfs 48G 8.3G 40G 18% /
== Inode Information for [ / ]: ==
文件系统 类型 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/rl-root xfs 25057280 217313 24839967 1% /
== Storage device behind directory [ / ]: ==
/dev/mapper/rl-root
== 3 Largest Files on [ / ]: ==
281M /var/lib/rpm/Packages
208M /usr/lib/locale/locale-archive
163M /var/lib/clamav/main.cvd
== 3 Largest Directories on [ / ]: ==
7.8G 总用量
7.8G /
6.3G /usr
2.6G /usr/share
== 3 Largest Files on [ / ] Older Than 30 Days: ==
208M /usr/lib/locale/locale-archive
163M /var/lib/clamav/main.cvd
145M /usr/lib64/firefox/libxul.so
== 3 Largest Deleted Files on [ / ] With Open Handles: ==
Size COMMAND File Handle Filename
11.0313MB sssd_be /proc/1046/fd/18 /var/lib/sss/mc/initgroups
== Elapsed Time: ==
0h:0m:7s
== Server Time at completion: ==
2023年 02月 07日 星期二 23:30:07 CST
#_# END REPORT
由于作者尚未正式释出release,并且在频繁修改,如果在运行时输出了错误信息,可以尝试较早的的版本或者自行修复,比如笔者测试期间有如下出错信息:
/usr/local/bin/topdiskconsumer: 第 323 行:[: 参数太多
/usr/local/bin/topdiskconsumer:行134: resize: 未找到命令
对于第一条信息,原因是笔者虚机环境的df输出了中文,而判断条件中grep 操作是对英文单词Avail:
[root@vm ~]# df --output=avail /tmp | grep -v Avail
可用
41442220
解决办法是把第323行的
grep -v Avail
修改为
sed '$!d'
即只保留最后一行内容。
对于第二条信息,补充安装resize即可:
[root@vm ~]# dnf install xterm-resize
对该工具更具体的介绍,可以参考作者自己的介绍:
最后小结:
在笔者的实践中,无论用哪一个工具执行自动化操作,都必须把工具软件的输出发送到系统日志,然后通过logwatch、postfix、dovecot、aliases以及在管理员PC上的thunderbird等系列软件的组合拳,实现每天一站式收取全部服务器的日志监控邮件,这是高效运维的一种做法,下次详谈。
本站微信订阅号:
本页网址二维码: