[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设备