我的USB模组,在接到Linux主机上,一般都会出现USB网卡和USB串口。
有时候我们会看到这个网卡的名字怪怪的,有时候看到的又是前篇一律的usb0、eth0、wwan0,然后我们的就会去想,如何去固定这个网卡名字。
能不能呢?当然能。
在想办法固定网卡名字之前,我们需要了解,网卡的名字是Linux系统哪些条件决定的!
决定USB网卡名字的因素
- Linux 内核
- udev、grub等
我的USB模组,在接到Linux主机上,一般都会出现USB网卡和USB串口。
有时候我们会看到这个网卡的名字怪怪的,有时候看到的又是前篇一律的usb0、eth0、wwan0,然后我们的就会去想,如何去固定这个网卡名字。
能不能呢?当然能。
在想办法固定网卡名字之前,我们需要了解,网卡的名字是Linux系统哪些条件决定的!
我在一个USB Hub (vid=2c7c, pid=0125) 上插了两个EC20
我用自定义udev rule去指定AT接口的设备名称
首先要记录Hub上USB接口位置与系统内devpath属性的对应关系
取决于硬件设计,不一定是按次序递增
先用几条规则给USB接口打上TAG
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="2c7c", ATTR{idProduct}=="0125", ATTR{devpath}=="*.3", TAG+="quectel0"
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="2c7c", ATTR{idProduct}=="0125", ATTR{devpath}=="*.2", TAG+="quectel1"
然后针对每个设备的每个接口,指定希望使用的设备名称,我这里只用了AT和UAC接口
# 00: diag
# 01: nmea
# 02: at
# 03: ppp
# 04: wwan
# 05: adb
# 06: uac
# 07: snd
# 08: snd
ACTION=="add", SUBSYSTEM=="tty", TAGS=="quectel0", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="quectel0-at"
ACTION=="add", SUBSYSTEM=="sound", TAGS=="quectel0", ENV{ID_USB_INTERFACE_NUM}=="06", SYMLINK+="quectel0-uac"
ACTION=="add", SUBSYSTEM=="tty", TAGS=="quectel1", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="quectel1-at"
ACTION=="add", SUBSYSTEM=="sound", TAGS=="quectel1", ENV{ID_USB_INTERFACE_NUM}=="06", SYMLINK+="quectel1-uac"
systemd的udev存在bug,上述规则只在开机时起作用,运行时插拔无法生效,原因待排查
看看是否支持udevadm。
用udevadm monitor检查下插拔过程。
ATTR{devpath}== 这个是否发生了变化。
网卡设备的初始化,在内核里包括两个部分,一部分应该在drivers还有一部分在net/里。net目录里不只是内核协议栈的代码。
之前有个客户这么改过代码
dev.c(kernel/msm-4.9/net/core/dev.c), we renamed the eth8 as below
static int **dev_alloc_name_ns(**struct net *net,
struct net_device *dev,
const char *name)
{
char buf[IFNAMSIZ];
int ret;
ret = __dev_alloc_name(net, name, buf);
if (ret >= 0){
else if(!strcmp(netdev_drivername(dev),"rndis_host")|| !strcmp(netdev_drivername(dev),"GobiNet")) //LTEmodem
strlcpy(dev->name,"eth8", IFNAMSIZ);
}
}
这里判断驱动名字修改网卡名称。
一般来说,我们不会去动 net里的代码。我们只需要修改 usbnet.c 就可以了。
usbnet_probe 里 根据网卡的flag 决定
假如我们需要修改网卡名称怎么做?
固定网卡的名字,可以根据一些条件来决定
这里可以打印出usb 的
这里可以打印出VID PID interface 甚至是USB的类信息,驱动名称
在这里可以打印出一些usb的bus dev 甚至kobj对象里的信息,这些信息也可以用来修改网卡名称。
上面log 会打印
这些和uevent 上报的udevadm 打印出来的是一致的。