一、Linux系统维护概述
1.1 为什么需要定期维护
Linux系统作为服务器操作系统的首选,其稳定性和性能很大程度上取决于定期的维护工作。随着时间的推移,系统会产生各种临时文件、日志文件、缓存文件等,这些文件会逐渐占用磁盘空间,影响系统性能。定期进行系统维护,特别是磁盘空间清理,是保障服务器稳定运行的基础工作。
1.2 维护频率建议
根据服务器用途和负载,建议的维护频率:
– 高负载服务器:每周一次
– 中等负载服务器:每两周一次
– 低负载服务器:每月一次
– 桌面系统:每月一次
1.3 维护前准备
在进行任何清理操作前,请务必:
1. 备份重要数据
2. 记录当前系统状态
3. 在测试环境中验证清理脚本
4. 准备回滚方案
二、磁盘空间监控
2.1 查看磁盘使用情况
# 查看所有挂载点的磁盘使用情况
df -h
# 查看inode使用情况
df -i
# 查看指定目录的磁盘使用情况
du -sh /var/log
2.2 找出大文件
# 查找大于100MB的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 查找最大的10个文件或目录
du -ah / | sort -rh | head -n 10
# 按大小排序当前目录下的文件
ls -lhS
2.3 磁盘使用趋势分析
# 安装监控工具
sudo apt install -y ncdu
# 使用ncdu分析磁盘使用情况(交互式)
ncdu /
# 生成磁盘使用报告
du -h / | sort -rh > disk_usage_report.txt
三、系统日志清理
3.1 理解Linux日志系统
Linux使用rsyslog或journald作为日志系统。日志文件通常位于:
– /var/log/ – 传统日志目录
– journalctl – systemd日志系统
3.2 清理传统日志文件
# 查看日志目录大小
du -sh /var/log
# 清理旧的日志文件(.gz压缩文件)
find /var/log -name "*.gz" -mtime +30 -delete
# 清理旧的日志文件(数字轮转文件)
find /var/log -name "*.[0-9]" -mtime +30 -delete
# 清空当前日志文件(不删除文件)
sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/auth.log
3.3 配置日志轮转(logrotate)
编辑 /etc/logrotate.conf 或创建应用特定的配置:
# /etc/logrotate.d/custom
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
3.4 清理systemd日志
# 查看journal日志大小
journalctl --disk-usage
# 清理旧日志(保留最近500MB)
sudo journalctl --vacuum-size=500M
# 清理7天前的日志
sudo journalctl --vacuum-time=7d
四、软件包缓存清理
4.1 Debian/Ubuntu系统
# 清理apt缓存
sudo apt clean
# 清理不再需要的依赖包
sudo apt autoremove -y
# 清理已卸载软件的配置文件
sudo apt purge -y $(dpkg -l | grep "^rc" | awk '{print $2}')
# 查看apt缓存大小
du -sh /var/cache/apt/archives
4.2 RHEL/CentOS系统
# 清理yum缓存
sudo yum clean all
# 清理不再需要的依赖包
sudo yum autoremove -y
# 查看yum缓存大小
du -sh /var/cache/yum
4.3 Fedora系统
# 清理dnf缓存
sudo dnf clean all
# 清理不再需要的依赖包
sudo dnf autoremove -y
# 查看dnf缓存大小
du -sh /var/cache/dnf
五、临时文件清理
5.1 清理/tmp目录
# 查看/tmp目录大小
du -sh /tmp
# 清理/tmp目录下超过7天未访问的文件
find /tmp -type f -atime +7 -delete
# 清理/tmp目录下所有文件(谨慎使用)
rm -rf /tmp/*
5.2 配置tmpfiles.d自动清理
创建 /etc/tmpfiles.d/custom.conf:
# 清理/tmp目录下超过10天未访问的文件
d /tmp 1777 root root 10d
# 清理/var/tmp目录下超过30天未访问的文件
d /var/tmp 1777 root root 30d
5.3 清理用户缓存
# 清理用户缓存目录
rm -rf ~/.cache/*
# 清理浏览器缓存
rm -rf ~/.cache/chromium/*
rm -rf ~/.cache/mozilla/*
# 清理缩略图缓存
rm -rf ~/.cache/thumbnails/*
六、内核清理
6.1 查看已安装的内核
# Debian/Ubuntu
dpkg -l | grep linux-image
# RHEL/CentOS
rpm -qa | grep kernel
6.2 安全删除旧内核
# Debian/Ubuntu - 保留当前和上一个版本
sudo apt purge -y $(dpkg -l | grep linux-image | grep -v $(uname -r) | grep -v "linux-image-generic" | awk '{print $2}')
# RHEL/CentOS
sudo package-cleanup --oldkernels --count=2
6.3 清理内核头文件
# Debian/Ubuntu
sudo apt purge -y $(dpkg -l | grep linux-headers | grep -v $(uname -r | sed 's/-generic//') | awk '{print $2}')
七、应用缓存清理
7.1 Docker清理
# 查看Docker磁盘使用
docker system df
# 清理未使用的镜像、容器、网络和卷
docker system prune -a
# 清理悬空镜像
docker image prune
# 清理未使用的卷
docker volume prune
# 清理构建缓存
docker builder prune
7.2 Snap包清理
# 查看snap包占用的空间
du -h /var/lib/snapd/snaps
# 删除旧版本的snap包
sudo snap list --all | awk '/disabled/{print $1, $3}' | xargs -r sudo snap remove
7.3 浏览器缓存清理(桌面系统)
# Chrome/Chromium
rm -rf ~/.config/google-chrome/Default/Cache/*
rm -rf ~/.config/chromium/Default/Cache/*
# Firefox
rm -rf ~/.mozilla/firefox/*.default/cache2/*
八、数据库清理
8.1 MySQL/MariaDB清理
-- 查看数据库大小
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;
-- 清理二进制日志(保留最近7天)
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
-- 优化表(回收空间)
OPTIMIZE TABLE your_table_name;
8.2 PostgreSQL清理
# 清理VACUUM(回收空间)
sudo -u postgres vacuumdb --all --full
# 清理分析
sudo -u postgres vacuumdb --all --analyze
# 查看数据库大小
sudo -u postgres psql -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"
九、自动化清理脚本
9.1 创建清理脚本
创建 /usr/local/bin/system-cleanup.sh:
#!/bin/bash
# 日志文件
LOGFILE="/var/log/system-cleanup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
log() {
echo "[$DATE] $1" | tee -a $LOGFILE
}
log "开始系统清理..."
# 清理apt缓存
log "清理apt缓存..."
apt clean -y 2>/dev/null
apt autoremove -y 2>/dev/null
# 清理日志
log "清理旧日志..."
find /var/log -name "*.gz" -mtime +30 -delete 2>/dev/null
find /var/log -name "*.[0-9]" -mtime +30 -delete 2>/dev/null
# 清理/tmp
log "清理/tmp目录..."
find /tmp -type f -atime +7 -delete 2>/dev/null
# 清理用户缓存
log "清理用户缓存..."
rm -rf /home/*/.cache/* 2>/dev/null
# 显示清理后的磁盘使用情况
log "清理完成,当前磁盘使用情况:"
df -h / | tee -a $LOGFILE
log "系统清理任务完成"
9.2 设置定时任务
# 设置脚本可执行权限
sudo chmod +x /usr/local/bin/system-cleanup.sh
# 添加到crontab(每周日凌晨2点执行)
sudo crontab -e
# 添加以下行:
# 0 2 * * 0 /usr/local/bin/system-cleanup.sh >> /var/log/system-cleanup-cron.log 2>&1
十、监控与告警
10.1 磁盘空间监控脚本
#!/bin/bash
# /usr/local/bin/disk-alert.sh
THRESHOLD=85 # 阈值百分比
USAGE=$(df -h / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
echo "警告:磁盘空间使用率已达${USAGE}%,请及时清理!" | mail -s "磁盘空间告警" admin@example.com
fi
10.2 添加到crontab
# 每小时检查一次磁盘空间
sudo crontab -e
# 添加以下行:
# 0 * * * * /usr/local/bin/disk-alert.sh
总结
Linux系统维护中的磁盘空间清理是一项持续性的工作。通过本文介绍的方法,您可以:
- 定期监控磁盘使用情况
- 清理系统日志和软件包缓存
- 删除临时文件和旧内核
- 清理应用缓存和数据库
- 自动化清理任务
- 设置监控告警
建议根据实际需求制定清理计划,并定期执行。记住:预防胜于治疗,定期维护可以避免许多潜在问题。
注:本文基于Linux常见发行版(Ubuntu、Debian、CentOS、Fedora)编写,具体命令可能因发行版不同而有所差异。