Linux有什么工具能自动清理释放存储空间?

作者:Sender Su  来源:原创内容  发布日期:2023-02-08  最后修改日期:2023-02-08

最近出现了几次虚拟机存储空间占满,导致应用服务停止的情况(好吧,明显是管理员没有每天通过宿主机管理界面检查核实资源情况)。

banner

笔者:国际认证信息系统审计师、软考系统分析师

一般地,对于这些在运行 CentOS 7 的虚机,执行一下

yum clean all

就已经可以释放出很多空间。这是因为yum并不会主动清除下载的升级安装包。

但这个操作仅仅只是清理了软件升级包的缓存,如果管理员有洁癖又或者强迫症,想全面清理,这肯定是不够的。

那么在Linux下是否也有类似Windows下那样的存储空间清理软件呢?

只有一个:BleachBit,地址是:

https://www.bleachbit.org/

bleachbit-about

事实上,需要知道的是,在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、覆盖文件内容以防被恢复

bleachbit-settings-1

2、自定义删除路径

bleachbit-settings-2

3、保留特定语言(后面介绍)

bleachbit-settings-4

4、白名单功能。

bleachbit-settings-5

在具体可以清理的软件方面,包括了

  • 常见的桌面软件比如Firefox、Evolution,

  • 系统运维相关的比如dnf/yum缓存的清理

  • 操作历史比如bash、vim历史的清理

  • 按特定文件名的深度搜索

bleachbit-main-1

在实现空间清理的同时,这个软件还提供了基于文件和基于空间的数据擦除功能,可以确保删除的文件不会被通过反删除工具找回来。

bleachbit-main-3

软件提供了自创的CleanerML语法(基于XML的标记语言),用户可以自行设计面向特定情况的清理器,扩展BleachBit的用途。

软件还有社区在创建和维护各种特定的清理器,对于伸手党来说简直就是福音:

https://github.com/az0/cleanerml/

更进一步地,对于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,还支持两种不同的图形化的表示方式:

disk_usage_analyzer-about

disk_usage_analyzer-shape1

disk_usage_analyzer-shape2

但这些软件都是图形化界面,不适合管理员在字符环境下使用。而如果使用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

对该工具更具体的介绍,可以参考作者自己的介绍:

https://www.redhat.com/sysadmin/free-storage-space-linux

最后小结:

在笔者的实践中,无论用哪一个工具执行自动化操作,都必须把工具软件的输出发送到系统日志,然后通过logwatch、postfix、dovecot、aliases以及在管理员PC上的thunderbird等系列软件的组合拳,实现每天一站式收取全部服务器的日志监控邮件,这是高效运维的一种做法,下次详谈。

本栏目相关
  •  2010-01-25 Linux 下的分区调整工具GParted实战
  •  2020-02-27 服务器热加硬盘、热转RAID模式,配合LINUX卷操作实现不重启服务器完成扩容
  •  2023-01-26 Windows服务器折腾安装MegaRAID存储管理器17.05版
  •  2022-02-24 如何安装使用 Broadcom RAID卡命令行管理工具 StorCLI(或称PercCLI)?
  •  2023-02-26 能否用Windows服务器作为路由器?(基本配置篇)
  •  2022-08-02 科幻感满分的终端模拟器eDEX-UI
  •  2022-10-17 安装 MegaRAID 存储管理器集中监控 DAS 存储状态
  •  2023-04-08 Windows 服务器网络性能调优系列网卡篇
  •  2022-12-03 VMware vSphere Hypervisor 6.7 手动升级过程实例
  • 本站微信订阅号:

    微信订阅号二维码

    本页网址二维码:

    本栏目热门内容
  • Acrobat虚拟PDF打印机执行打印时挂起,解决办法竟然...
  • LINKSYS交换机登录WEB界面显示不正确的解决方法
  • 又一次RAID 5阵列故障记录
  • 解决VMware vSphere ESXi 5.0 Update 1 中虚机不能...
  • 修改CentOS发行信息以绕过Dell服务器BIOS更新和DSET...
  • 解决虚拟化运行的 Windows Server 2003 标准版出现...
  • Windows Server 2008 重命名域和域控制器
  • Intel Nehalem CPU Errata 导致 VMWare ESXi(vSpher...
  • 一次很精神的电脑组装过程记录(但不是自己的电脑)...
  • 解决MySQL Cluster 备份总是失败,提示文件已存在的...
  • MegaCli安装及使用杂记
  • 解决WSUS显示客户端不全的问题
  • 解决 VMWare vSphere 6 客户端无法修改用户密码
  • 解决Windows Server 2008 R2域控制器显示无法连接到...
  • 本站服务器RAID 5阵列双硬盘失效挽救记录
  • 网站数据库从MySQL 5.0升级到5.6的记录
  • 解决MariaDB使用Percona XtraBackup增量备份出错
  • DELL PowerEdge 820 报CPU3 INTERNAL ERROR 的解决...
  • Linux 下的分区调整工具GParted实战
  • 修改arpwatch使通知邮件主题显示IP地址
  • 程序员漫画:如何用8种不同的编程语言去解救公主
  • 解决Samba WINS服务的错误解释问题
  • 解决很好用的多合一即时通信软件pidgin的崩溃问题
  • 使用 GParted 进行虚拟机硬盘分区调整操作
  • 解决Squid代理HTTP时在浏览器出现Content Encoding ...
  • 用Delphi编写使用到ADO的DLL的一些问题
  • 网站简单改版
  • 索尼系列手提电脑备份失败,出现700错误的解决办法
  • Dell R900服务器 BMC firmware incompatible with C...
  • 更多...