创建新的虚拟机后,您可能希望在 KVM 主机和 KVM 虚拟机之间共享文件和文件夹。 在这个简短的指南中,我们将看到如何在 Linux 中使用 Virt-manager 在 KVM 主机和来宾虚拟机之间设置共享文件夹。
在配置共享文件夹之前,请确保您已在 KVM 主机上安装了 Virt-manager。
- 如何使用 Virt-Manager 管理 KVM 虚拟机
如果您已经安装了完整的 KVM 虚拟化套件组,则无需单独安装 Virt-manager。 Virt-manager 是 KVM 虚拟化软件包组的一部分。 否则,您可能需要按照上述链接进行安装。
从 Virt-manager 界面创建一个新的虚拟机。 这是非常直接和容易的! 暂时不要启动虚拟机。 我们需要在我们的 KVM 主机中创建共享文件夹。
在 KVM 主机中创建共享文件夹
在您的 KVM 主机系统中创建一个新的共享文件夹,该文件夹要共享给来宾计算机。
出于本指南的目的,我创建了一个名为的共享文件夹 KVM_Share
在我的 $HOME
目录。
[[email protected] ~]$ mkdir ~/KVM_Share
接下来,为共享文件夹设置所需的权限。 我想从我的来宾虚拟机编辑和修改此共享文件夹的内容,因此我授予了共享文件夹的完全权限。
[[email protected] ~]$ chmod 777 ~/KVM_Share
接下来为 KVM 共享文件夹设置正确的 SELinux 类型:
$ sudo semanage fcontext -a -t svirt_image_t "/home/sk/KVM_Share(/.*)?"
此命令为共享文件夹下的任何内容设置默认文件上下文,即 /home/sk/KVM_Share
在我们的情况下。
运行上述命令后,它会在 /etc/selinux/targeted/contexts/files/file_contexts.local
使更改持久化的文件。
附加行可能如下所示:
$ cat /etc/selinux/targeted/contexts/files/file_contexts.local This file is auto-generated by libsemanage Do not edit directly. /usr/lib/chromium-browser system_u:object_r:bin_t:s0 /usr/lib/chromium-browser/chromium-browser.sh system_u:object_r:bin_t:s0 /usr/lib/chrome-sandbox system_u:object_r:chrome_sandbox_exec_t:s0 /home/sk/KVM_Share(/.*)? system_u:object_r:svirt_image_t:s0
接下来,运行以下命令来告诉 SELinux 将共享目录下所有内容的文件上下文恢复为我们的默认值(即 semanage 更改的内容)。
$ sudo restorecon -vR /home/sk/KVM_Share
如果KVM共享文件夹没有设置正确的SELinux类型,启动VM时会遇到如下错误。
Error starting domain: internal error: qemu unexpectedly closed the monitor: 2021-05-06T09:30:21.239353Z qemu-system-x86_64: -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=/hostshare,bus=pci.5,addr=0x0: cannot initialize fsdev 'fsdev-fs0': failed to open '/home/sk/KVM_Share': Permission denied Traceback (most recent call last): File "/usr/share/virt-manager/virtManager/asyncjob.py", line 65, in cb_wrapper callback(asyncjob, *args, *kwargs) File "/usr/share/virt-manager/virtManager/asyncjob.py", line 101, in tmpcb callback(args, **kwargs) File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 57, in newfn ret = fn(self, *args, **kwargs) File "/usr/share/virt-manager/virtManager/object/domain.py", line 1329, in startup self._backend.create() File "/usr/lib64/python3.9/site-packages/libvirt.py", line 1353, in create raise libvirtError('virDomainCreate() failed') libvirt.libvirtError: internal error: qemu unexpectedly closed the monitor: 2021-05-06T09:30:21.239353Z qemu-system-x86_64: -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=/hostshare,bus=pci.5,addr=0x0: cannot initialize fsdev 'fsdev-fs0': failed to open '/home/sk/KVM_Share': Permission denied
现在是时候在 Virt-manager 中配置共享文件夹了。
在 KVM 主机和来宾之间设置共享文件夹
打开 Virt-manager 并确保访客系统已关闭。 选择来宾机器并单击 打开 按钮以显示虚拟机控制台和详细信息。
在下一个窗口中,单击 “显示虚拟硬件详细信息” 菜单栏上的按钮,然后单击 “添加硬件” 左窗格中的按钮。
单击左侧窗格中的“文件系统”,在源路径中输入共享文件夹位置,在目标路径下输入挂载标签。 在这里,我分享 "~/KVM_Share"
目录和我的挂载标签是 /hostshare
. 您可以根据需要指定 mount_tag 的名称。 请注意 mount_tag 不是路径。 mount_tag 只是用于标识主机共享的名称。 单击完成并应用以更新更改。
你应该做的最后一件事是 选择合适的访问模式 用于访问共享文件夹。
有三个可能的值。 他们是 passthrough
, mapped
和 squash
.
- 直通 – 指定使用从来宾虚拟机内部设置的用户权限设置访问源(即共享文件夹)。 即文件使用与在来宾上创建的凭据相同的凭据进行存储。 如果未指定,则这是默认访问模式。
- 映射 – 指定使用管理程序的权限设置访问源。 如果您想从来宾计算机获得读写访问权限,则必须选择此模式。
- 壁球 – 与“passthrough”类似,例外是特权操作失败,例如
chown
被忽略。 这使得类似 passthrough 的模式可供以非 root 身份运行虚拟机管理程序的人使用。
选择首选访问模式后,单击“应用”按钮。 我们现在已经从 Virt-manager 为 KVM 主机和来宾系统配置了共享文件夹。
现在,打开来宾虚拟机的电源并在您的来宾机器中创建一个挂载点来挂载 KVM 主机系统的共享文件夹:
[[email protected] ~]$ mkdir ~/hostfiles
最后,使用以下命令在来宾计算机中挂载共享文件夹:
[[email protected] ~]$ sudo mount -t 9p -o trans=virtio /hostshare hostfiles/
共享文件夹 ~/KVM_Share
安装在 hostfiles
虚拟机中的目录。 从现在开始,您可以从来宾虚拟机访问共享文件夹的内容。 您还可以在 KVM 主机和来宾系统上编辑和删除共享文件夹的内容。
要在每次启动时自动挂载共享文件夹,请将以下行添加到 /etc/fstab
来宾系统中的文件:
/hostshare /hostfiles 9p trans=virtio,version=9p2000.L,rw 0 0
希望这可以帮助。
资源:
- KVM 文档
文件共享基于内核的虚拟机KVMLinux共享文件夹虚拟化