GO解析 - Linux 指令之 lsblk

news/2024/5/20 4:27:02

版本

lsblk --version
lsblk from util-linux 2.38.1

代码

lsblkParser.go

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

lsblkParser_linux.go

package utilsimport ("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 boolparent  *LSBlkItemitems   = make([]LSBlkItem, 0))for i, line := range lines {var item LSBlkItemif 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 = 7currItemCnt = 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 uint64strs := strings.Split(str, ":") // 8:0for 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 = strif 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 mainimport ("encoding/json""fmt""pi_gpio_test/utils"
)func main() {var lsblkParser utils.LSBlkParseritems, 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.mrgr.cn/p/15063724

相关文章

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

Jmeter-线程组下篇

线程组 线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户,多个虚拟用户同时执行相同的一批任务。…

stable diffusion 之云端部署攻略

本文主要介绍stable diffusion云端产品以及使用步骤 ℹ️整合安装包、模型资源见文末~ megaease cloud(强烈推荐) 优点: 集成了常用大模型和插件、VAE3080显卡配置,费用大概0.48元/小时,可随时暂停,暂停…

【自然语言处理】seq2seq模型——机器翻译

seq2seq模型——机器翻译 1 任务目标 1.1 案例简介 seq2seq是神经机器翻译的主流框架,如今的商用机器翻译系统大多都基于其构建,在本案例中,我们将使用由NIST提供的中英文本数据训练一个简单的中英翻译系统,在实践中学习seq2se…

腾讯游戏海外扩张,增持芬兰游戏开发商股份持股比例增至14.8%

易采游戏网5月8日消息,近日腾讯再次出手,大幅增持了芬兰知名游戏开发商Remedy Entertainment的股份,持股比例猛增至14.8%。这一举动引起了业界和投资者的广泛关注。 据了解,腾讯此次增持是在2024年4月24日完成的。根据芬兰法律规…

Ubuntu下halcon软件的下载安装

由于工作需求,点云配准需要使用halcon进行实现,并且将该功能放入QT界面中 1.下载halcon 进入halcon官网进行下载 官网链接:https://www.mvtec.com/products/halcon/ 注意:要注册登陆之后才能进行下载 接着点击Downloads->H…

Axure实现菜单抽屉效果

Axure是怎么实现如下效果的? 菜单打开和收起侧边栏菜单抽屉效果 实现效果 两级菜单,点击菜单收起其他菜单,打开当前菜单。 实现原理 单击一级菜单时,1)切换当下二季菜单的显示/隐藏状态 2)隐藏其他菜单…

网络安全之ACL

ACL:访问控制列表——控制列表(策略列表),是一个控制工具。 功能:!、定义感兴趣路由(控制层面)。2、定义感兴趣流量(数据层面)。 例如: 假设在该…

【MsSQL】数据库基础 库的基本操作

目录 一,数据库基础 1,什么是数据库 2,主流的数据库 3,连接服务器 4,服务器,数据库,表关系 5,使用案例 二,库的操作 1,创建数据库 2,创建…

【攻防技术系列+Python】-- 用 Python 控制系统进程

用 Python 控制系统进程 由于注册表几乎可以决定整个操作系统的运行,因此它成为安全工具与恶意软件对抗的主要战场之一。除了注册表之外,对系统进程的控制也是安全工具和恶意软件的必争之地。这里我们首先要了解程序和进程的区别。程序是静态的,进程是动态的。进程可以分为系…

两个手机在一起ip地址一样吗?两个手机是不是两个ip地址

在数字时代的浩瀚海洋中,手机已经成为我们生活中不可或缺的一部分。随着移动互联网的飞速发展,IP地址成为了连接手机与互联网的桥梁。那么,两个手机在一起IP地址一样吗?两个手机是不是两个IP地址?本文将带您一探究竟&a…

【快速入门Linux】10_Linux命令—Vi编辑器

文章目录 一、vi 简介1.1 vi1.2 vim1.3查询软连接命令(知道) 二、打开和新建文件(重点)2.1 打开文件并且定位行2.2 异常处理 三、vi三种工作模式(重点)3.1 末行模式-命令 四、常用命令4.0 命令线路图4.1 移…

图像涂哪就动哪!Gen-2新功能“神笔马良”爆火,网友:急急急

AI搞视频生成,已经进化到这个程度了?! 对着一张照片随手一刷,就能让被选中的目标动起来! 明明是一辆静止的卡车,一刷就跑了起来,连光影都完美还原: 原本只是一张火灾照片&#xff0…

STM32快速入门(串口传输之USART)

STM32快速入门(串口传输之USART) 前言 USART串口传输能实现信息在设备之间的点对点传输,支持单工、半双工、全全双工,一般是有三个引脚:TX、RX、SW_RX(共地)。不需要一根线来同步时钟。最大优…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置:2C,2G内存,50G存储 3、集群架构设计 从表格中,可以看出,Hadoop集群,主要有2个模块服务,一个是HDFS服务,一个是…

基于web的物流管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

特斯拉CEO马斯克访华,或加速FSD技术在中国的落地

特斯拉首席执行官埃隆马斯克于4月底进行了中国之旅,这一访问被业内人士认为可能加速特斯拉FSD(Full Self-Drive,完全自动驾驶)技术在中国的应用。业内专家指出,马斯克的此番到访可能会对中国自动驾驶市场产生深远影响&…

VMware如何将虚拟机的端口服务映射出去

我们有时候在VMware起了一个服务,想要局域网的朋友同事访问 这时候就需要i端口映射 选择NAT模式 VMnet8点击 NAT设置 然后点击添加然后映射传入端口对话框 红色部分是 你主机本机,也就是你在用的电脑的空闲端口(可以打开cmd 输入命令 : netstat -ano 查看已用端口都有哪些…

c++多线程2小时速成

简介 c多线程基础需要掌握这三个标准库的使用&#xff1a;std::thread,std::mutex, andstd::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::th…

CSS 伪类、伪元素的应用实例:电池充电、高能进度条

一、目的 本文通过 CSS 伪类、伪元素&#xff0c;结合动画 animation 和 Vue 动态样式属性&#xff08;通过 CSS 变量&#xff09;的写法&#xff0c;来实现电池充电、高能进度条的效果&#xff0c;如下图所示。 二、基础知识 1、CSS 伪类、伪元素 简单概括成以下 4 点&#x…