我目前正在尝试使用支持 SocketCAN 的设备(Kvaser USBcan Light 2xHS)上Dell Edge Gateway 3002跑步Ubuntu 核心 16。
该CAN接口已在Ubuntu桌面上成功测试。
CAN 内核模块在 Ubuntu Core 16 上默认未加载,因此我的第一步是加载它们:
$ lsmod | grep can
can_gw 20480 0
can_raw 20480 0
can_dev 24576 1 kvaser_usb
can 45056 2 can_gw,can_raw
此时连接 CAN 接口应导致创建两个新的 CAN 接口(默认情况can0
下can1
)。问题是这些接口无处可寻:
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether d8:9e:f3:9c:5f:9f brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
link/ether d8:9e:f3:9c:5f:a1 brd ff:ff:ff:ff:ff:ff
4: wwan0: <BROADCAST,MULTICAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether aa:c6:53:a2:73:a0 brd ff:ff:ff:ff:ff:ff
5: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
link/ether 00:23:a7:fa:99:68 brd ff:ff:ff:ff:ff:ff
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:57:84:86:f6 brd ff:ff:ff:ff:ff:ff
输出dmesg
显示存在某种安全问题。我不熟悉 AppArmor,所以我不确定这是否有任何相关性:
$ dmesg | tail -n15
[ 515.224025] usb 1-1: new high-speed USB device number 6 using xhci_hcd
[ 515.353111] usb 1-1: New USB device found, idVendor=0bfd, idProduct=0123
[ 515.353122] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 515.353129] usb 1-1: Product: Kvaser USBcan Light
[ 515.353134] usb 1-1: Manufacturer: Kvaser AB
[ 515.368908] audit: type=1400 audit(1539088148.830:340): apparmor="DENIED" operation="open" profile="snap.uefi-fw-tools.fwupd" name="/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/busnum" pid=2327 comm="fwupd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
有没有人有在 Ubuntu Core 上使用过 SocketCAN 设备的经验?有没有什么调试方法?
谢谢!
编辑01
我们已尝试停止 apparmor 服务:
# systemctl stop apparmor.service
# systemctl status apparmor.service
● apparmor.service - LSB: AppArmor initialization
Loaded: loaded (/etc/init.d/apparmor; bad; vendor preset: enabled)
Active: inactive (dead) since Tue 2018-10-09 15:40:17 UTC; 1s ago
Docs: man:systemd-sysv-generator(8)
Process: 4442 ExecStop=/etc/init.d/apparmor stop (code=exited, status=0/SUCCESS)
Process: 2345 ExecStart=/etc/init.d/apparmor start (code=exited, status=0/SUCCESS)
Oct 09 15:40:17 ******* systemd[1]: Stopping LSB: AppArmor initialization...
Oct 09 15:40:17 ******* apparmor[4442]: * Clearing AppArmor profiles cache
Oct 09 15:40:17 ******* apparmor[4442]: ...done.
Oct 09 15:40:17 ******* apparmor[4442]: All profile caches have been cleared, but no profiles have been unloaded.
Oct 09 15:40:17 ******* apparmor[4442]: Unloading profiles will leave already running processes permanently
Oct 09 15:40:17 ******* apparmor[4442]: unconfined, which can lead to unexpected situations.
Oct 09 15:40:17 ******* apparmor[4442]: To set a process to complain mode, use the command line tool
Oct 09 15:40:17 ******* apparmor[4442]: 'aa-complain'. To really tear down all profiles, run the init script
Oct 09 15:40:17 ******* apparmor[4442]: with the 'teardown' option."
Oct 09 15:40:17 ******* systemd[1]: Stopped LSB: AppArmor initialization.
奇怪的是,连接 USBcan 设备后,仍然会出现 apparmor 拒绝消息:
# dmesg | tail -n6
[ 1704.616028] usb 1-1: new high-speed USB device number 8 using xhci_hcd
[ 1704.744895] usb 1-1: New USB device found, idVendor=0bfd, idProduct=0123
[ 1704.744907] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 1704.744913] usb 1-1: Product: Kvaser USBcan Light
[ 1704.744919] usb 1-1: Manufacturer: Kvaser AB
[ 1704.770397] audit: type=1400 audit(1539099996.288:134): apparmor="DENIED" operation="open" profile="snap.uefi-fw-tools.fwupd" name="/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/busnum" pid=4013 comm="fwupd" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
我猜想这与 Ubuntu Core 固有的限制有关。
编辑02
恐怕我无法apt
在 Ubuntu Core 上使用,而且没有快照对于apparmor-utils
。aa-enforce
和aa-complain
命令无法被识别。
我确实尝试过运行systemctl disable apparmor.service
并重新启动。此后,网关的 SSH 访问权限丢失(它是一台没有 GPU 的无头机器),我不得不再次刷新操作系统映像。我想知道这是否与 Ubuntu Core 需要该apparmor
服务才能正常工作有关。
该uefi-fw-tools
snap 包默认安装在网关附带的 Ubuntu Core 映像上。
我将尝试安装该uefi-fw-tools
插件开发模式尽量避免任何 apparmor 问题并发布结果。
编辑03
安装uefi-fw-tools
卡扣后开发模式AppArmor被拒消息消失了,尽管连接 USBCan 设备时 SocketCAN 接口仍然没有出现。
我联系了 Kvaser 支持人员,似乎 USBcan Light 仅支持内核 >= 4.7,而网关运行的是 4.4。文档中提到的最低内核应该是 3.2,但不支持此特定型号。
无论如何,非常感谢您在调试 AppArmor 方面提供的帮助。
答案1
别忘了重启加载内核后。
配置 CAN 总线接口的标准命令是:
ip link set can0 type can bitrate 500000 listen-only on
这会将 can0 接口的比特率设置为 500 Kbps。现在启动接口并开始转储帧:
ip link set can0 up
candump -cae can0,0:0,#FFFFFFFF
或者做一个
ip l sh
关于 apparmor 消息,我不确定 - 但您可以尝试:
首先我建议安装 apparmor-utils
sudo apt install apparmor-utils
在你的情况下
profile="snap.uefi-fw-tools.fwupd"
拒绝operation="open"
name="/sys/devices/pci0000:00/0000:00:14.0/usb1/1-1/busnum"
pid=2327
在您的
/etc/apparmor.d/snap.uefi-fw-tools.fwupd
添加中以下行(在 /sys/.... 前插入 2 个空格!)/sys/devices/pci*/*/usb*/*/busnum rw,
重新加载所有 apparmor 配置文件:
sudo systemctl reload apparmor.service
或者如果未启动/启用
sudo systemctl enable apparmor.service sudo systemctl start apparmor.service
您可以使用以下方式证明状态
sudo systemctl status apparmor.service
或者
sudo aa-status
我建议使用
sudo aa-complain /etc/apparmor.d/snap.uefi-fw-tools.fwupd
这将允许并记录配置文件违规行为。这对于测试和开发新配置文件很有用。稍后您可以将其设置为强制执行
sudo aa-enforce /etc/apparmor.d/snap.uefi-fw-tools.fwupd