zoukankan      html  css  js  c++  java
  • [administrator][driver] driverctl 是如何在udev上层管理设备驱动的

    https://gitlab.com/driverctl/driverctl

    driverctl 处于 kernel 与 udev做设备与驱动管理的上层. 

    理解什么叫override是本文的核心内容.  作者为什么该参数起名叫override而不叫driver呢?

     @20180828: override 是kernel提供的概念,sysfs下提供的这一功能。而driverctl实际上不过是一个220行左右的bash脚本。详见文后的相关阅读,可以跳转至另一篇内容。

    两类用途:

    1.  做驱动加载卸载的util.

      1.1  加载override驱动:  (读到本文最后时, 你会理解驱动与override驱动的区别)

    driverctl set-override 0000:00:04.0 igb_uio

      1.2  卸载override驱动. 

    driverctl unset-override 0000:00:04.0

      1.3  卸载override驱动后,不加载原驱动.

    [root@D129 ~]# driverctl --noprobe unset-override 0000:00:04.0
    [root@D129 ~]# driverctl list-devices |grep 04
    0000:00:04.0 (none)

    2. 在udev上层做驱动配置的持久化.

    持久化内容在这个地方:

    [root@D129 ~]# driverctl set-override 0000:00:04.0 igb_uio
    [root@D129 ~]# ll /etc/driverctl.d/
    total 4
    -rw-r--r-- 1 root root 8 Jul 30 10:58 pci-0000:00:04.0
    [root@D129 ~]# cat /etc/driverctl.d/pci-0000:00:04.0 
    igb_uio

    所谓持久化, 就是保证该设备,在启动,插拔之后,都能加载到我们用driverctl设置的驱动.

    这个机制实际上是udev调用driverctl来做的. 见下文.

      2.1  不做持久化设置而单独作为util来使用的话, 可以增加--nosave参数.

    [root@D129 ~]# driverctl --nosave set-override 0000:00:04.0 igb_uio
    [root@D129 ~]# driverctl --nosave unset-override 0000:00:04.0

    当前状态查看指令

    [root@D129 ~]# driverctl list-overrides
    0000:00:04.0 igb_uio
    [root@D129 ~]# driverctl list-devices
    0000:00:00.0 (none)
    0000:00:01.0 (none)
    0000:00:01.1 ata_piix
    0000:00:01.3 piix4_smbus
    0000:00:02.0 bochs-drm
    0000:00:03.0 virtio-pci
    0000:00:04.0 igb_uio [*]
    0000:00:05.0 virtio-pci
    [root@D129 ~]# 

    配置们:

    如果实现持久化?  通过配置, 简单的来说, 就是 udev调用driverctl , driverctl读取配置文件

    [root@D129 ~]# cat /usr/lib/udev/rules.d/05-driverctl.rules 
    
    ACTION=="add", TEST=="/etc/driverctl.d/$env{SUBSYSTEM}-$kernel", PROGRAM="/usr/sbin/driverctl load-override $kernel"
    [root@D129 ~]# cat /etc/driverctl.d/pci-0000:00:04.0 
    igb_uio
    [root@D129 ~]# 

    注:  参数中使用的名称是override,   可以理解为重写驱动的意思, 就是说driverctl管理的是设备的重写驱动, 而不是设备驱动本身. 比如, 如下命令:

    [root@D129 ~]# driverctl list-devices |grep 04
    0000:00:04.0 virtio-pci
    [root@D129 ~]# driverctl unset-override 0000:00:04.0
    [root@D129 ~]# driverctl list-devices |grep 04
    0000:00:04.0 virtio-pci
    [root@D129 ~]# 

    以上命令并没有对设备驱动作出改变,  因为virtio-pci是kernel管理的驱动, 而不是 override的驱动. 

    请理解, driverctl与kernel/udev的不同层级关系.

    还有还有:

    1.  很久以前, 一直想要处理的问题, 终于在这个driverctl上找到了答案  

    [dpdk][kernel][driver] 如何让DPDK的UIO开机自动加载到正确的网卡上

    2.  TODO,   kernel和udev给设备找到正确驱动,到底是一个什么机制? 
     
     
    ----------------------- @ 2018-08-28 -----------------------------------------------------------------
    More:
    https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-platform

    https://patches.linaro.org/patch/27588/

    > echo pci-stub > /sys/bus/pci/devices/0000:03:00.0/driver_override
    > echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind
    > echo 0000:03:00.0 > /sys/bus/pci/drivers_probe
    
    
    
    > echo pci-stub > /sys/bus/pci/devices/0000:03:00.0/driver_override
    > echo 0000:03:00.0 > /sys/bus/pci/devices/0000:03:00.0/driver/unbind
    > echo 0000:03:00.0 > /sys/bus/pci/drivers_probe

    相关阅读:[dpdk][sysfs][pci] 在dpdk程序中操纵PCI设备

  • 相关阅读:
    变量按数据类型分类
    构造方法重载 及注意事项
    构造方法-带参
    构造方法-无参
    对对象中的属性赋值(两种方法)
    局部变量的值赋给成员变量 案例(红色字体)
    成员变量与局部变量区别
    创建对象综合案例
    20151015css3 部分css2的内容
    20151012jq4
  • 原文地址:https://www.cnblogs.com/hugetong/p/9389557.html
Copyright © 2011-2022 走看看