在 KVM 主机和来宾之间设置共享文件夹

创建新的虚拟机后,您可能希望在 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 并确保访客系统已关闭。 选择来宾机器并单击 打开 按钮以显示虚拟机控制台和详细信息。

在 Virt-manager 中显示虚拟机控制台和详细信息

在下一个窗口中,单击 “显示虚拟硬件详细信息” 菜单栏上的按钮,然后单击 “添加硬件” 左窗格中的按钮。

单击 Virt-manager 中的“添加硬件”按钮

单击左侧窗格中的“文件系统”,在源路径中输入共享文件夹位置,在目标路径下输入挂载标签。 在这里,我分享 "~/KVM_Share" 目录和我的挂载标签是 /hostshare. 您可以根据需要指定 mount_tag 的名称。 请注意 mount_tag 不是路径。 mount_tag 只是用于标识主机共享的名称。 单击完成并应用以更新更改。

在 KVM 主机和来宾之间设置共享文件夹在 KVM 主机和来宾之间设置共享文件夹

你应该做的最后一件事是 选择合适的访问模式 用于访问共享文件夹。

在Virt-manager中选择访问共享文件夹的安全模式在Virt-manager中选择访问共享文件夹的安全模式

有三个可能的值。 他们是 passthrough, mappedsquash.

  • 直通 – 指定使用从来宾虚拟机内部设置的用户权限设置访问源(即共享文件夹)。 即文件使用与在来宾上创建的凭据相同的凭据进行存储。 如果未指定,则这是默认访问模式。
  • 映射 – 指定使用管理程序的权限设置访问源。 如果您想从来宾计算机获得读写访问权限,则必须选择此模式。
  • 壁球 – 与“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共享文件夹虚拟化