Debian:用 load-modules.conf 加载的模块 can-dev 不工作,直到我手动重新加载它

Debian: Module can-dev loaded with load-modules.conf does not work until I reload it manually

我在装有 Debian 64 位 运行 的 raspberry pi 上使用 can bus 时遇到一个小问题。

我的 /etc/modules-load.d/modules.conf 看起来像这样:

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
ixxat_usb2can
can-dev
can-raw

启动并连接到机器后,我立即加载了模块:

~/$ lsmod | grep can
can_raw                28672  0
can                    28672  1 can_raw
ixxat_usb2can          28672  0
can_dev                28672  1 ixxat_usb2can
usbcore               266240  5 xhci_hcd,ixxat_usb2can,dwc2,brcmfmac,xhci_pci

can 总线似乎准备就绪,接口 can0 已启动:

~/$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether e4:5f:01:2e:2e:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.77/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2a02:810b:43c0:539c:e65f:1ff:fe2e:2e72/64 scope global dynamic mngtmpaddr
       valid_lft 86398sec preferred_lft 43198sec
    inet6 fe80::e65f:1ff:fe2e:2e72/64 scope link
       valid_lft forever preferred_lft forever
3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
    link/can
4: can1: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
    link/can
5: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether e4:5f:01:2e:2e:73 brd ff:ff:ff:ff:ff:ff
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:6b:e0:11:18 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

如果我尝试访问通过接口 can0 上的 can 适配器连接的电机设备,它不起作用,我从电机控制库中得到一个错误代码,遗憾的是,没有记录,但它发生在尝试找到 can 设备。

我觉得很奇怪:我只需要重新加载 can-dev 模块就可以使它工作。之后lsmod没有任何变化,但我发现设备和电机按照我的意愿移动:

~/$ sudo /sbin/modprobe can-dev
~/$ lsmod | grep can
can_raw                28672  0
can                    28672  1 can_raw
ixxat_usb2can          28672  0
can_dev                28672  1 ixxat_usb2can
usbcore               266240  5 xhci_hcd,ixxat_usb2can,dwc2,brcmfmac,xhci_pci

所以我的基本问题是:这里发生了什么?我错过了什么吗?提前致谢!

我刚刚弄明白了,所以万一有人遇到这样的问题:

我从来没有看过界面can1,因为我不使用它。我的 usb to can dongle 有这个接口,但它是开放式的,那里没有连接任何东西,所以它超出了我的范围。 但是在启动后仔细查看 ip a,然后在第二次手动加载 can-dev 模块后再次查看,就会发现它对接口 can1.[=21 的状态有影响=]

手动加载can-dev之前:

3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
    link/can
4: can1: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
    link/can

之后:

3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
    link/can
4: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
    link/can

所以,can1 的状态似乎对我在 can0 上的设备正常工作至关重要。然后我所做的就是在我的 /etc/network/interfaces.d 中创建一个名为 can1 的文件,它看起来如下并且在启动时获取 can1:

auto can1
iface can1 inet manual
  pre-up /sbin/ip link set can1 type can bitrate 1000000
  up /sbin/ip link set up can1 && /sbin/modprobe can-dev
  down /sbin/ip link set down can1

我不确定是否需要在该配置的“向上”部分加载模块,而且更重要的是,它有任何缺点。如果有人比我更了解这些东西(我相信你们中的大多数人 linux 都知道),请告诉我。

最后,can 总线从启动时就按预期工作,无需执行其他命令。