linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

linux中各种最新网卡2.5G网卡驱动不同型号的网卡需要不同的驱动整合各种网卡驱动包括有线网卡、无线网卡、自动安装Wi-Fi热点。

最近在做路由器二次开发现在市面上卖的新设备大多数都采用了2.5G网卡现在各种Linux社区对新网卡的驱动都还不成熟尤其是一些小众一点的网卡有些低版本的Linux官方都没有对应版本的驱动这里有个覆盖几乎市面上最新网卡驱动的方法主要是整合各种网卡型号安装时候自动进行安装。

在这里插入图片描述

在这里插入图片描述

例如以我下面的这个设备为例查看网卡型号如下

lspci |grep -i net
02:00.0 Network controller: MEDIATEK Corp. Device 7961
03:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)
04:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)
05:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)
06:00.0 Ethernet controller: Intel Corporation Device 125c (rev 04)

iwconfig
iwconfig: error while loading shared libraries: libiw.so.29: cannot open shared object file: No such file or directory


Linux网络设备驱动程序遵循通用的接口设计时采用的是面向对象的方法一个设备就是一个对象net_device结构。一个网络设备最基本的方法有初始化、发送和接收等。

Linux网络设备驱动程序的体系结构可以分为四层网络协议接口层、网络设备接口层、设备驱动功能层和网络设备与媒介层如图1所示。网络设备驱动程序最主要的工作是完成设备驱动功能层。在Linux中所有网络设备都抽象为一个接口这个接口提供了对所有网络设备的操作集合。由数据结构struct net_device来表示网络设备在内核中的运行情况即网络设备接口。它既包括纯软件网络设备接口如环路(loopback)也包括硬件网络设备接口如以太网卡。由以dev_base为头指针的设备链来集体管理所有网络设备该设备链中的每个元素代表一个网络设备接口。数据结构net_device中有很多供系统访问和协议层调用的设备方法包括初始化打开和关闭网络设备的open和stop函数处理数据包发送的hard_start_xmit函数以及中断处理函数等。

驱动程序Device Driver全称为“设备驱动程序”是一种可以使计算机中央处理器——CPU控制和使用设备的特殊程序相当于硬件的接口操作系统通过这个接口控制硬件设备的工作。所有的硬件都要安装驱动程序没有驱动程序的硬件是运行不了的就像一辆有轮胎但是没有传动轴的汽车一样跑不起来控制不了。假如某设备的驱动程序未能正确安装便不能正常工作。

1、内核启动流程
起电开启主机硬件电源。
固件主板固件加载 BIOS 或 UEFI进行硬件自检和初始化检查系统配置是否正确。
BIOS/UEFIBIOS 或 UEFI 开始寻找可启动介质读取磁盘的 MBR 或 GBT 引导分区启动 Bootloader。
BootloaderBootloader 执行 GRUB2 引导程序GRUB2 通过 /boot/grub2/grub.cfg 配置文件的内容从 /boot 目录中读取 /boot/vmlinuz-3.10.0-1160.83.1.el7.x86_64 内核文件并加载到内存中。管理员可以通过 /boot/grub2/grub.cfg 配置文件设置系统启动选项。
InitramfsKernel 启动过程中首先加载 /boot/initramfs-3.10.0-1160.83.1.el7.x86_64.img 镜像文件这是 initramfsinitial RAM filesystem作为临时文件系统用于进行基本的系统初始化工作。包括加载 /usr/lib/modules/3.10.0-1160.83.1.el7.x86_64/kernel/fs/xfs 驱动程序。有了 xfs 驱动程序之后Kernel 才可以挂载 xfs 格式的 / 根分区并访问文件。
Init 系统Kernel 挂载根分区后开始运行 init 或 systemd 进程这是第一个 User Process。init 进程会读取 /etc/inittab 配置文件根据不同的运行级别开始启动相应的各种程序和服务。包括各种设备驱动程序、进程管理、内存管理等系统服务。
Init 系统的入口在 linux/init/main.c start_kernel()相当于 Kernel 的 main 函数是 Kernel 真正的初始化流程入口start_kerenl() 将会调用一系列的初始化函数包括CPU 初始化Main Memory 初始化Interrupt 初始化Process Scheduling 初始化TCP/IP Stack 初始化等目的是最终建立起基本完整的 Linux Kernel ENV。

2、内核协议栈初始化流程
start_kernel() 过程中调用 linux/net/socket.c sock_init() 进入协议栈初始化流程。
sock_init() Socket 初始化使用 Slab 内存分配算法创建 sk_buff 的 Cache 空间并注册 Socket filesystem。
proto_init() 协议栈初始化在 /proc/net/ 目录下创建各类协议文件注册相关的协议文件操作函数。
dev_init() 网络设备初始化
在 /proc/sys/net/ 目录下创建 Ethernet Device 和 TCP/IP Protocols 相关的数据结构文件
开启 Device 的 Hardware Rx/Tx Interrupt
为每个 CPU 初始化一个 Rx Queues 并绑定硬中断号同时注册接收报文的软中断回调函数
注册 loopback 本地回环操作函数
inet_proto_init INET Socket 初始化注册 INET Socket 接口函数例如TCP、UDP、ICMP、IGMP 等协议类型的基本收包处理函数。
unix_proto_init UNIX Socket 初始化注册 UNIX Socket 接口函数。

3、网卡驱动程序注册流程
Driver 会调用 module_init() 向 Kernel 注册 init() 函数然后在 dev_init() 过程中初始化 Device 和 Driver 时Kernel 就会调用它。以 Intel I350 网卡的 IGB DriverIntel Gigabit Ethernet为例它的初始化函数为 linux/drivers/net/ethernet/intel/igb/igb_main.c igb_init_module()。

IGB Driver 初始化流程的核心是 pci_register_driver()它维护了一个 pci_device_id 映射表通过读取 Device PCI configuration space如下图中的 Vendor ID 和 Device ID 来并识别出 Device 具体的型号以及对应的驱动程序。

4、网卡驱动程序初始化流程
IGB Driver 的初始化流程从 linux/drivers/net/ethernet/intel/igb/igb_main.c igb_probe() 函数开始。

dma_set_mask() 申请 DMA 内存空间和 I/O 端口。
pci_request_selected_regions() 获取 PCIe 设备的 Resource包括Memory BAR、I/O BAR 和 MSI-X BAR 这 3 个 Regions并通过这些 BARs 完成一系列访问和初始化例如更新 Linux 文件系统 /sys/bus/pci/devices/{BDF}/。
alloc_etherdev_mq() => alloc_netdev_mq()
实例化 Kernel 的 net_device网络设备管理包含了 Device 的详细信息结构体和 IGB 私有的 igb_adapter包含了 IGB Driver 的特性信息结构体。
实例化 Kernel 的 netdev_queue网络设备队列管理结构体并关联到 net_device。
初始化 net_device 实例。
设置 net_device->netdev_ops 设备操作函数集包含了 Device 的各种操作回调函数例如igb_open 设备启动函数、收/发包函数等和 net_device->ethtool_ops ethtool 操作函数集。
igb_sw_init() => igb_init_interrupt_scheme()
igb_set_interrupt_capability()设置网卡的发送队列数量、接收队列数量、中断描述符数量调用 pci_enable_msix() 获得网络的 MSIX 中断号。并将其保存到 pci_dev->msi_list 的每一项 msi_desc.irq 中。
igb_alloc_q_vectors()根据之前设置的中断描述符个数初始化中断描述符 igb_q_vector并加入到 igb_adapter->q_vector[] 列表中。同时初始化 igb_q_vector 中的 napi 结构体注册 NAPI 收包机制所必须的 poll() 函数然后将 napi 实例挂载到 net_device->napi_list 链表中。
igb_alloc_queues()根据之前设置的发送队列个数实例化 igb_ring 结构体然后添加到 igb_adapter->tx_ring[] 列表中。同样的为接收队列实例化 igb_ring 结构体并添加到 igb_adapter->rx_ring[] 列表。
igb_map_ring_to_vector()将 Rx Ring、Tx Ring 实例和 igb_q_vector 关联起来即igb_q_vector->tx_ring 和 igb_q_vector->rx_ring。
igb_init_hw_timer() 设置网卡硬件定时器。
igb_probe_vfs() 设置 SR-IOV 特性如果没有开启则将 igb_adapter->vfs_allocated_count 设置为 0。
igb_irq_disable() 关闭网卡设备的中断。
设置网卡特性标志 net_device->features 和 net_device->vlan_features。
获取 Ethernet Ports 的 MAC 地址并保存到 net_device->dev_addr 中。
register_netdev() 将新建的 net_device 实例注册到 Kernel 中。
如此的Kernel 就掌握了 PCIe Device 的详细信息以及各类操作函数入口并以此完成对 Device 控制。

5、创建网络接口
在 igb_probe() 的后期调用了 linux/include/linux/netdevice.h register_netdev() 将 net_device 实例注册到 Kernel 中并会创建对应的 Network Interface。然后我们在 Shell 中就可以看见对应的网卡设备了。

register_netdev() 读取 net_device 实例提供的信息并根据 IGB Driver 设定的 Network interface name prefix前缀为其生成一个唯一的 Interface name。例如ethXEthernet。

ifconfig 指令
当我们执行指令 ifconfig eth0 时就可以查看到 net_device 实例提供的 Name、MAC、Mask、MTU 等信息。这些信息。这实际上是 ifconfig 指令通过调用 Socket I/O SCI 来实现的。

RX errorsNIC 总的收包错误数量包括 too-long-frames 错误Rx Ring 溢出错误CRC 校验错误Frame 同步错误FIFO Overruns 错误、Missed pkg 错误等。
RX droppedNIC 总的丢包数量通常是由于 skb_buffer 内存空间不足导致的表示 CPU 处理能力低于 NIC 带宽。
RX overrunsNIC 总的 FIFO Overruns 错误数量通常是由于 CPU 无法及时处理 NIC 发出的硬件中断导致的表示硬件中断可能没有均衡的分布在多个 CPU Cores 上。
RX frame表示 Misaligned 的 Frames。
ethtool 指令
也可以使用 ethtool 命令行工具用于查看并 net_device 结构体的配置信息。ethtool 指令则是通过调用 ioctl I/O SCI 与 Net device 注册的 ethtool 函数进行交互来实现的。

查看 NIC 的基础信息包括 Supported portsTP 电口、Fiber 光口、Supported link modes、Speed速率、Duplex双工、Link detected 等。


下载脚本点击下载

上传到目标Linux系统并解压其中一个目录如图所示的目录还有一个目录是众多网卡驱动。

在这里插入图片描述

简单两步执行

第一步

sh update.sh

之后设备会重启。

第二步

sh config.sh

之后设备会重启。

到这里就完成了有线网卡和无线网卡的驱动都自动安装好了系统也优化配置了如果设备有 Wi-Fi 天线会自动配置无线网卡驱动并自动创建Wi-Fi出来。
手机搜索发现
Wi-Fi 账号mitu
Wi-Fi密码12345678

这个信息可以在第二步之前进行配置也就是hostapd.conf文件中进行配置。


需要注意的是再执行上面两个步骤之前需要确保设备有网。这里建议通过手机的USB网络共享所有手机都支持这个功能步骤如下

1 目标设备开机首先手机通过USB数据线连接设备有些手机必须先连接数据线才有下面的这些选项和菜单
2 打开手机的“设置” 功能如下图所示
在这里插入图片描述

3 选择“移动网络”如下图所示
在这里插入图片描述

4选择”移动网络共享“如下图所示
在这里插入图片描述

5打开“USB共享网络”完成。


提供的软件包里面包含了众多网卡型号弄懂了脚本的内容上面方法实测可以驱动几乎所有的网卡型号有不懂的可以把错误提出来进行留言。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux

“linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点-CSDN博客” 的相关文章