如何在Linux下利用Lsblk -P输出Key=Value格式的数据流驱动自动化云盘初始化与部署脚本

小磊同学_8940

小磊同学_8940

2026-06-19

895人浏览

原创

lsblk -P 是解析块设备信息最规范的机器可读方式,输出键值对(如 NAME="sda" TYPE="disk"),天然适配自动化工具;核心用于云盘初始化,需筛选 TYPE="disk"、RO="0"、MOUNTPOINT="" 且 SIZE≥阈值的裸盘。

如何在linux下利用lsblk -p输出key=value格式的数据流驱动自动化云盘初始化与部署脚本

lsblk -P 是 Linux 下解析块设备信息最规范的机器可读方式,输出形如 NAME="sda" TYPE="disk" SIZE="100G" RO="0" RM="0" MODEL="Virtual_disk" 的键值对,天然适配 shell 脚本、Ansible、Python 等自动化工具。用于云盘初始化(如识别新挂载的数据盘、跳过系统盘、自动分区/格式化/挂载)非常可靠。

理解 lsblk -P 输出结构与关键字段

执行 lsblk -P -o NAME,TYPE,SIZE,RO,RM,MOUNTPOINT,MODEL 可定制输出字段。核心字段含义:

  • NAME:设备名(如 sdb、nvme0n1),不含路径,适合拼接 /dev/
  • TYPE:必须为 disk(跳过 part、rom、loop)才能作为原始云盘处理
  • RO:只读标志,RO="0" 表示可写(必须检查,避免误操作只读设备)
  • RM:可移动标志,云盘通常为 RM="0";部分云环境(如 AWS EBS)可能为 RM="1",需按实际策略判断
  • MOUNTPOINT:为空(MOUNTPOINT="")表示未挂载,是“待初始化”云盘的关键判据
  • SIZE:带单位(如 "100G"),可用 awk 或 numfmt 提取纯数值做容量判断(例如只处理 ≥20G 的盘)

Shell 脚本中安全提取并过滤目标云盘

用 while IFS= read -r line 逐行解析,配合 eval 将 Key=Value 转为变量(注意引号保护):

lsblk -P -o NAME,TYPE,SIZE,RO,RM,MOUNTPOINT | while IFS= read -r line; do
  [ -z "$line" ] && continue
  eval "$line"  # 将 NAME="sdb" TYPE="disk" → 变量 $NAME $TYPE 等
  if [[ $TYPE == "disk" && $RO == "0" && -z $MOUNTPOINT ]]; then
    dev="/dev/$NAME"
    size_gb=$(echo "$SIZE" | sed 's/[A-Z]//g')  # 去掉单位,粗略比较(如 "50G" → "50")
    if (( $(echo "$size_gb >= 20" | bc -l) )); then
      echo "发现待初始化云盘: $dev ($SIZE)"
      # 后续执行 parted/mkfs/mount...
    fi
  fi
done

⚠️ 注意:while 循环在管道中会启用子 shell,变量无法回传。生产脚本建议改用进程替换:while ...; do ...; done ,确保变量作用域可控。

对接自动化部署(Ansible / Python 示例)

Ansible 中直接解析: 使用 community.general.lsblk 模块(底层即调用 lsblk -P),返回结构化 JSON:

Linux Distros
Linux Distros

Linux发行版游乐场,适用于需要临时Linux沙箱、基于浏览器的Linux虚拟机、一次性终端环境、桌面Linux会话等场景

下载
- name: 获取裸盘列表
  community.general.lsblk:
    output_fields: "NAME,TYPE,SIZE,RO,RM,MOUNTPOINT"
  register: blkinfo
  • name: 初始化未挂载的数据盘 block:
    • filesystem: fstype: xfs dev: "/dev/{{ item.NAME }}"
    • mount: path: "/data/{{ item.NAME }}" src: "/dev/{{ item.NAME }}" fstype: xfs state: mounted loop: >- {{ blkinfo.blkdevs | selectattr('TYPE', 'equalto', 'disk') | selectattr('RO', 'equalto', '0') | selectattr('MOUNTPOINT', 'equalto', '') | list }}

Python 中解析(推荐用 subprocess + shlex):

import subprocess, shlex
<p>result = subprocess.run(['lsblk', '-P', '-o', 'NAME,TYPE,SIZE,RO,RM,MOUNTPOINT'],
capture_output=True, text=True)
disks = []
for line in result.stdout.strip().split('\n'):
if not line.strip():
continue</p><h1>安全拆分 Key="Value"(支持含空格的 Value)</h1><pre class="brush:php;toolbar:false;">kv_pairs = shlex.split(line)
attrs = {}
for kv in kv_pairs:
    if '=' in kv:
        k, v = kv.split('=', 1)
        attrs[k] = v.strip('"\'')
if (attrs.get('TYPE') == 'disk' and
    attrs.get('RO') == '0' and
    not attrs.get('MOUNTPOINT')):
    disks.append('/dev/' + attrs['NAME'])

print("待处理云盘:", disks)

云环境特殊注意事项

不同云平台的设备命名与行为有差异,需针对性适配:

  • AWS EC2:EBS 卷常为 xvdf、nvme1n1,RM="1";建议加 MODEL 字段过滤(如 MODEL="Amazon Elastic Block Store")
  • 阿里云 ECS:系统盘为 vda,数据盘多为 vdb~vdd;注意 vdb 可能已被 cloud-init 自动挂载,需检查 MOUNTPOINT 是否为空
  • 腾讯云 CVM:NVMe 盘为 nvme0n1,SATA 盘为 sdb;部分镜像默认将第二块盘挂载到 /data,需确认是否覆盖
  • 统一建议:首次运行前加 dry-run 模式(如 --dry-run 参数),仅打印将执行的操作,不真实格式化

不复杂但容易忽略:始终用 lsblk -P 而非 lsblk 默认输出,避免因列宽截断、空格错位导致解析失败;所有设备路径拼接前校验 NAME 是否匹配正则 ^[a-z]+[0-9]*$,防注入风险。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

linux shell脚本 python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3950

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3373

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2533

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6130

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5762

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3373

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2885

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3099

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习