一、Linux磁盘空间管理基础
1.1 理解Linux磁盘空间
Linux系统将所有内容组织在根目录”/”下的文件系统中。磁盘空间是服务器运行的基础资源,当磁盘空间不足时,系统会出现各种问题,如无法创建新文件、应用运行缓慢甚至崩溃。因此,定期清理Linux系统磁盘空间是运维人员的基本技能。
1.2 查看磁盘使用情况
# 查看总体磁盘使用情况
df -h
# 查看当前目录各子目录大小
du -sh *
# 查看指定目录大小
du -sh /var/log
# 查看最大的10个文件或目录
du -ah / | sort -rh | head -n 10
# 查看磁盘 inode 使用情况
df -i
1.3 常见磁盘空间消耗来源
- 日志文件:系统日志、应用日志持续增长
- 软件包缓存:apt/yum/dnf的缓存文件
- 旧内核:多次更新后积累的老旧内核
- 临时文件:/tmp目录下的临时文件
- 邮件队列:Postfix等邮件服务器的邮件存储
- 数据库文件:MySQL、PostgreSQL等的数据库文件
- 容器镜像:Docker等容器平台存储的镜像
二、日志文件清理
2.1 系统日志清理
Linux系统日志通常位于/var/log目录下:
# 查看日志目录大小
du -sh /var/log
# 查看各类日志文件大小
ls -lhS /var/log/
# 清理旧的日志文件
sudo find /var/log -name "*.gz" -mtime +30 -delete
sudo find /var/log -name "*.[0-9]" -mtime +30 -delete
# 截断日志文件(保留文件但清空内容)
sudo truncate -s 0 /var/log/syslog
# 使用logrotate自动管理日志
sudo nano /etc/logrotate.conf
2.2 logrotate配置示例
# /etc/logrotate.d/myapp 配置示例
/var/log/myapp/*.log {
daily # 每天轮转
rotate 7 # 保留7个旧文件
compress # 压缩旧文件
delaycompress # 延迟压缩
missingok # 忽略文件不存在错误
notifempty # 空文件不轮转
create 0640 www-data www-data # 创建新文件权限
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
2.3 应用日志清理
# Nginx日志清理
sudo truncate -s 0 /var/log/nginx/access.log
sudo truncate -s 0 /var/log/nginx/error.log
sudo systemctl reload nginx
# Apache日志清理
sudo truncate -s 0 /var/log/apache2/access.log
sudo truncate -s 0 /var/log/apache2/error.log
sudo systemctl reload apache2
# MySQL慢查询日志清理
sudo truncate -s 0 /var/log/mysql/slow-query.log
sudo mysqladmin flush-logs
三、软件包缓存清理
3.1 Debian/Ubuntu系统
# 清理apt缓存
sudo apt clean
# 清理不再需要的包
sudo apt autoremove -y
# 清理旧内核(保留当前和上一个版本)
sudo apt autoremove --purge -y
# 清理孤立的配置文件
sudo dpkg --purge $(dpkg -l | grep "^rc" | awk '{print $2}')
# 查看可清理的空间
apt-get check
du -sh /var/cache/apt/archives
3.2 CentOS/RHEL系统
# 清理yum缓存
sudo yum clean all
# 清理缓存目录
sudo yum erase -y $(rpm -qa | grep kernel | grep -v $(uname -r))
# 清理旧内核
sudo package-cleanup -y --oldkernels --count=1
# 查看缓存大小
du -sh /var/cache/yum
3.3 Fedora系统
# 清理dnf缓存
sudo dnf clean all
# 清理不再需要的依赖
sudo dnf autoremove -y
# 清理旧内核
sudo dnf remove -y $(dnf repoquery --installonly --latest-limit=-2 -q)
四、清理临时文件
4.1 /tmp目录清理
# 查看tmp目录大小
du -sh /tmp
# 查找tmp目录下的旧文件(7天以上)
find /tmp -type f -mtime +7
# 删除tmp目录下的旧文件
find /tmp -type f -atime +7 -delete
# 设置tmp目录自动清理(systemd)
sudo nano /etc/tmpfiles.d/tmp.conf
4.2 tmpfiles.d配置示例
# /etc/tmpfiles.d/tmp.conf
# 清理/tmp下10天未访问的文件
D /tmp 1777 root root 10d
# 清理/var/tmp下30天未访问的文件
D /var/tmp 1777 root root 30d
# 清理/run下已停止服务的PID文件
D /run 0755 root root -
4.3 清理其他临时目录
# 清理用户临时目录
rm -rf /home/*/tmp/*
# 清理浏览器缓存
rm -rf ~/.cache/*
# 清理缩略图缓存
rm -rf ~/.cache/thumbnails/*
# 清理旧下载文件
find ~/Downloads -type f -mtime +30 -delete
五、内核清理
5.1 列出当前和旧内核
# 查看当前内核版本
uname -r
# 列出已安装的内核
dpkg -l | grep linux-image
# 列出所有内核版本
ls -la /boot/vmlinuz-*
5.2 安全删除旧内核
# Ubuntu/Debian删除旧内核
sudo apt-get purge -y $(dpkg -l | grep linux-image | grep -v $(uname -r) | awk '{print $2}')
# CentOS删除旧内核
sudo package-cleanup -y --oldkernels
# 确认删除后的状态
dpkg -l | grep linux-image
5.3 防止内核自动更新
# 锁定当前内核版本
sudo apt-mark hold linux-image-$(uname -r)
sudo apt-mark hold linux-headers-$(uname -r)
# 查看已锁定的包
dpkg --get-selections | grep hold
六、大文件定位与清理
6.1 查找大文件
# 查找大于100MB的文件
find / -type f -size +100M -exec ls -lh {} \;
# 查找最大的目录
du -ah / | sort -rh | head -n 20
# 查找特定类型的大文件
find /var -type f -name "*.log" -size +100M
# 查找重复文件(需要安装fdupes)
sudo apt install -y fdupes
fdupes -r /home
6.2 常见大文件位置
| 位置 | 描述 | 清理建议 |
|---|---|---|
| /var/log | 系统和应用日志 | 配置logrotate |
| /var/cache | 缓存文件 | 定期清理 |
| /tmp | 临时文件 | 设置自动清理 |
| /opt | 第三方软件 | 清理旧版本 |
| /home/*/.local | 用户缓存 | 定期清理 |
| /var/lib/docker | Docker数据 | 清理未使用镜像 |
6.3 Docker清理
# 查看Docker磁盘使用
docker system df
# 清理未使用的镜像、容器、网络
docker system prune -a
# 清理悬空镜像
docker image prune
# 清理未使用的卷
docker volume prune
# 清理构建缓存
docker builder prune
# 清理所有未使用的资源
docker system prune --volumes
七、邮件队列清理
7.1 Postfix邮件队列
# 查看邮件队列
sudo mailq
# 查看队列数量
sudo postqueue -p | tail -1
# 删除所有队列中的邮件
sudo postsuper -d ALL
# 删除发送失败的邮件
sudo postsuper -d ALL deferred
# 清理邮件占用的空间
sudo rm -rf /var/spool/postfix/*
sudo rm -rf /var/mail/*
sudo postfix start
7.2 Sendmail邮件队列
# 查看邮件队列
sudo mailq
# 删除所有邮件
sudo rm -rf /var/spool/mqueue/*
# 查看队列统计
sudo sendmail -bp
八、数据库清理
8.1 MySQL/MariaDB
# 登录MySQL
mysql -u root -p
# 查看数据库大小
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;
# 清理二进制日志
PURGE BINARY LOGS BEFORE '2026-01-01';
# 清理慢查询日志
SET GLOBAL slow_query_log = 'OFF';
TRUNCATE TABLE mysql.slow_log;
SET GLOBAL slow_query_log = 'ON';
# 优化数据库表
OPTIMIZE TABLE table_name;
8.2 PostgreSQL
# 清理VACUUM
psql -U postgres -c "VACUUM FULL;"
# 清理分析缓存
psql -U postgres -c "ANALYZE;"
# 清理WAL日志
pg_archieve cleanup
# 查看数据库大小
psql -U postgres -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database;"
九、自动清理脚本
9.1 编写清理脚本
#!/bin/bash
# /usr/local/bin/disk-cleanup.sh
LOGFILE="/var/log/disk-cleanup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
log() {
echo "[$DATE] $1" | tee -a $LOGFILE
}
log "开始磁盘清理..."
# 清理临时文件
log "清理临时文件..."
find /tmp -type f -atime +7 -delete 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
# 清理apt缓存
log "清理apt缓存..."
apt-get clean -y 2>/dev/null
apt-get autoremove -y 2>/dev/null
# 清理Docker(谨慎使用)
# log "清理Docker未使用资源..."
# docker system prune -f 2>/dev/null
# 显示清理后的磁盘使用情况
log "清理完成,当前磁盘使用情况:"
df -h / | tee -a $LOGFILE
log "磁盘清理任务完成"
9.2 设置定时任务
# 设置脚本可执行权限
sudo chmod +x /usr/local/bin/disk-cleanup.sh
# 添加到crontab(每周日凌晨2点执行)
sudo crontab -e
# 添加以下行:
# 0 2 * * 0 /usr/local/bin/disk-cleanup.sh >> /var/log/disk-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
# 发送钉钉/企业微信通知(可选)
# curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"磁盘告警:使用率'$USAGE'%"}}' https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN
fi
10.2 添加监控到crontab
# 每小时检查一次磁盘空间
sudo crontab -e
# 添加以下行:
# 0 * * * * /usr/local/bin/disk-alert.sh
总结
Linux系统磁盘空间管理需要综合运用多种方法:
- 定期清理:建立定期清理机制,使用cron任务自动化执行
- 日志管理:配置logrotate,合理设置日志轮转策略
- 缓存清理:定期清理apt/yum/dnf缓存
- 内核管理:及时删除旧内核,释放boot分区空间
- 监控预警:设置磁盘空间监控,及时发现潜在问题
通过本文介绍的方法和最佳实践,可以有效管理Linux系统的磁盘空间,确保服务器稳定运行。建议根据实际情况制定清理计划,并定期执行清理任务。