虚拟机提供了许多优势,如灵活性、资源的合理利用以及在隔离环境中运行。在虚拟环境中的一个常见任务是在虚拟机和主机之间复制文件。阅读了解如何从主机复制文件到虚拟机,如何从虚拟机传输文件到主机,以及如何在虚拟机之间复制文件。
我们环境的组成部分
让我们首先来了解一下术语:
- A host is a physical machine on which a hypervisor is installed.
- A hypervisor is virtualization software to run virtual machines on the host. There are two types of hypervisors:
- 类型1:使用ESXi服务器,即主机机器
- 类型2:使用VMware Workstation,在这种情况下,Windows和Linux可以作为主机机器的操作系统
在这个演练中,用于解释如何从虚拟机传输文件到主机的环境由以下组件组成:
- ESXi主机1:192.168.101.201
- ESXi主机2:192.168.101.202
- Ubuntu Linux机器:192.168.101.210
- 安装了VMware Workstation的Windows主机
- 网络:192.168.101.0/24
- ESXi虚拟机和VMware Workstation虚拟机连接到同一个网络
我们使用以下技术在虚拟机和主机之间复制文件:
- 共享文件夹
- 共享剪贴板和拖放
- USB存储设备
- PowerCLI
- SSH和SCP
- NFS共享
- 在VMware Web界面中下载/上传文件
- ISO文件
使用共享文件夹将VM文件传输到主机
共享文件夹是VMware Workstation中的一个方便功能,用于在安装了VMware Workstation的Windows或Linux物理主机和在VMware Workstation上运行的虚拟机之间传输文件。对于macOS,VMware Fusion是VMware Workstation的等价物,并支持类似的功能。
现在让我们来介绍使用VMware共享文件夹从虚拟机到主机以及反之间传输文件的步骤。
注意:要使此功能起作用,必须在虚拟机上安装VMware Tools。主机和虚拟机之间的数据传输是通过VMware Tools在主机和客户操作系统之间进行交互完成的,而不是通过网络进行的。
- 选择要配置VMware文件共享的虚拟机。我们选择其中一个Windows虚拟机。
- 在VMware Workstation GUI中单击VM > 设置(编辑虚拟机设置)。
- 在虚拟机设置窗口中,选择选项选项卡,然后单击共享文件夹。在文件夹共享部分,选择始终启用。可选择选中复选框在Windows客户端中将共享文件夹映射为网络驱动器,以获取更多便利。
- 单击添加以选择要用作共享文件夹的文件夹。
- 输入要在主机上共享的文件夹路径或单击浏览并选择所需文件夹。我们选择C:\temp\share-VM
输入共享文件夹的名称,例如,share-VM
单击下一步。
- 选择启用此共享。如果要让虚拟机以只读模式访问共享文件夹,请选中只读复选框。单击完成。
- 新的共享文件夹现在显示在选项选项卡的虚拟机设置窗口的共享文件夹列表中。如果文件名旁边的相应复选框被选中,则共享文件夹已启用。
单击确定保存设置。
- 打开用于与共享文件夹功能共享文件夹的Windows VM的用户界面。
- 在我的电脑(此电脑)或Windows资源管理器中,单击网络(我的网络位置)以查看网络中可用的计算机。
- 选择vmware-host作为配置了共享文件夹的计算机名称。此名称默认设置,并映射到您的物理机器(主机)上,其中包含共享文件夹。
- 单击共享文件夹并选择所需的共享文件夹(在我们的示例中为share-VM)。在我们的情况下,共享文件夹的完整路径为
\\vmware-host\Shared Folders\share-VM\
你可以从主机复制文件到虚拟机,也可以从虚拟机复制文件到主机。在我们的示例中,我们使用 VMware Workstation 中的 VMware 文件共享功能,从 Windows 主机复制了 Test01.txt 到 Windows 客户机。
对于 Linux 客户机,你可以使用以下命令挂载所有 VMware 共享文件夹:
- 在 Linux 内核版本低于 4.0 的情况下:
mount -t vmhgfs .host:/ /home/user1/shares
- 在 Linux 内核版本为 4.0 或更高时:
/usr/bin/vmhgfs-fuse .host:/ /home/user1/shares -o subtype=vmhgfs-fuse,allow_other
如果你想在虚拟机重新启动后保持共享文件夹被挂载,可以在 /etc/fstab 中添加相应的行以及注释和配置,例如:
# VMware 共享文件夹 用于在 VMWare 客户机和主机之间传输文件
.host:/ /mnt/hgfs/ fuse.vmhgfs-fuse defaults,allow_other,uid=1000 0 0
在我们进入下一部分之前,请注意,共享文件夹功能仅适用于 VMware Workstation(以及 macOS 上的 VMware Fusion),在运行在 ESXi 主机上的虚拟机上不可用。对于 ESXi 主机,您可以手动共享文件夹,并使用网络在 Windows 机器之间复制文件。要将文件从虚拟机复制到 ESXi 主机,您应该使用附加工具或将从手动共享文件夹复制文件的方法与下面解释的方法之一相结合。
在 Windows 10 和 Windows Server 2019 中共享文件夹的其他方法。您还可以了解更多关于 SMB 文件共享协议的信息。
如果您有具有管理权限的 Windows 帐户,并且安全策略允许访问默认情况下可用的隐藏管理共享,则可以使用共享路径访问 Windows 机器的本地磁盘上的文件,例如:
\\IP-Address\c$
其中:
IP-Address 是远程 Windows 机器的 IP 地址或主机名。
C$ is the needed disk drive letter on a remote Windows machine which is a hidden system share.
使用共享剪贴板将文件从主机传输到虚拟机
共享剪贴板是一项功能,允许您从虚拟机复制和粘贴内容,如文本和整个文件到安装了 VMware Workstation 的主机机器。该过程类似于在 Windows 或 Linux 中使用 GUI 在不同应用程序窗口之间复制粘贴内容的过程。
完整的功能范围在 VMware Workstation 中可用,它允许您从主机传输文件到虚拟机,以及从虚拟机到主机。您也可以使用拖放文件作为复制粘贴的替代方法。
VMware Workstation 中的共享剪贴板
让我们看看如何使用共享剪贴板和拖放将文件传输到 VMware Workstation 虚拟机。在我们的示例中,VMware Workstation 安装在 Windows 主机上。
- 在 VM 列表中选择左窗格中的虚拟机。
- 单击 编辑虚拟机设置(VM > 设置)。
- 选择选项标签,点击客人隔离。
选择两个复选框:
- 启用拖放功能
- 启用复制粘贴功能
点击确定保存设置并关闭窗口。
在VMware ESXi中共享剪贴板
关于在VMware ESXi上运行的VM,您无法使用拖放或通过共享剪贴板在ESXi主机上的VM和任何其他计算机之间复制任何文件。唯一的选择是在运行在ESXi上的VM和您的本地计算机(安装有VMware Workstation或VMware远程控制台的计算机)之间复制粘贴文本。出于安全原因,不支持文件的复制粘贴和拖放。
但是,如果您无法复制配置文件,例如,您可以使用共享剪贴板复制文件的文本内容。默认情况下,ESXi VM配置中禁用了共享剪贴板。在ESXi主机上执行以下操作以启用共享剪贴板以复制粘贴文本数据:
- 编辑虚拟机配置时,必须将虚拟机关闭。如果虚拟机正在运行,则关闭虚拟机。
- 打开虚拟机设置。您可以使用VMware Host Client和VMware vSphere Client。选择一个虚拟机,单击编辑虚拟机设置,然后选择虚拟机选项选项卡。
展开高级设置部分,然后单击编辑配置。
- 您需要向虚拟机配置中添加三个配置参数(写入虚拟机配置VMX文件)。单击添加参数。
- 添加这三个参数:
isolation.tools.copy.disable FALSE
isolation.tools.paste.disable FALSE
isolation.tools.setGUIOptions.enable TRUE
- 点击确定并保存设置。
作为替代方案,您可以手动编辑位于ESXi数据存储上的VM目录中的VMX文件以进行VM配置。
- 本地登录ESXi shell或通过SSH登录。
- 转到VM目录(数据存储上存储VM文件的目录)。在我们的情况下,我们进入这个目录:
cd /vmfs/volumes/datastore10a/Windows-VM/
- 编辑VMX配置文件。在我们的情况下,文件是Windows-VM.vmx
vi Windows-VM.vmx
- 将上述三个参数添加到此配置文件的末尾。
- 保存更改并关闭文件(退出文本编辑器)。
现在我们可以使用 VMware 远程控制台和 VMware Workstation 连接到运行在 ESXi 主机上的虚拟机,在本地计算机和远程虚拟机之间复制和粘贴文本。
使用 USB 存储设备
VMware ESXi 和 VMware Workstation 支持 USB 透传功能,允许您将 USB 设备插入主机,并将此 USB 设备连接到在此主机上运行的虚拟机。您可以将 USB 存储设备依次连接到主机和虚拟机,以在这些计算机之间双向复制文件。
注意:必须在虚拟机客户操作系统(OS)上安装 VMware Tools 才能使用 USB 透传功能。
在 VMware Workstation VM 和主机之间复制文件
执行以下操作,在安装在 Windows 和 Linux 主机上的 VMware Workstation 中从 VM 复制文件到主机(界面统一):
- 启动虚拟机。
- 将 USB 存储设备(如 USB 硬盘驱动器或 USB 闪存驱动器)插入作为主机的物理计算机中。
- 检测到新的 USB 设备窗口在 VMware Workstation 中打开。选择您想要连接 USB 设备的位置:
- 连接到主机
- 连接到虚拟机
让我们选择第二个选项,将我们的 USB 闪存驱动器连接到虚拟机。在这个示例中,我们正在运行一个 Windows 虚拟机。如果在 VMware Workstation 上运行多个虚拟机,您必须在列表中选择所需的虚拟机。USB 设备一次只能连接到一个虚拟机。点击确定继续。
如果您的 USB 存储设备已经插入到安装了 VMware Workstation 的物理主机机器的 USB 端口中,USB 传递选项的弹出窗口不会自动显示。您可以在菜单中将 USB 设备连接到虚拟机(从主机断开连接):
转到虚拟机>可移动设备>您的 USB 存储设备名称>连接(从主机断开连接)。
在我们的示例中,USB 闪存驱动器名称为 Kingston DataTraveler 2.0。
- 现在,我们可以看到 USB 闪存驱动器已连接到 Windows 7 虚拟机的“我的电脑”(Windows 资源管理器)磁盘驱动器列表中。要检查 USB 存储设备:
- 右键单击我的电脑并点击管理。
- 在右键单击后的相应插件中,转到计算机管理> 设备管理器和计算机管理> 磁盘管理。
如果没有自动分配驱动器号,请在磁盘管理插件中手动分配该号。
Linux 客户端的工作流程相同。在某些 Linux 发行版中,您可能需要手动在 Linux 操作系统中像挂载闪存驱动器一样挂载连接的 USB 存储设备。
- 一旦将 USB 存储设备挂载到虚拟机并被客户端操作系统识别,即可将所需文件从虚拟机复制到 USB 存储设备。现在也可以将文件从 USB 存储设备复制到虚拟机。
- 从虚拟机复制所有所需文件到 USB 闪存驱动器后,将 USB 闪存驱动器从虚拟机断开连接,并将此 USB 设备连接到主机:
单击VM > 可移动设备 > 您的 USB 存储设备名称 > 断开连接(连接到主机)。
- A USB storage device is now connected to a host machine (a Windows machine on which VMware Workstation is running in our case). We can transfer the files that were copied from the VM to the USB flash drive to your host machine.
从 VMware Workstation 到 ESXi 虚拟机的 USB 透传
您可以将 USB 闪存驱动器插入 ESXi 服务器并插入到您本地的 Windows 或 Linux 机器(已安装 VMware Workstation 或 VMware Remote Console(VMRC))上,您正在远程管理 ESXi 主机的这台机器上,以将此 USB 闪存驱动器连接到 ESXi VM。在第一种情况下,使用 主机连接 的 USB 透传,在第二种情况下,使用 客户端连接 的 USB 透传。
让我们将插入到本地物理 Windows 10 机器上的 USB 闪存驱动器连接到运行在 ESXi 主机 v7.0 上的 Windows XP VM(使用客户端连接的 USB 透传功能)。VMware Workstation 安装在我们的物理 Windows 机器上,并通过网络(192.168.101.0/24)连接到 ESXi 主机。
要做到这一点:
- A VM must be powered off to edit the VM settings.
- 确保虚拟机的虚拟硬件列表中存在一个 USB 控制器。您可以在 VMware Host Client 中检查 VM 配置。选择您的 VM(在我们的例子中为 Windows-VM),点击 编辑设置 并选择 虚拟硬件 选项卡。
- 让我们回到安装在我们本地(物理)Windows 10机器上的VMware Workstation。点击文件 > 连接到服务器 在VMware Workstation中连接到远程ESXi主机。
- 输入ESXi服务器名称或IP地址,用户名和密码。点击连接。
- 在VMware Workstation的左窗格中展开ESXi主机,显示远程主机、这些主机上的远程VM以及本地VMware Workstation VM。
- 选择在远程ESXi主机上运行的VM。我们选择在192.168.101.201上运行的Windows-VM。之后我们可以看到所选VM的客户操作系统的用户界面。
- 点击 VM > 可移动设备 > 您的USB存储设备名称 > 连接 (与主机断开连接)。
请注意,我们选择连接到我们安装了VMware Workstation的物理Windows机器的USB设备。此USB设备不是连接到我们远程连接的物理ESXi主机的设备。
- 现在我们可以看到我们的USB闪存驱动器连接到运行在远程ESXi主机上的Windows XP VM:开始 > CMD > compmgmt.msc > 设备管理器。
- 将连接的USB闪存驱动器的分区分配一个磁盘驱动器字母,如果尚未分配驱动器字母。在虚拟机和USB闪存驱动器之间复制所需的文件。您可以将文件传输到虚拟机,也可以从虚拟机传输文件。
- 复制文件后,您可以断开USB存储设备与虚拟机的连接,并将此设备重新连接到本地物理运行VMware Workstation的Windows 10计算机上。在VMware Workstation GUI中,单击VM>可移动设备>您的USB存储设备名称>断开连接(连接到主机)。
在ESXi上连接USB闪存驱动器
在某些情况下,例如需要在ESXi主机上更新网络驱动程序但无法使用网络时,此方法非常有用。将USB闪存驱动器连接到ESXi比连接到运行VMware Workstation的主机机器更复杂。
ESXi存在一些限制,涉及可挂载到ESXi的支持文件系统。不支持带有FAT32和NTFS文件系统的USB闪存驱动器或USB HDD。因此,我们需要在USB闪存驱动器上创建一个分区,并使用VFAT格式化此分区(在Windows中被识别为FAT12)。VFAT有一些限制,如最大分区大小和最大文件大小。因此,此方法不适用于大文件,如大于4 GB的虚拟磁盘或ISO镜像。然而,这些限制足以传输配置文件、驱动程序等。
创建USB闪存驱动器上的分区
首先,让我们在USB闪存驱动器上创建一个新分区,并在VFAT中格式化此分区。我们可以通过将插入ESXi服务器的USB闪存驱动器连接到虚拟机(使用主机连接的USB直通功能)来执行此操作。另外,我们也可以将USB闪存驱动器插入物理的Windows或Linux机器。
在本例中,我们使用Windows 7机器为ESXi准备USB闪存驱动器。适用于Windows Server 2008R2、Windows 10和其他较新Windows版本的命令相同。
- 为确保USB闪存驱动器连接到您的Windows机器,请右键单击我的电脑或此电脑(或从CMD运行diskmgmt.msc)打开磁盘管理。
- 打开Windows命令行:
开始>运行>cmd
- 在命令行中键入
diskpart
并按Enter。你会看到一个diskpart提示:
Diskpart
- 列出连接到您的Windows机器的磁盘:
list disk
在输出列表中找到您的USB闪存驱动器并记住磁盘编号。在我们的案例中,磁盘1是我们的USB闪存驱动器的编号(见下面的屏幕截图)。
- 通过定义上述命令输出的适当磁盘编号(在我们的案例中为磁盘1)选择您的USB闪存驱动器。
select disk 1
- 列出所选的USB闪存驱动器上的分区:
列出分区
我们的USB闪存驱动器上有一个分区(请参见下面的截图)。USB闪存驱动器上有一个分区是最常见的情况。
接下来,我们需要删除USB闪存驱动器上的分区。
重要提示: USB闪存驱动器上的所有数据将被删除。在继续下一步之前,您可以将数据从闪存驱动器复制出来。
- 选择要删除的USB闪存驱动器上的分区:
选择分区1
- 运行命令以删除所选的分区:
删除分区
- 选择再次你的 USB 闪存驱动器:
选择磁盘 1
- 使用 VFAT 文件系统创建一个新的分区。在这个示例中,我们在我们的 USB 闪存驱动器上创建一个 4GB 的分区。请记住,你不能在 VFAT 上存储大于 4GB 的文件。请注意,VFAT 仅支持 8.3 文件名格式。
创建分区 primary size=4000 id=6
- 以兼容 ESXi 的方式格式化创建的分区:
格式化 fs=fat 快速
- 退出 diskpart 实用程序(运行 退出 命令)。
A USB flash drive is ready to be recognized by ESXi and copy files. After some additional ESXi configuration steps, you can attach a USB flash drive to a VM and copy the needed file(s) to the USB flash drive.
假设我们需要复制一个带有驱动程序的 ZIP 归档。在我们的示例中,我们已将 net-tulip.zip 复制到 USB 闪存驱动器。接下来,我们需要在 ESXi 服务器的 ESXi 命令行中挂载 USB 闪存驱动器的一个分区。
配置 ESXi 主机使用 USB 闪存驱动器
假设我们需要从 USB 闪存驱动器复制一个带有驱动程序的 ZIP 存档到 ESXi 数据存储中,然后将一个 VM 配置文件从 ESXi 数据存储复制到 USB 闪存驱动器。在 ESXi 主机上执行以下操作将文件传输到 VMware ESXi,以及反向传输:
- 配置在命令行界面中完成。因此,您必须在ESXi 主机上启用 SSH 访问。
- 要在 DCUI 中启用远程 SSH 访问,请转到故障排除选项>启用 SSH。
- 要在 VMware Host Client 中启用 ESXi 上的远程 SSH 访问和 SSH 服务器,请转到主机>管理,然后选择服务选项卡。右键单击TSM-SSH,然后单击启动以启动服务。您可以永久启用此服务。
- 通过 SSH 连接到 ESXi 主机以使用命令行。您可以使用您喜爱的 SSH 客户端。
- 停止 USB 仲裁器服务:
/etc/init.d/usbarbitrator stop
USB 仲裁器会自动为驻留在 ESXi 主机上的虚拟机启用 USB 透传功能(您只需在相应虚拟机的 VM 设置中选择一个 USB 闪存驱动器即可使用此功能)。
- 如果您想要在 ESXi 重新启动后(永久性地)禁用 USB 仲裁器服务,则可以使用以下命令:
chkconfig usbarbitrator off
要启用 USB 仲裁器服务,请使用适当的命令:
/etc/init.d/usbarbitrator start
chkconfig usbarbitrator on
- 可选命令来检查连接到 ESXi 主机的 USB 设备:
lsusb
esxcli storage core device list | grep -i usb
esxcli storage filesystem list
您可以查看/var/log/usb.log来检查 USB 设备的状态。
- 您可能需要在停止 USB 仲裁服务后断开并重新连接 USB 存储设备。
- 列出块磁盘设备以查找/识别连接的 USB 闪存驱动器(或 USB 硬盘)。
ls -ltrh /vmfs/devices/disks/
我们的 USB 闪存驱动器是mpx.vmhba32:C0:T0:L0:(请参阅下面的截图)。
因此,完整的磁盘地址/位置是:
/dev/disks/mpx.vmhba32:C0:T0:L0:
- 检查USB设备的分区号,以确保已经识别了正确的磁盘设备:
ls /dev/disks/mpx.vmhba32:C0:T0:L0:*
根据输出,考虑到我们的情况中的分区号,完整的设备ID是:
/dev/disks/mpx.vmhba32:C0:T0:L0:1
- 定位USB闪存驱动器的根文件夹,以定义复制文件的源/目标路径。运行以下命令并按Tab查看卷目录中的可用项目。ESXi文件系统的/volumes/目录是挂载有文件系统的分区的目录。
ls -al /vmfs/volumes/ [press Tab]
USB闪存驱动器上的卷被称为NO NAME
- 检查USB闪存驱动器根目录
ls -al /vmfs/volumes/NO\ NAME/
我们的ZIP归档文件位于USB闪存驱动器卷上。
- 我们已经使用以下命令在ESXi数据存储(datastore10a)上创建了install文件夹:
cd /vmfs/volumes/datastore10a
mkdir install
在下面的截图中,您还可以看到我们将从ESXi数据存储复制到USB闪存驱动器的VM配置文件的目录。
- 将ZIP归档文件从USB闪存驱动器复制到我们ESXi主机上的install文件夹(位于datastore10a上)。
cp /vmfs/volumes/NO\ NAME/net-tulip.zip /vmfs/volumes/datastore10a/install/
- 检查文件是否已复制:
ls -al /vmfs/volumes/datastore10a/install/
文件已成功复制。
同样,您可以在相反方向上复制文件 – 从ESXi复制文件到USB闪存驱动器,然后从此USB闪存驱动器将所需文件复制到虚拟机或另一台计算机。
- 检查虚拟机文件夹的内容:
ls -al /vmfs/volumes/datastore10a/Windows-VM/
- 从ESXi数据存储复制Windows-VM.vmx配置文件到USB闪存驱动器:
cp /vmfs/volumes/datastore10a/Windows-VM/Windows-VM.vmx /vmfs/volumes/NO\ NAME/
- 检查文件是否已复制到USB闪存驱动器:
ls -al /vmfs/volumes/NO\ NAME/
在ESXi主机上完成文件复制后,您可以弹出USB闪存驱动器并启动ESXi主机上的USB仲裁服务。然后,您可以插入USB闪存驱动器,并使用主机连接的USB直通功能将USB闪存驱动器连接到虚拟机。
了解有关ESXi的USB直通以及将插入ESXi主机的USB存储设备连接到驻留在ESXi主机上的VM的详细信息。
使用PowerCLI将文件传输到VMware VMs
从VM传输文件到主机的另一种方法是使用PowerCLI命令(cmdlets)。在VM内部必须安装VMware Tools。这些PowerShell cmdlet使用VMware Tools将文件复制到/从驻留在ESXi主机上的VM。因此,如果在源/目标ESXi主机上的VM内运行命令,则不需要网络。
要在VM之间复制文件,可以使用Copy-VMGuestFile cmdlet和vSphere PowerCLI中的其他cmdlet。
- 连接到 ESXi 主机或 vCenter 服务器。在此示例中,我们连接到一个 ESXi 主机。
Connect-VIServer 192.168.101.201
- 为了避免证书警告,运行以下命令:
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false
Copy-VMGuestFile(本地 > ESXi VM)
使用以下命令将文件从本地计算机(运行 PowerCLI 的计算机)复制到 ESXi 主机上的远程 VM:
Copy-VMGuestFile -Source "c:\temp\test.txt" -LocalToGuest -VM Windows-VM -Destination "c:\temp-VM" -GuestUser user1 -GuestPassword Password
其中:
c:\temp\test.txt is the source file that we want to copy from the local machine
-LocalToGuest 是方向(从本地计算机到运行在 ESXi 主机上的目标 VM 上的客户操作系统)
-VM Windows-VM 是目标 VM 名称的定义
c:\temp-VM is the destination folder on the destination VM (where we want to store a file copy)
user1是目标虚拟机中的客户操作系统(OS)中的用户名。此用户必须能够访问已定义的目标文件夹。
密码是该用户的密码。
我们忽略关于VMware Tools版本的警告,并检查我们的text.txt文件是否已复制。
我们可以看到我们的test.txt文件,其大小为29字节,已成功复制到在ESXi主机上运行的Windows XP虚拟机中。
Copy-VMGuestFile(ESXi VM > 本地)
现在,让我们将文件从VM的客户操作系统复制到执行命令的机器的本地目录:
Copy-VMGuestFile -Source "c:\temp-VM\test2.txt" -GuestToLocal -Destination "c:\temp" -VM Windows-VM -GuestUser user1 -GuestPassword Password
其中:
-Source “c:\temp-VM\test2.txt”是在ESXi上运行的VM上源文件的路径
-GuestToLocal是方向(从ESXi VM的客户OS到执行命令的本地机器)
“c:\temp”是本地机器上目标文件夹的路径
user1是目标虚拟机中客户操作系统的用户名。此用户必须能够访问已定义的目标文件夹。
密码是客户OS中此用户的密码。
您可以查看使用Copy-VMGuestFile cmdlet的命令示例:
get-help Copy-VMGuestFile -examples
使用Copy-DatastoreItem
PowerShell命令来复制文件到/从ESXi数据存储。有两种方法可以使用此命令将文件复制到VMware ESXi数据存储:
- 如果在VM内的Windows客户端安装了PowerCLI,则可以运行命令直接从ESXi数据存储复制文件到VM,反之亦然。
- 如果无法在托管在ESXi主机上的虚拟机上安装PowerCLI,则可以从本地Windows机器上运行PowerCLI命令,使用Copy-VMGuestFile命令将文件从ESXi数据存储复制到本地机器,然后使用Copy-VMGuestFile将这些文件从本地机器复制到VM。
您必须连接到ESXi服务器或vCenter服务器。您可以使用以下命令执行此操作:
ViConnect <服务器名称或IP>
我们直接连接到ESXi主机。
让我们将VM配置文件从数据存储复制到当前Windows机器(我们在该机器上运行这些命令 – 它也可以是ESXi主机上的VM):
- 获取有关数据存储的信息:
Get-Datastore "datastore10a"
- 获取ESXi数据存储对象:
$datastore = Get-Datastore "datastore10a"
- 创建一个新的 PowerShell 驱动器,命名为 ds:,映射到 $datastore:
New-PSDrive -Location $datastore -Name ds -PSProvider VimDatastore -Root "\"
- 将您的数据存储设置为当前位置:
Set-Location ds:\
- 要列出所选目录中的文件和目录,请使用以下命令:
Get-ChildItem
- 您可以将虚拟机目录设置为新位置。在我们的案例中,该目录是 Windows-VM
Set-Location "Windows-VM"
-
Copy-DatastoreItem -Item ds:\Windows-VM\Windows-VM.vmx -Destination c:\temp
其中:
ds:\Windows-VM\Windows-VM.vmx是要复制的文件路径,ds:\是到数据存储的定义的快捷方式(在这种情况下是datstore10a)。
- 如果您已连接到 vCenter(而不是像我们在这个示例中连接到特定的 ESXi 主机),您可以使用以下命令来定义 vCenter 数据中心中的数据存储,并从 ESXi 数据存储复制文件到本地机器的文件夹:
Copy-DatastoreItem vmstore:\Datacenter1\datastore10a\Windows-VM\Windows-VM.vmx c:\temp\
- 使用以下命令将文件复制到相反的方向(通过连接到 ESXi 主机):
Copy-DatastoreItem -Item c:\temp\darwin.iso -Destination ds:\install\
我们将 darwin.iso(这是带有 VMware Tools 的 macOS 镜像)从 Windows 机器复制到 ESXi 数据存储中的 install 目录。
- 如果您连接到 vCenter,可以使用以下命令将文件从本地 Windows 机器复制到远程 ESXi 主机上的数据存储:
Copy-DatastoreItem c:\temp\darwin.iso -Destination vmstore:\Datacenter1\datastore10a\install\
您可以使用这些 PowerCLI 命令并创建 PowerShell 脚本来在 VM 和主机之间传输文件。
从 VMware Workstation 中的 VM 复制文件到主机的命令
如果您在Windows或Linux主机上使用VMware Workstation(它是一种类型-2的hypervisor)(或者在macOS上使用VMware Fusion),您也可以使用命令行界面从VM复制文件到主机,反之亦然。您可以使用vmrun命令行工具来操作虚拟机。命令的语法对于Windows、Linux和macOS(VMware Fusion)是相同的。在本教程中,我们在Windows 10上使用VMware Workstation 15。
- 前往VMware Workstation目录:
cd "C:\Program Files (x86)\VMware\VMware Workstation\"
- 使用以下命令将文件从VM内的guest OS复制到本地Windows主机:
CopyFileFromHostToGuest <vmx文件路径> <guest中的路径> <主机上的路径>
在我们的情况下,确切的命令是:
vmrun copyFileFromGuestToHost d:\virtual\WinServer2019\WinServer2019.vmx "c:\temp\test.txt" "c:\temp\copied\"
- 请输入用户名和此用户的密码(用户必须具有足够的权限以访问定义的文件)。
在哪里:
d:\virtual\WinServer2019\WinServer2019.vmx 是从中复制文件的虚拟机的虚拟磁盘。
c:\temp\test.txt 是存储在虚拟机的虚拟磁盘上的文件;这是我们要复制的文件。
c:\temp\copied\ 是要在主机上存储文件副本的目录。
确保在设置路径时使用反斜杠 \ 字符。我们已经从虚拟机复制了一个文本文件 test.txt 到主机。
或者,您可以通过在命令中定义凭据来运行命令:
vmrun -T ws -gu Administrator -gp Password000 copyFileFromGuestToHost d:\virtual\WinServer2019\WinServer2019.vmx "c:\temp\test.txt" "c:\temp\copied\"
要将文件以相反方向(从主机到虚拟机)复制,使用如下命令:
CopyFileFromHostToGuest <vmx 文件路径> <主机路径> <虚拟机路径>
本示例中的特定命令是:
vmrun copyFileFromHostToGuest d:\virtual\WinServer2019\WinServer2019.vmx "c:\temp\test3.txt" "c:\temp\test3-copy.txt"
如何使用 SSH 和 SCP 传输文件
SSH(安全外壳协议)是一种常见的依赖于加密的安全管理远程主机的协议。SCP 是一种依赖于 SSH 的协议,用于安全地在网络上传输文件。您可以使用 SCP 将文件从虚拟机传输到主机,特别是如果虚拟机上运行的是 Linux。可以通过几个步骤在 Linux 机器和 ESXi 上启用 SCP 和 SSH 服务器。
如何在 ESXi 中启用 SSH 服务器
必须在 ESXi 主机上启用 SSH 服务器服务才能使用此方法,并将文件传输到 VMware ESXi 和从 ESXi 中。
- 要在 VMware Host Client 中启用 SSH 服务器,请转到 主机 > 管理 > 服务 并启动 TSM-SSH 服务。
- 必须在ESXi防火墙中允许SSH,以允许通过SCP传输文件从ESXi主机以及从此ESXi主机连接到其他机器使用SCP:
- 转到导航器窗格中的网络,选择防火墙规则选项卡,然后选择SSH客户端。
- 单击操作>启用以启用防火墙规则。
- 要检查主机之间的SSH连接,您可以在ESXi主机上运行以下命令:
nc -z 192.168.101.202 22
其中:
192.168.101.202是远程主机的IP地址。
22是SSH连接的端口号(22是默认端口号)。
通过网络复制文件的SCP命令的一般语法:
scp [选项] [用户]@[SRC_HOST]:文件路径1 [用户]@[DEST_HOST]:文件路径2
[用户]@[SRC_HOST]:文件路径1 – 源文件
[用户]@[DEST_HOST]:文件路径2 – 目标文件
-P 指定 SSH 连接的端口号(如果端口号不是 22,请使用此标志)。
下面,我们解释一些具体的实例。
如何通过 SCP 将本地文件复制到远程机器
要通过 SCP 将本地文件复制到远程机器,使用如下命令:
scp 文件名.txt 远程用户名@远程主机IP:/远程目录
来自 Linux
我们将 LinuxDir.txt 文件从本地 Ubuntu Linux 机器(也可以是虚拟机)复制到通过网络连接的 ESXi 主机。远程 ESXi 主机上的目标位置是 datastore10a 数据存储上的 install 目录。远程 ESXi 主机的 IP 地址是 192.168.101.201。
在我们的情况下,将文件从本地 Linux 机器复制到远程 ESXi 主机的命令是:
scp LinuxDir.txt [email protected]:/vmfs/volumes/datastore10a/install/
您可以使用新文件名将复制的文件存储在目标机器上:
scp LinuxDir.txt [email protected]:/vmfs/volumes/datastore10a/install/LinuxDir-copy.txt
使用 -r 标志复制包含所有文件的目录:
scp -r /本地/目录 远程用户名@192.168.101.201:/远程/目录
从ESXi
您可以在ESXi主机上使用scp命令。命令行中的scp语法对Linux和ESXi是相同的。远程机器上必须配置SSH服务器。
让我们登录到ESXi主机(192.168.101.201)并将install目录及其所有包含的文件复制到远程Linux机器(192.168.101.210)上的user1的主目录。
scp -r /vmfs/volumes/datastore10a/install/ [email protected]:/home/user1/
如果SSH服务器侦听的端口不是22,请使用-P参数;例如,如果SSH端口号是8022,则命令是:
scp -P 8022 -r /vmfs/volumes/datastore10a/install/ [email protected]:/home/user1/
如何通过SCP从远程机器复制文件到本地机器
SCP对于从远程机器复制文件到本地机器很方便,这还允许您将文件从虚拟机传输到主机。下面我们解释如何在Linux和ESXi中运行适当的命令。
将文件复制到本地Linux机器
我们将使用SCP将文件从远程ESXi主机复制到当前Linux机器。要执行此操作,请使用以下命令:
scp 远程用户名@远程_IP地址:/远程/文件.txt /本地/目录
让我们从远程 ESXi 服务器复制一个 darwin.iso 文件到 Linux 机器上定义的主目录:
scp [email protected]:/vmfs/volumes/datastore10a/install/winPreVista.iso /home/user1/
将文件复制到本地 ESXi 主机
如果我们登录到一个 ESXi 主机,我们可以运行以下命令,将一个 VM 文件从远程 Linux 机器复制到本地 ESXi 主机的 datastore。让我们通过网络使用 SCP 将 VM_file.txt 从 Linux 机器复制到 ESXi datastore 的目录:
scp [email protected]:/home/user1/VM_file.txt /vmfs/volumes/datastore10a/install/
如何在两台远程机器之间复制文件
有 SCP 命令可以从一台远程机器复制文件到另一台远程机器,有时候通过当前本地机器复制数据,有时候不会。命令语法如下:
scp [email protected]://directory/file.txt [email protected]://directory/
以上命令直接从一个远程主机传输数据到另一个远程主机(不会复制到我们当前的本地机器)。如果你想通过运行命令的本地机器路由流量,请使用 -3 标志。
注意: 如果两个远程主机的凭据相同,请使用此命令。
在本地 Linux 机器上运行的命令示例,从远程 ESXi 主机(192.168.101.202)复制一个文件(vim.v00)到本地 ESXi 主机(192.168.101.201):
scp [email protected]://vmfs/volumes/BOOTBANK1/vim.v00 [email protected]://vmfs/volumes/datastore10a/install/“`
如果看到主机密钥验证失败错误,则意味着其中一个主机上未存储主机密钥。如果错误是由于在远程服务器上更改主机密钥而导致的,请删除存储在~/.ssh/known_hosts中当前远程主机的旧主机密钥
删除旧主机密钥的命令是:
ssh-keygen -R 主机名或IP地址
例如,在192.168.101.202上运行以下命令以删除远程主机192.168.101.201的旧主机密钥:
ssh-keygen -R 192.168.101.201
在命令中使用-3以通过本地机器复制文件的示例:
scp -3 [email protected]://vmfs/volumes/BOOTBANK1/vim.v00 [email protected]://vmfs/volumes/datastore10a/install/
此目的的替代命令是:
scp -o "ForwardAgent yes" [email protected]://vmfs/volumes/BOOTBANK1/vim.v00 [email protected]://vmfs/volumes/datastore10a/install/
如何通过SCP从Windows复制文件
您还可以在Windows中将文件复制到虚拟机或ESXi主机。为此,您需要使用SCP客户端,例如WinSCP,它是一个用户友好且方便的图形界面。您可以免费下载WinSCP。
- 运行 WinSCP。
- 选择一个协议,例如,SFTP。
- 输入远程主机的主机名和端口号,比如 ESXi 主机或 Linux 机器。
- 输入远程机器的用户名和密码。
- 点击 登录。
在这个例子中,我们正在连接到一个远程 ESXi 主机。
- A notification message is displayed:
继续连接到未知服务器并将其主机密钥添加到缓存中?
点击 是 继续。
- 一旦连接成功,您会看到带有两个面板的命令行式窗口。一个面板表示本地机器上的目录,另一个面板表示远程机器上的目录。您可以通过在这两个面板之间复制文件来在本地主机和远程主机之间复制文件。
您可以从连接的 WinSCP 中的远程 ESXi 主机的数据存储中复制文件到远程 Windows VM 或物理机,使用 Windows 机器上的 SMB 共享。
但是,在 WinSCP 面板中无法输入直接的共享路径(例如,\\192.168.101.117\c$)。您只能选择磁盘驱动器字母。为了绕过这个限制,在 Windows 资源管理器中连接到文件共享并将此文件共享映射为网络驱动器。分配一个驱动器字母,例如,在此示例中我们分配了S:来连接 192.168.101.211 上的共享文件夹。
现在我们可以在 WinSCP 的左窗格的下拉菜单中选择S:作为网络驱动器,选择远程 ESXi 服务器的数据存储中所需的文件或目录并复制文件到双向。
使用 NFS 共享
您可以使用 NFS 共享将文件从 ESXi 数据存储传输到 VM,反之亦然。ESXi 不支持 SMB 共享(Windows 本地)。它支持 NFS 共享(Linux 本地)和将 NFS 共享附加为数据存储。使用此功能,您可以使用以下方法之一在 ESXi 和 Linux 机器之间传输文件:
方法 1:
- 在 Linux VM 上配置 NFS 服务器和 NFS 共享
- 在 ESXi 上将 NFS 共享附加为数据存储
- 将文件从 VM 复制到 ESXi 数据存储,反之亦然
方法 2:
- 在物理 Linux 机器或 NAS 上配置 NFS 服务器
- 将NFS共享附加为ESXi上的数据存储
- 连接到Linux VM上的NFS共享
- 从Linux VM复制文件到NFS共享,然后将这些文件复制到ESXi主机上。从ESXi主机复制文件到NFS共享,并将这些文件从NFS共享复制到Linux VM。
阅读NFS vs SMB比较,以了解更多关于这些文件共享协议的信息。
在Linux上配置NFS共享
我们在本教程中使用Linux Ubuntu 20.04。我们以普通用户身份登录Linux,并在需要时使用sudo获取root权限运行命令。执行以下步骤安装NFS服务器并配置NFS共享。
- 在Linux中更新仓库树:
sudo apt-get update
- 在Linux上安装NFS服务器软件包:
sudo apt-get install nfs-kernel-server -y
- 创建一个目录(导出目录),该目录将在NFS服务器上共享:
sudo mkdir -p /srv/nfs/share1/
- 设置创建的目录的所有者和权限:
sudo chown -R nobody:nogroup /srv/nfs/share1/
sudo chmod 0777 /srv/nfs/share1/
nobody 是一个伪用户,用于代表权限最低且无法访问shell的用户。 nogroup 组的目的类似于 nobody 用户。
- 配置exports文件以共享创建的目录。
sudo nano /etc/exports
或者
sudo vim /etc/exports
- 在配置文件底部添加以下行:
/srv/nfs/share1/ CLIENT_IP(rw,sync,no_subtree_check)
在我们的情况下,允许 ESXi 主机的 IP 地址为:
/srv/nfs/share1/ 192.168.101.201(rw,sync,no_subtree_check)
您可以通过添加以下行来允许子网中所有主机的访问:
/srv/nfs/share1/ 192.168.101.0/24(rw,sync,no_subtree_check)
您可以添加下一行来允许另一个主机(IP 地址)的访问。
保存更改并退出文本编辑器。
- 要检查数据是否写入文件,您可以使用以下命令:
cat /etc/exports
- 使用以下命令应用新的配置:
sudo exportfs -a
- 确保 Linux 机器上的防火墙允许访问。您可以使用以下命令授予特定 IP 地址访问权限:
sudo ufw allow from IP to any port nfs
在我们的情况下:
sudo ufw allow from 192.168.101.201 to any port nfs
要允许对整个子网的主机进行访问:
sudo ufw allow from 子网 to any port nfs
在我们的情况下,命令将是:
sudo ufw allow from 192.168.101.0/24 to any port nfs
- 您可以使用以下命令检查防火墙状态:
sudo ufw status
- 重新启动 NFS 服务器以使配置更改生效:
sudo systemctl restart nfs-kernel-server
- NFS 共享已在 Linux 中配置。
- 将文件从 Linux 机器的任意目录复制到通过 NFS 共享的目录。我们将 VM_file.txt 复制到我们的 NFS 共享,并在此之后检查目录的内容:
cp VM_file.txt /srv/nfs/share1/
ls -al /srv/nfs/share1/
在 ESXi 中挂载 NFS 数据存储
在配置 NFS 共享后,需要在 ESXi 中添加 NFS 数据存储。我们在此示例中使用 VMware 主机客户端来执行此操作。
转到 存储 > 数据存储 并点击 新数据存储。
打开 新数据存储 向导。
- 选择 挂载 NFS 数据存储。点击 下一步 继续。
- 提供NFS挂载细节:
- 名称:NFS-share(显示为数据存储名称的名称)
- NFS服务器:192.168.101.210
- NFS共享:/srv/nfs/share1/
- NFS版本:NFS4<>/li
NFS4的用户名和密码是可选的。我们将这两个字段留空。
- 准备完成。检查您的配置,如果一切正确,请单击完成。
从VM复制文件到主机
NFS数据存储已成功挂载。您可以在存储> 数据存储中检查。
现在我们可以将存储在NFS共享上的VM上的文件复制到本地ESXi数据存储(从VM到主机传输文件)。
- 单击数据存储浏览器。
- 在数据存储浏览器中选择您的NFS数据存储(在我们的情况下是
)。浏览NFS数据存储中所需的文件。选择所需的文件,然后单击 。 - 选择目的地。在目标数据存储中选择要存储复制文件的位置(在我们的情况下是
)。单击 。 或者,您可以在ESXi服务器的命令行中复制所需的文件:
cp /vmfs/volumes/NFS-share/VM_file.txt /vmfs/volumes/datastore10b/VM_file-copy.txt
使用VMware Web界面下载/上传文件
您可以使用 VMware 主机客户端或 VMware vSphere 客户端的 Web 接口上传/下载文件到/从 ESXi 数据存储中。Web 接口可从已安装 Web 浏览器并且具有到 ESXi 主机的网络连接的任何物理或虚拟机中访问。因此,您可以直接从虚拟机打开此 Web 接口,如果客户操作系统具有 GUI,或者使用任何本地机器作为中间机器,从虚拟机到主机和反之传输文件。
还有一种替代但更复杂的方法可以从虚拟机传输文件到 VMware ESXi:
- 将虚拟机的虚拟磁盘下载到本地计算机或另一台机器。
- 从此虚拟机虚拟磁盘(.vmdk 和 –flat.vmdk)中提取所需文件到本地计算机。或者,如果安装了 VMware Workstation,您还可以将虚拟磁盘挂载到虚拟驱动器。
- 使用上述方法之一(在 VMware 主机客户端、vSphere 客户端或 SCP 客户端等)将提取的文件或从挂载的虚拟磁盘中的文件上传到 ESXi 主机的数据存储中。
阅读有关 如何从 VMDK 虚拟磁盘提取文件 的详细博客文章。
使用ISO文件向VM传输数据
如果VM的网络连接不可用,您可以通过使用ISO映像文件将文件传输到VMware VM:
- 使用Ultra ISO等软件为Windows创建ISO映像。
- 在本地计算机或其他计算机上将所需的文件写入ISO映像。您可以从ESXi复制文件并使用上述方法之一将它们写入ISO映像。
- 使用VM的虚拟CD/DVD驱动器将ISO映像文件挂载到VM(您可以直接从本地计算机挂载ISO文件,或者在执行此操作之前将ISO文件上传到ESXi数据存储)。使用VMware Host Client、VMware vSphere Client、VMware Workstation或VMware Remote Console将ISO文件挂载到ESXi VM。
此方法不能用于从VM向主机传输文件,因为VM在只读模式下工作于虚拟CD/DVD磁盘。
结论
有多种方法可以从主机向虚拟机复制文件,反之亦然。有些方法需要网络连接,有些方法即使网络不可用也能工作。您可以根据您的场景选择适合您的方法,并结合这些方法。请记住备份您的VM以避免数据丢失。使用NAKIVO Backup and Replication,您可以保护VMware vSphere中的VM,并直接从VM备份中恢复单个文件。
Source:
https://www.nakivo.com/blog/3-simple-ways-to-transfer-files-from-a-vm-to-a-host/