golang获取Linux系统内核硬件信息插件库sysinfo的使用
Golang 获取 Linux 系统内核硬件信息插件库 sysinfo 的使用
简介
sysinfo 是一个 Go 语言库,用于获取 Linux 操作系统/内核/硬件系统信息。它是一个完全独立的库,不依赖于主机系统,也不执行外部程序。它只收集"库存类型"的信息,即那些不经常变化的数据。
代码示例
以下是一个完整的示例代码,展示如何使用 sysinfo 库获取系统信息:
package main
import (
"encoding/json"
"fmt"
"log"
"os/user"
"github.com/zcalusic/sysinfo"
)
func main() {
// 检查当前用户是否为 root
current, err := user.Current()
if err != nil {
log.Fatal(err)
}
if current.Uid != "0" {
log.Fatal("requires superuser privilege")
}
var si sysinfo.SysInfo
// 获取系统信息
si.GetSysInfo()
// 将系统信息转换为 JSON 格式并打印
data, err := json.MarshalIndent(&si, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(data))
}
功能特点
- 完全独立,无外部依赖
- 不执行外部程序
- 只收集不经常变化的"库存类型"信息
- 适用于任何现代/受支持的 Linux 发行版
系统要求
sysinfo 需要:
- Linux 内核 4.2 或更高版本
- 访问 /sys 和 /proc Linux 虚拟文件系统
- 访问 /etc、/var、/run 文件系统中的各种文件
- 超级用户权限(用于访问 SMBIOS/DMI 表和检测 RAM 大小及属性)
安装方法
使用 go get 命令安装:
go get github.com/zcalusic/sysinfo
示例输出
运行上述代码后,会输出类似以下的 JSON 格式系统信息:
{
"sysinfo": {
"version": "0.9.1",
"timestamp": "2016-09-24T13:30:28.369498856+02:00"
},
"node": {
"hostname": "web12",
"machineid": "04aa55927ebd390829367c1757b98cac",
"timezone": "Europe/Zagreb"
},
"os": {
"name": "CentOS Linux 7 (Core)",
"vendor": "centos",
"version": "7",
"release": "7.2.1511",
"architecture": "amd64"
},
"kernel": {
"release": "3.10.0-327.13.1.el7.x86_64",
"version": "#1 SMP Thu Mar 31 16:04:38 UTC 2016",
"architecture": "x86_64"
},
"product": {
"name": "RH2288H V3",
"vendor": "Huawei",
"version": "V100R003",
"serial": "2103711GEL10F3430658"
},
"board": {
"name": "BC11HGSA0",
"vendor": "Huawei",
"version": "V100R003",
"serial": "033HXVCNG3107624"
},
"chassis": {
"type": 17,
"vendor": "Huawei"
},
"bios": {
"vendor": "Insyde Corp.",
"version": "3.16",
"date": "03/16/2016"
},
"cpu": {
"vendor": "GenuineIntel",
"model": "Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz",
"speed": 2400,
"cache": 20480,
"cpus": 1,
"cores": 8,
"threads": 16
},
"memory": {
"type": "DRAM",
"speed": 2133,
"size": 65536
},
"storage": [
{
"name": "sda",
"driver": "sd",
"vendor": "ATA",
"model": "ST9500620NS",
"serial": "9XF2HZ9K",
"size": 500
}
],
"network": [
{
"name": "enp3s0f1",
"driver": "ixgbe",
"macaddress": "84:ad:5a:e3:79:71",
"port": "fibre",
"speed": 10000
}
]
}
许可证
sysinfo 使用 MIT 许可证。
更多关于golang获取Linux系统内核硬件信息插件库sysinfo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang获取Linux系统内核硬件信息插件库sysinfo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 获取 Linux 系统内核硬件信息 - sysinfo 使用指南
在 Golang 中获取 Linux 系统内核和硬件信息有多种方式,其中 sysinfo
是一个常用的库。下面我将详细介绍如何使用 sysinfo
库以及相关的替代方案。
1. 使用 sysinfo 库
sysinfo
是一个用于收集系统信息的 Golang 库,可以获取 CPU、内存、磁盘、网络、进程等信息。
安装
go get github.com/zcalusic/sysinfo
基本使用示例
package main
import (
"encoding/json"
"fmt"
"log"
"time"
"github.com/zcalusic/sysinfo"
)
func main() {
var si sysinfo.SysInfo
si.GetSysInfo()
data, err := json.MarshalIndent(&si, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(data))
}
获取特定信息
package main
import (
"fmt"
"time"
"github.com/zcalusic/sysinfo"
)
func main() {
var si sysinfo.SysInfo
// 获取系统信息
si.GetSysInfo()
// 打印系统信息
fmt.Println("系统信息:")
fmt.Printf("主机名: %s\n", si.Node.Hostname)
fmt.Printf("操作系统: %s %s\n", si.OS.Name, si.OS.Version)
fmt.Printf("内核版本: %s\n", si.Kernel.Release)
fmt.Printf("系统架构: %s\n", si.Node.Machine)
fmt.Printf("系统启动时间: %s\n", time.Unix(int64(si.Node.Uptime), 0))
// CPU信息
fmt.Println("\nCPU信息:")
fmt.Printf("CPU型号: %s\n", si.CPU.Model)
fmt.Printf("CPU核心数: %d\n", si.CPU.Cpus)
fmt.Printf("CPU线程数: %d\n", si.CPU.Cores)
// 内存信息
fmt.Println("\n内存信息:")
fmt.Printf("总内存: %.2f GB\n", float64(si.Memory.Total)/1024/1024/1024)
fmt.Printf("可用内存: %.2f GB\n", float64(si.Memory.Free)/1024/1024/1024)
// 磁盘信息
fmt.Println("\n磁盘信息:")
for _, disk := range si.BlockDevices {
fmt.Printf("设备: %s, 大小: %.2f GB\n", disk.Name, float64(disk.Size)/1024/1024/1024)
}
}
2. 替代方案
除了 sysinfo
,还有其他一些库可以获取系统信息:
使用 gopsutil
package main
import (
"fmt"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/host"
"github.com/shirou/gopsutil/v3/mem"
)
func main() {
// 主机信息
hostInfo, _ := host.Info()
fmt.Printf("主机名: %s\n", hostInfo.Hostname)
fmt.Printf("操作系统: %s %s\n", hostInfo.OS, hostInfo.PlatformVersion)
fmt.Printf("内核版本: %s\n", hostInfo.KernelVersion)
// CPU信息
cpuInfo, _ := cpu.Info()
for _, c := range cpuInfo {
fmt.Printf("CPU型号: %s, 核心数: %d\n", c.ModelName, c.Cores)
}
// 内存信息
memInfo, _ := mem.VirtualMemory()
fmt.Printf("总内存: %.2f GB\n", float64(memInfo.Total)/1024/1024/1024)
fmt.Printf("可用内存: %.2f GB\n", float64(memInfo.Available)/1024/1024/1024)
}
使用 /proc 文件系统直接读取
package main
import (
"fmt"
"io/ioutil"
"os"
"strings"
)
func main() {
// 获取 CPU 信息
cpuInfo, _ := ioutil.ReadFile("/proc/cpuinfo")
fmt.Println("CPU 信息:")
fmt.Println(string(cpuInfo))
// 获取内存信息
memInfo, _ := ioutil.ReadFile("/proc/meminfo")
fmt.Println("\n内存信息:")
fmt.Println(string(memInfo))
// 获取系统版本信息
osRelease, _ := ioutil.ReadFile("/etc/os-release")
fmt.Println("\n系统版本信息:")
fmt.Println(string(osRelease))
}
3. 性能比较
sysinfo
: 简单易用,但功能相对有限gopsutil
: 功能全面,跨平台支持好- 直接读取
/proc
: 最灵活,但需要自己解析数据
4. 最佳实践建议
- 如果需要快速获取系统信息,推荐使用
sysinfo
- 如果需要更详细的系统监控信息,推荐使用
gopsutil
- 如果需要特定信息或自定义解析,可以直接读取
/proc
或/sys
下的文件
以上方法都可以帮助你在 Golang 中获取 Linux 系统的内核和硬件信息,根据你的具体需求选择合适的方案即可。