You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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设备管理机制即可实现,不需要自己写循环监听,操作步骤非常简单:

  1. 先编写你需要自动执行的脚本,比如路径为/usr/local/bin/disk-auto-handler.sh,示例内容如下:
#!/bin/bash
# udev会自动传入设备全路径到环境变量DEVNAME,直接调用即可
echo "新接入的存储设备为: $DEVNAME" >> /tmp/disk-insert.log
# 下方可以补充你自己的业务逻辑
  1. 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/disk-auto-handler.sh
  1. 新建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及之后的设备

  1. 重载udev规则让配置生效:
sudo udevadm control --reload-rules

配置完成后,后续每接入一块新的存储设备,系统会自动执行你写的脚本,不需要手动查询设备名,udev会直接把设备全路径通过DEVNAME环境变量传给脚本。

内容的提问来源于stack exchange,提问作者hunterzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:36:03