【问题标题】:Manipulate kernel device name with udev rules使用 udev 规则操作内核设备名称
【发布时间】:2014-02-15 21:18:47
【问题描述】:

我有一个 bash 脚本,它接受一个 KERNEL 设备名称作为参数,并输出一个可用作新 KERNEL 设备名称的新字符串。

Example: 
bash myScript sda
output: sdaa

为此我使用自定义 udev 规则。

我不确定如何将参数传递到 bash 脚本并使用 udev 规则捕获结果输出。

这是我尝试过的一些规则,

KERNEL=="sda", RUN+="/bin/bash /etc/udev/myScript '%E{KERNEL}'", NAME="%c"

KERNEL=="sda", IMPORT{program}="/bin/bash /etc/udev/myScript --export %k", NAME="%c"

KERNEL=="sda", IMPORT{program}="/bin/bash /etc/udev/myScript --import %k --export %c", NAME="%c"

我使用 echo 将我的字符串输出到标准输出。

【问题讨论】:

  • 删除了关于服务器故障的重复问题

标签: linux bash device udev


【解决方案1】:

无法更改设备节点的名称。只能创建额外的符号链接。

如果您为 NAME 键赋值,您只能更改网络接口的名称。

见systemd udev documentation。旧的standalone udevd也一样

【讨论】:

    【解决方案2】:

    设备属性可以通过设备属性(%k - 设备内核名称,%p - 设备的开发路径)传递给脚本。您可以参考 udev 手册页了解所有可用的设备属性。

    shell 脚本的 std 输出通过 "%c" 提供给 udev 规则。 .

    这条规则怎么样:

    KERNEL=="sda", RUN+="/bin/bash /etc/udev/myScript %k", NAME="%c"
    

    【讨论】:

    • 这也不起作用。 /dev/sda 不再存在于 /dev/ 下。这意味着脚本的某些部分做了一些工作,但没有创建 /dev/sdaa。我的脚本很简单,只包含一行,echo echo $1 | sed "s/${1:2:1}/${1:2:1}${1:2:1}/"
    • 通过更改 udev 的日志级别检查是否可以找到任何有用的日志。 udevadm control --log-priority=debug
    • 最初,只是从脚本中输出一些常量,看看它是否改变了设备名称。
    • 我有设备 sda 和 sdb。如果我将 sda 的名称更改为 sdb,我看不到 sda,而只看到 sdb。这意味着 sda 已成为 sdb。但是如果我尝试将 sda 更改为类似备份的东西,我在 /dev/ 下看不到备份
    • 在启用调试日志后发现任何 udev 相关日志(/var/log/messages)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多