Red Hat Training

A Red Hat training course is available for RHEL 8

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

您可能需要在主机系统及其运行的虚拟机(VM)间共享数据。要快速有效地这样做,您可以在您的系统中设置 NFS 或者 Samba 文件共享。

14.1. 在主机和 Linux 虚拟机间共享文件

为了在主机系统与其连接的 Linux 虚拟机间进行有效的文件共享,您可以导出一个 NFS 共享,供虚拟机挂载和访问。

先决条件

  • nfs-utils 软件包安装在主机上。
  • 要与虚拟机共享的目录。如果您不想共享任何现有目录,请创建一个新目录,例如: shared-files

    # mkdir shared-files
  • 主机可以通过虚拟机的网络可见并可访问。通常情况下,如果虚拟机使用 NAT网桥类型虚拟网络进行连接,则会出现这种情况。然而,对于 macvtap 连接,您必须首先在主机上设置 macvlan 功能。要做到这一点:

    1. 在主机的 /etc/systemd/network/ 目录中创建一个网络设备文件,例如 vm-macvlan.netdev

      # vim /etc/systemd/network/vm-macvlan.netdev
    2. 编辑网络设备文件,使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [NetDev]
      Name=vm-macvlan
      Kind=macvlan
      
      [MACVLAN]
      Mode=bridge
    3. 为您的 macvlan 网络设备创建网络配置文件,例如 vm-macvlan.network

      # vim /etc/systemd/network/vm-macvlan.network
    4. 编辑网络配置文件使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [Match]
      Name=_vm-macvlan_
      
      [Network]
      IPForward=yes
      Address=192.168.250.33/24
      Gateway=192.168.250.1
      DNS=192.168.250.1
    5. 为您的物理网络接口创建网络配置文件。例如,如果您的接口是 enp4s0:

      # vim /etc/systemd/network/enp4s0.network

      如果您不确定要使用的接口名称,您可以使用主机上的 ifconfig 命令获取活跃网络接口列表。

    6. 编辑物理网络配置文件,使物理网络成为 macvlan 接口的一部分,在本例中为 vm-macvlan

      [Match]
      Name=enp4s0
      
      [Network]
      MACVLAN=vm-macvlan
    7. 重启您的主机。
  • 可选: 为了提高安全性,请确保您的虚拟机与 NFS 版本 4 或更高版本兼容。

流程

  1. 在主机上,导出您要作为网络文件系统(NFS)共享的文件的目录。

    1. 获取您要共享文件的每个虚拟机的 IP 地址。以下示例获取 testguest1testguest2 的 IP 地址。

      # virsh domifaddr testguest1
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet0      52:53:00:84:57:90    ipv4         192.168.124.220/24
      
      # virsh domifaddr testguest2
      Name       MAC address          Protocol     Address
      ----------------------------------------------------------------
      vnet1      52:53:00:65:29:21    ipv4         192.168.124.17/24
    2. 编辑主机上的 /etc/exports 文件并添加包括您要共享的目录、您要共享的虚拟机 IP 和共享选项的行。

      Shared directory VM1-IP(options) VM2-IP(options) [...]

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

      /usr/local/shared-files/ 192.168.124.220(rw,sync) 192.168.124.17(rw,sync)
    3. 导出更新的文件系统。

      # exportfs -a
    4. 确定启动 NFS 进程:

      # systemctl start nfs-server
    5. 获取主机系统的 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.168.124.1/24 brd 192.168.124.255 scope global virbr0
             valid_lft forever preferred_lft forever
      [...]

      请注意,您要共享文件的虚拟机用来连接到主机的网络是相关网络。通常,这是 virbr0

  2. /etc/exports 文件中指定的虚拟机的客户机操作系统中挂载导出的文件系统。

    1. 创建您要用作共享文件系统挂载点的目录,例如 /mnt/host-share:

      # mkdir /mnt/host-share
    2. 在挂载点挂载主机导出的目录。这个示例在客户端的 /mnt/host-share 中挂载由 192.168.124.1 主机导出的 /usr/local/shared-files 目录:

      # mount 192.168.124.1:/usr/local/shared-files /mnt/host-share
    3. 要验证挂载是否已成功,访问并探索挂载点上的共享目录:

      # cd /mnt/host-share
      # ls
      shared-file1  shared-file2  shared-file3

14.2. 在主机和 Windows 虚拟机间共享文件

为了在主机系统和连接到它的 Windows 虚拟机间有效文件共享,您需要准备一个可被虚拟机访问的 Samba 服务器。

先决条件

  • samba 软件包安装在您的主机上。如果没有:

    # yum install samba
  • 主机可以通过虚拟机的网络可见并可访问。通常情况下,如果虚拟机使用 NAT网桥类型虚拟网络进行连接,则会出现这种情况。然而,对于 macvtap 连接,您必须首先在主机上设置 macvlan 功能。要做到这一点:

    1. 创建网络设备文件,例如在主机的 /etc/systemd/network/ 目录中称为 vm-macvlan.netdev 的文件。

      # vim /etc/systemd/network/vm-macvlan.netdev
    2. 编辑网络设备文件,使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [NetDev]
      Name=vm-macvlan
      Kind=macvlan
      
      [MACVLAN]
      Mode=bridge
    3. 为您的 macvlan 网络设备创建网络配置文件,例如 vm-macvlan.network

      # vim /etc/systemd/network/vm-macvlan.network
    4. 编辑网络配置文件使其包含以下内容。您可以将 vm-macvlan 替换为您为网络设备选择的名称。

      [Match]
      Name=_vm-macvlan_
      
      [Network]
      IPForward=yes
      Address=192.168.250.33/24
      Gateway=192.168.250.1
      DNS=192.168.250.1
    5. 为您的物理网络接口创建网络配置文件。例如,如果您的接口是 enp4s0:

      # vim /etc/systemd/network/enp4s0.network

      如果您不确定要使用的接口,可以使用主机上的 ifconfig 命令获取活跃网络接口列表。

    6. 编辑物理网络配置文件,使物理网络成为 macvlan 接口的一部分,在本例中为 vm-macvlan

      [Match]
      Name=enp4s0
      
      [Network]
      MACVLAN=vm-macvlan
    7. 重启您的主机。

流程

  1. 在主机中,创建一个 Samba 共享并使其可以被外部系统访问。

    1. 为 Samba 添加防火墙权限。

      # firewall-cmd --permanent --zone=public --add-service=samba
      success
      # firewall-cmd --reload
      success
    2. 编辑 /etc/samba/smb.conf 文件:

      1. [global] 部分添加以下内容:

        map to guest = Bad User
      2. 在文件的末尾添加以下内容:

        #=== Share Definitions ===
        [VM-share]
        path = /samba/VM-share
        browsable = yes
        guest ok = yes
        read only = no
        hosts allow = 192.168.122.0/24

        请注意,hosts allow 行限制了共享仅可以被 VM 网络上的主机访问。如果您希望共享可以被任何人访问,请删除该行。

    3. 创建 /samba/VM-share 目录。

      # mkdir -p /samba/VM-share
    4. 启用 Samba 服务。

      # systemctl enable smb.service
      Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.
    5. 重启 Samba 服务。

      # systemctl restart smb.service
    6. 允许虚拟机访问该 VM-share 目录并进行修改。

      # chmod -R 0755 /samba/VM-share/
      # chown -R nobody:nobody /samba/VM-share/
    7. 将 SELinux Samba 共享标签添加到 /etc/samba/VM-share/

      # chcon -t samba_share_t /samba/VM-share/
  2. 在 Windows 客户机操作系统上,将 Samba 共享作为网络位置附加。

    1. 打开文件 Explorer 并右键点击 "This PC"。
    2. 在上下文菜单中点 Add a network location

      virt Win10 network loc1
    3. 在打开的 Add Network Location 向导中,选择 "Choose a custom network location" 并点 Next
    4. 在"Internet 或 network address"字段中,输入 host-IP/VM-share,其中 host-IP 是主机的 IP 地址。通常,主机 IP 是虚拟机的默认网关。之后,点 Next

      virt Win10 网络 loc2
    5. 当向导询问共享目录是否要重命名时,保留默认名称。这样可保证跨虚拟机和客户端文件共享配置的一致性。点 Next
    6. 如果访问网络位置成功,您可以点击 Finish 并打开共享目录。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。