【问题标题】:Device node in LXC is not accessible when connected via SSH通过 SSH 连接时无法访问 LXC 中的设备节点
【发布时间】:2019-12-31 14:06:00
【问题描述】:

当我通过 SSH 连接时,无法读取或写入通过 LXC 容器的物理硬件设备。

我的物理硬件设备的设备节点如下所示:

myuser@myhost:~$ ls -la /dev/usb/hiddev0
crw-rw-rw- 1 root root 180, 0 Jul 30 10:27 /dev/usb/hiddev0

这就是我创建和启动容器的方式:

myuser@myhost:~$ sudo lxc-create -q -t debian -n mylxc -- -r stretch
myuser@myhost:~$ sudo lxc-start -n mylxc

然后我将设备节点添加到 LXC:

myuser@myhost:~$ sudo lxc-device -n mylxc add /dev/usb/hiddev0

之后设备在 LXC 中可用,我可以在连接到 LXC 后读取它:

myuser@myhost:~$ sudo lxc-attach -n mylxc
root@mylxc:/# ls -la /dev/usb/hiddev0
crw-r--r-- 1 root root 180, 0 Aug 27 11:26 /dev/usb/hiddev0
root@mylxc:/# cat /dev/usb/hiddev0
����������^C
root@mylxc:/#

然后我无需密码即可通过 SSH 启用 root 访问:

myuser@myhost:~$ sudo lxc-attach -n mylxc
root@mylxc:/# sed -i 's/#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
root@mylxc:/# sed -i 's/#\?PermitEmptyPasswords.*/PermitEmptyPasswords yes/g' /etc/ssh/sshd_config
root@mylxc:/# sed -i 's/#\?UsePAM.*/UsePAM no/g' /etc/ssh/sshd_config
root@mylxc:/# passwd -d root
passwd: password expiry information changed.
root@mylxc:/# /etc/init.d/ssh restart
Restarting ssh (via systemctl): ssh.service.
root@mylxc:/# exit

当我现在通过 SSH 连接时,设备节点在那里,但我无法访问它:

myuser@myhost:~$ ssh root@<lxc-ip-address>
root@mylxc:~# ls -la /dev/usb/hiddev0
crw-r--r-- 1 root root 180, 0 Aug 27 11:26 /dev/usb/hiddev0
root@mylxc:~# cat /dev/usb/hiddev0
cat: /dev/usb/hiddev0: Operation not permitted

在这两种情况下(lxc-attachssh)我都是 root 用户(通过 whoami 验证),所以这不是问题。

为什么我通过 SSH 连接时不允许访问设备?


编辑

同时我发现当我在脚本中直接调用所有LXC初始化命令时,错误消失了,即:

sudo lxc-create -q -t debian -n mylxc -- -r stretch
sudo lxc-start -n mylxc
sudo lxc-device -n mylxc add /dev/usb/hiddev0
...

然后是上面描述的所有 SSH 配置。然后可以通过 SSH 正确访问该设备。

只要在lxc-startlxc-device 之间经过一段时间,就会出现错误,例如:

sudo lxc-create -q -t debian -n mylxc -- -r stretch
sudo lxc-start -n mylxc
sleep 1
sudo lxc-device -n mylxc add /dev/usb/hiddev0
...

为什么时间在这里很重要?在 LXC 内的第一秒内发生了什么导致设备无法访问?

【问题讨论】:

  • 请显示相关代码并说明确切的问题或错误。仅堆栈跟踪是不够的。另请参阅How to create a Minimal, Complete, and Verifiable example
  • @jww ?我包含了每一个命令来重现我的问题中的错误。
  • 同时我发现当我最小化lxc-startlxc-device之间的时间时错误消失了。在原始帖子中查看我的编辑。

标签: linux virtualization lxc


【解决方案1】:

lxc-users 邮件列表的帮助下,我发现了the restriction is intended。必须在 LXC 的配置中使用其主要/次要编号明确允许访问设备:

lxc.cgroup.devices.allow = c 180:* rwm

在我的情况下,使用lxc-attach 的无限制访问似乎是一些错误。如果未明确允许,则设备不应在 LXC 中访问。

【讨论】:

    猜你喜欢
    • 2016-01-25
    • 2021-01-03
    • 1970-01-01
    • 2017-03-01
    • 2021-12-06
    • 2016-04-12
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多