linux - 使用不支持 %e 的 udev 规则枚举符号链接
问题描述
我使用的 udev 版本(在 Centos7 上)不支持设备的 %e 命名,但我想使用它提供的功能。
具体来说,我有几个 NVME 设备,由两种不同类型组成,它们都可以在硬件集群上使用,但可能无法插入确切的位置。我想列举它们,以便我可以继续使用 Ansible 或其他一些管理工具以编程方式进行分区、添加文件系统和挂载驱动器。具体来说,我最终想做一些类似mkfs.ext4 /dev/type1nvme1 -L nvme1
和mkfs.ext4 /dev/type2nvme1 -L different_nvme1
- 但当然为了做到这一点,我/dev
每次都需要将设备放在同一个位置。
我已将此答案视为指南:
然而,最大的问题是,udev 似乎是多线程的并且一次枚举多个设备 - 所以脚本失败。我有两种类型的大约 18 个 nvme 设备,我通常只获得其中大约 6 或 7 个的符号链接,而且数字是错误的。这是 udev 规则,以及我正在使用的脚本:
# all nvme devices
KERNEL=="nvme*[0-9]n*[0-9]", SUBSYSTEMS=="nvme"\
, ATTR{queue/read_ahead_kb}="4096"\
, ATTR{queue/rotational}="0"\
, ATTR{queue/scheduler}="none"
# Better rename type1 cards
KERNEL=="nvme*[0-9]n*[0-9]", ATTRS{model}=="Dell Express Flash PM1725a*"\
, PROGRAM="/usr/local/sbin/unique-num /dev disktype1"\
, SYMLINK+="disktype1%c"
#
# Better rename internal nvme (primary seg) cards
KERNEL=="nvme*[0-9]n*[0-9]", ATTRS{model}=="Dell Express Flash NVMe P4600*"\
, PROGRAM="/usr/local/sbin/unique-num /dev disktype2"\
, SYMLINK+="disktype2 %c"
# cat /usr/local/sbin/unique-num
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: $0 location prefix" >&2
exit 1
fi
location="$1"
prefix="$2"
needindex=1
index=0
while [ $needindex -eq 1 ]
do
if [ ! -e $location/$prefix$index ]; then
needindex=0
echo "$index"
else
(( index++ ))
fi
done
之后udevadm trigger
:
[root@sdw1 ~]# ls -l /dev/disk_type*
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type10 -> nvme0n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type11 -> nvme1n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type12 -> nvme2n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type13 -> nvme3n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type14 -> nvme4n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type15 -> nvme9n1
lrwxrwxrwx 1 root root 7 Apr 2 18:56 /dev/disk_type20 -> nvme7n1
lrwxrwxrwx 1 root root 8 Apr 2 18:56 /dev/disk_type21 -> nvme13n1
lrwxrwxrwx 1 root root 8 Apr 2 18:56 /dev/disk_type22 -> nvme16n1
lrwxrwxrwx 1 root root 8 Apr 2 18:56 /dev/disk_type23 -> nvme14n1
简而言之 - 有什么方法可以为不支持它的版本获取 udev 的 %e 命名行为?
解决方案
推荐阅读
- c++ - Cout 是空的,我不知道为什么
- java - 模式不允许包含数字的单词?
- javascript - 将不同的 URL 分配给不同的 ID
- azure - 如何使用 Azure DevOps 阶段的 Docker 映像?
- smtp - 无法通过 PHP 验证 SMTP
- excel - 在具有可变范围的列中查找重复项并在单独的列中计数
- javascript - 如何使用单行递归地将属性添加到 Javascript 数组?
- ansible - Ansible:使用节点锚点和合并键拆分不同的 yaml 文件
- node-config - 如何使用 node-config 从数组中获取项目属性
- flutter - 警告:您当前运行的“颤振”工具不是当前目录中的工具