磁盘空间已满问题分析与解决方案
您的服务器根分区(/
)和Docker overlay分区已经使用100%空间,这是一个严重问题,需要立即处理。
当前磁盘使用情况分析
从df -h
输出可以看到关键问题:
/dev/mapper/centos-root
50G已用满(100%)- 多个Docker overlay分区也都已用满
/home
分区有大量可用空间(42G中只用了33M)
紧急处理措施
1. 查找大文件/目录
bash
# 查看根目录下占用空间最大的10个目录
sudo du -h --max-depth=1 / | sort -rh | head -n 10
# 查看/var目录占用情况(通常这里占用最多)
sudo du -h --max-depth=1 /var | sort -rh | head -n 10
# 查看根目录下占用空间最大的10个目录
sudo du -h --max-depth=1 / | sort -rh | head -n 10
# 查看/var目录占用情况(通常这里占用最多)
sudo du -h --max-depth=1 /var | sort -rh | head -n 10
2. 清理常见占用空间大的项目
bash
# 清理旧的日志文件
sudo journalctl --vacuum-size=200M # 保留200MB日志
sudo rm -f /var/log/*.gz /var/log/*.old
# 清理Docker资源
docker system prune -a -f # 清理无用的Docker对象
docker volume prune -f # 清理无用的卷
# 清理yum缓存
sudo yum clean all
# 清理旧的日志文件
sudo journalctl --vacuum-size=200M # 保留200MB日志
sudo rm -f /var/log/*.gz /var/log/*.old
# 清理Docker资源
docker system prune -a -f # 清理无用的Docker对象
docker volume prune -f # 清理无用的卷
# 清理yum缓存
sudo yum clean all
3. 临时转移文件到/home
bash
# 例如转移Docker数据到/home
sudo systemctl stop docker
sudo mv /var/lib/docker /home/
sudo ln -s /home/docker /var/lib/docker
sudo systemctl start docker
# 例如转移Docker数据到/home
sudo systemctl stop docker
sudo mv /var/lib/docker /home/
sudo ln -s /home/docker /var/lib/docker
sudo systemctl start docker
中长期解决方案
1. 扩展根分区空间
如果使用LVM(从输出看您确实在用LVM):
bash
# 检查可用物理卷空间
sudo pvdisplay
# 如果有可用空间,可以扩展逻辑卷
sudo lvextend -L +20G /dev/mapper/centos-root # 增加20G
sudo xfs_growfs /dev/mapper/centos-root # 对于XFS文件系统
# 或
sudo resize2fs /dev/mapper/centos-root # 对于ext4文件系统
# 检查可用物理卷空间
sudo pvdisplay
# 如果有可用空间,可以扩展逻辑卷
sudo lvextend -L +20G /dev/mapper/centos-root # 增加20G
sudo xfs_growfs /dev/mapper/centos-root # 对于XFS文件系统
# 或
sudo resize2fs /dev/mapper/centos-root # 对于ext4文件系统
2. 重新分配分区空间
从输出看/home
有大量未使用空间,可以考虑:
bash
# 1. 缩小/home分区
sudo umount /home
sudo lvreduce -L -30G /dev/mapper/centos-home
sudo mkfs.xfs -f /dev/mapper/centos-home # 重新格式化,注意这会删除/home数据
sudo mount /home
# 2. 将释放的空间分配给根分区
sudo lvextend -L +30G /dev/mapper/centos-root
sudo xfs_growfs /dev/mapper/centos-root
# 1. 缩小/home分区
sudo umount /home
sudo lvreduce -L -30G /dev/mapper/centos-home
sudo mkfs.xfs -f /dev/mapper/centos-home # 重新格式化,注意这会删除/home数据
sudo mount /home
# 2. 将释放的空间分配给根分区
sudo lvextend -L +30G /dev/mapper/centos-root
sudo xfs_growfs /dev/mapper/centos-root
3. Docker存储优化
bash
# 修改Docker存储驱动配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=20G"
]
}
EOF
sudo systemctl restart docker
# 修改Docker存储驱动配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=20G"
]
}
EOF
sudo systemctl restart docker
预防措施
设置日志轮转:
bashsudo tee /etc/logrotate.d/docker <<EOF /var/lib/docker/containers/*/*.log { rotate 7 daily compress size=10M missingok delaycompress copytruncate } EOF
sudo tee /etc/logrotate.d/docker <<EOF /var/lib/docker/containers/*/*.log { rotate 7 daily compress size=10M missingok delaycompress copytruncate } EOF
安装监控工具:
bashsudo yum install -y epel-release sudo yum install -y ncdu htop
sudo yum install -y epel-release sudo yum install -y ncdu htop
定期清理脚本:
bashsudo tee /usr/local/bin/cleanup.sh <<EOF #!/bin/bash docker system prune -a -f journalctl --vacuum-size=200M rm -f /var/log/*.gz /var/log/*.old yum clean all EOF sudo chmod +x /usr/local/bin/cleanup.sh
sudo tee /usr/local/bin/cleanup.sh <<EOF #!/bin/bash docker system prune -a -f journalctl --vacuum-size=200M rm -f /var/log/*.gz /var/log/*.old yum clean all EOF sudo chmod +x /usr/local/bin/cleanup.sh
注意事项
- 在执行任何删除操作前,确保您了解这些文件的作用
- 缩小分区前务必备份重要数据
- 如果是生产环境,建议在非高峰期操作
- 考虑设置磁盘空间监控告警
通过以上步骤,您应该能够解决当前磁盘空间已满的问题,并建立预防机制避免再次发生。