lsblk -p 以 key="value" 格式输出块设备信息,适配脚本解析;需用 -o 指定字段,-b 获取字节数,name 无 /dev/ 前缀,nvme 命名特殊,应检查版本兼容性。

lsblk -P 是 Linux 中专为脚本解析设计的输出模式,它将块设备信息以 KEY="VALUE" 的形式(类似 shell 变量赋值)打印,天然适配 eval、declare 或字段提取工具,非常适合驱动自动化磁盘部署脚本。
理解 lsblk -P 的输出结构
执行 lsblk -P 会输出类似这样的内容:
NAME="sda" MAJ:MIN="8:0" RM="0" SIZE="100G" RO="0" TYPE="disk" MOUNTPOINT="" NAME="sda1" MAJ:MIN="8:1" RM="0" SIZE="99G" RO="0" TYPE="part" MOUNTPOINT="/" NAME="sda2" MAJ:MIN="8:2" RM="0" SIZE="1G" RO="0" TYPE="part" MOUNTPOINT="[SWAP]" NAME="sr0" MAJ:MIN="11:0" RM="1" SIZE="1024M" RO="0" TYPE="rom" MOUNTPOINT=""
每行代表一个设备或分区,所有字段用空格分隔,值统一用双引号包裹(含空格、斜杠、括号等特殊字符),保证 shell 安全解析。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
在 Bash 脚本中安全解析 -P 输出
推荐使用 while read -r line + eval(需谨慎)或更安全的 declare -A + 字符串拆分。以下为两种可靠方式:
-
方式一:用 declare -A 构建设备映射(推荐)
逐行提取 NAME 并构建关联数组,避免 eval 执行任意字符串:
declare -A dev_info while IFS= read -r line; do [[ -z "$line" ]] && continue name=$(echo "$line" | sed -n 's/NAME="\([^"]*\)".*/\1/p') [[ -n "$name" ]] || continue # 将整行转为可 source 的变量定义(仅提取 KEY="VALUE" 对) cleaned=$(echo "$line" | sed 's/[^[:space:]A-Za-z0-9_="]*//g') eval "declare -A dev_info_$name=( $cleaned )" done
-
方式二:用 mapfile + declare(简洁版)
适用于单设备快速提取:
mapfile -t lines
结合自动化部署的典型用例
例如:自动选择未挂载的大于 50G 的空闲磁盘,创建 LVM PV / VG / LV,并格式化挂载:
- 用
lsblk -P -o NAME,SIZE,TYPE,MOUNTPOINT过滤出TYPE="disk"且MOUNTPOINT=""的设备 - 用
awk或bash比较SIZE(注意单位:-P 默认为人类可读,加-b则为字节) - 提取
NAME后拼接/dev/$NAME,传给pvcreate、vgcreate等命令 - 后续可结合
findmnt或再次调用lsblk -P验证挂载结果
注意事项与避坑点
-
-P默认不显示所有字段;务必用-o显式指定所需列(如NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE,MODEL),否则缺失字段不会输出 -
SIZE在无-b时是字符串(如"100G"),比较大小需先转换或改用-b获取字节数 - 设备名(
NAME)不含/dev/前缀,脚本中需手动拼接 - 对 NVMe 设备,
NAME为nvme0n1,分区为nvme0n1p1,命名规则与 SCSI 不同,解析逻辑需兼容 - 若脚本需跨发行版运行,建议加
lsblk --version检查是否支持-P(coreutils ≥ 8.22)










