硬盘有问题怎么排查
2025/12/21大约 6 分钟
硬盘有问题怎么排查
核心排查思路
硬盘问题通常分为硬件故障(坏道、接口异常、机械损坏)和软件问题(文件系统损坏、I/O 瓶颈、权限错误)。排查按"空间 → 性能 → 健康度 → 文件系统"逐层深入。
第一步:检查磁盘空间
# 查看分区使用情况
df -h
# 找出占用大目录(从根目录开始)
du -sh /* | sort -rh | head -10
du -sh /var/* | sort -rh | head -10
# 找出大文件(> 1GB)
find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null
# 查看 inode 使用(文件数量限制)
df -i常见问题:
- 空间满导致无法写入:清理日志
/var/log、临时文件/tmp、缓存。 - inode 耗尽:大量小文件导致,即使空间足够也无法创建文件。
第二步:检查磁盘性能
# 查看磁盘 I/O 统计
iostat -x 2 5
# 关键指标:
# - %util > 80%:磁盘接近饱和
# - await > 100ms:平均等待时间高,I/O 慢
# - r/s, w/s:每秒读写次数
# 实时监控磁盘 I/O
iotop -o
# 找出高 I/O 的进程
# 查看磁盘读写速度
hdparm -Tt /dev/sda
# 或用 dd 测试
dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct性能问题判断:
- 高 %util + 高 await → 磁盘过载或硬件故障
- 高 r/s 或 w/s 但低吞吐 → 大量小 I/O,随机访问
- 低吞吐 + 低 IOPS → 可能是机械硬盘或硬件故障
第三步:检查硬件健康度
# 查看 SMART 信息(Self-Monitoring, Analysis and Reporting Technology)
smartctl -a /dev/sda
# 关键指标:
# - Reallocated_Sector_Ct:重新分配扇区数(坏道),应为 0
# - Current_Pending_Sector:待处理扇区(不稳定),应为 0
# - Offline_Uncorrectable:不可修复扇区,应为 0
# - UDMA_CRC_Error_Count:传输错误,线缆或接口问题
# - Temperature_Celsius:温度,应 < 50°C
# 运行 SMART 自检
smartctl -t short /dev/sda # 短测(几分钟)
smartctl -t long /dev/sda # 长测(几小时)
# 查看测试结果
smartctl -l selftest /dev/sda
# 查看内核日志中的硬盘错误
dmesg | grep -i "error\|fail\|sda"
journalctl -k | grep -i "I/O error"硬件故障判断:
- 坏道数 > 0:硬盘开始损坏,需尽快备份迁移
- 温度过高:散热问题,可能导致性能下降
- UDMA 错误多:SATA 线缆或主板接口问题
第四步:检查文件系统
# 查看文件系统挂载状态
mount | grep /dev/sda
cat /etc/fstab
# 查看文件系统错误(只读模式通常是检测到错误)
dmesg | grep -i "read-only\|remount"
# 检查文件系统(必须卸载或只读挂载)
# ext4/ext3
umount /dev/sda1
fsck -n /dev/sda1 # -n 只检查不修复
fsck -y /dev/sda1 # -y 自动修复
# xfs(需卸载)
umount /dev/sda1
xfs_repair -n /dev/sda1 # 只检查
xfs_repair /dev/sda1 # 修复
# 查看文件系统类型和详情
lsblk -f
blkid /dev/sda1
tune2fs -l /dev/sda1 # ext4 详细信息文件系统问题:
- 只读挂载:系统检测到错误自动保护,需 fsck 修复
- 无法挂载:超级块损坏、文件系统类型不匹配
- 目录损坏:inode 错误,需 fsck 修复
第五步:查看系统日志
# 内核日志(硬件错误)
dmesg -T | tail -100
dmesg | grep -i "sda\|ata\|scsi"
# 系统日志
journalctl -xe
journalctl -u systemd-fsck@dev-sda1
# 传统 syslog
tail -100 /var/log/messages
tail -100 /var/log/syslog
grep -i "error\|fail" /var/log/kern.log日志关键字:
- "I/O error":读写错误
- "bad block":坏道
- "medium error":介质错误
- "read-only file system":只读
- "unable to read superblock":超级块损坏
快速排查流程总结
1. 空间检查
df -h && df -i
↓ 空间/inode 满 → 清理文件
2. 性能检查
iostat -x 2 5
iotop -o
↓ I/O 慢 → 找出高 I/O 进程,优化应用
3. 硬件检查
smartctl -a /dev/sda
dmesg | grep sda
↓ 坏道/硬件错误 → 备份数据,更换硬盘
4. 文件系统检查
fsck -n /dev/sda1
↓ 文件系统损坏 → 修复或恢复数据
5. 日志确认
journalctl -xe
dmesg -T
↓ 根据错误信息针对性处理应急处理措施
1. 硬盘只读无法写入:
# 检查挂载选项
mount | grep sda1
# 重新挂载为读写
mount -o remount,rw /dev/sda1
# 如失败,需卸载后 fsck 修复
umount /dev/sda1
fsck -y /dev/sda1
mount /dev/sda12. 磁盘空间满:
# 快速清理
rm -rf /tmp/*
journalctl --vacuum-size=100M
find /var/log -name "*.log" -mtime +7 -delete
# 找出删除但仍占用的文件
lsof | grep deleted
# 重启对应进程释放空间3. 疑似硬盘故障:
# 立即备份关键数据
rsync -av /data /backup
tar czf backup.tar.gz /data
# 标记坏块(ext4)
badblocks -sv /dev/sda1 > badblocks.txt
fsck -l badblocks.txt /dev/sda1相关高频面试题
Q1: 如何判断硬盘是机械盘还是固态盘?性能差异?
# 判断方法
lsblk -d -o name,rota
# ROTA=1 为机械盘,ROTA=0 为固态盘
cat /sys/block/sda/queue/rotational
# 1=HDD, 0=SSD
# 性能差异:
# HDD:顺序读写快(~150MB/s),随机 IOPS 低(~100)
# SSD:顺序和随机都快(~500MB/s,IOPS 上万)
# NVMe SSD:更快(~3000MB/s,IOPS 几十万)Q2: inode 满了怎么办?和磁盘空间满有什么区别?
# 查看 inode 使用
df -i
# inode 满:大量小文件占用,即使空间充足也无法创建文件
# 磁盘满:存储空间用尽
# 解决 inode 满:
# 1. 删除不需要的小文件
find /tmp -type f -delete
find /var -name "*.log" -mtime +30 -delete
# 2. 压缩合并小文件
tar czf archive.tar.gz small_files/
rm -rf small_files/
# 3. 重建文件系统(增加 inode 数量,需重新格式化)
mkfs.ext4 -N 10000000 /dev/sda1Q3: 如何查看硬盘的 SMART 信息?哪些指标最重要?
# 安装并查看
apt install smartmontools
smartctl -a /dev/sda
# 最重要的指标:
# 1. Reallocated_Sector_Ct(重分配扇区)> 0 → 有坏道
# 2. Current_Pending_Sector(待处理扇区)> 0 → 不稳定扇区
# 3. Offline_Uncorrectable(不可修复扇区)> 0 → 严重损坏
# 4. UDMA_CRC_Error_Count 高 → 传输错误(线缆问题)
# 5. Temperature > 50°C → 过热
# 6. Power_On_Hours → 使用时长
# 任一关键指标异常 → 立即备份,准备更换硬盘Q4: 磁盘 I/O 很高,如何定位是哪个进程导致的?
# 方法 1:iotop(最直观)
iotop -o # 只显示有 I/O 的进程
iotop -P # 显示进程而非线程
# 方法 2:pidstat
pidstat -d 2 5 # 每 2 秒采样 5 次,显示磁盘 I/O
# 方法 3:查看进程 I/O 统计
cat /proc/<PID>/io
# 关键字段:
# - read_bytes:读取字节数
# - write_bytes:写入字节数
# 方法 4:系统调用追踪
strace -p <PID> -e trace=read,write -cQ5: 文件系统变成只读了怎么办?
# 原因:内核检测到文件系统错误,自动保护防止进一步损坏
# 步骤 1:确认只读
mount | grep /dev/sda1
# 看到 ro(read-only)
# 步骤 2:查看日志找原因
dmesg | grep -i "read-only\|error"
journalctl -xe
# 步骤 3:尝试重新挂载(可能失败)
mount -o remount,rw /dev/sda1
# 步骤 4:如失败,必须 fsck 修复
# 卸载分区(如果是根分区需进单用户模式或 LiveCD)
umount /dev/sda1
fsck -y /dev/sda1 # 自动修复
# 步骤 5:重新挂载
mount /dev/sda1Q6: 如何测试硬盘的读写性能?
# 方法 1:dd 测试(写入)
dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct
# 注意:oflag=direct 绕过缓存
# 方法 2:dd 测试(读取)
dd if=/tmp/test of=/dev/null bs=1M iflag=direct
# 方法 3:hdparm(快速)
hdparm -Tt /dev/sda
# -T 测试缓存读取速度
# -t 测试磁盘读取速度
# 方法 4:fio(最专业)
fio --name=randwrite --ioengine=libaio --iodepth=16 --rw=randwrite \
--bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
# 关键指标:
# - 顺序读写:MB/s(HDD ~150, SSD ~500, NVMe ~3000)
# - 随机 IOPS:次数(HDD ~100, SSD ~10k, NVMe ~100k)故障速查表
| 症状 | 诊断命令 | 可能原因 | 解决方案 |
|---|---|---|---|
| 空间满 | df -h | 文件过多、日志堆积 | 清理大文件/日志 |
| inode 满 | df -i | 小文件过多 | 删除小文件或归档 |
| I/O 慢 | iostat -x | 硬件故障、I/O 过载 | 检查 SMART、优化应用 |
| 只读文件系统 | dmesg | 文件系统错误 | fsck 修复 |
| 无法挂载 | blkid | 超级块损坏、类型错 | fsck 或重建文件系统 |
| 坏道 | smartctl -a | 硬盘老化 | 备份数据、更换硬盘 |