GO解析 - Linux 指令之 lsblk

版本

lsblk --version
lsblk from util-linux 2.38.1

代码

lsblkParser.go

package utils

type LSBlkItem struct {
	Name       string // 名称
	Major      uint   // 主版本
	Minor      uint   // 此版本
	Removable  bool   // 可移除de
	Writable   bool   // 可写的
	Size       uint   // 大小字节
	Type       string // 类型, part是上一个磁盘的一部分,disk就是磁盘
	MountPoint string // 挂载点

	Parent *LSBlkItem // 父挂载点
}

type LSBlkParser struct {
}

lsblkParser_linux.go

package utils

import (
	"errors"
	"os/exec"
	"strconv"
	"strings"
)

func (l *LSBlkParser) GetSizes(devNames []string) ([]LSBlkItem, error) {
	items, err := l.getItems()
	if nil != err {
		return nil, err
	}
	return items, err
}

func (l *LSBlkParser) getItems() ([]LSBlkItem, error) {
	/*
		-b 以字节显示磁盘大小
		-p 打印设备完整路径
	*/
	cmd := exec.Command("lsblk", "-b", "-p")
	bs, err := cmd.CombinedOutput()
	if nil != err {
		return nil, err
	}

	lines := strings.SplitN(string(bs), "\n", -1)
	var (
		isChild bool
		parent  *LSBlkItem
		items   = make([]LSBlkItem, 0)
	)
	for i, line := range lines {
		var item LSBlkItem
		if 0 == i || 0 >= len(line) {
			continue
		} // 第一行是标题行, 跳过
		item, isChild, err = l.getItem(line)
		if nil != err {
			return nil, err
		}
		if isChild {
			item.Parent = parent
		}
		items = append(items, item)
		if !isChild {
			parent = &items[len(items)-1]
		}
	}

	return items, err
}

func (l *LSBlkParser) getItem(line string) (item LSBlkItem, isChild bool, err error) {
	var (
		itemMinCnt = 6 // 字符串分解之后最少会有多少个
		//itemMaxCnt = 7
		currItemCnt = 0
	)
	/*
		NAME              MAJ:MIN RM        SIZE RO TYPE MOUNTPOINTS
		/dev/sda            8:0    1           0  0 disk
		/dev/sdb            8:16   1 31104958464  0 disk
		/dev/mmcblk0      179:0    0  7818182656  0 disk
		├─/dev/mmcblk0p1  179:1    0   536870912  0 part /boot/firmware
		└─/dev/mmcblk0p2  179:2    0  7277117440  0 part /
		/dev/mmcblk0boot0 179:32   0     4194304  1 disk
		/dev/mmcblk0boot1 179:64   0     4194304  1 disk
	*/
	strs := strings.Fields(line)
	currItemCnt = len(strs)
	if itemMinCnt > currItemCnt {
		return item, false, errors.New("item count not enough")
	}
	for i, str := range strs {
		switch i {
		case 0:
			if item.Name, err = l.getName(str); nil != err {
				return
			}
		case 1:
			if item.Major, item.Minor, err = l.getMajorMinor(str); nil != err {
				return
			}
		case 2:
			if item.Removable, err = l.getRemovable(str); nil != err {
				return
			}
		case 3:
			if item.Size, err = l.getSize(str); nil != err {
				return
			}
		case 4:
			if item.Writable, err = l.getWritable(str); nil != err {
				return
			}
		case 5:
			if item.Type, isChild, err = l.getType(str); nil != err {
				return
			}
		case 6:
			if item.MountPoint, err = l.getMountPoint(str); nil != err {
				return
			}
		}
	}

	return
}

func (l *LSBlkParser) getName(str string) (string, error) {
	for i := range str {
		if str[i] != '/' {
			continue
		}
		str = str[i:]
		return str, nil
	}

	return str, nil
}

func (l *LSBlkParser) getMajorMinor(str string) (major uint, minor uint, err error) {
	var temp uint64
	strs := strings.Split(str, ":") // 8:0
	for i := range strs {
		if temp, err = strconv.ParseUint(strs[i], 10, 32); nil != err {
			return
		}
		if 0 == i {
			major = uint(temp)
		} else if 1 == i {
			minor = uint(temp)
		} else {
			break
		}
	}
	return
}

func (l *LSBlkParser) getRemovable(str string) (bool, error) {
	temp, err := strconv.ParseUint(str, 10, 64)
	if nil != err {
		return false, err
	}
	if 0 == temp {
		return false, nil
	} else {
		return true, nil
	}
}

func (l *LSBlkParser) getSize(str string) (uint, error) {
	temp, err := strconv.ParseUint(str, 10, 64)
	if nil != err {
		return 0, err
	}
	return uint(temp), nil
}

func (l *LSBlkParser) getWritable(str string) (bool, error) {
	temp, err := strconv.ParseUint(str, 10, 64)
	if nil != err {
		return false, err
	}
	if 0 == temp {
		return true, nil
	} else {
		return false, nil
	}
}

func (l *LSBlkParser) getType(str string) (typ string, isChild bool, err error) {
	typ = str
	if 0 == strings.Compare(str, "disk") {
		isChild = false
	} else if 0 == strings.Compare(str, "part") {
		isChild = true
	}
	return
}

func (l *LSBlkParser) getMountPoint(str string) (string, error) {
	return str, nil
}


测试

main.go

package main

import (
	"encoding/json"
	"fmt"
	"pi_gpio_test/utils"
)

func main() {
	var lsblkParser utils.LSBlkParser

	items, err := lsblkParser.GetSizes([]string{
		"/dev/sda", "/dev/sdb",
	})
	if nil != err {
		fmt.Println(err)
		return
	}

	for _, item := range items {
		bs, err := json.Marshal(item)
		fmt.Println(string(bs), err)
	}
}

结果

{“Name”:“/dev/sda”,“Major”:8,“Minor”:0,“Removable”:true,“Writable”:true,“Size”:0,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}
{“Name”:“/dev/mmcblk0”,“Major”:179,“Minor”:0,“Removable”:false,“Writable”:true,“Size”:3523215360,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}
{“Name”:“├─/dev/mmcblk0p1”,“Major”:179,“Minor”:1,“Removable”:false,“Writable”:true,“Size”:536870912,“Type”:“part”,“MountPoint”:“/boot/firmware”,“Parent”:{“Name”:“/dev/mmcblk0”,“Major”:179,“Minor”:0,“Removable”:false,“Writable”:true,“Size”:3523215360,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}}
{“Name”:“└─/dev/mmcblk0p2”,“Major”:179,“Minor”:2,“Removable”:false,“Writable”:true,“Size”:2982150144,“Type”:“part”,“MountPoint”:“/”,“Parent”:{“Name”:“/dev/mmcblk0”,“Major”:179,“Minor”:0,“Removable”:false,“Writable”:true,“Size”:3523215360,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}}
{“Name”:“/dev/mmcblk0boot0”,“Major”:179,“Minor”:32,“Removable”:false,“Writable”:false,“Size”:4194304,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}
{“Name”:“/dev/mmcblk0boot1”,“Major”:179,“Minor”:64,“Removable”:false,“Writable”:false,“Size”:4194304,“Type”:“disk”,“MountPoint”:“”,“Parent”:null}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/593595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏:【机器学习:项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月5日,星期日

每天一分钟,知晓天下事! 2024年5月5日 星期日 农历三月廿七 立夏 1、 近日国际金价大幅震荡,跌至近一个月新低。 2、 2024亚洲少年攀岩锦标赛:中国选手包揽U14和U12速度赛男女组前三名。 3、 马来西亚将进一步优化中国游客入境程…

【详细教程】手把手教你开通YouTube官方API接口(youtube data api v3)

文章目录 一、背景调查1.1 youtube介绍1.2 分析价值与意义1.3 API接口介绍 二、申请接口权限2.1、注册Google账号2.2、创建项目2.3、启用youtube data api v3服务2.4、创建凭据 三、后续发布 一、背景调查 1.1 youtube介绍 众所周知,youtube是目前全球最大的视频社…

MyCat安装配置,及数据分片

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Python深度学习基于Tensorflow(1)Numpy基础

numpy的重要性不言而喻,一般不涉及到GPU/TPU计算,都是用numpy,常见的np就是这个玩意。其特点就是快!其实如果不涉及到深度学习,还有一个库是很重要的,scipy,集成了很多的东西。 安装和导入如下…

002-ChatGLM4接入Langchain

智谱AI GLM-4 新一代基座大模型GLM-4,整体性能相比GLM3全面提升60%,逼近GPT-4;支持更长上下文;更强的多模态;支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体能力。 基础能力(英文):GLM-4 在 MMLU、GSM8K、MATH、BBH、HellaSwag、HumanEval等…

[云原生]Docker-compose:一站式多容器应用部署神器

目录 引言 一、Docker Compose 简介 (一)基本信息 (二)核心特性 (三)文件格式 二、Docker Compose 环境安装 (一)准备安装包 (二)添加执行权限 三、…

[Meachines][Hard]Napper

Main $ nmap -p- -sC -sV 10.10.11.240 --min-rate 1000 $ curl http://10.10.11.240 $ gobuster dir -u "https://app.napper.htb" -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -k 博客 $ ffuf -c -w /usr/share/se…

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层:构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章:模板语法基础 Django模板语法介绍 Django模…

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台,旨在处理大规模数据的存储和处理。它提供了分布式文件系统(HDFS)和分布式计算框架(MapReduce),使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

【Java基础】15.脚本、编译、注解

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 文章目录 系列文章目录15.脚本、编译、注解15.1 Java的脚本机制15.1.1 获取脚本引擎15.1.2 脚本计算与绑定15.1.3 重定向输入和输出15.1.4 调用脚本的函数和方法15.1.5 编…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错,如何知道是 哪个 symbols 不对呢? 今天探索到下面的方法: 1、点击导航上方 最右侧的按钮,查看历史报错 2、选中报错信息,右键选择 Expand All Transcripts 在出现的详细信息面…

【ARM Cortex-M3指南】4:存储器系统

文章目录 四、存储器系统4.1 存储器系统特性概述4.2 存储器映射4.3 存储器访问属性4.4 默认的存储器访问权限4.5 位段操作4.5.1 位段操作的优势4.5.2 不同数据宽度的位段操作4.5.3 C程序实现位段操作 4.6 非对称传输4.7 排他访问4.8 端模式 四、存储器系统 4.1 存储器系统特性…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例:系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容: Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

【计算机科学速成课】笔记二

笔记一 文章目录 7.CPU阶段一:取指令阶段阶段二:解码阶段阶段三:执行阶段 8.指令和程序9.高级CPU设计——流水线与缓存 7.CPU CPU也叫中央处理器,下面我们要用ALU(输入二进制,会执行计算)、两种…

倪海厦(二)研究任何学问(东西)批判去看

大家好今天我们接着研究,倪海厦是如何思考问题的: 研究任何学问(东西),批判去看,假设--验证--结果。以果决其行!!!放空自己。学而后思,思学并进。 今天这一篇呢&#xf…

医疗器械软件相关的追溯关系

在医疗器械软件开发过程中,追溯性是确保产品质量和安全性的关键步骤之一。追溯性要求各个阶段的需求、设计、实现和测试之间能够清晰、连贯地关联起来,以便在整个开发周期中进行有效的跟踪和管理。IEC62304中明确输出的内容要有对应的追溯性,…

golang学习笔记(内存模型和分配机制)

操作系统的存储管理 虚拟内存管理 虚拟内存是一种内存管理技术,它允许操作系统为每个进程提供一个比实际物理内存更大的地址空间。这个地址空间被称为虚拟地址空间,而实际的物理内存则被称为物理地址空间。使用虚拟内存有以下几点好处: 内…

docker系列8:容器卷挂载(上)

目录 传送门 从安装redis说起 什么是容器卷挂载 操作系统的挂载 日志文件一般是"首恶元凶" 挂载命令 容器卷挂载 卷挂载命令 启动时挂载 查看挂载卷信息 容器卷管理 查看卷列表 创建容器卷 具名挂载与匿名挂载 具名挂载 传送门 docker系列1&#xff…
最新文章