本文目录导读:

在Linux/Unix系统中,可以用多种脚本(Bash、Python等)获取硬盘信息,以下是几种常见且实用的方法:
Bash 脚本(最常用)
使用 df 命令获取分区使用情况
#!/bin/bash # 获取所有挂载点的磁盘使用情况 echo "=== 磁盘分区使用情况 ===" df -h # 只显示物理硬盘(排除tmpfs等虚拟文件系统) echo "" echo "=== 物理硬盘分区 ===" df -h --type=ext4 --type=xfs --type=ntfs --type=vfat 2>/dev/null
使用 lsblk 获取块设备信息
#!/bin/bash echo "=== 块设备列表 ===" lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL echo "" echo "=== 详细设备信息 ===" lsblk -d -o NAME,SIZE,TYPE,TRAN,ROTA,MODEL
使用 fdisk 或 parted 获取分区表
#!/bin/bash echo "=== 分区表信息 ===" sudo fdisk -l 2>/dev/null | grep -E "^Disk /dev/[sv]d|^/dev/[sv]d" # 或者使用parted echo "" echo "=== 分区类型与大小 ===" sudo parted -l 2>/dev/null | grep -E "Disk /dev|Partition Table"
获取磁盘SMART健康状态
#!/bin/bash
# 需要安装 smartmontools
echo "=== 磁盘健康状态 ==="
for disk in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
if [ -b "$disk" ]; then
echo "--- $disk ---"
sudo smartctl -H "$disk" 2>/dev/null | grep -E "SMART overall-health|SMART Health Status"
fi
done
Python 脚本(跨平台兼容)
#!/usr/bin/env python3
import os
import subprocess
import json
def get_disk_info_linux():
"""获取Linux系统硬盘信息"""
info = {}
# 使用 df 命令
result = subprocess.run(['df', '-h', '--output=source,fstype,size,used,avail,pcent,target'],
capture_output=True, text=True)
info['df_output'] = result.stdout.splitlines()
# 使用 lsblk 命令(需要root权限获取更多信息)
try:
result = subprocess.run(['lsblk', '-J', '-o', 'NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE'],
capture_output=True, text=True)
info['lsblk_json'] = json.loads(result.stdout)
except:
info['lsblk_json'] = "lsblk not available"
return info
def get_disk_info_windows():
"""获取Windows系统硬盘信息"""
import wmi
c = wmi.WMI()
info = {}
drives = []
for disk in c.Win32_DiskDrive():
drive_info = {
'model': disk.Model,
'size': int(disk.Size) // (1024**3), # GB
'interface': disk.InterfaceType,
'serial': disk.SerialNumber,
}
drives.append(drive_info)
info['drives'] = drives
# 获取分区信息
partitions = []
for partition in c.Win32_DiskPartition():
partitions.append({
'name': partition.Name,
'size': int(partition.Size) // (1024**3),
'type': partition.Type,
})
info['partitions'] = partitions
return info
if __name__ == "__main__":
if os.name == 'nt': # Windows
info = get_disk_info_windows()
print(json.dumps(info, indent=2))
else: # Linux/Unix
info = get_disk_info_linux()
print("df 命令输出:")
for line in info['df_output']:
print(line)
综合监控脚本
磁盘IO监控
#!/bin/bash # 监控磁盘IO(需要安装sysstat) echo "=== 磁盘IO统计 ===" iostat -x 1 3 2>/dev/null | tail -n +4 | head -n 5 # 使用iotop(需要root) echo "" echo "=== 实时磁盘IO(按w切换排序)===" sudo iotop -d 1 -n 5 -o 2>/dev/null | head -20
磁盘温度检测(需要安装hddtemp或nvme-cli)
#!/bin/bash
echo "=== 磁盘温度 ==="
for disk in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
if [ -b "$disk" ]; then
temp=$(sudo hddtemp "$disk" 2>/dev/null | awk '{print $NF}')
[ -n "$temp" ] && echo "$disk: $temp"
fi
done
# NVMe固态温度
echo ""
echo "=== NVMe设备温度 ==="
sudo nvme list 2>/dev/null | grep -E "Temperature|温度"
生成HTML报告的脚本
#!/bin/bash
# 生成磁盘健康报告
output="/tmp/disk_report_$(date +%Y%m%d).html"
cat > "$output" <<HTMLHEADER
<html>
<head><title>硬盘信息报告 - $(date)</title></head>
<body>
<h1>硬盘信息报告</h1>
<h2>1. 分区使用情况</h2>
<pre>
HTMLHEADER
# 添加df输出
df -h >> "$output"
echo "</pre><h2>2. 物理设备列表</h2><pre>" >> "$output"
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL >> "$output"
echo "</pre><h2>3. SMART健康状态</h2><pre>" >> "$output"
for disk in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
if [ -b "$disk" ]; then
echo "--- $disk ---" >> "$output"
sudo smartctl -H "$disk" 2>/dev/null | grep -E "SMART overall-health|SMART Health Status" >> "$output"
fi
done
echo "</pre></body></html>" >> "$output"
echo "报告已生成: $output"
直接读取系统文件(无需外部命令)
#!/bin/bash
# 从/proc和/sys文件系统读取硬盘信息
echo "=== 从 /proc/partitions 读取分区信息 ==="
awk '{if(NR>1) print $4, $3/1024/1024 " MB"}' /proc/partitions | grep -v ^name
echo ""
echo "=== 从 /sys/block 获取块设备详细信息 ==="
for device in /sys/block/*; do
dev_name=$(basename "$device")
if [ -f "$device/size" ]; then
size=$(cat "$device/size")
size_gb=$((size * 512 / 1024 / 1024 / 1024))
echo "$dev_name: ${size_gb}GB"
fi
done
# 获取磁盘型号(需要root或特定权限)
echo ""
echo "=== 磁盘型号信息 ==="
for dev in /sys/block/sd* /sys/block/nvme*; do
if [ -f "$dev/device/model" ]; then
echo "$(basename $dev): $(cat $dev/device/model)"
fi
done
使用建议
- 权限问题:部分命令(如
fdisk -l、smartctl、iotop)需要root权限,建议使用sudo - 跨平台:Windows推荐用PowerShell + WMI,Linux用上述Bash脚本
- 输出格式:
- 日常监控:
df -h+lsblk - 详细分析:
fdisk -l+smartctl - 编程接口:Python脚本(可输出JSON)
- 日常监控:
需要保存脚本并赋予执行权限:
chmod +x disk_info.sh ./disk_info.sh