我有一台在 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
首先尝试将整个 NIC 驱动程序包含在您的 initramfs 中(通过 Debian 的 initramfs-tools),以防它的存在本身就使其优先于通用“USB 存储”驱动程序。看起来您的 NIC 应该使用内核模块
sr9800
,但最终它使用了内核模块cdc_ether
,但请尝试同时包含两者。还要检查
/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"
最后检查 usb_modeswitch 是否包含您设备的 USB VID:PID 的配置文件(未显示在您的 lshw 转储中;用于
lsusb
获取它)。如果包含,那么您的 initramfs 将需要包含 usb_modeswitch udev 规则、实际可执行文件和配置文件。