第24集:磁盘空间管理

教学目标

  • 掌握查看磁盘空间使用情况的方法
  • 学会分析磁盘空间占用情况
  • 掌握清理磁盘空间的常用方法
  • 了解磁盘配额管理的基本概念和设置方法
  • 学会监控磁盘空间使用情况
  • 能够解决常见的磁盘空间问题

核心知识点讲解

1. 磁盘空间管理概述

磁盘空间管理是Linux系统管理中的重要组成部分,它涉及到磁盘空间的监控、分析、清理和优化等方面。有效的磁盘空间管理可以确保系统正常运行,避免因磁盘空间不足导致的问题。

2. 查看磁盘空间使用情况

df命令

df命令用于查看文件系统的磁盘空间使用情况。

基本语法:

df [选项]

常用选项:

选项 描述
-h 以人类可读的格式显示(如GB、MB)
-T 显示文件系统类型
-i 显示inode使用情况
-a 显示所有文件系统,包括虚拟文件系统
-x 排除指定类型的文件系统

示例输出解读

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        20G  5.2G   14G  28% /
/dev/sdb1        50G  10G   37G  22% /data

字段说明:

  • Filesystem:文件系统
  • Size:总空间大小
  • Used:已使用空间
  • Avail:可用空间
  • **Use%**:使用百分比
  • Mounted on:挂载点

3. 分析磁盘空间占用

du命令

du命令用于估算文件或目录的磁盘空间使用情况。

基本语法:

du [选项] [文件或目录]

常用选项:

选项 描述
-h 以人类可读的格式显示
-s 显示总计,不显示子目录
-c 显示总计,并在最后显示总和
-a 显示所有文件和目录
--max-depth 指定显示的目录深度

查找大文件和大目录

# 查找当前目录下大于100MB的文件
find . -type f -size +100M -exec ls -lh {} \;

# 查找当前目录下占用空间最大的前10个目录
du -h --max-depth=2 . | sort -hr | head -10

4. 清理磁盘空间

清理临时文件

# 清理/tmp目录下的临时文件
sudo rm -rf /tmp/*

# 清理用户临时目录
tmpreaper 7d ~/.tmp

# 清理系统日志文件
sudo journalctl --vacuum-time=7d

清理包管理器缓存

# Debian/Ubuntu系统
sudo apt clean

# CentOS/RHEL系统
sudo yum clean all

# Fedora系统
sudo dnf clean all

清理旧的内核文件

# 查看已安装的内核
dpkg --list | grep linux-image

# 删除旧内核(保留最新的两个)
sudo apt autoremove --purge

清理Docker相关文件

# 清理未使用的Docker资源
docker system prune -a

# 清理Docker卷
docker volume prune

5. 磁盘配额管理

磁盘配额(Disk Quota)是一种限制用户或组在文件系统上使用的磁盘空间的机制。

启用磁盘配额

  1. 修改/etc/fstab文件

    UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /  ext4  defaults,usrquota,grpquota  0  1
  2. 重新挂载文件系统

    sudo mount -o remount /
  3. 创建配额文件

    sudo quotacheck -cug /
  4. 启用配额

    sudo quotaon /

设置用户配额

# 设置用户的软限制和硬限制
sudo edquota -u username

# 或者使用命令行直接设置
sudo setquota -u username 1000000 2000000 0 0 /

查看配额

# 查看用户配额
quota -u username

# 查看所有用户的配额
sudo repquota /

6. 磁盘空间监控

使用工具监控

  • df命令:定期检查
  • du命令:分析具体目录
  • ncdu:交互式磁盘使用分析工具
  • glances:系统监控工具,包含磁盘空间监控
  • nagios/zabbix:企业级监控系统

设置磁盘空间告警

# 创建简单的磁盘空间监控脚本
#!/bin/bash

THRESHOLD=80

df -h | grep -v tmpfs | grep -v devtmpfs | while read line; do
  USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
  if [ $USAGE -ge $THRESHOLD ]; then
    echo "警告:磁盘空间使用超过阈值!"
    echo $line
  fi
done

7. 常见磁盘空间问题及解决方法

磁盘空间不足

症状

  • 系统报错:"No space left on device"
  • 无法创建新文件或写入数据

解决方法

  • 清理临时文件和日志
  • 删除不需要的文件
  • 移动大文件到其他存储设备
  • 扩展文件系统(如果有未分配的磁盘空间)

inode不足

症状

  • 系统报错:"No space left on device",但df显示有空间
  • 无法创建新文件

解决方法

  • 查找并删除大量小文件
  • 检查/tmp目录是否有大量临时文件
  • 考虑重新格式化文件系统,调整inode比例

大文件占用空间

解决方法

  • 使用find命令查找大文件
  • 检查日志文件是否过大
  • 检查数据库文件是否需要清理
  • 考虑使用压缩或归档的方式存储大文件

8. 磁盘空间管理最佳实践

  1. 定期检查:定期检查磁盘空间使用情况
  2. 设置告警:设置磁盘空间使用阈值告警
  3. 清理策略:制定定期清理策略
  4. 合理分区:根据用途合理规划分区
  5. 使用配额:对多用户系统使用磁盘配额
  6. 监控增长:监控磁盘空间增长趋势
  7. 备份重要数据:定期备份重要数据
  8. 合理使用压缩:对不常用的大文件进行压缩

操作示例

示例1:查看磁盘空间使用情况

# 以人类可读的格式查看所有文件系统
df -h

# 查看文件系统类型和使用情况
df -Th

# 查看inode使用情况
df -i

# 排除tmpfs文件系统
df -h -x tmpfs

# 查看特定挂载点的使用情况
df -h /
df -h /home

示例2:分析磁盘空间占用

# 查看当前目录的总大小
du -sh

# 查看当前目录下各子目录的大小
du -h --max-depth=1

# 查看当前目录下所有文件和目录的大小
du -ah

# 查找当前目录下大于50MB的文件
find . -type f -size +50M -exec ls -lh {} \;

# 查找系统中最大的10个文件
find / -type f -size +100M 2>/dev/null | xargs ls -lh | sort -k5,5hr | head -10

# 分析/home目录的空间使用情况
ncdu /home

示例3:清理磁盘空间

# 清理/tmp目录
sudo rm -rf /tmp/*

# 清理APT缓存
sudo apt clean

# 清理旧的日志文件
sudo find /var/log -name "*.log.*" -delete

# 清理未使用的包
sudo apt autoremove --purge

# 清理Docker未使用的资源
docker system prune -a

# 清理旧的内核文件(CentOS/RHEL)
sudo package-cleanup --oldkernels --count=2

# 清理用户主目录中的缓存
trm -rf ~/.cache/*

示例4:设置磁盘配额

# 1. 编辑/etc/fstab,添加配额选项
# sudo nano /etc/fstab
# 添加usrquota,grpquota选项

# 2. 重新挂载文件系统
sudo mount -o remount /

# 3. 创建配额文件
sudo quotacheck -cug /

# 4. 启用配额
sudo quotaon /

# 5. 设置用户配额
sudo edquota -u username

# 6. 查看配额设置
quota -u username

# 7. 生成配额报告
sudo repquota /

# 8. 设置软限制的宽限期
sudo edquota -t

示例5:监控磁盘空间

# 创建磁盘空间监控脚本
cat > disk_monitor.sh << 'EOF'
#!/bin/bash

THRESHOLD=80
LOG_FILE="/var/log/disk_monitor.log"

echo "[$(date)] 开始检查磁盘空间" >> $LOG_FILE

df -h | grep -v tmpfs | grep -v devtmpfs | while read line; do
  MOUNT=$(echo $line | awk '{print $6}')
  USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
  
  if [ $USAGE -ge $THRESHOLD ]; then
    echo "[$(date)] 警告: $MOUNT 分区使用 $USAGE%,超过阈值 $THRESHOLD%" >> $LOG_FILE
    # 这里可以添加邮件通知或其他告警机制
  else
    echo "[$(date)] 正常: $MOUNT 分区使用 $USAGE%" >> $LOG_FILE
  fi
done

echo "[$(date)] 检查完成" >> $LOG_FILE
echo "------------------------" >> $LOG_FILE
EOF

# 使脚本可执行
chmod +x disk_monitor.sh

# 运行脚本
./disk_monitor.sh

# 将脚本添加到crontab,每天运行一次
# sudo crontab -e
# 添加: 0 0 * * * /path/to/disk_monitor.sh

示例6:解决磁盘空间问题

# 问题1:磁盘空间不足
# 1. 查找大文件
find / -type f -size +100M 2>/dev/null | xargs ls -lh | sort -k5,5hr | head -10

# 2. 清理临时文件
sudo rm -rf /tmp/*

# 3. 清理日志文件
sudo journalctl --vacuum-time=3d

# 问题2:inode不足
# 1. 查看inode使用情况
df -i

# 2. 查找大量小文件
find /tmp -type f | wc -l

# 3. 删除大量小文件
sudo rm -rf /tmp/*

# 问题3:根目录空间不足
# 1. 分析根目录空间使用
cd / && du -h --max-depth=1 | sort -hr

# 2. 检查/var目录
cd /var && du -h --max-depth=1 | sort -hr

# 3. 清理/var/log目录
sudo find /var/log -name "*.log" -exec truncate -s 0 {} \;

课后练习

  1. 基础练习

    • 使用df命令查看系统磁盘空间使用情况
    • 使用du命令分析/home目录的空间占用
    • 清理系统中的临时文件和包管理器缓存
  2. 进阶练习

    • 查找系统中占用空间最大的10个文件
    • 为用户设置磁盘配额
    • 创建一个磁盘空间监控脚本,并添加到crontab
  3. 思考问题

    • 当系统提示"No space left on device"但df显示有空间时,可能是什么原因?
    • 如何区分磁盘空间不足和inode不足的问题?
    • 磁盘配额的软限制和硬限制有什么区别?
    • 如何制定一个有效的磁盘空间清理策略?

总结

本集介绍了Linux系统中磁盘空间管理的相关知识,包括:

  • 使用df命令查看磁盘空间使用情况
  • 使用du命令分析磁盘空间占用情况
  • 清理磁盘空间的常用方法,如清理临时文件、包管理器缓存、旧内核文件等
  • 磁盘配额管理的基本概念和设置方法
  • 磁盘空间监控的工具和方法
  • 常见磁盘空间问题的解决方法
  • 磁盘空间管理的最佳实践

有效的磁盘空间管理是确保Linux系统稳定运行的重要因素。通过本集的学习,您应该能够掌握磁盘空间的监控、分析、清理和管理技巧,从而更好地维护系统的健康状态。在下一集中,我们将介绍Linux系统中文件系统维护的相关知识。

« 上一篇 文件系统挂载 下一篇 » 文件系统维护