如何通过Bash获取最新接入的/dev/sd类存储设备名称?
解决方案
一、手动获取新接入存储设备名的极简方法
不需要对比两次lsblk输出,直接用一行命令就能拿到最新接入的磁盘设备全路径:
echo /dev/$(dmesg | grep -E 'sd\w+: .*Attached SCSI disk' | tail -n 1 | awk '{print substr($4,1,length($4)-1)}')
命令说明:从内核日志中匹配最后一个接入的SCSI磁盘记录,提取设备名后拼接成/dev/sdX格式直接输出,执行即可拿到结果,不需要额外操作。
如果只需要匹配所有磁盘中最后新增的,也可以用lsblk直接过滤:
lsblk -p -n -o NAME,TYPE | grep ' disk$' | tail -n 1 | awk '{print $1}'
二、插入设备后自动运行脚本的实现方案
用系统自带的udev设备管理机制即可实现,不需要自己写循环监听,操作步骤非常简单:
- 先编写你需要自动执行的脚本,比如路径为
/usr/local/bin/disk-auto-handler.sh,示例内容如下:
#!/bin/bash # udev会自动传入设备全路径到环境变量DEVNAME,直接调用即可 echo "新接入的存储设备为: $DEVNAME" >> /tmp/disk-insert.log # 下方可以补充你自己的业务逻辑
- 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/disk-auto-handler.sh
- 新建udev规则文件
/etc/udev/rules.d/99-auto-disk.rules,写入以下内容:
# 匹配新接入的块存储磁盘设备,触发执行自定义脚本 ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]", RUN+="/usr/local/bin/disk-auto-handler.sh"
如果需要排除原有/dev/sda、/dev/sdb的触发事件,可以把规则里的
KERNEL=="sd[a-z]"改成KERNEL=="sd[c-z]",只会匹配sdc及之后的设备
- 重载udev规则让配置生效:
sudo udevadm control --reload-rules
配置完成后,后续每接入一块新的存储设备,系统会自动执行你写的脚本,不需要手动查询设备名,udev会直接把设备全路径通过DEVNAME环境变量传给脚本。
内容的提问来源于stack exchange,提问作者hunterzz
相关产品推荐
相关产品推荐

