获取disk参数
命令行:
df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 41153856 28058544 10998160 72% /
tmpfs 3925384 0 3925384 0% /dev/shm
/dev/sda1 487652 144402 317650 32% /boot
/dev/sda5 915383628 307557352 561320756 36% /home
通过/proc虚拟文件系统
cat /proc/diskstats
输出:
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0
7 0 loop0 0 0 0 0 0 0 0 0 0 0 0
7 1 loop1 0 0 0 0 0 0 0 0 0 0 0
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0
11 0 sr0 0 0 0 0 0 0 0 0 0 0 0
8 0 sda 1344106 1663542 29293600 2377613 270750 5550066 46583400 27877737 0 3015302 30258156
8 1 sda1 696 275 27488 597 20 6 64 531 0 1011 1127
8 2 sda2 116010 51679 5829362 327116 167370 1100011 10139128 2335122 0 1163309 2662218
8 3 sda3 6206 23271 235816 39420 8468 856234 6928160 2516768 0 50862 2557927
8 4 sda4 3 0 12 86 0 0 0 0 0 86 86
8 5 sda5 1221018 1588316 23199530 2010088 94071 3593815 29516048 23017612 0 1998328 25028788
8 16 sdb 0 0 0 0 0 0 0 0 0 0 0
8 32 sdc 0 0 0 0 0 0 0 0 0 0 0
8 80 sdf 0 0 0 0 0 0 0 0 0 0 0
8 64 sde 0 0 0 0 0 0 0 0 0 0 0
8 48 sdd 0 0 0 0 0 0 0 0 0 0 0
go代码(读取/proc/diskstats来实现)
package disk
import "golang.org/x/sys/unix"
// Usage returns a file system usage. path is a filessytem path such
// as "/", not device file path like "/dev/vda1". If you want to use
// a return value of disk.Partitions, use "Mountpoint" not "Device".
func Usage(path string) (*UsageStat, error) {
stat := unix.Statfs_t{}
err := unix.Statfs(path, &stat)
if err != nil {
return nil, err
}
bsize := stat.Bsize
ret := &UsageStat{
Path: path,
Fstype: getFsType(stat),
Total: (uint64(stat.Blocks) * uint64(bsize)),
Free: (uint64(stat.Bavail) * uint64(bsize)),
InodesTotal: (uint64(stat.Files)),
InodesFree: (uint64(stat.Ffree)),
}
// if could not get InodesTotal, return empty
if ret.InodesTotal < ret.InodesFree {
return ret, nil
}
ret.InodesUsed = (ret.InodesTotal - ret.InodesFree)
ret.Used = (uint64(stat.Blocks) - uint64(stat.Bfree)) * uint64(bsize)