[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.rzrgm.cn/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]#
浙公網安備 33010602011771號