在容器中运行VirtualBox

我在一个lxc容器中安装了VirtualBox。 然而,当我尝试启动虚拟机时,出现以下消息:
kernel driver not accessible (rc=1909)
....permission problem with /dev/vboxdrv.

这显然是一个可预测的安全问题。
有人知道我如何授予容器访问此设备驱动程序:/dev/vboxdrv的权限吗?
非常感谢任何帮助或指导。
4个回答

在你的LXC主机上(我这里假设使用Ubuntu):
  1. 安装virtualbox-dkmslinux-headers-genericbuild-essential软件包,并检查内核模块是否已加载:

    myhost$ sudo /etc/init.d/virtualbox status
    VirtualBox内核模块已加载。
    
  2. 获取VirtualBox设备号(在我的情况下是10、55/56/57):

    myhost$ ls -la /dev | grep vbox
    crw-------  1 root root     10,  57 Feb 25 08:22 vboxdrv
    crw-------  1 root root     10,  56 Feb 25 08:22 vboxdrvu
    crw-------  1 root root     10,  55 Feb 25 08:22 vboxnetctl
    
  3. 将节点号添加到LXC客户端配置文件中(/var/lib/lxc/myguest/config):

    ## VirtualBox
    lxc.cgroup.devices.allow = c 10:57 rwm
    lxc.cgroup.devices.allow = c 10:56 rwm
    lxc.cgroup.devices.allow = c 10:55 rwm
    
  4. 重新启动LXC客户端,安装virtualbox软件包,并创建设备节点:

    myguest$ sudo mknod -m 600 /dev/vboxdrv c 10 57
    myguest$ sudo mknod -m 600 /dev/vboxdrvu c 10 56
    myguest$ sudo mknod -m 600 /dev/vboxnetctl c 10 55
    
  5. 检查客户端上的VirtualBox是否可以看到内核模块:

    myguest$ sudo /etc/init.d/virtualbox status
    VirtualBox内核模块已加载。
    

这应该是正确的答案。其他所有答案都缺少的最重要的步骤是第三步和第四步。 - Léo Lam

VirtualBox Linux内核驱动程序(vboxdrv)未加载或者/dev/vboxdrv存在权限问题。通过执行以下命令重新设置内核模块:
 '/etc/init.d/vboxdrv setup'

作为 root 用户。Ubuntu 或 Fedora 的用户应首先安装 DKMS 软件包。此软件包会跟踪 Linux 内核的更改,并在必要时重新编译 vboxdrv 内核模块。

这只是错误信息中的一句引用。驱动程序已加载,但容器没有权限访问它。根据错误响应,我的问题是:如何授予容器内的进程访问内核设备的权限?我该如何解决权限问题? - user108168

你需要将 /dev/vboxdrv 的所有权赋予组 "vboxuser",并将启动容器的用户添加到该组中。然后确保有组权限(即 chmod 660 /dev/vboxdrv)。


嗨Nathan C. 謝謝你的回覆。我是在主機環境還是容器中進行這個操作? - user108168
主机假设内核驱动程序已安装(它们应该安装了,因为LXC依赖于主机内核)。 - Nathan C
嗨Nathan C,谢谢你的澄清。设备/dev/vboxdrv是由root拥有的,我正在以root身份启动容器。我曾尝试在容器内以另一个用户身份运行virtualbox,但现在尝试以root身份运行它。我还使用chmod命令将设备的组设置为vboxusers,权限设置为660。但我仍然遇到错误。对于主机上的root和非root用户,一切都正常工作。我是否不需要在lxc配置文件中添加设置来授予容器权限?这是我假设的,但我不知道具体是什么设置。感谢你的帮助。 - user108168

不需要在主机上安装VirtualBox,只要您的容器能够编译内核模块,您可以在LXC容器的预启动脚本中加载它。为了更好的安全性,您可以在加载之前将VBox内核模块复制到主机上。