Linux如何精准查看/dev/sda、/dev/sdb等块设备的独立空间使用情况?

Linux如何精准查看/dev/sda、/dev/sdb等块设备的独立空间使用情况?
1. 为什么需要精准查看块设备空间在Linux服务器管理中磁盘空间监控是最基础也最重要的工作之一。但很多新手会遇到这样的困惑明明用df -h查看磁盘空间显示的数值却和实际硬件不符。这种情况往往发生在服务器挂载了多块硬盘时特别是当多个物理设备被合并挂载到同一目录时。举个例子我最近接手的一台服务器就遇到了这个问题。这台机器挂载了两块4TB的企业级硬盘/dev/sda和/dev/sdb但df -h只显示了一个7.2TB的挂载点。这是因为管理员使用了LVM将两块硬盘合并成了一个逻辑卷。虽然这种做法提升了存储灵活性但却给精准监控每块物理硬盘的健康状态带来了挑战。1.1 块设备的基本概念在Linux系统中所有存储设备都被抽象为块设备。常见的块设备包括传统机械硬盘/dev/sda、/dev/sdbSSD固态硬盘/dev/nvme0n1虚拟磁盘/dev/vda硬件RAID阵列/dev/md0每个块设备可以包含多个分区如/dev/sda1、/dev/sda2。理解这一点很重要因为后续的所有监控命令都需要区分整块设备和分区这两个层级。1.2 常见监控痛点在实际运维中我遇到过这些典型问题场景合并挂载混淆多块硬盘通过LVM或RAID合并挂载后无法直接看出每块物理盘的使用情况设备名漂移服务器重启后/dev/sda和/dev/sdb可能互换位置未挂载空间遗漏硬盘已分区但未挂载的区域容易被忽略硬件故障定位难当收到磁盘空间告警时需要快速定位到具体的物理设备2. 基础命令快速查看块设备布局2.1 lsblk - 设备拓扑一目了然lsblk是我最推荐的入门命令它能以树形结构展示所有块设备的物理关系lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL,UUID典型输出示例NAME FSTYPE SIZE MOUNTPOINT LABEL UUID sda 3.7T ├─sda1 ext4 500G /data data_disk 5e3a4b1c-... └─sda2 LVM2_member 3.2T └─vg0-lv0 xfs 3.2T /storage sdb 3.7T └─sdb1 ext4 3.7T /backup backup 8d7e6f5a-...参数说明-o自定义输出列我习惯包含这些关键信息NAME设备及分区名称FSTYPE文件系统类型SIZE容量大小自动转换为易读单位MOUNTPOINT挂载点路径LABEL/UUID唯一标识符实用技巧添加-f参数可以快速查看文件系统信息等价于lsblk -o NAME,FSTYPE,LABEL,UUID,MOUNTPOINT2.2 df - 文件系统空间统计经典的df命令仍是查看已挂载文件系统使用情况的首选df -hT关键参数-h人类可读格式自动转换GB/TB等单位-T显示文件系统类型但要注意其局限性只能显示已挂载的文件系统对于合并挂载如LVM无法区分底层物理设备默认不显示临时文件系统如tmpfs进阶用法结合-x参数排除特定文件系统类型例如df -hT -x tmpfs -x devtmpfs3. 精准定位物理设备的独立使用情况3.1 通过持久化标识符追踪设备设备名如/dev/sda可能因重启而变化更可靠的方式是使用持久化设备标识符。Linux在/dev/disk/目录下提供了多种标识方式ls -l /dev/disk/by-id/输出示例ata-ST4000DM004-2CV104_ZDH4D5K2 - ../../sda ata-ST4000DM004-2CV104_ZTT8P3E1 - ../../sdb最佳实践在脚本中始终使用/dev/disk/by-id/路径优先选择ata-、wwn-开头的硬件级标识避免使用uuid-开头的文件系统级标识格式化后会变化3.2 查看未挂载分区空间对于已分区但未挂载的空间可以使用parted命令sudo parted /dev/sda unit GB print free输出示例Number Start End Size File system Name Flags 17.4GB 21.5GB 4000MB free 1 21.5GB 521GB 500GB ext4 data 2 521GB 4001GB 3480GB lvm这个命令特别适合检查磁盘末尾的未分配空间分区表布局是否合理是否存在隐藏的恢复分区3.3 LVM物理卷监控对于使用LVM的场景需要专门监控物理卷PV的使用sudo pvs sudo vgs sudo lvs组合命令示例sudo pvdisplay -m | grep -A 1 PV Name\|Free这个命令可以显示每个物理卷的剩余空间以及空间在卷组中的分布情况。4. 高级监控方案与实战技巧4.1 使用smartctl监控磁盘健康空间监控之外磁盘健康状态同样重要。smartctl工具可以读取硬盘的SMART数据sudo smartctl -A /dev/sda重点关注这些指标Reallocated_Sector_Ct重映射扇区数Current_Pending_Sector待重映射扇区Temperature_Celsius运行温度自动化建议可以设置cron任务定期收集这些数据与历史记录对比分析。4.2 编写监控脚本示例下面是一个实用的监控脚本框架可以定期收集存储信息#!/bin/bash # 记录时间戳 echo $(date) # 1. 物理磁盘列表 echo ## 物理磁盘 ## lsblk -d -o NAME,MODEL,SIZE,ROTA # 2. 文件系统使用率 echo -e \n## 文件系统 ## df -hT -x tmpfs -x devtmpfs | awk NR1 {print} $6 ~ /^\/$|home|data|storage/ {print} $50 80 {print} # 3. LVM使用情况 echo -e \n## LVM状态 ## sudo pvs echo sudo vgs echo sudo lvs # 4. 磁盘健康状态 echo -e \n## 磁盘健康 ## for disk in $(lsblk -d -o NAME -n); do echo /dev/$disk: sudo smartctl -H /dev/$disk | grep result done4.3 可视化监控方案对于大规模环境建议采用专业监控工具Prometheus node_exporternode_exporter提供node_filesystem_*指标配合Grafana展示历史趋势Zabbix内置文件系统发现模板支持自定义触发器告警ELK Stack收集解析各节点的磁盘日志通过Kibana创建定制化仪表盘5. 常见问题排查手册5.1 设备名变化导致监控失效现象脚本中硬编码的/dev/sdb突然变成了/dev/sdc解决方案改用持久化设备标识符# 错误方式 df /dev/sdb1 # 正确方式 df $(readlink -f /dev/disk/by-id/ata-ST4000DM004-2CV104_ZTT8P3E1-part1)在fstab中使用UUID或LABELUUID5e3a4b1c-... /data ext4 defaults 0 25.2 空间已满但df显示有剩余可能原因进程持有已删除文件的句柄文件系统预留空间ext*默认预留5%inode耗尽使用df -i检查排查命令# 查找被删除但仍占用的文件 sudo lsof L1 # 调整预留空间比例 sudo tune2fs -m 1 /dev/sda15.3 LVM空间扩展实战当某块物理磁盘空间不足时LVM提供了灵活的扩展方案添加新物理盘sudo pvcreate /dev/sdc sudo vgextend vg0 /dev/sdc扩展逻辑卷sudo lvextend -L 1T /dev/vg0/lv0 sudo xfs_growfs /storage # 对于XFS文件系统记住这个顺序PV → VG → LV → Filesystem6. 安全注意事项与最佳实践在监控存储空间时这些安全要点不容忽视监控权限控制普通用户使用df、lsblk等只读命令需要root权限的操作如smartctl建议通过sudo授权敏感信息保护脚本中避免硬编码设备路径日志中的UUID等标识信息应脱敏处理监控频率优化常规空间检查每小时1次SMART健康检查每天1次详细扫描如badblocks每周1次告警阈值建议普通分区85%触发警告关键分区如/75%触发警告inode使用率80%触发警告7. 终极方案全面存储监控体系经过多年实践我总结出这套监控体系基础层使用lsblk、df等命令做实时检查持久化层通过/dev/disk/by-id/确保设备标识稳定健康层定期采集SMART数据预测故障可视化层PrometheusGrafana实现历史趋势分析自动化层Ansible剧本实现自动扩容特别提醒所有监控都要设置合理的告警阈值避免狼来了效应。我曾经配置过一个过于敏感的系统在半夜3点因为一个临时文件触发告警这种体验相当糟糕。