如何在 udev 程序中查找设备路径?

如何在 udev 程序中查找设备路径?

我正在尝试构建一个插入 USB 驱动器时重新安装的系统。

插入 USB 后,它会被映射到类似的东西/dev/sdc1。然后我想卸载,然后使用重新安装pmount(以便获得用户权限,以便另一个程序可以读取/访问 USB 驱动器)。我一直在手动运行以下命令:

  1. sudo umount /dev/sdc1
  2. pmount /dev/sdc1 some_label

然后我有另一个程序可以从中读取文件/media/some_label

但是,这需要通过编程来完成。我创建了以下 udev 规则:

ACTION=="add", \
ATTRS{idVendor}=="154b", \
ATTRS{idProduct}=="00ed", \
RUN+="/usr/bin/bash /home/some/script/location/script.sh"

我知道它正在运行,因为我可以将运行命令更改为,mkdir并且我看到当我插入 USB 时创建了(测试)目录。

但是,我不确定如何/dev/sdc1在 shell 脚本中以编程方式查找设备路径 ()。这样,我就可以运行上面列出的 2 个命令。

有什么建议么?

答案1

乌德夫:

传递环境变量如下:

RUN+="/home/some/script/location/script.sh DEVNAME=$env{DEVNAME}"

并在脚本中将设备名称的变量script.sh解析为:$@

if [[ "$@" =~ (DEVNAME=/dev/sd.?) ]] ; then
__DEVNAME="${BASH_REMATCH[1]}"
__DEVNAME="${__DEVNAME#*=}" ; fi

/dev/sda然后您应该在变量中有设备名称$__DEVNAME

重击:

安装jq方式:

sudo apt install jq

要查找设备分区和挂载点:

对于分区:

sudo lsblk -o NAME -J /dev/sda | jq -r '.blockdevices | .[].children | .[] | .name'

对于挂载点:

__TMPFILE="$(mktemp)"
sudo lsblk -p -o NAME,MOUNTPOINT -J /dev/sda | jq -r '.blockdevices | .[].children | .[] | "declare -A __MOUNTS[\(.name)]=\"\(.mountpoint)\""' > "$__TMPFILE"
source $__TMPFILE 
echo "Your mount point for sda1 is ${__MOUNTS[sda1]}"

相关内容