fix: 优化磁盘信息获取逻辑,排除临时文件系统和网络驱动器

This commit is contained in:
Akizon77
2025-05-25 18:17:00 +08:00
parent 26b54ac85d
commit 6257278426

View File

@@ -1,6 +1,8 @@
package monitoring package monitoring
import ( import (
"strings"
"github.com/shirou/gopsutil/disk" "github.com/shirou/gopsutil/disk"
) )
@@ -11,19 +13,17 @@ type DiskInfo struct {
func Disk() DiskInfo { func Disk() DiskInfo {
diskinfo := DiskInfo{} diskinfo := DiskInfo{}
usage, err := disk.Partitions(true) usage, err := disk.Partitions(false) // 使用 false 只获取物理分区
if err != nil { if err != nil {
diskinfo.Total = 0 diskinfo.Total = 0
diskinfo.Used = 0 diskinfo.Used = 0
} else { } else {
for _, part := range usage { for _, part := range usage {
if part.Mountpoint != "/tmp" && part.Mountpoint != "/var/tmp" && part.Mountpoint != "/dev/shm" { // 排除临时文件系统和网络驱动器
// Skip /tmp, /var/tmp, and /dev/shm if isPhysicalDisk(part) {
// 获取磁盘使用情况
u, err := disk.Usage(part.Mountpoint) u, err := disk.Usage(part.Mountpoint)
if err != nil { if err != nil {
diskinfo.Total = 0 continue
diskinfo.Used = 0
} else { } else {
diskinfo.Total += u.Total diskinfo.Total += u.Total
diskinfo.Used += u.Used diskinfo.Used += u.Used
@@ -33,3 +33,39 @@ func Disk() DiskInfo {
} }
return diskinfo return diskinfo
} }
// isPhysicalDisk 判断分区是否为物理磁盘
func isPhysicalDisk(part disk.PartitionStat) bool {
mountpoint := strings.ToLower(part.Mountpoint)
// 临时文件系统
if mountpoint == "/tmp" || mountpoint == "/var/tmp" || mountpoint == "/dev/shm" ||
mountpoint == "/run" || mountpoint == "/run/lock" {
return false
}
fstype := strings.ToLower(part.Fstype)
// 网络驱动器
if strings.HasPrefix(fstype, "nfs") || strings.HasPrefix(fstype, "cifs") ||
strings.HasPrefix(fstype, "smb") || fstype == "vboxsf" || fstype == "9p" ||
strings.Contains(fstype, "fuse") {
return false
}
// Windows 网络驱动器通常是映射盘符但不容易通过fstype判断
// 可以通过opts判断Windows网络驱动通常有相关选项
optsStr := strings.ToLower(part.Opts)
if strings.Contains(optsStr, "remote") || strings.Contains(optsStr, "network") {
return false
}
// Docker overlay
if fstype == "overlay" {
return false
}
// 虚拟内存
if strings.HasPrefix(part.Device, "/dev/loop") || fstype == "devtmpfs" || fstype == "tmpfs" {
return false
}
return true
}