USB NIC 未在启动时初始化

USB NIC 未在启动时初始化

我有一台在 Rpi4 上运行的服务器,它通过 LXD 运行多项服务,其中一项是 VPN 服务。由于我的 ISP 的限制,我通过付费 VPN 提供商将端口转发路由到服务器(LXD 之外)。我希望 LXD VPN 服务直接连接到家庭网络,而不是 LXD 设置的桥接网络,最后我连接了第二个 USB NIC 并将其直接连接到 LXD 容器。事实证明,这是最稳定的解决方案,而且效果很好。

我遇到的唯一问题是,由于某种原因,USB NIC 在启动时未初始化。我必须在启动后拔下/重新插入设备才能显示它,但不知道为什么。这没什么大不了的,因为这台机器几乎从不关机,但不知道原因让我很烦。

这是来自lshw

*-usb:1
    description: Communication device
    product: USB 10/100 LAN
    vendor: CoreChips
    physical id: 4
    bus info: usb@1:1.4
    version: 20.00
    serial: 00E0D9003D31
    capabilities: usb-2.10 ethernet
    configuration: driver=cdc_ether maxpower=100mA speed=480Mbit/s

它只是一个 base100,但我的互联网也只有 100/100,而且与无论如何都无法充分利用的 1G NIC 相比,这花费了我不到一半的费用。

该设备在启动期间作为存储设备加载。

*-usb:1
    description: Mass storage device
    product: USB 10/100 LAN
    vendor: CoreChips
    physical id: 4
    bus info: usb@1:1.4
    version: 20.00
    serial: 00E0D9003D31
    capabilities: usb-2.00 scsi
    configuration: driver=usb-storage maxpower=100mA speed=480Mbit/s

显然它有一个带有 Windows 驱动程序的小型 ROM。

$ blkid /dev/sr0 
/dev/sr0: BLOCK_SIZE="2048" UUID="2019-10-18-17-20-33-00" LABEL="SR9900" TYPE="iso9660"

$ mount /dev/sr0 /tmp/rom/
$ ls /tmp/rom/
AUTORUN.INF  CoreChips.ico  sr9900_sfx.exe

我将其拔下并重新插入后,它被正确加载为 NIC 并且/dev/sr0消失了。

为什么启动时是一件事,启动后又是另一件事?它不应该始终将其识别为一件事或另一件事吗?或者这不是内核模块加载顺序吗?如果它同时具有 NIC 和 ROM,它不应该同时初始化两者,就像通过集线器连接两个设备一样?

最重要的是,是否有东西可以放入启动脚本或配置文件中,以便在启动后重置此设备,例如模拟拔出/重新插入?这至少可以让人们重新启动服务器,而不必每次都手动执行此操作。

答案1

这是那些奇怪的 USB 设备之一首先将自己呈现为一个包含 Windows 驱动程序 Setup.exe 的虚拟 CD-ROM 设备,除非 NIC 特定的驱动程序已经加载并使用一些神奇的命令将设备切换到 NIC 模式。

3G/4G 调制解调器经常这样做,甚至有人创建了整个“usb_modeswitch”项目,仅用于编目各种将调制解调器(有时还有打印机)切换到正常模式的方法。有些设备依赖 usb_modeswitch,有些则依赖内核驱动程序执行必要的操作。(但是,如果您尚未安装 usb_modeswitch,安装它,它可能会使某些设备的情况变得更糟。)

但是 usb_modeswitch 助手仅在设备处于以下情况时通过 udev 规则触发:添加。如果在 initramfs 中检测到该设备(其中有一组最少的工具和 udev 规则),则不会在那时切换它 - 并且不会要求“主”udev 实例稍后再次执行此操作。尝试以下操作以重新触发特定 USB 设备的 udev 规则:

udevadm trigger -v -y usb -p ID_VENDOR=CoreChips
  1. 首先尝试将整个 NIC 驱动程序包含在您的 initramfs 中(通过 Debian 的 initramfs-tools),以防它的存在本身就使其优先于通用“USB 存储”驱动程序。看起来您的 NIC 应该使用内核模块sr9800,但最终它使用了内核模块cdc_ether,但请尝试同时包含两者。

  2. 还要检查/sys/bus/usb/devices/1-1.4/bConfigurationValue模式切换的最简单方法。USB 设备可以向主机提供多种“配置”;将正确的数字写入此文件就足以切换模式。如果结果只是 USB 配置的问题,请在 /etc/udev/rules.d/90-nic.rules 中创建 udev 规则,并找出如何将其包含在 initramfs 中:

    ACTION=="add|change", SUBSYSTEM=="usb", ENV{ID_VENDOR}=="CoreChips", ENV{ID_MODEL}=="USB 10/100 LAN", ATTR{bConfigurationValue}="123"
    
  3. 最后检查 usb_modeswitch 是否包含您设备的 USB VID:PID 的配置文件(未显示在您的 lshw 转储中;用于lsusb获取它)。如果包含,那么您的 initramfs 将需要包含 usb_modeswitch udev 规则、实际可执行文件和配置文件。

相关内容