[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开机自动加载到正确的网卡上
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设备