我刚刚在 Dell 1950 服务器上安装了RHEL 6.3。该服务器作为两个 GBit 端口,Gb0 和 Gb1。
出于某种晦涩的原因,udev选择命名Gb0 eth1和Gb1 eth0。这对我来说绝对不是一个好发现,只会让人感到困惑。
所以我修改了配置/etc/udev/rules.d/70-persistent-net.rules:
# PCI device 0x14e4:0x164c (bnx2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \
ATTR{address}=="00:20:19:52:d3:c0", \
ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
# PCI device 0x14e4:0x164c (bnx2)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \
ATTR{address}=="00:20:19:52:d3:be", \
ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Run Code Online (Sandbox Code Playgroud)
我只是更改了文件上的“NAME”字段以反映我想要的内容。我重新启动了服务器,但没有奏效。
在dmesg日志中,我可以阅读以下内容:
udev: renamed network interface eth1 to rename5
udev: renamed network interface eth0 to eth1
udev: renamed network interface rename5 to eth0
Run Code Online (Sandbox Code Playgroud)
知道这里有什么问题吗?为什么会这样udev切换?我有另一个类似的服务器,我没有这个问题。
我想在 Linux 环境中根据供应商 ID 禁用 USB 设备。我想根据供应商 ID 只允许特定的 USB 设备。
我尝试创建一些 udev 规则来挂载和卸载我的 USB 闪存驱动器;目前的规则非常简单:
ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"
Run Code Online (Sandbox Code Playgroud)
plug_flash_drive.sh 也很简单:
device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"
Run Code Online (Sandbox Code Playgroud)
unplug_flash_drive.sh:
device_name=$1
umount "/dev/$device_name"
rmdir "/media/$device_name"
Run Code Online (Sandbox Code Playgroud)
我做了一些测试,所以我可以确定:
有人知道为什么在 udev 调用时不执行 mount 吗?
28/08/14 编辑:我在脚本末尾添加了“grep -q /proc/mounts && echo success || echo failure”,以检查我的调试日志是否在脚本结束之前实际安装了设备。即使 udev 调用了该脚本,该设备似乎也已安装在该点上。所以现在真正的问题是“当通过 udev 调用时,我的块设备似乎在挂载脚本结束后卸载了”:s
虽然我理解 udev 的伟大并感谢开发人员的努力,但我只是想知道是否有替代方案。
例如,我可能会想象应该有一种方法来制作启动脚本,该脚本创建我的系统(不更改硬件)上的大多数设备节点无论如何都是相同的。
我想跳过的好处或原因与跳过udev相同dbus,即降低复杂性并通过增加我的更改来更安全地设置系统。
我写这个规则是为了测试目的:
SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Kingston", ATTRS{serial}=="001CC0EC34A2BB318709004B", ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1642", SYMLINK+="pen", NAME="pendrak"
Run Code Online (Sandbox Code Playgroud)
基于以下信息:
# udevadm info --name=/dev/sdb --attribute-walk
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5:1.0/host2/target2:0:0/2:0:0:0/block/sdb':
KERNEL=="sdb"
SUBSYSTEM=="block"
DRIVER==""
ATTR{ro}=="0"
ATTR{size}=="30299520"
ATTR{stat}==" 419 …Run Code Online (Sandbox Code Playgroud) 该文件/etc/udev/rules.d/70-persistent-net.rules是在带有 udev 的 Linux 系统上自动生成的,如果它不存在,则在重启期间。但我想知道如何在不重新启动服务器的情况下创建此规则文件(使用命令)。
我在谷歌上搜索了一段时间,发现规则文件是由这个脚本生成的:
/lib/udev/write_net_rules
Run Code Online (Sandbox Code Playgroud)
但是,无法从命令行运行此脚本,因为(我假设)它希望由 udev 启动,并正确设置了一些环境变量。手动启动它会打印错误消息“缺少 $INTERFACE”。即使我在脚本启动之前设置了 env 变量 INTERFACE=eth0,它仍然会打印错误“缺少有效匹配”。更不用说我有两个接口(eth0和eth1),我希望为两者生成规则文件。
我也想触发这样的 udev 事件,希望它会从 udev 本身启动脚本,但没有任何改变:
udevadm trigger --type=devices --action=change
Run Code Online (Sandbox Code Playgroud)
那么,有人知道如何在/etc/udev/rules.d/70-persistent-net.rules不重启的情况下重新生成文件中的持久网络规则吗?
相关问题:USB 连接/断开通知
当设备插入/拔出时,我会收到即时通知,这很棒。但是为了使它(几乎)完美,我还想获得像 一样的设备文件名/dev/ttyUSB0,甚至更好的是,它的所有符号链接。
但是,我无法找到如何从udev、 或 从lsusb或以其他方式获取此信息。我拥有的设备的唯一 ID 是像/devices/pci0000:00/0000:00:1d.0/usb5/5-1. 如何从中获取设备文件名?
我想知道如何列出所有 udev 规则。
我知道它们可以作为行(一行 = 一个规则)*.rules存储在这些目录中的文件中
/etc/udev/rules.d
/lib/udev/rules.d
/run/udev/rules.d
/var/run/udev/rules.d
Run Code Online (Sandbox Code Playgroud)
因此,我虽然可以通过简单地连接*.rules这些目录中的所有文件来找到所有规则。这似乎不起作用(因为执行了一些规则,我在这些目录中找不到任何规则作为规则)。
充其量我认为 udevadm 界面有一个命令,它可以让我打印出 udev 当前拥有的所有规则。
可以肯定的是,我进行了审查,man udevadm尤其是关于部分udevadm info [parameters]似乎没有产生任何结果。
鉴于 udev 允许针对同一设备的大量文件和规则,不知道为设备编写所有规则的有效/可行方法令人沮丧。
我在理解规则中如何评估来自不同父设备的 udev 设备属性时遇到了一些麻烦。我想为特定的串口usb设备(HUAWEI Modem)写一个规则,属性walk如下:
$ udevadm info --attribute-walk --name=/dev/ttyUSB0
looking at device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="generic"
ATTRS{port_number}=="0"
looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0':
KERNELS=="1-1.3:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="usbserial_generic"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="02"
ATTRS{bInterfaceProtocol}=="01"
ATTRS{bNumEndpoints}=="03"
ATTRS{supports_autosuspend}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceNumber}=="00"
looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3':
KERNELS=="1-1.3"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="1.3"
ATTRS{idVendor}=="12d1"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 4"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="5"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="500mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0001"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="4561"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="HUAWEI"
ATTRS{removable}=="removable"
ATTRS{idProduct}=="1506"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="HUAWEI MOBILE"
Run Code Online (Sandbox Code Playgroud)
为了识别此设备,我尝试使用以下 …
我知道这个问题类似于“ Udev:重命名我的网络接口”,但我不认为它是重复的,因为我的接口不是通过 udev 规则命名的,并且该问题中的其他答案都不适用于我。
所以我在这台笔记本电脑上有一个 WiFi 适配器,我想将接口从 wlp5s0 重命名为 wlan0:
root@aj-laptop:/etc/udev/rules.d# iwconfig
wlp5s0 IEEE 802.11 ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=off
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
eth0 no wireless extensions.
lo no wireless extensions.
root@aj-laptop:/etc/udev/rules.d# ifconfig wlp5s0
wlp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 00:80:34:1f:d8:3f txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped …Run Code Online (Sandbox Code Playgroud)