我正在关注让 KVM 以非 root 身份运行的指南为了制作一个名为食火鸡正常工作。问题是我尝试在 kinoite 上执行以下命令,因此无法修改 /etc 目录。
$ sudo sed -i "s/#user = \"root\"/user = \"$(id -un)\"/g" /etc/libvirt/qemu.conf
$ sudo sed -i "s/#group = \"root\"/group = \"$(id -gn)\"/g" /etc/libvirt/qemu.conf
$ sudo usermod -a -G kvm $(id -un)
$ sudo usermod -a -G libvirt $(id -un)
$ sudo systemctl restart libvirtd
$ sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
这些命令在做什么以及我可以做什么才能使它们在不可变的发行版上发挥作用。
答案1
$ sudo sed -i "s/#user = \"root\"/user = \"$(id -un)\"/g" /etc/libvirt/qemu.conf
id -un
输出运行该命令的用户的名称。
sudo
( s
witch u
ser and do
) 是一个以不同用户身份运行另一个命令的命令。如果未指定,则通常是root
具有超级用户权限的用户,常规访问控制不适用,例如谁可以修改文件系统上的任何文件。您必须被明确授予以该用户身份运行命令的权限,并提供凭证来确认您的身份才能正常工作。
sed
是一个s
流ed
itor。某些sed
实现可以-i
选择对文件的内容进行操作i
,因此可以像编辑文件一样编辑文件溪流。
该sed
命令(来自 70 年代初)可以理解一种非常简单的编程语言。在该语言中,有一个s/pattern/replacement/flags
命令,与文本编辑器中的命令相同ed
,用于替换与模式匹配的字符串。
这里的模式是#user = "root"
,替换是user = "<output-of-the-id-command>"
,g
意味着每行可以根据需要执行多次(这在这里没有意义,但可能是无害的)。
实际上,这将取消#user = "root"
该文件中该行的注释,并替换root
为调用用户。
它编辑的文件是libvirt 的 QEMU 驱动程序配置。该文件有:
# The user for QEMU processes run by the system instance. It can be
# specified as a user name or as a user id. The qemu driver will try to
# parse this value first as a name and then, if the name doesn't exist,
# as a user id.
#
# Since a sequence of digits is a valid user name, a leading plus sign
# can be used to ensure that a user id will not be interpreted as a user
# name.
#
# By default libvirt runs VMs as non-root and uses AppArmor profiles
# to provide host protection and VM isolation. While AppArmor
# continues to provide this protection when the VMs are running as
# root, /dev/vhost-net, /dev/vhost-vsock and /dev/vhost-scsi access is
# allowed by default in the AppArmor security policy, so malicious VMs
# running as root would have direct access to this file. If changing this
# to run as root, you may want to remove this access from
# /etc/apparmor.d/abstractions/libvirt-qemu. For more information, see:
# https://launchpad.net/bugs/1815910
# https://www.redhat.com/archives/libvir-list/2019-April/msg00750.html
#
# Some examples of valid values are:
#
# user = "qemu" # A user named "qemu"
# user = "+0" # Super user (uid=0)
# user = "100" # A user named "100" or a user with uid=100
#
#user = "root"
也可以看看https://libvirt.org/drvqemu.html#posix-users-groups。
因此,这告诉您以运行该命令的用户身份libvirtd
运行。qemu
$ sudo sed -i "s/#group = \"root\"/group = \"$(id -gn)\"/g" /etc/libvirt/qemu.conf
那里的设置也一样group
。
$ sudo usermod -a -G kvm $(id -un)
这会将当前用户添加为 Unix 组的成员kvm
。该组对 /dev/kvm 具有读+写访问权限,qemu 需要使用 KVM 管理程序功能。
$ sudo usermod -a -G libvirt $(id -un)
对于libvirt
其成员资格允许管理系统级虚拟机的组也是如此。
$ sudo systemctl restart libvirtd
重新启动libvirtd
守护程序以应用这些设置。
$ sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
禁用 libvirtd 服务的 apparmor,放宽了 libvirtd 及其运行的一些命令无法执行的许多操作,其中一些命令可能是 qemu 以非 root 身份正常运行所必需的。
这些命令在做什么以及我可以做什么才能使它们在不可变的发行版上发挥作用。
这很可能取决于发行版及其具体情况不可变的。