[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 ::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.-514.6..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
uio 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
------------ update@20170918 -----------------------
清除igb_uio自动加载的逆过程.
1. 删除
/etc/modules-load.d/dpdk.conf
2. 删除
/usr/lib/modules/3.10.-693.2..el7.x86_64/weak_updates/dpdk/
3. depmod
与安装时不同的是, 还有后两个步骤
4. 卸载uio
rmmod igb_uio
modprobe -r uio
5. 重新生成initramfs
mkinitrd /boot/initramfs-3.10.-693.2..el7.x86_64.img.new 3.10.-693.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/-driverctl.rules
/usr/lib/udev/rules.d/-vfio-uio.rules
/usr/lib/udev/vfio_name
... ...
[root@D129 copyright]# cat /etc/driverctl.d/pci-\:\:04.0
igb_uio
[root@D129 copyright]#
[dpdk][kernel][driver] 如何让DPDK的UIO开机自动加载到正确的网卡上的更多相关文章
- 浅析 GRUB 如何加载 linux kernel
前言 对于 GRUB 的加载流程,网上绝大部分都是写对 menu.lst, grub.cfg 这些 GRUB 配置文件的编写流程,就像是写脚本语言一样,用些关键字就能让 PC机能正确启动桌面 Linu ...
- [driver]linux内核动态加载模块
问题: 1. 把编译好的模块放到板子/lib/modules对应文件夹下,并且执行了depmod -a, 比如pl2303.ko, 那么下一次插入pl2303的串口线,是否可以识别,也就是自动加载pl ...
- selenium学习笔记11——driver.get(url) 页面加载时间太长
在执行自动化测试用例过程中,发现因为网络慢或其他原因导致driver.get(url) 时,页面一直在加载,页面没有加载完成就不会去继续执行下面的动作,但是实际上需要操作的元素已经加载出来了. 解决方 ...
- selenium学习笔记——driver.get(url) 页面加载时间太长
# 两个同时设置才行 # 实现效果:加载状态停止,进行代码下一步操作 driver.set_page_load_timeout(10) driver.set_script_timeout(10) # ...
- [dpdk] dpdk编译成动态库使用 -- PCI port自动发现与pmd动态加载
1. 修改配置文件 .conf, 设置如下变量的值. [root@D129 x86_64-native-linuxapp-gcc]# cat dpdk/x86_64-native-linuxapp- ...
- CentOS VirtualBox启动虚拟及报错:VirtualBox error: Kernel driver not installed (rc=1908)
VirtualBox error: Kernel driver not installed (rc=1908) Hi all, Let me first say that this is my fin ...
- Ubuntu 升级VisualBox后无法启动 Kernel driver not installed (rc=-1908)
VisualBox之所以在Linux上比传统的VMware快得多,关键一点就是它和Linux内核的结合比较紧密,这也是开源的优点. 不过Linux内核更新很频繁,每次更新内核后启动VirtualBox ...
- virtualbox cannot access the kernel driver的解决办法
一位网友windows xp sp3下安装virtualbox 4.1.20版本,安装好了重启过后,可以打开virtualbox,但是等到创建好虚拟电脑后按启动按钮,就出现了错误提示:"Ca ...
- Fedora安装VirtualBox时出现错误Kernel driver not installed (rc=-1908)的解决办法
新建虚拟机后启动时出现如下错误: Kernel driver not installed (rc=-1908) The VirtualBox Linux kernel driver (vboxdrv) ...
随机推荐
- Cublas矩阵加速运算
前言 编写 CUDA 程序真心不是个简单的事儿,调试也不方便,很费时.那么有没有一些现成的 CUDA 库来调用呢? 答案是有的,如 CUBLAS 就是 CUDA 专门用来解决线性代数运算的库. 本文将 ...
- GitHub网站操作
1.建立新的仓库 2.添加文件 3.新建一个分支 4.删除仓库
- 微信小程序测试指南
[本文出自天外归云的博客园] 微信小程序本地部署测试方法 下载微信开发者工具 让小程序管理员将测试人员的微信号添加开发者权限 本地设置hosts为测试环境hosts 打开微信web开发者工具并扫码登录 ...
- 【emWin】例程十六:窗口管理器
介绍: 显示器上出现的任何内容都包含在窗口中,窗口可以为任何尺寸,并且可在屏幕上一次显示多个窗口, 甚至部分或整个窗口在其他窗口的前面也可.我们可以对窗口进行创建.移动.调整大小等操作,也 可以操控任 ...
- one-to-all及all-to-all网络通信模式
在这两种模式下,因为 占用的通信通道非常高,形成了一个一对多的通道 甚至是多对多的通道,导致现有的fattree网络结构负载太大.
- excel 2007 无法输入中文
解决方法: 1.32位系统:找到C:\Program Files\Common Files\Microsoft Shared\OFFICE12\Office Setup Controller,将这个文 ...
- idea java 非web程序打包
以下打包非常暴力.O(∩_∩)O哈哈~ 方法一: 第一步:选择需要打包的程序 第二步:选择需要打包的文件 第三步:artifacts->jar->from modules with... ...
- Pika的设计及实现
Pika pika是360奇虎公司开源的一款类redis存储系统,主要解决的是用户使用 Redis 的内存大小超过 50G.80G 等等这样的情况,会遇到启动恢复时间长,一主多从代价大,硬件成本贵,缓 ...
- 《objective-c基础教程》学习笔记 (一)—— 开发环境配置和简单类型输出
懒惰是富有最大的敌人,再不前进,我们就out了.最近工作比较轻松,不是很忙.于是想晚上下班回家学习点新东西.看着苹果大军的一天天壮大,心里也是痒痒的.于是就想先系统的学习下Objective-C,为之 ...
- 5 -- Hibernate的基本用法 --5 1 持久化类的要求
1. 提供一个无参数的构造器:所有的持久化类都应该提供一个无参数的构造器,这个构造器可以不采用public访问控制符.只要提供了无参数的构造器,Hibernate就可以使用Constructor.n ...