一、技术背景与需求分析
在混合云存储环境中,运维人员常面临以下挑战:物理磁盘与虚拟磁盘混杂管理困难、LUN信息采集效率低下、存储设备变更时映射关系更新不及时。传统人工检查方式存在三大痛点:依赖人工经验易出错、无法实时获取完整映射链、难以处理大规模存储集群。
本文提出的自动化方案通过脚本实现三个核心功能:1)自动识别物理磁盘与虚拟磁盘;2)采集LUN标识信息;3)建立设备-挂载点-LUN的三级映射关系。该方案特别适用于需要快速定位存储故障的场景,如存储阵列扩容后的设备验证、存储路径异常排查等。
二、脚本实现原理与核心逻辑
1. 磁盘设备识别机制
脚本采用lsblk命令结合管道处理实现设备筛选:
lsblk | grep disk | grep ^s | awk '{print $1}'
该命令组合通过三重过滤:
grep disk:筛选出磁盘类型设备grep ^s:匹配以s开头的设备名(SCSI/SATA设备)awk '{print $1}':提取设备名称列
2. 挂载点采集方法
对每个识别到的磁盘设备,进一步采集其挂载点信息:
lsblk /dev/$lunmap | grep lvm | awk '{print $NF}'
这里的关键处理逻辑:
- 通过
/dev/$lunmap指定设备路径 grep lvm筛选出LVM逻辑卷awk '{print $NF}'获取最后一列的挂载点路径
3. LUN信息提取技术
使用smartctl工具获取设备标识信息:
smartctl -a /dev/$lunmap | grep "Logical Unit id" | awk -F":" '{print $2}'
该命令链实现:
-a参数获取完整设备信息grep "Logical Unit id"定位LUN标识字段awk -F":"以冒号为分隔符提取值
三、完整脚本实现与优化
1. 基础脚本结构
#!/bin/bashfor lunmap in $(lsblk | grep disk | grep ^s | awk '{print $1}')dofor mpoint in $(lsblk /dev/$lunmap | grep lvm | awk '{print $NF}')doecho "$lunmap --> $mpoint --> $(smartctl -a /dev/$lunmap | grep "Logical Unit id" | awk -F":" '{print $2}')"donedone
2. 增强型脚本优化
针对实际应用场景,建议进行以下优化:
-
错误处理机制:添加命令执行状态检查
if ! smartctl -a /dev/$lunmap > /dev/null 2>&1; thenecho "Warning: Failed to query $lunmap"continuefi
-
输出格式标准化:使用制表符分隔字段
printf "%-10s --> %-20s --> %s\n" "$lunmap" "$mpoint" "$lun_id"
-
性能优化:缓存设备列表减少重复查询
devices=$(lsblk | grep disk | grep ^s | awk '{print $1}')for lunmap in $devices; do# 后续处理逻辑done
四、脚本部署与使用指南
1. 权限配置要求
脚本执行需要以下权限:
smartctl命令执行权限(通常需要root)- 设备文件读取权限
建议配置方式:sudo chmod +x block_device_mapping.shsudo chown root:root block_device_mapping.sh
2. 执行方式选择
根据使用场景选择执行方式:
-
常规执行:
sudo ./block_device_mapping.sh
-
单行命令模式(适合临时调试):
for lunmap in $(lsblk | grep disk | grep ^s | awk '{print $1}'); dofor mpoint in $(lsblk /dev/$lunmap | grep lvm | awk '{print $NF}'); dolun_id=$(smartctl -a /dev/$lunmap | grep "Logical Unit id" | awk -F":" '{print $2}')printf "%-10s --> %-20s --> %s\n" "$lunmap" "$mpoint" "$lun_id"donedone
3. 结果解析示例
典型输出格式:
sdb --> /data --> 0x3600d0230000000000e1140463955737csdc --> /app --> 0x3600d0230000000000e114046395577cd
输出解读要点:
- 虚拟磁盘(如VMware虚拟设备)不会显示LUN信息
- 物理存储设备会显示16进制格式的LUN标识
- 挂载点可能包含多个条目(如存在多个LVM卷)
五、高级应用场景扩展
1. 存储变更检测
通过定时执行脚本并对比输出,可实现存储设备变更检测:
# 首次执行保存基准./block_device_mapping.sh > baseline.txt# 后续执行对比差异./block_device_mapping.sh > current.txtdiff baseline.txt current.txt
2. 与监控系统集成
可将脚本输出接入日志收集系统,实现存储设备的实时监控:
./block_device_mapping.sh | while read line; doecho "$(date) - $line" >> /var/log/storage_map.logdone
3. 自动化故障排查
结合LUN信息可开发自动化故障诊断流程:
- 识别异常挂载点
- 获取对应LUN标识
- 查询存储阵列管理界面定位具体设备
- 执行针对性维护操作
六、最佳实践与注意事项
1. 执行环境要求
- 需安装
smartmontools包(提供smartctl工具) - 建议在物理服务器或经过存储直通的虚拟机中执行
- 避免在容器环境中直接使用(需挂载设备文件系统)
2. 常见问题处理
-
smartctl命令不可用:
- 安装smartmontools:
yum install smartmontools或apt-get install smartmontools
- 安装smartmontools:
-
设备识别异常:
- 检查lsblk版本是否过旧
- 确认设备命名规则是否符合预期(某些系统可能使用nvme*命名)
-
权限不足问题:
- 使用sudo执行或配置sudoers免密码
- 考虑使用setuid位(需谨慎评估安全风险)
3. 性能优化建议
- 对大规模存储环境(>100块磁盘),建议分批处理
- 可将设备列表输出到文件后并行处理
- 考虑使用更高效的语言实现(如Python的psutil库)
本方案通过自动化脚本实现了存储设备信息的透明化管理,特别适用于需要频繁操作存储设备的运维场景。实际部署时建议结合具体环境进行调整,并建立完善的输出日志机制以便问题追溯。