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. 最佳实践建议

  1. 如果需要快速获取系统信息,推荐使用 sysinfo
  2. 如果需要更详细的系统监控信息,推荐使用 gopsutil
  3. 如果需要特定信息或自定义解析,可以直接读取 /proc/sys 下的文件

以上方法都可以帮助你在 Golang 中获取 Linux 系统的内核和硬件信息,根据你的具体需求选择合适的方案即可。

回到顶部