1. 为什么我们需要关注磁盘信息?
在Linux系统管理中,磁盘信息查询是每个运维人员和开发者必备的基础技能。想象一下,当你发现系统运行缓慢,或者部署新应用时提示"磁盘空间不足",这时候快速准确地获取磁盘使用情况就变得至关重要。不同于Windows系统的图形化界面,Linux主要通过命令行工具来获取这些信息,这虽然增加了学习曲线,但提供了更灵活、更强大的控制能力。
我曾在一次生产环境事故中深刻体会到掌握这些命令的重要性。当时一个日志服务异常导致磁盘被快速写满,系统即将崩溃。正是通过df -h命令快速定位到问题分区,再用du -sh *找出罪魁祸首的日志目录,才及时避免了服务中断。这种经历让我明白,看似简单的磁盘查询命令,在关键时刻能救命。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础命令:快速查看磁盘使用情况
2.1 df命令:文件系统概览
df(disk filesystem)是最常用的磁盘空间检查工具。不加任何参数时,它会以1K块为单位显示所有挂载文件系统的使用情况:
bash复制$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 104806400 5242880 94160896 6% /
tmpfs 8169348 0 8169348 0% /dev/shm
但人类更习惯以GB/MB为单位查看,这时可以加上-h(human-readable)参数:
bash复制$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 5.0G 90G 6% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
几个实用技巧:
df -i:查看inode使用情况(小文件多的系统要特别关注)df -T:同时显示文件系统类型(ext4/xfs等)df --total:在最后一行显示汇总信息
注意:NFS等网络文件系统可能因为连接问题导致df命令卡住,这时可以用
df -l只查看本地文件系统。
2.2 du命令:目录空间分析
当df显示某个分区空间不足时,我们需要用du(disk usage)来找出具体是哪些目录占用了空间。基本用法:
bash复制$ du -sh /var/log
1.4G /var/log
常用参数组合:
du -sh *:查看当前目录下所有文件和目录的大小du -h --max-depth=1 /path:只显示指定目录下一级子目录的大小du -x:不跨越文件系统边界(避免统计挂载点)
一个实用场景:找出/var下占用空间最大的3个目录:
bash复制$ du -h /var --max-depth=1 | sort -h -r | head -n 4
12G /var
6.2G /var/lib
4.8G /var/log
1.2G /var/cache
3. 进阶工具:更详细的磁盘信息
3.1 lsblk:块设备拓扑结构
lsblk以树状结构显示所有块设备(磁盘、分区、LVM等)的层次关系,非常适合查看磁盘的物理结构:
bash复制$ lsblk -o NAME,MAJ:MIN,RM,SIZE,RO,FSTYPE,MOUNTPOINT
NAME MAJ:MIN RM SIZE RO FSTYPE MOUNTPOINT
sda 8:0 0 100G 0
├─sda1 8:1 0 96G 0 ext4 /
├─sda2 8:2 0 1K 0
└─sda5 8:5 0 4G 0 swap [SWAP]
sr0 11:0 1 1024M 0
常用选项:
-f:显示完整的文件系统信息-p:显示完整设备路径(如/dev/sda1)-i:使用ASCII字符画线
3.2 fdisk和parted:分区表查看
对于磁盘分区细节,传统工具是fdisk:
bash复制$ sudo fdisk -l /dev/sda
Disk /dev/sda: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: VIRTUAL DISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 209715199 209713152 100G 83 Linux
而parted则支持更多现代特性(如GPT分区表、大于2TB的磁盘):
bash复制$ sudo parted /dev/sda print
Model: ATA VIRTUAL DISK (scsi)
Disk /dev/sda: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 107GB 107GB primary ext4 boot
3.3 smartctl:磁盘健康监测
对于关心磁盘硬件健康的用户,smartctl(来自smartmontools包)可以读取磁盘的S.M.A.R.T.信息:
bash复制$ sudo smartctl -a /dev/sda
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.10.0-0.bpo.9-amd64]
=== START OF INFORMATION SECTION ===
Model Family: Virtual disk
Device Model: VIRTUAL DISK
[...]
SMART overall-health self-assessment test result: PASSED
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x000b 100 100 050 Pre-fail Always - 0
5 Reallocated_Sector_Ct 0x0013 100 100 050 Pre-fail Always - 0
[...]
关键指标关注:
- Reallocated_Sector_Ct:重映射扇区数(数值增长表示磁盘开始损坏)
- Temperature_Celsius:温度(过高会影响寿命)
- Power_On_Hours:通电时间(预估剩余寿命)
4. 可视化工具与实用脚本
4.1 ncdu:交互式磁盘分析
对于喜欢图形化界面的用户,ncdu(NCurses Disk Usage)提供了基于终端的交互式界面:
bash复制$ sudo apt install ncdu # Debian/Ubuntu
$ sudo yum install ncdu # RHEL/CentOS
$ ncdu /
使用方向键导航,按d删除文件(需权限),r重新扫描目录。相比du的输出,它能更直观地展示目录大小分布。
4.2 自定义监控脚本
结合前面介绍的命令,我们可以编写简单的shell脚本监控磁盘状态:
bash复制#!/bin/bash
# 磁盘空间阈值(百分比)
THRESHOLD=90
# 检查所有挂载点
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $6 }' | 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 "警报:分区 \"$partition\" 使用率 $usep%"
# 找出大文件
echo "占用空间最大的5个文件/目录:"
du -h $partition --max-depth=1 2>/dev/null | sort -hr | head -n 6
fi
done
保存为check_disk.sh后,添加执行权限并运行:
bash复制chmod +x check_disk.sh
./check_disk.sh
可以结合cron设置定期检查:
bash复制# 每天上午9点运行
0 9 * * * /path/to/check_disk.sh >> /var/log/disk_check.log
4.3 使用Grafana可视化监控
对于企业级监控,可以结合Prometheus和Grafana实现磁盘信息的可视化。Node Exporter会收集包括磁盘在内的系统指标,配置示例:
yaml复制# node_exporter配置
--collector.diskstats.ignored-devices="^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p)\d+$"
--collector.filesystem.ignored-mount-points="^/(sys|proc|dev|run|var/lib/docker)($|/)"
在Grafana中导入ID=1860的仪表板,即可获得专业的磁盘监控视图,包括:
- 各分区使用率趋势图
- 磁盘IOPS和吞吐量
- 预测何时会空间不足
5. 特殊场景与疑难问题处理
5.1 LVM逻辑卷管理
对于使用LVM的系统,需要额外关注物理卷(PV)、卷组(VG)和逻辑卷(LV)的状态:
bash复制# 查看物理卷
$ sudo pvdisplay
# 查看卷组
$ sudo vgdisplay
# 查看逻辑卷
$ sudo lvdisplay
# 扩展逻辑卷(当VG有剩余空间时)
$ sudo lvextend -L +10G /dev/vg01/lv_data
$ sudo resize2fs /dev/vg01/lv_data # 对于ext文件系统
5.2 磁盘空间已满但df显示有剩余
有时删除文件后,df仍显示空间未释放,常见原因:
- 文件被进程占用:
lsof | grep deleted找出并重启相关进程 - Docker等容器占用了空间:
docker system prune清理 - 小文件过多导致inode耗尽:
df -i检查
5.3 网络文件系统(NFS)的特殊处理
查询NFS磁盘信息时,如果服务器无响应会导致命令挂起。解决方法:
bash复制# 指定超时时间
$ timeout 5s df -h /nfs_mount
# 或者使用mount选项soft,intr
$ mount -o soft,intr nfs_server:/path /mnt
5.4 处理磁盘I/O性能问题
当磁盘响应缓慢时,可以用以下工具诊断:
bash复制# 实时IO监控
$ iotop
# 磁盘活动统计
$ iostat -x 1
# 测试磁盘速度
$ dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct
关键指标:
%util(iostat输出):设备繁忙百分比await:平均I/O等待时间(毫秒)- 使用
fio工具进行更专业的基准测试
6. 安全注意事项与最佳实践
6.1 敏感目录的权限控制
查询磁盘信息通常需要root权限,特别是在访问/dev下的设备文件时。建议:
- 普通用户使用
sudo执行特权命令 - 通过
visudo配置精确的sudo权限,如:
code复制%admin ALL=(ALL) NOPASSWD: /usr/bin/fdisk -l, /usr/sbin/smartctl *
6.2 日志轮转配置
避免日志填满磁盘的关键是合理配置logrotate。示例配置/etc/logrotate.d/myapp:
code复制/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/bin/systemctl reload myapp > /dev/null
endscript
}
6.3 自动化清理策略
对于临时文件、缓存等,可以配置自动化清理:
bash复制# 使用tmpwatch(RHEL)或tmpreaper(Debian)
$ sudo tmpwatch 24h /tmp
# 或者通过systemd timer
$ cat /etc/systemd/system/cleanup.timer
[Unit]
Description=Daily cleanup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
$ cat /etc/systemd/system/cleanup.service
[Unit]
Description=Cleanup script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
6.4 云环境特殊考量
在云服务器上,还需要注意:
- 云监控提供的磁盘指标(如AWS CloudWatch)
- 扩容云磁盘后的分区调整流程
- 网络存储(如EBS、Azure Disk)的性能特点
- 快照对磁盘性能的影响
比如在AWS上扩容EBS卷后,需要:
- AWS控制台修改卷大小
- 在实例上识别新容量:
sudo growpart /dev/xvda 1 - 调整文件系统:
sudo resize2fs /dev/xvda1
