Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用udev规则枚举符号链接,其中udev不';我不支持%e_Linux_Ansible_Filesystems_Udev - Fatal编程技术网

Linux 使用udev规则枚举符号链接,其中udev不';我不支持%e

Linux 使用udev规则枚举符号链接,其中udev不';我不支持%e,linux,ansible,filesystems,udev,Linux,Ansible,Filesystems,Udev,我使用的是不支持的udev版本(在Centos7上),但我想使用它提供的功能 具体来说,我有几个NVME设备,由两种不同的类型组成,它们都可以在一个硬件集群上使用,但可能无法插入到确切的位置。我想列举它们,这样我就可以继续使用Ansible或其他一些管理工具以编程方式进行分区、添加文件系统和装载驱动器。具体地说,我最终想做一些类似于mkfs.ext4/dev/type1nvme1-L nvme1和mkfs.ext4/dev/type2nvme1-L的事情-当然,为了做到这一点,我每次都需要在相同

我使用的是不支持的udev版本(在Centos7上),但我想使用它提供的功能

具体来说,我有几个NVME设备,由两种不同的类型组成,它们都可以在一个硬件集群上使用,但可能无法插入到确切的位置。我想列举它们,这样我就可以继续使用Ansible或其他一些管理工具以编程方式进行分区、添加文件系统和装载驱动器。具体地说,我最终想做一些类似于
mkfs.ext4/dev/type1nvme1-L nvme1
mkfs.ext4/dev/type2nvme1-L的事情-当然,为了做到这一点,我每次都需要在相同的
/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"

udevadm触发后

[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


因此,简而言之,对于不支持%e命名行为的版本,是否有任何方法可以获得该命名行为

您是否考虑过更新到支持所需功能的版本?我没有发现任何RHEL/centos版本支持带有
%e
修饰符的udev。这似乎是一个旧的/不推荐的选项。它在Ubuntu上也不可用,据证实,问题是udev导致的竞争条件。通过
udevadm control-m 1将udev max workers设置为“1”,可以“解决”触发问题,我们可以努力确保脚本处理udev的多线程。您是否考虑过更新到支持所需功能的版本?我没有找到任何支持udev且具有
%e
修饰符的RHEL/centos版本。这似乎是一个旧的/不推荐的选项。它在Ubuntu上也不可用,据证实,问题是udev导致的竞争条件。通过
udevadm control-m1
将udev max workers设置为“1”,可以“解决”触发问题,我们可以确保脚本处理来自udev的多线程。
[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