zoukankan      html  css  js  c++  java
  • [dpdk][kernel][driver] 如何让DPDK的UIO开机自动加载到正确的网卡上

     0. 前言

    开了虚拟机,开始dpdk之前,我每天都干这几件事:

    [root@dpdk potatos]# modprobe uio
    [root@dpdk potatos]# insmod /root/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko 
    [root@dpdk potatos]# /root/dpdk/tools/dpdk-devbind.py -b igb_uio 0000:00:04.0

    作为一个有理想的人,很明显,这件事需要让机器自己干 --! 做了上百次之后,我终于开窍了。。。

    1. linux启动过程

      BOIS/UEFI --> MBR --> grub2 -> linux kernel --> initrd --> root_fs --> sys init / systemd / busybox --> shell --> logind/display manager --> X

    可参考另一篇:https://i.cnblogs.com/PostDone.aspx?postid=6652739&actiontip=%E5%8F%91%E5%B8%83%E6%88%90%E5%8A%9F

      涉及到驱动的地方:

      A:linux kernel,有一部分驱动是直接编译到内核里边去的 /boot/vmlinuz-linux ,另一部分是动态加载的,在/usr/lib/modules/4.10.6-1-ARCH/kernel/ 下面。还有一部分是没有的。

        我们在编译内核之前,可以修改内核编译选项,有三个选项 Y / M / N  一一对应。

      B:initrd: 但是我们是两阶段启动,所以,initrd中也被集成了一部分驱动,他们的目的只是为了strap起 rootfs。可以在/etc/mkinitcpio.conf中指定。

      C:rootfs,也就是/usr/lib/modules/4.10.6-1-ARCH/kernel/ 下面的驱动。

    2. 我们讨论 rootfs中的内容。

      A:我们可以手动加载卸载他们,用modprobe。了解modprobe的大概用法,配置。

    # man modprobe
    # man modprobe.d

      B:udev, 设备插拔之类的,udev会根据事件,自动的加载卸载驱动。

    https://wiki.archlinux.org/index.php/udev

    http://www.reactivated.net/writing_udev_rules.html

    https://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html

      看完两篇文档,我依然对udev了解不深。

    所以,我应该把dpdk的uio放进udev么? 还是加入启动脚本里,在里边调用 modprobe? 

    了解一下sys init 和 systemd 的流程,应该会找到正确的方式。

    3.   sys init / systemd 流程

      略。好像没啥关系

    4.   来个别人总结的番外篇:(为了防止这位博友把原文删掉,我已经另存本地了。)

      http://www.cnblogs.com/image-eye/archive/2011/08/19/2145858.html

    5.  按照番外片里的说法,所有设备在被内核发现的时候,内核就会发内核事件出来,而外面正在监听的udev就会捕获到,然后根据modprobe.alias 和 modprobe.dep中的内容,加载一系列的模块了。

      所以,我应该去改modprobe的配置,blacklist掉相应的网卡,使之使用dpdk的驱动。

    6. https://wiki.archlinux.org/index.php/Kernel_modules#Blacklisting

    CentOS 7 里边的方法:红色为关键操作。

    [root@dpdk ~]# cd /lib/modules/3.10.0-514.6.1.el7.x86_64/extra/                 
    [root@dpdk extra]# mkdir dpdk                                                   
    [root@dpdk extra]# cp /root/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko dpdk/
    [root@dpdk etc]# cd modules-load.d/                                             
    [root@dpdk modules-load.d]# touch dpdk.conf                                     
    [root@dpdk modules-load.d]# vim dpdk.conf     
    [root@dpdk ~]# cat /etc/modules-load.d/dpdk.conf 
    igb_uio
    [root@dpdk ~]# depmod 
    [root@dpdk ~]# modprobe igb_uio
    [root@dpdk ~]# reboot
    [root@dpdk ~]# lsmod |grep igb
    igb_uio                13224  0 
    uio                    19259  1 igb_uio
    [root@dpdk ~]# 

    http://stackoverflow.com/questions/34800731/module-not-found-when-i-do-a-modprobe

    至此,UIO已经开机自动加载了,接下来的问题是,让UIO自动驱动网卡。

    截至到目前,只能自动加载。却不知道如何让指定的网卡默认加载UIO,毕竟我不能blacklist intel的驱动。而

    且从udev里卸载一个驱动去加载另一个是否常规呢?这些疑问都需要深入的理解了udev之后才能回答。

    算了,放弃了。。。。 不然人家dpdk为啥要提供个脚本。。。

    当然,实现功能是没问题的,只需要自启动一个脚本,调用这个驱动。

    如果,有幸有人读到此处并愿意分享的话,欢迎留言。

    -------- update@20170412 --------

    driver_override: 可能有点关系吧,还没有时间细研究。

    https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-platform

    https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci

    -----------  update@20170918 -------------

    自动加载hugepage.

    1. 增加内核参数: hugepages=1024

    http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html#use-of-hugepages-in-the-linux-environment

    2. 修改fstab自动挂载. 增加行

    nodev /mnt/huge hugetlbfs defaults 0 0

    ------------  update@20170918 -----------------------

    清除igb_uio自动加载的逆过程.

    1. 删除

    /etc/modules-load.d/dpdk.conf

    2. 删除

    /usr/lib/modules/3.10.0-693.2.2.el7.x86_64/weak_updates/dpdk/

    3. depmod

    与安装时不同的是, 还有后两个步骤

    4. 卸载uio

    rmmod igb_uio
    modprobe -r uio

    5. 重新生成initramfs

    mkinitrd /boot/initramfs-3.10.0-693.2.2.el7.x86_64.img.new 3.10.0-693.2.2.el7.x86_64

    6. reboot

    -------------- update @ 2018-07-25 ------------------------------------

    [administrator][driver] driverctl 是如何在udev上层管理设备驱动的

    igb_uio 自动加载问题.

    偶然发现的,可以用 driverctl  做.

    driverctl 设置了udev的rules,  同时留下了pci的ID在配置里:

    [root@D129 copyright]# rpm -ql driverctl
    /etc/driverctl.d
    /usr/lib/udev/rules.d/05-driverctl.rules
    /usr/lib/udev/rules.d/89-vfio-uio.rules
    /usr/lib/udev/vfio_name
    ... ...
    [root@D129 copyright]# cat /etc/driverctl.d/pci-0000:00:04.0 
    igb_uio
    [root@D129 copyright]# 
  • 相关阅读:
    C#实现MD5加密,winform c#2005
    关于 "基础连接已经关闭:接收时发生意外错误"
    SERVERPROPERTY方法说明
    Web 设计与开发终极资源大全(上)
    SQL Server:在 SQL Server 2005 中配置数据库邮件,发送邮件
    Web 地理定位(GeoLocation)知识大全
    sql server2005 创建作业问题
    SQL Server 监视事件
    Remoting 如何穿越防火墙
    使用SQL SERVER 2000的全文检索功能
  • 原文地址:https://www.cnblogs.com/hugetong/p/6651201.html
Copyright © 2011-2022 走看看