open /dev/kvm: Permission denied的解决办法

    一直使用Debian的虚拟机功能用的好好的,今天上午提示有软件更新,是libvirt相关的,知道是关于虚拟化的软件,习惯性地就更新了。下午有点东西需要写文档,由于LaTeX之类的编辑软件一直没时间学习,所以还是求助于Word,于是开virt-manager,点开虚拟的XP,结果出现:

    ...open /dev/kvm: Permission denied...

    昨晚没是用virt-manager打开XP,而是直接使用kvm命令行启动的XP,然后使用rdesktop连接,没有问题啊,难道XP坏了?打开虚拟的Debian,也出现问题,停在Grub界面不动了,只得强制关机。再打开虚拟的RHEL6,跟Debian症状相同,排除XP坏掉的缘故。然后记起更新了libvirt,于是去Debian的官网查看更新信息,找到点眉目:

   [15 Mar 2013]DSA-2650 libvirt - files and device nodes ownership change to kvm group

    也就是说相关的文件和设备结点的组权限被修改过了。于是查看一下/dev/kvm设备结点的权限,显示为:

    crw-rw----+ 1 root kvm 10, 232  3月 16 16:31 /dev/kvm

    即该结点的所有者为root,所属组为kvm,但是最后有一个"+",根据以前的经验,它的权限不是显示的那么简单,但是一时忘了"+"代表什么意思。幸好以前做过笔记,翻出来一看,哦,原来是ACL。专门针对基本权限设置过于笼统而设置的一套访问控制列表。

    但是一想不至于这么复杂吧,更新之前用的好好的,无奈不能看之前的权限是什么样的了。启动virt-manager是以root身份启动的,那么它应该能启动才对。但是验证此路不通,错误信息依旧,奇怪了,root用户都不能启动了!先翻看看以前记录的笔记,撤销全部的ACL:

    chacl -B /dev/kvm

    得到只有最普通的访问控制权限:

    crw-rw---- 1 root kvm 10, 232  3月 16 16:31 /dev/kvm

    然后启动,不行。修改为777的权限,顺利启动XP。然后改成666再试,仍然可以启动XP。然后改成660再试,启动失败。好了,知道为什么了,原来试图打开/dev/kvm的进程所有者不是root,且所属组也不是kvm。查看virt-manager是以谁的身份启动的:

    ps -ef | grep virt-manager

    得到的信息:

    root     20078  1 2 17:17 ? 00:00:38 python /usr/share/virt-manager/virt-manager.py

    不对,是以root身份打开的。再查kvm:

   ps -ef | grep kvm

    得到的信息:

    110      20297  1 10 17:17 ? 00:03:00 /usr/bin/kvm -S -M pc-0.12...

    原来是UID为110的用户打开的kvm,怪不得被拒绝访问。查看/etc/passwd中110对应的用户为libvirt-qemu。然后知道该怎么做了,有两种方法:

    <1>将用户libvirt-qemu加入到kvm组里:

    usermod -aG kvm libvirt-qemu

    <2>使用ACL赋予libvirt-qemu跟root一样的权限:

    首先要注意的是,带"+"的权限必须使用getfacl命令查看:

    getfacl /dev/kvm

    # file: dev/kvm
    # owner: root
    # group: kvm
    user::rw-
    user:我的普通用户名:rw-
    group::rw-
    mask::rw-
    other::---

    上面的意思是/dev/kvm的所有者是root,所属组为kvm,"我的普通用户名"跟root一样有对其读写的权限,组成员的权限是读写,其他用户没有权限。那么赋予libvirt-qemu跟root一样的权限就可以了:

    setfacl -m u:libvirt-qemu:rw /dev/kvm

    再次查看其权限:

    getfacl /dev/kvm

    # file: dev/kvm
    # owner: root
    # group: kvm
    user::rw-
    user:我的普通用户名:rw-

    user:libvirt-qemu:rw-

    group::rw-
    mask::rw-
    other::---

    运行XP,顺利启动。将libvirt-qemu的权限删除:

    sefacl -x u:libvirt-qemu /dev/kvm

    运行XP,启动失败,证明设置起效。

   但是很遗憾,重启机器后,/dev/kvm的权限被还原,因为它不是一个一直存在的结点,所以第一种方法才能治本。

    最后得出结论:启动virt-manager的身份虽然是root,但是它启动之后只是作为一个管理器,再启动虚拟主机时身份就不是root了,而是libvir-qemu。如果直接使用kvm的命令行方式启动XP,那么启动的身份还是root,就不会出现上述的问题了。

   更新:找到暂时的解决办法了,就是将libvirt-qemu组加入/dev/kvm的读写ACL中就可以了,只是不知道怎么开机就将它加入进去~

猜你喜欢

转载自blog.csdn.net/winshining/article/details/8681636