我想知道是否可以使用KVM libvirt创build多用户环境
也就是说每个用户都可以创build自己的虚拟机,但不能被其他人访问
看到这个多用户使用virt-manager
好像不工作
编辑1 :我想为每个虚拟主机设置所有者
感谢libvirt的PolicyKit支持,我相信这可以根据你需要多lessfunction来完成。
规则可以由您创build并通过PolicyKit ACL作为数据库(文件,服务器等)访问,以获取有关所有者的信息。 此外,如果PolicyKit规则具有对数据库的写入访问权限,则可以在创build时将VM分配给各自的所有者,从而自动创build该数据库。 它可能不是万无一失的(例如,当虚拟机定义失败时,数据库已经有了这个logging),所以根据你要查找的function,可能需要更多的钩子。 这就是为什么在libvirt之上build立项目(或只是由pipe理员部署的脚本),可以有更多的function。
如果一个简单的东西足够你可以说,用户只能在以他们的用户名开头的虚拟机上调用API。 只要确保包angular(例如用户“bla”不能访问用户的“blabla”机器)。
如前所述,根据您需要多lessfunction,可以轻松完成,也可以使用几行脚本,或者您可能需要一个完整的虚拟化系统,位于libvirt之上。
还有一件事没有人提到(这可能是你想要的/正在寻找的东西)。 如果您(作为非root用户)连接到qemu:///会话(而不是系统,请参阅连接到QEMU驱动程序 ),您将连接到您自己的libvirt守护进程实例,并且只能看到自己的机器字,它将与其他用户的会话守护进程隔离)。
那么就像在你链接的文章中所宣称的那样,libvirt确实支持每个API基础上的PolicyKit(我们称之为ACL)。 所以如果你设置了一些polkit规则,你应该能够得到你想要的。 例如,域X只对用户Y可见。不幸的是,我不认为有可能使这些规则成为dynamic的(我的意思是,如果用户创build了一个域,它将只对他们可见)。
除非你想编写你自己的包装/pipe理系统,否则你只需要一些比libvirt更多的东西来pipe理访问和虚拟机到用户的关系。 oVirt / RHV即使拥有一个特殊的用户门户网站,login的用户只能看到属于他的虚拟机。 我很确定其他虚拟化pipe理系统也有这个能力
这个文件作为polkit规则
function myFunction(username, virtualmachine) { var arr = virtualmachine.split("*"); if(arr[0]==username){ return true; } else{ return false; } } // Allow passwordless connection to qemu:///system polkit.addRule(function(action, subject) { if (action.id == "org.libvirt.unix.manage") { return polkit.Result.YES; } }); // Give full access to 'vm' polkit.addRule(function(action, subject) { if (action.id.indexOf("org.libvirt.api.domain.") == 0 ) { if (action.lookup("connect_driver") == 'QEMU' && myFunction(subject.user, action.lookup("domain_name"))) { polkit.log("vm=" + action.lookup("domain_name") + "action =>"+myFunction(subject.user, action.lookup("domain_name"))); polkit.log("subject=" + subject); polkit.log("ok"); return polkit.Result.YES; } else { return polkit.Result.NO; } } });
这里的vm格式
用户名*虚拟机名称
这个虚拟机只能被相应的用户访问
PS这只是原始的规则,你不能创build一个新的池或修改它等,因此要求规则的发展