1. 为什么需要查看Linux磁盘信息
在日常的Linux系统管理和维护中,磁盘信息检查是最基础也是最重要的操作之一。作为一名运维工程师,我几乎每天都要和磁盘打交道。想象一下这样的场景:当你收到服务器告警说磁盘空间不足,或者某个应用突然报错说无法写入文件时,第一反应是什么?没错,就是先看看磁盘到底出了什么问题。
Linux系统提供了丰富的命令行工具来获取磁盘的各种信息,包括但不限于:
- 磁盘的总容量、已用空间和剩余空间
- 磁盘的分区情况
- 文件系统类型
- 磁盘的挂载点
- 磁盘的读写性能
- 磁盘的硬件信息
掌握这些信息的查看方法,不仅能帮助我们快速定位问题,还能在问题发生前进行预防性维护。比如通过定期检查磁盘使用情况,可以提前发现空间不足的风险;通过监控磁盘I/O性能,可以识别潜在的瓶颈。
提示:在生产环境中,建议将磁盘监控纳入日常巡检项目,可以避免90%以上的磁盘相关故障。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础命令:df和du的使用详解
2.1 df命令:查看磁盘空间使用情况
df(disk filesystem)是最常用的磁盘空间查看命令。不加任何参数时,它会显示所有已挂载文件系统的使用情况:
bash复制$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 104806400 5242880 99563520 5% /
tmpfs 8169348 0 8169348 0% /dev/shm
/dev/sdb1 524032000 123456 523908544 1% /data
几个常用参数:
-h:以人类可读的格式显示(自动转换为KB、MB、GB等单位)-T:显示文件系统类型-i:显示inode使用情况而非块使用情况
例如,查看所有文件系统的使用情况(人类可读格式):
bash复制$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 100G 5.0G 95G 5% /
tmpfs tmpfs 7.8G 0 7.8G 0% /dev/shm
/dev/sdb1 xfs 500G 121M 500G 1% /data
2.2 du命令:查看目录和文件磁盘使用情况
du(disk usage)用于估算文件和目录占用的磁盘空间。基本用法:
bash复制$ du /var/log
1024 /var/log/nginx
2048 /var/log/mysql
3072 /var/log
常用参数:
-h:人类可读格式-s:只显示总计--max-depth=N:显示指定深度的目录
例如,查看/var目录下各子目录的大小(只显示一级子目录):
bash复制$ du -h --max-depth=1 /var
16K /var/tmp
12M /var/cache
1.2G /var/log
1.3G /var
注意:du命令会递归统计所有子目录,在大型目录上运行可能会很耗时。对于TB级别的目录,建议先用
--max-depth限制扫描深度。
3. 高级工具:lsblk和fdisk详解
3.1 lsblk:列出所有块设备信息
lsblk(list block devices)可以显示系统中的所有块设备(磁盘、分区等)的树状结构:
bash复制$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 96G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 4G 0 part [SWAP]
sdb 8:16 0 500G 0 disk
└─sdb1 8:17 0 500G 0 part /data
常用参数:
-f:显示文件系统信息-o:指定输出列(如NAME,SIZE,FSTYPE,MOUNTPOINT等)-p:显示完整设备路径
例如,显示详细的块设备信息:
bash复制$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 ext4 5c4f5e8a-3e2d-4b89-9a1f-0e8d3b7a6c5d /
└─sda5 swap 8a7b6c5d-4e3f-1a2b-9c8d-7e6f5a4b3c2d [SWAP]
sdb
└─sdb1 xfs 3a2b1c0d-9e8f-7d6c-5b4a-3e2f1a0d9c8b /data
3.2 fdisk:磁盘分区表操作工具
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: 0x5a3b2c1d
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 201326591 201324544 96G 83 Linux
/dev/sda2 201326592 209715199 8388608 4G 5 Extended
/dev/sda5 201328640 209715199 8386560 4G 82 Linux swap / Solaris
警告:fdisk可以修改分区表,误操作可能导致数据丢失。仅查看信息时建议使用
-l参数,避免进入交互模式。
4. 专业工具:smartctl和iostat深度使用
4.1 smartctl:磁盘健康状态监测
smartctl是SMART(Self-Monitoring, Analysis and Reporting Technology)工具,用于监测磁盘的健康状态:
bash复制$ sudo smartctl -a /dev/sda
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.4.0-91-generic] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Seagate BarraCuda 3.5" HDD
Device Model: ST1000DM010-2EP102
Serial Number: ZA123456
LU WWN Device Id: 5 000c50 123456789
Firmware Version: CC43
User Capacity: 1,000,204,886,016 bytes [1.00 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Form Factor: 3.5 inches
Device is: In smartctl database [for details use: -P show]
ATA Version is: ATA8-ACS T13/1699-D revision 4
SATA Version is: SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Mon Jul 15 10:30:45 2023 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
# 后面还有详细的SMART属性信息...
关键参数:
-H:只显示健康状态-A:显示所有SMART属性-l error:显示错误日志
4.2 iostat:磁盘I/O性能监控
iostat用于监控系统输入输出设备和CPU的使用情况,是性能分析的重要工具:
bash复制$ iostat -dx 1 3
Linux 5.4.0-91-generic (hostname) 07/15/2023 _x86_64_ (4 CPU)
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.32 1.95 12.80 31.20 0.00 0.12 0.00 5.71 0.62 1.12 0.00 40.00 16.00 0.44 0.10
sdb 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
常用参数:
-d:只显示磁盘统计信息-x:显示扩展统计信息1 3:每1秒刷新一次,共显示3次
关键指标解读:
%util:设备利用率(接近100%表示I/O饱和)await:平均I/O等待时间(毫秒)svctm:平均服务时间(毫秒)rkB/s和wkB/s:读写吞吐量
5. 实战:综合磁盘信息检查脚本
结合上述命令,我们可以编写一个综合性的磁盘检查脚本,一次性获取全面的磁盘信息:
bash复制#!/bin/bash
echo "===== 磁盘空间使用情况 ====="
df -hT
echo -e "\n===== 块设备信息 ====="
lsblk -f
echo -e "\n===== 磁盘分区信息 ====="
sudo fdisk -l | head -25
echo -e "\n===== 目录大小前10名 ====="
sudo du -h / 2>/dev/null | sort -rh | head -10
echo -e "\n===== 磁盘I/O统计 ====="
iostat -dx 1 3
echo -e "\n===== 磁盘健康状态 ====="
for disk in $(lsblk -d -o NAME | grep -v NAME); do
echo -n "/dev/$disk: "
sudo smartctl -H "/dev/$disk" | grep "SMART overall-health"
done
使用说明:
- 将上述内容保存为
disk_check.sh - 添加执行权限:
chmod +x disk_check.sh - 以root用户运行:
sudo ./disk_check.sh
这个脚本会输出:
- 文件系统使用情况
- 块设备树状结构
- 磁盘分区表信息
- 根目录下最大的10个目录
- 磁盘I/O性能统计
- 各磁盘的健康状态
提示:在生产环境中,可以定期运行此脚本并将结果保存到日志文件中,便于后续分析和问题排查。
6. 常见问题排查与解决
6.1 磁盘空间显示不一致问题
有时候会遇到df和du显示的空间使用不一致的情况,这通常有以下几种原因:
-
已删除文件仍被进程占用:
bash复制# 查找被删除但仍被占用的文件 sudo lsof | grep deleted # 解决方法:重启相关进程或直接kill进程 -
文件系统元数据占用空间:
bash复制# 检查文件系统是否有预留空间 sudo tune2fs -l /dev/sda1 | grep "Reserved block count" # 解决方法:调整预留空间比例(谨慎操作) sudo tune2fs -m 1 /dev/sda1 # 设置为1% -
磁盘配额限制:
bash复制# 检查用户配额 sudo repquota -a
6.2 磁盘I/O性能瓶颈分析
当系统响应变慢,怀疑是磁盘I/O问题时,可以按照以下步骤排查:
- 使用
iostat -dx 1查看磁盘利用率(%util)和等待时间(await) - 使用
iotop找出I/O最高的进程 - 使用
vmstat 1查看系统级I/O等待(wa) - 使用
pidstat -d 1查看进程级I/O统计
bash复制# 安装必要工具
sudo apt install sysstat iotop
# 综合监控
watch -n 1 "(iostat -dx 1 2 | tail -n +6); echo; iotop -o -b -n 1 | head -10"
6.3 磁盘损坏或坏道检测
当怀疑磁盘有物理损坏时,可以使用以下方法检测:
-
使用
badblocks检测坏道:bash复制sudo badblocks -v /dev/sda > badblocks.txt -
查看SMART错误日志:
bash复制sudo smartctl -l error /dev/sda -
强制进行SMART自检:
bash复制sudo smartctl -t short /dev/sda # 短测试 sudo smartctl -t long /dev/sda # 长测试 # 查看测试结果 sudo smartctl -l selftest /dev/sda
7. 图形化工具推荐
虽然命令行工具功能强大,但对于初学者或不熟悉Linux的用户,图形化工具可能更友好:
-
GNOME Disk Utility (Disks):
- 系统自带,提供直观的磁盘管理界面
- 支持查看SMART数据、创建分区、格式化等操作
-
GParted:
- 强大的分区编辑器
- 支持调整分区大小而不丢失数据
-
KDiskMark:
- 磁盘基准测试工具
- 类似Windows下的CrystalDiskMark
-
Cockpit:
- Web界面的服务器管理工具
- 包含磁盘监控和管理功能
安装方法(Ubuntu/Debian):
bash复制sudo apt install gnome-disk-utility gparted cockpit
8. 进阶技巧与最佳实践
8.1 使用ncdu进行交互式磁盘分析
ncdu(NCurses Disk Usage)是一个基于ncurses的交互式磁盘分析工具,比du更直观:
bash复制# 安装
sudo apt install ncdu
# 使用
ncdu /
操作说明:
- 使用方向键导航
- 按
d删除选中的文件/目录 - 按
r重新计算当前目录大小 - 按
q退出
8.2 监控磁盘空间变化
对于关键目录,可以设置监控脚本,当空间使用超过阈值时发出告警:
bash复制#!/bin/bash
THRESHOLD=90
MOUNTPOINT="/"
USAGE=$(df --output=pcent "$MOUNTPOINT" | tail -1 | tr -d '% ')
if [ "$USAGE" -gt "$THRESHOLD" ]; then
echo "警告: $MOUNTPOINT 使用率已达 ${USAGE}%" | mail -s "磁盘空间告警" admin@example.com
fi
可以将此脚本加入cron定时任务,每小时检查一次。
8.3 LVM磁盘管理技巧
对于使用LVM(Logical Volume Manager)的系统,还有一些专用命令:
-
查看物理卷(PV)信息:
bash复制sudo pvdisplay -
查看卷组(VG)信息:
bash复制sudo vgdisplay -
查看逻辑卷(LV)信息:
bash复制sudo lvdisplay -
扩展逻辑卷(当VG有剩余空间时):
bash复制sudo lvextend -L +10G /dev/vg0/lv0 sudo resize2fs /dev/vg0/lv0 # 对于ext文件系统
8.4 使用btrfs或zfs的高级功能
对于使用btrfs或zfs文件系统的用户,可以使用更高级的磁盘管理功能:
btrfs:
bash复制# 查看空间使用详情
sudo btrfs filesystem usage /
# 添加新磁盘到现有文件系统
sudo btrfs device add /dev/sdb1 /
sudo btrfs filesystem balance /
zfs:
bash复制# 查看池状态
sudo zpool status
# 查看数据集使用情况
sudo zfs list
# 添加磁盘镜像
sudo zpool attach poolname olddisk newdisk
