【发布时间】: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-attach 和 ssh)我都是 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-start 和lxc-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-start和lxc-device之间的时间时错误消失了。在原始帖子中查看我的编辑。
标签: linux virtualization lxc