我想知道是否可以使用 KVM libvirt 创建一个多用户环境,
即每个用户都可以创建自己的虚拟机,但其他人不能访问
该虚拟机。virt-manager 的多用户使用
好像它不起作用
编辑1:我想设置拥有者对于每个虚拟机
答案1
感谢 libvirt 的 PolicyKit 支持,我相信这可以做到,具体取决于您需要的功能量。
您可以创建规则,并通过 PolicyKit ACL 将其作为数据库(文件、服务器等)访问,以获取有关所有者的信息。此外,如果 PolicyKit 规则具有对数据库的写访问权限,您可以在创建虚拟机时将其分配给各自的所有者,从而自动创建该数据库。它可能不是万无一失的(例如,当虚拟机定义失败时,数据库将已经有该记录),因此可能需要更多钩子,具体取决于您要寻找的功能数量。这就是为什么有基于 libvirt 构建的项目(或仅由管理员部署的脚本)可以具有更多功能。
如果简单的事情对您来说就足够了,那么您可以说用户只能在以他们的用户名开头的虚拟机上调用 API。只需确保涵盖极端情况(例如,用户“bla”无法访问用户“blabla”的机器)。
如上所述,根据您需要的功能量,它可以轻松完成,或者只用几行脚本即可完成,或者您可能需要一个基于 libvirt 的完整虚拟化系统。
还有一件事没有人提到(而且可能是你想要的/正在寻找的。如果你(作为非 root 用户)连接到 qemu:///session(而不是系统,请参阅与 QEMU 驱动程序的连接)您将连接到您自己的 libvirt 守护进程实例,并且您将只能看到您自己的机器(换句话说,它将与其他用户的会话守护进程隔离)。
答案2
好吧,就像您链接的文章中宣传的那样,libvirt 确实支持每个 API 的 PolicyKit(我们称之为 ACL)。因此,如果您设置一些 polkit 规则,您应该能够得到您想要的。例如,域 X 将仅对用户 Y 可见。不幸的是,我认为不可能使这些规则动态化(我的意思是,如果用户创建域,它将仅对他们可见)。
答案3
除非您想编写自己的包装器/管理系统,否则您需要的不仅仅是 libvirt,还要管理访问和虚拟机与用户的关系。oVirt/RHV 开箱即用,甚至有一个特殊的用户门户,登录用户只能看到属于他的虚拟机。我很确定其他虚拟化管理系统也有这种能力
答案4
此文件为 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这只是原始规则,即您不能创建新池或修改它等,因此需要进一步制定规则