无需添加--device=/dev/kvm参数,能否在Docker容器中访问KVM?
不用--device=/dev/kvm参数,Docker容器能访问KVM吗?
答案是仅靠mknod创建/dev/kvm节点做不到,下面给你掰扯清楚原因和可行的替代方案:
先说说为什么/dev/net/tun能用mknod搞定
/dev/net/tun是网络类的字符设备,它的核心依赖是容器的网络权限(比如加--cap-add=NET_ADMIN),而不是非得把宿主机的设备直接映射进来。你在容器里用mknod创建节点后,只要权限够,内核会自动把这个节点关联到对应的驱动,所以能正常用。
那/dev/kvm为啥不行?
/dev/kvm是宿主机的虚拟化硬件设备,它的访问逻辑不一样:容器里的设备节点必须实际关联到宿主机的/dev/kvm设备才行。你光用mknod创建一个空的/dev/kvm文件,这个文件只是个“壳子”,没有和宿主机的真实设备挂钩,自然没法进行虚拟化操作。而且就算你创建了节点,还需要容器有足够的权限(比如SYS_ADMIN)才能操作KVM。
不想用--device的话,还有啥办法?
如果不想写--device=/dev/kvm,可以试试这两种方式:
- 用volume挂载:启动容器时加
-v /dev/kvm:/dev/kvm,效果和--device差不多,都是把宿主机的KVM设备直接映射进容器里。 - 特权模式:加
--privileged参数启动容器,这会让容器拿到宿主机的所有权限,肯定能访问/dev/kvm,但这个方式权限太大,生产环境别随便用。
最后总结下
仅靠mknod创建/dev/kvm节点是没用的,必须通过设备映射(不管是--device还是volume挂载),再配上合适的权限,容器才能真正访问到宿主机的KVM设备。
内容的提问来源于stack exchange,提问作者Maestro
相关产品推荐
相关产品推荐

