本文档风哥主要介绍Linux磁盘管理相关知识,包括df命令查看磁盘容量、du命令查看目录大小、磁盘监控策略、磁盘清理案例等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 磁盘使用概念与作用
磁盘使用管理是Linux系统管理的重要组成部分。df命令用于查看文件系统磁盘空间使用情况,du命令用于查看目录或文件占用的磁盘空间。合理管理磁盘空间可以确保系统稳定运行。
- 系统稳定性:防止磁盘空间不足导致系统故障
- 性能优化:合理分配磁盘空间提高性能
- 容量规划:为未来增长预留空间
- 故障预防:及时发现和处理磁盘空间问题
1.2 df与du命令区别
df和du命令的区别:
# 1. df命令特点
– 查看文件系统磁盘空间使用情况
– 显示整个文件系统的使用情况
– 包含已挂载的文件系统
– 显示总容量、已用、可用空间
# 2. du命令特点
– 查看目录或文件占用的磁盘空间
– 显示指定目录或文件的使用情况
– 可以递归统计子目录
– 显示实际占用的磁盘块
# 3. df与du对比
特性 df du
查看对象 文件系统 目录/文件
统计方式 文件系统级别 文件级别
显示内容 总容量、已用、可用 占用空间大小
使用场景 查看磁盘整体使用 查看目录占用
# 4. df使用场景
– 查看磁盘空间使用率
– 检查磁盘是否快满
– 查看文件系统挂载点
– 查看文件系统类型
# 5. du使用场景
– 查看目录占用空间
– 查找大文件
– 清理磁盘空间
– 分析磁盘使用
# 6. 常用组合
– df -h:人类可读格式显示磁盘使用
– du -sh *:查看当前目录下各文件/目录大小
– du -h –max-depth=1:查看目录一级子目录大小
1.3 磁盘监控重要性
磁盘监控是系统运维的重要工作:
# 1. 监控指标
– 磁盘使用率
– 磁盘IO性能
– 磁盘剩余空间
– 文件系统类型
# 2. 监控阈值
– 警告阈值:80%
– 严重阈值:90%
– 紧急阈值:95%
# 3. 监控频率
– 实时监控:关键系统
– 定时监控:普通系统
– 手动检查:日常巡检
# 4. 监控工具
– df/du命令
– 监控系统(Zabbix/Prometheus)
– 日志分析
– 自动告警
# 5. 监控策略
– 定期检查磁盘使用率
– 设置自动告警
– 记录历史数据
– 分析增长趋势
# 6. 应急预案
– 磁盘空间不足时的处理流程
– 临时文件清理策略
– 日志文件轮转策略
– 数据迁移方案
Part02-生产环境规划与建议
2.1 磁盘规划原则
在生产环境中,磁盘规划应遵循以下原则:
# 1. 分区规划
/ 根分区 50GB
/boot 引导分区 1GB
/var 日志分区 20GB
/home 用户分区 根据需求
/tmp 临时分区 10GB
/data 数据分区 根据需求
# 2. 空间预留
– 系统分区:预留30%空间
– 数据分区:预留20%空间
– 日志分区:预留40%空间
– 临时分区:预留50%空间
# 3. 文件系统选择
– 系统分区:XFS(RHEL 10默认)
– 数据分区:XFS(大文件)
– 小文件分区:ext4
– 共享存储:GFS2
# 4. LVM规划
– 使用LVM便于扩展
– 预留VG空间
– 配置快照
– 定期备份
# 5. 监控规划
– 设置磁盘使用率告警
– 监控磁盘IO
– 记录历史数据
– 分析增长趋势
# 6. 维护规划
– 定期清理临时文件
– 定期轮转日志文件
– 定期备份数据
– 定期检查磁盘健康
2.2 磁盘告警建议
生产环境磁盘告警建议:
- 设置多级告警阈值
- 区分不同分区告警
- 配置告警通知渠道
- 记录告警历史
- 定期测试告警
- 建立应急响应流程
# 1. 告警阈值配置
警告级别 使用率 处理时间
警告 80% 24小时内
严重 90% 4小时内
紧急 95% 立即处理
# 2. 告警脚本
# cat > /tmp/disk_alert.sh << 'EOF'
#!/bin/bash
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
EMERGENCY_THRESHOLD=95
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output;
do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
partition=$(echo $output | awk '{ print $2 }')
if [ $usep -ge $EMERGENCY_THRESHOLD ]; then
echo "EMERGENCY: $partition is ${usep}% full"
# 发送紧急告警
elif [ $usep -ge $CRITICAL_THRESHOLD ]; then
echo "CRITICAL: $partition is ${usep}% full"
# 发送严重告警
elif [ $usep -ge $WARNING_THRESHOLD ]; then
echo "WARNING: $partition is ${usep}% full"
# 发送警告告警
fi
done
EOF
# 3. 定时任务配置
# crontab -e
*/30 * * * * /tmp/disk_alert.sh
# 4. 告警通知配置
# 邮件通知
# 钉钉通知
# 企业微信通知
# 短信通知
# 5. 告警历史记录
# 记录告警时间、分区、使用率、处理结果
# 6. 告警测试
# 手动触发告警测试
# 验证告警通知
# 验证处理流程
2.3 磁盘审计策略
定期审计磁盘使用情况:
# 1. 创建磁盘审计脚本
# cat > /tmp/disk_audit.sh << 'EOF'
#!/bin/bash
REPORT="/tmp/disk_audit_report.txt"
echo "========================================" > $REPORT
echo “Disk Audit Report – $(date)” >> $REPORT
echo “========================================” >> $REPORT
echo “” >> $REPORT
# 1. 磁盘使用情况
echo “1. Disk Usage” >> $REPORT
echo “————-” >> $REPORT
df -h >> $REPORT
echo “” >> $REPORT
# 2. 磁盘inode使用情况
echo “2. Inode Usage” >> $REPORT
echo “————–” >> $REPORT
df -i >> $REPORT
echo “” >> $REPORT
# 3. 大目录统计
echo “3. Large Directories (>1GB)” >> $REPORT
echo “—————————” >> $REPORT
du -h –max-depth=1 / 2>/dev/null | grep ‘[0-9]G’ | sort -hr >> $REPORT
echo “” >> $REPORT
# 4. 大文件统计
echo “4. Large Files (>100MB)” >> $REPORT
echo “———————–” >> $REPORT
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk ‘{ print $5, $9 }’ | sort -hr >> $REPORT
echo “” >> $REPORT
# 5. 临时文件统计
echo “5. Temporary Files” >> $REPORT
echo “——————” >> $REPORT
du -sh /tmp /var/tmp 2>/dev/null >> $REPORT
echo “” >> $REPORT
# 6. 日志文件统计
echo “6. Log Files” >> $REPORT
echo “————” >> $REPORT
du -sh /var/log/* 2>/dev/null | sort -hr >> $REPORT
echo “” >> $REPORT
# 7. 用户目录统计
echo “7. User Directories” >> $REPORT
echo “——————-” >> $REPORT
for user in $(awk -F: ‘$3 >= 1000 && $3 != 65534 {print $1}’ /etc/passwd); do
home_dir=$(awk -F: -v u=$user ‘$1 == u {print $6}’ /etc/passwd)
if [ -d “$home_dir” ]; then
size=$(du -sh “$home_dir” 2>/dev/null | awk ‘{print $1}’)
echo “$user: $size” >> $REPORT
fi
done
echo “” >> $REPORT
# 8. 磁盘IO统计
echo “8. Disk I/O” >> $REPORT
echo “———–” >> $REPORT
iostat -x 1 3 >> $REPORT
echo “” >> $REPORT
echo “Audit completed. Report saved to $REPORT”
EOF
# 2. 执行审计脚本
# chmod +x /tmp/disk_audit.sh
# /tmp/disk_audit.sh
Audit completed. Report saved to /tmp/disk_audit_report.txt
# 3. 查看审计报告
# cat /tmp/disk_audit_report.txt
Part03-生产环境项目实施方案
3.1 df命令基础操作
df命令用于查看文件系统磁盘空间使用情况:
# 1. 查看所有文件系统磁盘使用情况
# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 917644 0 917644 0% /dev
tmpfs 933024 0 933024 0% /dev/shm
tmpfs 933024 18760 914264 3% /run
tmpfs 933024 0 933024 0% /sys/fs/cgroup
/dev/mapper/rhel-root 52403200 1234567 51168633 3% /
/dev/sda1 1038336 123456 914880 12% /boot
tmpfs 186604 0 186604 0% /run/user/0
# 2. 以人类可读格式显示
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 896M 0 896M 0% /dev
tmpfs 911M 0 911M 0% /dev/shm
tmpfs 911M 19M 892M 3% /run
tmpfs 911M 0 911M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
/dev/sda1 1014M 121M 894M 12% /boot
tmpfs 183M 0 183M 0% /run/user/0
# 3. 查看inode使用情况
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 229411 368 229043 1% /dev
tmpfs 233256 1 233255 1% /dev/shm
tmpfs 233256 510 232746 1% /run
tmpfs 233256 16 233240 1% /sys/fs/cgroup
/dev/mapper/rhel-root 26214400 12345 26202055 1% /
/dev/sda1 524288 326 523962 1% /boot
tmpfs 233256 4 233252 1% /run/user/0
# 4. 查看文件系统类型
# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
devtmpfs devtmpfs 917644 0 917644 0% /dev
tmpfs tmpfs 933024 0 933024 0% /dev/shm
tmpfs tmpfs 933024 18760 914264 3% /run
tmpfs tmpfs 933024 0 933024 0% /sys/fs/cgroup
/dev/mapper/rhel-root xfs 52403200 1234567 51168633 3% /
/dev/sda1 xfs 1038336 123456 914880 12% /boot
tmpfs tmpfs 186604 0 186604 0% /run/user/0
# 5. 查看指定文件系统
# df -h /dev/mapper/rhel-root
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
# 6. 查看指定目录所在文件系统
# df -h /home
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
# 7. 显示总计
# df -h –total
Filesystem Size Used Avail Use% Mounted on
devtmpfs 896M 0 896M 0% /dev
tmpfs 911M 0 911M 0% /dev/shm
tmpfs 911M 19M 892M 3% /run
tmpfs 911M 0 911M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
/dev/sda1 1014M 121M 894M 12% /boot
tmpfs 183M 0 183M 0% /run/user/0
total 3.8G 140M 3.7G 4% –
# 8. 排除指定文件系统类型
# df -h -x tmpfs
Filesystem Size Used Avail Use% Mounted on
devtmpfs 896M 0 896M 0% /dev
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
/dev/sda1 1014M 121M 894M 12% /boot
# 9. 只显示指定文件系统类型
# df -h -t xfs
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
/dev/sda1 1014M 121M 894M 12% /boot
# 10. 显示所有文件系统(包括虚拟文件系统)
# df -a
Filesystem 1K-blocks Used Available Use% Mounted on
sysfs 0 0 0 – /sys
proc 0 0 0 – /proc
devtmpfs 917644 0 917644 0% /dev
securityfs 0 0 0 – /sys/kernel/security
tmpfs 933024 0 933024 0% /dev/shm
…
# 11. 以POSIX格式输出
# df -P
Filesystem 1024-blocks Used Available Capacity Mounted on
devtmpfs 917644 0 917644 0% /dev
tmpfs 933024 0 933024 0% /dev/shm
tmpfs 933024 18760 914264 3% /run
…
# 12. 查看磁盘使用率排序
# df -h | sort -k5 -hr
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1014M 121M 894M 12% /boot
tmpfs 911M 19M 892M 3% /run
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
devtmpfs 896M 0 896M 0% /dev
tmpfs 911M 0 911M 0% /dev/shm
tmpfs 911M 0 911M 0% /sys/fs/cgroup
tmpfs 183M 0 183M 0% /run/user/0
# 13. 查看磁盘使用率超过阈值的分区
# df -h | awk ‘$5+0 > 10 {print $0}’
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 1014M 121M 894M 12% /boot
# 14. 查看本地文件系统
# df -hl
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 50G 1.2G 49G 3% /
/dev/sda1 1014M 121M 894M 12% /boot
# 15. 监控磁盘使用变化
# watch -n 1 df -h
3.2 du命令基础操作
du命令用于查看目录或文件占用的磁盘空间:
# 1. 查看当前目录占用空间
# du
4 ./dir1
4 ./dir2
12 .
# 2. 以人类可读格式显示
# du -h
4.0K ./dir1
4.0K ./dir2
12K .
# 3. 查看指定目录占用空间
# du -h /var/log
4.0K /var/log/private
4.0K /var/log/samba
4.0K /var/log/sssd
…
12M /var/log
# 4. 查看目录总大小
# du -sh /var/log
12M /var/log
# 5. 查看当前目录下各文件/目录大小
# du -sh *
4.0K dir1
4.0K dir2
4.0K file1.txt
4.0K file2.txt
# 6. 查看目录一级子目录大小
# du -h –max-depth=1 /var
4.0K /var/adm
4.0K /var/cache
4.0K /var/crash
4.0K /var/db
4.0K /var/empty
4.0K /var/ftp
4.0K /var/games
4.0K /var/gopher
4.0K /var/kerberos
4.0K /var/lib
4.0K /var/local
12M /var/log
4.0K /var/mail
4.0K /var/nis
4.0K /var/opt
4.0K /var/preserve
0 /var/run
4.0K /var/spool
4.0K /var/tmp
4.0K /var/www
4.0K /var/yp
25M /var
# 7. 查看目录二级子目录大小
# du -h –max-depth=2 /var
4.0K /var/adm
4.0K /var/cache/dnf
4.0K /var/cache/ldconfig
4.0K /var/cache/man
8.0K /var/cache
…
25M /var
# 8. 按大小排序
# du -h /var | sort -hr | head -n 10
25M /var
12M /var/log
8.0K /var/cache
4.0K /var/lib/systemd
4.0K /var/lib/rpm
4.0K /var/lib/rpm-state
4.0K /var/lib/sss
4.0K /var/lib
4.0K /var/log/private
4.0K /var/log/samba
# 9. 查看指定文件大小
# du -h /var/log/messages
4.0K /var/log/messages
# 10. 查看多个文件大小
# du -h /var/log/messages /var/log/secure
4.0K /var/log/messages
4.0K /var/log/secure
# 11. 排除指定目录
# du -h –exclude=/var/log /var
4.0K /var/adm
4.0K /var/cache
…
13M /var
# 12. 只统计指定文件类型
# find /var/log -name “*.log” -exec du -h {} \;
4.0K /var/log/boot.log
4.0K /var/log/dnf.log
4.0K /var/log/dnf.librepo.log
4.0K /var/log/hawkey.log
# 13. 查看目录占用空间(包括硬链接)
# du -l /var/log
4 /var/log/private
4 /var/log/samba
…
12 /var/log
# 14. 查看目录占用空间(显示时间)
# du -h –time /var/log
4.0K 2026-04-02 10:00 /var/log/private
4.0K 2026-04-02 10:00 /var/log/samba
…
12M 2026-04-02 10:00 /var/log
# 15. 查看目录占用空间(按修改时间排序)
# du -h –time /var/log | sort -k2
4.0K 2026-04-02 10:00 /var/log/private
4.0K 2026-04-02 10:00 /var/log/samba
…
12M 2026-04-02 10:00 /var/log
3.3 磁盘管理高级用法
磁盘管理的高级用法和技巧:
# 1. 查找大文件
# find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk ‘{ print $5, $9 }’ | sort -hr
500M /var/lib/mysql/ibdata1
200M /var/log/audit/audit.log
150M /var/lib/docker/overlay2/…
# 2. 查找大目录
# du -h –max-depth=1 / 2>/dev/null | grep ‘[0-9]G’ | sort -hr
5.0G /usr
2.0G /var
1.0G /home
# 3. 查找指定时间内修改的文件
# find /var/log -type f -mtime -7 -exec ls -lh {} \;
-rw——-. 1 root root 4.0K Apr 2 10:00 /var/log/messages
-rw——-. 1 root root 4.0K Apr 2 10:00 /var/log/secure
# 4. 查找并删除临时文件
# find /tmp -type f -mtime +7 -delete
# 5. 查找并删除大文件
# find /var/log -type f -size +100M -delete
# 6. 磁盘使用率监控脚本
# cat > /tmp/disk_monitor.sh << 'EOF'
#!/bin/bash
THRESHOLD=80
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output;
do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
partition=$(echo $output | awk '{ print $2 }')
if [ $usep -ge $THRESHOLD ]; then
echo "Warning: $partition is ${usep}% full"
# 查找大文件
echo "Large files on $partition:"
find $(df -h | grep $partition | awk '{print $NF}') -type f -size +100M -exec ls -lh {} \; 2>/dev/null | head -n 10
fi
done
EOF
# 7. 磁盘清理脚本
# cat > /tmp/disk_cleanup.sh << 'EOF'
#!/bin/bash
echo "Starting disk cleanup..."
# 清理临时文件
echo "Cleaning temporary files..."
find /tmp -type f -mtime +7 -delete
find /var/tmp -type f -mtime +7 -delete
# 清理日志文件
echo "Cleaning old log files..."
find /var/log -type f -name "*.log" -mtime +30 -delete
find /var/log -type f -name "*.gz" -mtime +30 -delete
# 清理包管理器缓存
echo "Cleaning package manager cache..."
dnf clean all
# 清理journal日志
echo "Cleaning journal logs..."
journalctl --vacuum-time=7d
echo "Disk cleanup completed"
df -h
EOF
# 8. 磁盘使用趋势分析
# cat > /tmp/disk_trend.sh << 'EOF'
#!/bin/bash
LOG_FILE="/var/log/disk_usage.log"
# 记录当前磁盘使用情况
echo "$(date): $(df -h / | tail -n 1 | awk '{print $5}')" >> $LOG_FILE
# 显示最近7天的趋势
echo “Disk usage trend (last 7 days):”
tail -n 7 $LOG_FILE
EOF
# 9. 磁盘IO监控
# iostat -x 1 5
Linux 4.18.0-477.el8.x86_64 (localhost) 04/02/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.50 0.00 0.50 0.00 0.00 99.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# 10. 磁盘健康检查
# smartctl -H /dev/sda
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-4.18.0-477.el8.x86_64] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
Part04-生产案例与实战讲解
4.1 不同场景磁盘监控案例
不同场景下的磁盘监控案例:
# 1. Web服务器磁盘监控
# cat > /tmp/web_disk_monitor.sh << 'EOF'
#!/bin/bash
echo "Web Server Disk Monitor - $(date)"
# 检查磁盘使用率
df -h | grep -E '/$|/var|/data'
# 检查日志目录大小
echo ""
echo "Log directory size:"
du -sh /var/log/nginx /var/log/httpd 2>/dev/null
# 检查上传目录大小
echo “”
echo “Upload directory size:”
du -sh /var/www/html/uploads 2>/dev/null
# 检查缓存目录大小
echo “”
echo “Cache directory size:”
du -sh /var/cache/nginx 2>/dev/null
# 检查大文件
echo “”
echo “Large files (>100MB):”
find /var/www -type f -size +100M -exec ls -lh {} \; 2>/dev/null | head -n 10
EOF
# 2. 数据库服务器磁盘监控
# cat > /tmp/db_disk_monitor.sh << 'EOF'
#!/bin/bash
echo "Database Server Disk Monitor - $(date)"
# 检查磁盘使用率
df -h | grep -E '/$|/data|/var'
# 检查数据目录大小
echo ""
echo "Data directory size:"
du -sh /var/lib/mysql /var/lib/pgsql 2>/dev/null
# 检查日志目录大小
echo “”
echo “Log directory size:”
du -sh /var/log/mysql /var/log/pgsql 2>/dev/null
# 检查备份目录大小
echo “”
echo “Backup directory size:”
du -sh /backup 2>/dev/null
# 检查大文件
echo “”
echo “Large files (>1GB):”
find /var/lib/mysql /var/lib/pgsql -type f -size +1G -exec ls -lh {} \; 2>/dev/null | head -n 10
EOF
# 3. 应用服务器磁盘监控
# cat > /tmp/app_disk_monitor.sh << 'EOF'
#!/bin/bash
echo "Application Server Disk Monitor - $(date)"
# 检查磁盘使用率
df -h | grep -E '/$|/opt|/data|/var'
# 检查应用目录大小
echo ""
echo "Application directory size:"
du -sh /opt/app 2>/dev/null
# 检查日志目录大小
echo “”
echo “Log directory size:”
du -sh /var/log/app 2>/dev/null
# 检查数据目录大小
echo “”
echo “Data directory size:”
du -sh /data/app 2>/dev/null
# 检查临时目录大小
echo “”
echo “Temporary directory size:”
du -sh /tmp /var/tmp 2>/dev/null
# 检查大文件
echo “”
echo “Large files (>500MB):”
find /opt/app /data/app -type f -size +500M -exec ls -lh {} \; 2>/dev/null | head -n 10
EOF
# 4. 文件服务器磁盘监控
# cat > /tmp/file_disk_monitor.sh << 'EOF'
#!/bin/bash
echo "File Server Disk Monitor - $(date)"
# 检查磁盘使用率
df -h | grep -E '/$|/data|/shared'
# 检查共享目录大小
echo ""
echo "Shared directory size:"
du -sh /shared/* 2>/dev/null
# 检查用户目录大小
echo “”
echo “User directory size:”
for user in $(awk -F: ‘$3 >= 1000 && $3 != 65534 {print $1}’ /etc/passwd); do
home_dir=$(awk -F: -v u=$user ‘$1 == u {print $6}’ /etc/passwd)
if [ -d “$home_dir” ]; then
size=$(du -sh “$home_dir” 2>/dev/null | awk ‘{print $1}’)
echo “$user: $size”
fi
done
# 检查大文件
echo “”
echo “Large files (>1GB):”
find /shared /home -type f -size +1G -exec ls -lh {} \; 2>/dev/null | head -n 10
EOF
# 5. 容器服务器磁盘监控
# cat > /tmp/container_disk_monitor.sh << 'EOF'
#!/bin/bash
echo "Container Server Disk Monitor - $(date)"
# 检查磁盘使用率
df -h | grep -E '/$|/var'
# 检查Docker目录大小
echo ""
echo "Docker directory size:"
du -sh /var/lib/docker 2>/dev/null
# 检查容器镜像大小
echo “”
echo “Container images:”
docker images –format “table {{.Repository}}\t{{.Tag}}\t{{.Size}}” 2>/dev/null
# 检查容器日志大小
echo “”
echo “Container logs:”
find /var/lib/docker/containers -name “*-json.log” -exec ls -lh {} \; 2>/dev/null | head -n 10
# 检查大文件
echo “”
echo “Large files (>1GB):”
find /var/lib/docker -type f -size +1G -exec ls -lh {} \; 2>/dev/null | head -n 10
EOF
4.2 磁盘清理案例
磁盘清理的实际案例:
# 1. 清理系统临时文件
# cat > /tmp/cleanup_temp.sh << 'EOF'
#!/bin/bash
echo "Cleaning temporary files..."
# 清理/tmp目录
find /tmp -type f -mtime +7 -delete
find /tmp -type d -empty -delete
# 清理/var/tmp目录
find /var/tmp -type f -mtime +30 -delete
find /var/tmp -type d -empty -delete
echo "Temporary files cleaned"
EOF
# 2. 清理日志文件
# cat > /tmp/cleanup_logs.sh << 'EOF'
#!/bin/bash
echo "Cleaning log files..."
# 清理旧日志文件
find /var/log -type f -name "*.log" -mtime +30 -delete
find /var/log -type f -name "*.gz" -mtime +30 -delete
find /var/log -type f -name "*.old" -mtime +30 -delete
# 清空大日志文件
find /var/log -type f -name "*.log" -size +100M -exec truncate -s 0 {} \;
# 清理journal日志
journalctl --vacuum-time=7d
echo "Log files cleaned"
EOF
# 3. 清理包管理器缓存
# cat > /tmp/cleanup_package.sh << 'EOF'
#!/bin/bash
echo "Cleaning package manager cache..."
# 清理DNF缓存
dnf clean all
# 清理旧内核
package-cleanup --oldkernels --count=2
# 清理未安装的包
dnf autoremove
echo "Package manager cache cleaned"
EOF
# 4. 清理Docker
# cat > /tmp/cleanup_docker.sh << 'EOF'
#!/bin/bash
echo "Cleaning Docker..."
# 删除未使用的镜像
docker image prune -a -f
# 删除未使用的容器
docker container prune -f
# 删除未使用的卷
docker volume prune -f
# 删除未使用的网络
docker network prune -f
# 删除构建缓存
docker builder prune -a -f
echo "Docker cleaned"
EOF
# 5. 清理应用缓存
# cat > /tmp/cleanup_app.sh << 'EOF'
#!/bin/bash
echo "Cleaning application cache..."
# 清理应用缓存目录
find /opt/app/cache -type f -mtime +7 -delete
find /opt/app/tmp -type f -mtime +7 -delete
# 清理会话文件
find /opt/app/sessions -type f -mtime +1 -delete
# 清理上传临时文件
find /opt/app/uploads/tmp -type f -mtime +1 -delete
echo "Application cache cleaned"
EOF
# 6. 完整磁盘清理
# cat > /tmp/full_cleanup.sh << 'EOF'
#!/bin/bash
echo "Starting full disk cleanup..."
# 记录清理前磁盘使用
echo "Before cleanup:"
df -h
# 执行各项清理
/tmp/cleanup_temp.sh
/tmp/cleanup_logs.sh
/tmp/cleanup_package.sh
/tmp/cleanup_docker.sh
/tmp/cleanup_app.sh
# 记录清理后磁盘使用
echo ""
echo "After cleanup:"
df -h
echo "Full disk cleanup completed"
EOF
# chmod +x /tmp/full_cleanup.sh
# /tmp/full_cleanup.sh
4.3 磁盘故障排查案例
磁盘相关故障的排查和解决:
# 案例1:磁盘空间不足
# 症状:提示”No space left on device”
# 排查步骤:
# 1. 检查磁盘使用率
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 50G 50G 0 100% /
# 2. 查找大文件
# find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | head -n 10
-rw——-. 1 root root 5.0G Apr 2 10:00 /var/log/audit/audit.log
-rw——-. 1 root root 2.0G Apr 2 10:00 /var/log/messages
# 3. 查找大目录
# du -h –max-depth=1 / 2>/dev/null | grep ‘[0-9]G’ | sort -hr
5.0G /var
2.0G /usr
1.0G /home
# 解决:清理大文件或扩展磁盘
# 案例2:inode耗尽
# 症状:磁盘有空间但无法创建文件
# 排查步骤:
# 1. 检查inode使用率
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/rhel-root 26214400 26214400 0 100% /
# 2. 查找大量小文件
# find / -type d -exec sh -c ‘echo “$(find “$1” -type f | wc -l) $1″‘ _ {} \; 2>/dev/null | sort -nr | head -n 10
1000000 /var/log/small_files
500000 /tmp/test
# 解决:删除大量小文件
# 案例3:磁盘IO性能问题
# 症状:系统响应缓慢
# 排查步骤:
# 1. 检查磁盘IO
# iostat -x 1 5
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 1000.00 500.00 8000.00 4000.00 0.00 0.00 0.00 0.00 50.00 50.00 75.00 8.00 8.00 0.67 100.00
# 2. 检查IO等待
# top
%Cpu(s): 0.5 us, 0.5 sy, 0.0 ni, 49.0 id, 50.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 解决:优化磁盘IO或升级硬件
# 案例4:文件系统只读
# 症状:无法写入文件
# 排查步骤:
# 1. 检查文件系统挂载
# mount | grep “on / ”
/dev/mapper/rhel-root on / type xfs (ro,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
# 2. 检查文件系统错误
# dmesg | grep -i error
XFS (dm-0): metadata I/O error
# 解决:修复文件系统或重新挂载
# 案例5:磁盘空间统计不准确
# 症状:df显示空间不足,但du显示空间充足
# 排查步骤:
# 1. 检查已删除但未释放的文件
# lsof | grep deleted
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 4w REG 253,0 10000 1234 /var/log/nginx/access.log (deleted)
# 解决:重启进程或强制释放文件
# 案例6:LVM空间不足
# 症状:LVM卷空间不足
# 排查步骤:
# 1. 检查VG空间
# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz–n- <50.00g 0
# 2. 检查LV使用
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root rhel -wi-ao---- <45.00g
swap rhel -wi-ao---- 5.00g
# 解决:添加物理卷或扩展VG
# 案例7:磁盘挂载失败
# 症状:无法挂载磁盘
# 排查步骤:
# 1. 检查磁盘设备
# fdisk -l
# 2. 检查文件系统
# blkid
# 3. 检查挂载点
# mount -a
mount: /data: mount(2) system call failed: Structure needs cleaning.
# 解决:修复文件系统
# 案例8:磁盘配额限制
# 症状:用户无法写入文件
# 排查步骤:
# 1. 检查磁盘配额
# repquota /home
# 2. 检查用户配额
# quota -u username
# 解决:调整配额或清理文件
# 案例9:NFS挂载问题
# 症状:NFS挂载卡住
# 排查步骤:
# 1. 检查NFS服务
# showmount -e nfs-server
# 2. 检查网络连接
# ping nfs-server
# 3. 检查NFS挂载
# mount -t nfs nfs-server:/data /mnt
# 解决:检查NFS服务和网络
# 案例10:磁盘阵列故障
# 症状:RAID阵列降级
# 排查步骤:
# 1. 检查RAID状态
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1](F)
52428672 blocks super 1.2 [2/1] [_U]
# 2. 检查磁盘状态
# mdadm --detail /dev/md0
# 解决:更换故障磁盘并重建RAID
Part05-风哥经验总结与分享
5.1 磁盘管理最佳实践
# 1. 磁盘监控原则
– 定期检查磁盘使用率
– 设置自动告警
– 记录历史数据
– 分析增长趋势
# 2. 磁盘清理原则
– 定期清理临时文件
– 定期清理日志文件
– 定期清理缓存文件
– 定期清理旧文件
# 3. 磁盘规划原则
– 合理分区
– 预留空间
– 使用LVM
– 定期备份
# 4. 磁盘告警原则
– 设置多级告警
– 区分不同分区
– 配置通知渠道
– 建立应急流程
# 5. 磁盘安全原则
– 定期检查磁盘健康
– 监控磁盘IO
– 记录磁盘变更
– 建立应急预案
5.2 常见问题与解决
# 问题1:磁盘空间不足
# 解决:查找并清理大文件
# find / -type f -size +100M -exec ls -lh {} \;
# 问题2:inode耗尽
# 解决:查找并删除大量小文件
# find / -type d -exec sh -c ‘echo “$(find “$1” -type f | wc -l) $1″‘ _ {} \;
# 问题3:磁盘IO性能问题
# 解决:优化磁盘IO或升级硬件
# iostat -x 1 5
# 问题4:文件系统只读
# 解决:修复文件系统或重新挂载
# mount -o remount,rw /
# 问题5:磁盘空间统计不准确
# 解决:检查已删除但未释放的文件
# lsof | grep deleted
# 问题6:LVM空间不足
# 解决:添加物理卷或扩展VG
# vgs, lvs
# 问题7:磁盘挂载失败
# 解决:检查磁盘设备和文件系统
# fdisk -l, blkid
# 问题8:磁盘配额限制
# 解决:调整配额或清理文件
# repquota, quota
# 问题9:NFS挂载问题
# 解决:检查NFS服务和网络
# showmount -e, ping
# 问题10:磁盘阵列故障
# 解决:更换故障磁盘并重建RAID
# cat /proc/mdstat, mdadm –detail
5.3 磁盘管理工具推荐
- 基本工具:df, du, ls, find
- 分区工具:fdisk, parted, gdisk
- LVM工具:pvcreate, vgcreate, lvcreate
- 文件系统工具:mkfs, xfs_admin, tune2fs
- 监控工具:iostat, iotop, dstat
# 1. 查看磁盘使用
# df -h
# du -sh *
# 2. 查找大文件
# find / -type f -size +100M -exec ls -lh {} \;
# 3. 查找大目录
# du -h –max-depth=1 / | grep ‘[0-9]G’ | sort -hr
# 4. 监控磁盘IO
# iostat -x 1 5
# iotop
# 5. 检查磁盘健康
# smartctl -H /dev/sda
# 6. 检查文件系统
# xfs_repair -n /dev/sda1
# e2fsck -n /dev/sda1
# 7. LVM管理
# vgs, lvs, pvs
# 8. 磁盘分区
# fdisk -l
# parted -l
# 9. 挂载管理
# mount, umount
# blkid
# 10. 磁盘配额
# repquota, quota, setquota
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
