udev

装了OFED,会安装下面的文件:

# cat /etc/udev/rules.d/82-net-setup-link.rules
SUBSYSTEM=="net", ACTION=="add", ATTR{phys_switch_id}!="", ATTR{phys_port_name}!="", \
        IMPORT{program}="/etc/infiniband/vf-net-link-name.sh $attr{phys_port_name} $attr{phys_switch_id}" \
        NAME="$env{NAME}", RUN+="/sbin/ethtool -L $env{NAME} combined 4", GOTO="net_setup_skip_link_name"


SUBSYSTEM=="net", ACTION=="add", ATTR{phys_port_name}!="", \
        IMPORT{program}="/etc/infiniband/vf-net-link-name.sh $attr{phys_port_name}" \
        NAME="$env{NAME}", RUN+="/sbin/ethtool -L $env{NAME} combined 4"

LABEL="net_setup_skip_link_name"

上面的ATTR可以通过udevadm查看:

#  udevadm info -a /sys/class/net/enp4s0f0

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:02.0/0000:04:00.0/net/enp4s0f0':
    KERNEL=="enp4s0f0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{dormant}=="0"
    ATTR{testing}=="0"
    ATTR{gro_flush_timeout}=="0"
    ATTR{addr_assign_type}=="0"
    ATTR{num_prio_hp}=="0"
    ATTR{carrier_down_count}=="10"
    ATTR{link_mode}=="0"
    ATTR{duplex}=="full"
    ATTR{netdev_group}=="0"
    ATTR{addr_len}=="6"
    ATTR{iflink}=="47"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{carrier}=="1"
    ATTR{napi_defer_hard_irqs}=="0"
    ATTR{speed}=="25000"
    ATTR{mtu}=="1500"
    ATTR{dev_id}=="0x0"
    ATTR{ifalias}==""
    ATTR{type}=="1"
    ATTR{address}=="b8:59:9f:bb:31:82"
    ATTR{dev_port}=="0"
    ATTR{tx_queue_len}=="1000"
    ATTR{flags}=="0x1003"
    ATTR{ifindex}=="47"
    ATTR{name_assign_type}=="4"
    ATTR{operstate}=="up"
    ATTR{phys_port_name}=="p0"
    ATTR{carrier_up_count}=="11"
    ATTR{carrier_changes}=="21"
    ATTR{hp_pp_burst_size}=="0"
    ATTR{proto_down}=="0"

比如ATTR{phys_port_name}就是p0,也可以通过sysfs直接查看:

# cat /sys/class/net/enp4s0f0/phys_port_name
p0

/etc/infiniband/vf-net-link-name.sh文件里面出现的变量也可以用udevadm查看:

# udevadm info /sys/class/net/enp4s0f0
P: /devices/pci0000:00/0000:00:02.0/0000:04:00.0/net/enp4s0f0
L: 0
E: DEVPATH=/devices/pci0000:00/0000:00:02.0/0000:04:00.0/net/enp4s0f0
E: INTERFACE=enp4s0f0
E: IFINDEX=47
E: SUBSYSTEM=net
E: USEC_INITIALIZED=319791501875
E: ID_NET_NAMING_SCHEME=v240
E: ID_NET_NAME_MAC=enxb8599fbb3182
E: ID_OUI_FROM_DATABASE=Mellanox Technologies, Inc.
E: ID_NET_NAME_PATH=enp4s0f0np0
E: ID_BUS=pci
E: ID_VENDOR_ID=0x15b3
E: ID_MODEL_ID=0x1017
E: ID_PCI_CLASS_FROM_DATABASE=Network controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
E: ID_VENDOR_FROM_DATABASE=Mellanox Technologies
E: ID_MODEL_FROM_DATABASE=MT27800 Family [ConnectX-5]
E: ID_PATH=pci-0000:04:00.0
E: ID_PATH_TAG=pci-0000_04_00_0
E: ID_NET_DRIVER=mlx5_core
E: ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
E: ID_NET_NAME=enp4s0f0np0
E: NAME=enp4s0f0
E: SYSTEMD_ALIAS=/sys/subsystem/net/devices/enp4s0f0 /sys/subsystem/net/devices/enp4s0f0
E: TAGS=:systemd:

比如ID_NET_DRIVER=mlx5_core。

至于ID_NET_NAME是从那里生成的,我觉得是通过systemd生成的。代码可以通 git clone git@github.com:systemd/systemd.git 下载。

调用函数如下:

builtin_net_id
        name_pci
                dev_pci_slot

如果link name是eno1,o代表onboard。如果是enp4s0f0,p代表pci。后面是slot,function。

在Buildroot环境中配置和使用 `udev` 是构建嵌入式Linux系统过程中常见的需求之一,特别是在需要动态管理设备节点或实现设备热插拔支持的场景中。Buildroot 提供了对 `udev` 的集成支持,但需要正确配置以确保其正常运行。 ### 配置udev支持 在Buildroot中启用 `udev` 支持主要通过配置菜单完成。首先,进入Buildroot的配置界面: ```bash make menuconfig ``` 然后依次选择以下选项以启用 `udev`: - **Target packages** → - **System tools** → - **[*] udev** 该选项将确保在最终的根文件系统中包含 `udev` 工具和相关配置文件 [^2]。 此外,为了确保 `udev` 能够正常工作,还需要启用一些基础的内核特性,包括: - 在内核配置中启用 `CONFIG_UEVENT_HELPER_PATH`,并将其设置为 `/sbin/udevsend` 或 `/sbin/udevd`,这取决于具体使用的 `udev` 版本。 - 启用 `CONFIG_NETLINK_KOBJECT_UEVENT` 以支持通过 netlink 接口发送 uevent 事件 [^1]。 ### 使用udev规则 在Buildroot中添加自定义的 `udev` 规则可以通过以下方式实现: 1. **创建自定义规则文件**:在 `board/<your_board>/udev/rules.d/` 目录下创建 `.rules` 文件。例如,为特定的USB设备创建规则文件 `99-my-usb-device.rules`。 2. **规则示例**: ```udev SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678", MODE="0666" ``` 3. **配置Buildroot使用自定义规则**:在 `make menuconfig` 中启用 `BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_UDEV` 选项,以确保在构建过程中将自定义规则包含到最终的根文件系统中 [^4]。 ### 启动时启用udev服务 为了确保 `udev` 在系统启动时自动运行,还需要确保初始化系统(如BusyBox init或systemd)中正确配置了 `udev` 的启动脚本。Buildroot会根据所选的初始化系统自动处理大部分配置,但如果使用的是自定义的启动脚本,则可能需要手动添加以下命令: ```bash udevd --daemon udevadm trigger ``` 上述命令将启动 `udev` 守护进程并触发所有设备事件,确保设备节点正确创建 [^2]。 ### 注意事项 - 如果项目对系统大小有严格限制,可以考虑使用 `mdev` 替代 `udev`,因为 `mdev` 更轻量级,但功能也相对有限。 - 对于需要高度定制化设备管理逻辑的项目,`udev` 提供了更丰富的功能和更高的灵活性 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值