第 19 章 在主机及其虚拟机间共享文件

您可能需要在主机系统和其运行的虚拟机(VM)之间共享数据。要快速高效地完成此操作,您可以在系统上建立 NFS 文件共享。或者,您也可以使用 virtiofs 与 Linux 和 Windows 虚拟机共享数据。

19.1. 使用 NFS 在主机和其虚拟机之间共享文件

为了 RHEL 9 主机系统和虚拟机(VM)之间高效的文件共享,您可以导出虚拟机可以挂载和访问的 NFS 共享。

但是,对于 Linux 虚拟机,使用 virtiofs 特性通常更为方便。

先决条件

  • nfs-utils 软件包已安装在主机上。

    # dnf install nfs-utils -y
  • NAT 的虚拟网络或 网桥 类型被配置为将主机连接到虚拟机。
  • 可选: 为了提高安全性,请确保您的虚拟机与 NFS 版本 4 或更高版本兼容。

流程

  1. 在主机上,将一个带有文件的目录导出为网络文件系统(NFS):

    1. 与虚拟机共享一个现有目录。如果您不想共享任何现有目录,请创建一个新目录:

      # mkdir shared-files
    2. 获取每个虚拟机的 IP 地址,以便从主机(如 testguest1testguest2)共享文件:

      # virsh domifaddr testguest1
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet0      52:53:00:84:57:90    ipv4         192.0.2.2/24
      
      # virsh domifaddr testguest2
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet1      52:53:00:65:29:21    ipv4         192.0.2.3/24
    3. 编辑主机上的 /etc/exports 文件,并添加一行,其中包含您要共享的目录、要共享的虚拟机的 IP 以及其它选项:

      /home/<username>/Downloads/<shared_directory>/ <VM1-IP(options)> <VM2-IP(options)>
      ...

      以下示例将主机上的 /usr/local/shared-files 目录与 testguest1testguest2 共享,并允许虚拟机编辑目录的内容:

      /usr/local/shared-files/ 192.0.2.2(rw,sync) 192.0.2.3(rw,sync)
      注意

      要与 Windows 虚拟机共享目录,您需要确保 Windows NFS 客户端在共享目录中有写权限。您可以在 /etc/exports 文件中使用 all_squashanonuidanongid 选项。

      /usr/local/shared-files/ 192.0.2.2(rw,sync,all_squash,anonuid=<directory-owner-UID>,anongid=<directory-owner-GID>)

      <directory-owner-UID><directory-owner-GID> 是拥有主机上共享目录的本地用户的 UID 和 GID。

      对于管理 NFS 客户端权限的其他选项,请按照 确保 NFS 服务安全 指南进行操作。

    4. 导出更新的文件系统:

      # exportfs -a
    5. 启动 nfs-server 服务:

      # systemctl start nfs-server
    6. 获取主机系统的 IP 地址,来在虚拟机上挂载共享目录:

      # ip addr
      ...
      5: virbr0: [BROADCAST,MULTICAST,UP,LOWER_UP] mtu 1500 qdisc noqueue state UP group default qlen 1000
      link/ether 52:54:00:32:ff:a5 brd ff:ff:ff:ff:ff:ff
      inet 192.0.2.1/24 brd 192.0.2.255 scope global virbr0
      valid_lft forever preferred_lft forever
      ...

      请注意,相关网络将主机与虚拟机连接,以共享文件。通常,这是 virbr0

  2. 在 Linux 虚拟机上挂载共享目录在 /etc/exports 文件中指定:

    # mount 192.0.2.1:/usr/local/shared-files /mnt/host-share
    • 192.0.2.1 :主机的 IP 地址。
    • /usr/local/shared-files :主机上导出的目录的文件系统路径。
    • /mnt/host-share :虚拟机上的挂载点

      注意

      挂载点必须是一个空目录。

  3. 在 Windows 虚拟机上挂载共享目录,如 /etc/exports 文件中所述:

    1. 以管理员身份打开 PowerShell shell 提示符。
    2. 在 Windows 上安装 NFS-Client 软件包。

      1. 要在服务器版本上安装,请输入:

        # Install-WindowsFeature NFS-Client
      2. 要在桌面版本上安装,请输入:

        # Enable-WindowsOptionalFeature -FeatureName ServicesForNFS-ClientOnly, ClientForNFS-Infrastructure -Online -NoRestart
    3. 在 Windows 虚拟机上挂载主机导出的目录:

      # C:\Windows\system32\mount.exe -o anon \\192.0.2.1\usr\local\shared-files Z:

      在本例中:

      • 192.0.2.1 :主机的 IP 地址。
      • /usr/local/shared-files :主机上导出的目录的文件系统路径。
      • Z:: 挂载点的盘符。

        注意

        您必须选择一个系统上不使用的驱动器符。

验证

  • 列出虚拟机上共享目录的内容,以便您可以在主机和虚拟机之间共享文件:

    $ ls <mount_point>
    shared-file1  shared-file2  shared-file3

    在这个示例中,将 <mount_point> 替换为挂载的共享目录的文件系统路径。