简介:面向需要在物理机与虚拟机之间快速交换文件的开发、测试及运维人员,这套FileZilla工具资源系统梳理了FTP/SFTP/FTPS的配置与使用要点,覆盖连接设置、双向拖拽传输、断点续传、多线程加速及安全加密等常见场景。资源包共547个文件,压缩后约5.61MB,其中png截图占绝大多数,方便按图索骥对照界面操作;exe与dll为FileZilla客户端主程序及组件,mo为多语言翻译文件,xml/xrc则包含默认配置和界面布局,整体结构清晰,主程序与示例配置齐全,并附有版权及使用说明文档。已有4827人学习。通过这份资源,读者既能获得可运行的FileZilla工具,也能结合图文理解虚拟机网络模式(桥接/NAT)对连通性的影响,掌握FTP服务端的基本配置思路,从而独立完成本地与虚拟机的双向文件互传,提升开发调试与部署效率。
1. 本地与虚拟机文件互传工具:先搞清楚是哪条链路卡住了
本地与虚拟机文件互传工具,说到底就是解决一个日常但很烦的需求:宿主机的安装包怎么塞进虚拟机,虚拟机里的日志怎么拿回宿主机。多数教程只告诉你装个 VMware Tools,可真上手你会发现,拖拽转圈、共享目录不显示、大文件复制一半校验失败,哪样都能卡你一晚上。原因很简单,这句话背后藏着三条完全不同的链路,选错链路,工具装得再全也没用。
这篇笔记以 VMware Workstation 和 VirtualBox 为主线,把拖拽复制、共享文件夹、网络传输三条链路按“能不能用、怎么配、坑在哪”拆开。新手跟着步骤能跑通,熟手直接翻第 5 章的避坑清单和第 6 章的磁盘只读提取。
先说个反直觉结论:拖拽复制看起来最方便,其实最容易翻车;共享文件夹配置稍烦,却是传大文件真正可靠的通道。适合刚装好虚拟机的入门用户,被双系统文件折腾的开发,以及在 ESXi 上维护虚拟机、不想为传个补丁包启动整套桌面的运维。
2. 三种互传链路怎么选:拖拽、共享目录与网络通道
2.1 先看虚拟化类型,再看互传工具
“本地与虚拟机文件互传”其实不是一个工具,而是一组通道的组合。不同虚拟化引擎暴露的入口不同:VMware Workstation 下最顺手的通道是 VMware Tools 加共享文件夹,VirtualBox 下靠增强功能加 vboxsf 模块,到了 ESXi、Proxmox VE 这类服务器虚拟化上,桌面式的拖拽通道直接消失,只剩网络和磁盘两个入口。
所以动手前第一件事是先回答:你的虚拟机跑在哪一类引擎上。选错了方向,后面所有配置都是在给错误方案打补丁。
| 虚拟化形态 | 默认互传链路 | 需要安装的组件 | 大文件表现 |
|---|---|---|---|
| VMware Workstation 17 | 拖拽/剪贴板、共享文件夹 | VMware Tools 或 open-vm-tools | 共享文件夹最顺 |
| VirtualBox | 拖拽、共享文件夹 | Guest Additions | 共享文件夹最顺 |
| ESXi / Proxmox | scp、sftp、virtiofs | open-vm-tools 可选 | 网络传输为主 |
| KVM/QEMU | virtiofs、scp | virtiofsd | 建议 virtiofs |
宿主和客户机的操作系统组合也会影响选择。Windows 宿主加 Linux 客户机是最常见组合,教程最全;反过来 Linux 宿主加 Windows 客户机,拖拽体验会打折,共享文件夹要映射网络路径,反而没有 SMB 方便。先把这两个变量定下来,后面的配置才不会白做。
2.2 拖拽复制与复制粘贴:链路最短,也最容易翻车
拖拽复制和复制粘贴走的是同一条链路:虚拟机工具在客户机里挂一个辅助进程,宿主把鼠标选中的文件内容交给它,由它在客户机里写盘。这条链路不用配 IP、不用挂载,教学成本最低,但它天然是为小块数据传输设计的,不是为几十 GB 的镜像准备的。文件一大,进度条转半天最后报失败,或者两边都以为传完了结果校验值对不上,都是常见现场。
还有一个容易被忽略的边界:Linux 客户机如果跑 Wayland 会话,拖拽复制在不少发行版上时好时坏。原因是 Wayland 的安全模型收紧了剪贴板和拖放权限,虚拟机的辅助进程插不进去。常见做法是切回 Xorg 登录会话,或者干脆在 Wayland 下只用共享文件夹。这个问题到第 5 章会展开,这里先记住方向:拖拽适合传小脚本,不适合传产物。
2.3 共享文件夹:大文件传输的主信道
共享文件夹的原理和拖拽完全不同。VMware 通过 vmhgfs 或 vmhgfs-fuse,VirtualBox 通过 vboxsf,把宿主上的一个真实目录半虚拟化成客户机里的挂载点。因为是文件系统驱动的行为,数据不经过窗口剪贴板,也没有内存缓冲上限,传几十 GB 的包都不容易断。这也是我一般会优先推荐共享文件夹的原因。
但共享文件夹也有脾气。挂载点默认属主是 root,普通用户写文件会报 Permission denied;Windows 宿主路径带中文或空格时,挂载行为可能变得很怪;fstab 写错还可能让虚拟机启动卡住。这些边界后面挨个讲。先记住结论:拖拽解决偶尔传个小脚本,共享文件夹才是天天传构建产物的正确姿势。
2.4 网络通道:不依赖工具的兜底
如果连附加组件都装不上,比如客户机是精简版系统、内核头文件缺失,或者虚拟机跑在远程 ESXi 上,那就只剩网络这一条路。常见做法是宿主起一个临时 HTTP 服务,客户机直接 curl 拉;反之客户机跑 sshd,宿主用 scp 拉回来。这条链路和虚拟化引擎无关,只要网络能通就行。
注意 NAT 和桥接的区别。NAT 模式下客户机访问宿主走的是虚拟网卡的默认网关,宿主访问客户机则需要知道客户机 IP 并且放行防火墙端口;桥接模式下两边同网段,按 IP 直连。如果你在 VMware 里发现两边互相 ping 不通,先别急着切换网络模式,查 Windows 防火墙和虚拟网卡的 DHCP 服务,往往比反复改配置有效。
3. VMware Workstation 下把拖拽和共享文件夹跑通
3.1 安装 VMware Tools:先选对包,再执行
VMware 里互传的第一前置条件是 VMware Tools。Windows 客户机最省事:菜单里点虚拟机->安装 VMware Tools,光驱挂载后跑 setup64.exe,一路下一步重启即可。这套流程从旧版到 VMware Workstation 17 都没变过,老用户直接照旧。麻烦的是 Linux 客户机,它有两套安装路线,二选一,不要都装。
第一套是发行版仓库里的 open-vm-tools,这是现代发行版默认推荐的方式,内核升级后 dkms 会自动重编模块,不用每次手动处理。第二套是官方 ISO 里的 VMwareTools-*.tar.gz,安装脚本现场编译,适合对版本有特殊要求的场景。我一般推荐 open-vm-tools,尤其是 Ubuntu 22.04 这类默认仓库已经带好的系统。
# Ubuntu/Debian 系安装 open-vm-tools;desktop 包提供拖拽和剪贴板协同 sudo apt update sudo apt install -y open-vm-tools open-vm-tools-desktop # 能输出版本号说明服务已经和宿主导通 vmware-toolbox-cmd -v第一条 apt update 不是多余动作,不少 Tools 装不上的案例,其实是仓库索引过期找不到包。第二行的 open-vm-tools 提供共享文件夹、网络时间同步,open-vm-tools-desktop 才带拖拽复制和剪贴板共享,桌面场景两个都要装。最后一行命令输出版本号,比如 11.x、12.x,说明客户机已收到宿主下发的能力。
如果走官方 tar 包,命令是这样:
# 挂载 VMware Tools 的虚拟光驱 sudo mkdir -p /mnt/cdrom sudo mount /dev/cdrom /mnt/cdrom tar xzf /mnt/cdrom/VMwareTools-*.tar.gz -C /tmp/ cd /tmp/vmware-tools-distrib/ # 用默认路径安装,避免交互式提问卡住自动化 sudo ./vmware-install.pl --defaultmount 后光驱如果被桌面自动挂载到 /media 也能用,解压到 /tmp 是为了避免普通用户目录权限问题。vmware-install.pl --default 会吃掉所有默认路径,跑完建议重启一次,让内核模块完整加载。
提示:open-vm-tools 和官方 VMware Tools 不要同时装,两套驱动的接管逻辑会互相覆盖,拖拽和共享目录反而都不通。
3.2 验证三处开关:设置、服务、会话
Tools 装完不代表万事大吉。拖拽复制有三个开关要同时打开,缺一个就表现为“装了等于没装”。第一处在虚拟机设置:虚拟机->设置->选项->客户机隔离,勾上启用拖放和启用复制粘贴,这一步重启后始终生效。第二处在客户机里,服务必须活着:
# 状态显示 active (running) 才算正常 systemctl status vmtoolsd第三处是图形会话。Ubuntu 22.04 默认用 Wayland,VMware Tools 的拖拽通道对 Wayland 支持有限,表现是拖进去光标转圈,松手没反应。解决办法是注销后切回 Xorg 会话,再重新登录。这个切换不需要改任何配置文件,也是我排查拖拽问题时的第一步操作。
3.3 共享文件夹挂载:路径、fuse 与权限
共享文件夹分两步。第一步在 VMware 界面里配置:虚拟机设置->选项->共享文件夹,勾选总是启用,添加一个宿主目录。强烈建议目录用纯英文、短路径,比如 D:\vm-share\workspace,别把整个 C 盘或桌面共享进来,一是权限范围难控制,二是路径里带中文容易出怪问题。
第二步在客户机里挂载。Linux 客户机装完 open-vm-tools 后大多会自动挂到 /mnt/hgfs,登录后直接 ls 验证。没自动挂载就手动执行:
sudo mkdir -p /mnt/hgfs/workspace sudo vmhgfs-fuse .host:/ /mnt/hgfs/workspace \ -o uid=1000,gid=1000,allow_other.host:/ 代表宿主的共享根目录,挂载后共享名会出现在目标目录下面;uid=1000,gid=1000 让普通用户能直接读写,省得每次临时改属主;allow_other 允许客户机里的其他用户也访问。uid 数值用 id -u 查,别照抄 1000,不同发行版普通用户 uid 不一定是 1000。
3.4 Windows 客户机与临时 HTTP 兜底
如果客户机本身就是 Windows,共享文件夹不需要敲命令,默认以网络路径形式存在。在运行框输入 \vmware-host\Shared Folders,就能看到所有共享目录;想在资源管理器里方便一点,就右键此电脑->映射网络驱动器,填入 \vmware-host\Shared Folders\workspace。注意这是 VMware 专用的 UNC 路径,不是传统的 \host\share。
共享文件夹一时配不通,又急着传一个 2GB 的安装包时,临时 HTTP 是最快兜底。宿主在要分享的目录里起服务:
# 在要分享的目录下执行,0.0.0.0 表示对所有网卡开放 python3 -m http.server 8000 --bind 0.0.0.0客户机拉取:
# 192.168.x.x 是宿主局域网 IP;NAT 模式下可以先看默认网关 curl -O http://192.168.x.x:8000/package.tar.gzWindows 宿主可能要用 python 而不是 python3,看安装时的环境变量。起服务前先在宿主浏览器访问 127.0.0.1:8000 确认可用,再让客户机拉;客户机连不上时先查宿主防火墙是否放行 8000 端口,再确认 NAT 模式下客户机的默认网关就是宿主虚拟网卡的 IP。
4. VirtualBox 互传:增强功能、vboxsf 挂载与镜像兜底
4.1 先装依赖,再装增强功能
VirtualBox 的互传和 VMware 长得像,细节却不同。虚拟机里要先装增强功能,它提供拖拽、共享文件夹、动态分辨率。问题在于增强功能要现场编译 vboxsf 内核模块,编译链不齐就很容易出现脚本运行完、模块却没生成的情况,表现为挂载时报错,这坑几乎每个 VirtualBox 用户都踩过。所以先把依赖装齐:
# linux-headers 版本必须匹配当前内核,这里用 uname -r 动态取 sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r)build-essential 提供 gcc 和 make,dkms 负责内核升级后自动重编 vboxsf 模块,linux-headers-$(uname -r) 则是编译目标,版本不匹配时 apt 会报错。装完后在虚拟机菜单点设备->安装增强功能,光驱里会出现 VBoxGuestAdditions.iso,挂载执行:
sudo mount /dev/cdrom /mnt # --nox11 跳过图形组件,无桌面环境也适用 sudo /mnt/VBoxLinuxAdditions.run --nox11 # 装完立刻验证模块是否真的编译出来 sudo modprobe vboxsf && lsmod | grep vboxsf--nox11 对最小化安装和服务器版很有用,桌面版不加也没事。脚本执行时间取决于虚拟机核数,跑完直接 modprobe vboxsf,能加载就说明模块正常;如果这里报 unknown symbol 或 modprobe 失败,回看脚本输出里的 ERROR 行,几乎都是内核头文件缺失。
4.2 固定分配共享文件夹与挂载命令
共享文件夹建议用固定分配,写在虚拟机配置里,重启还在;临时分配只对当前会话有效,重启后要重新配。窗口里操作:设备->共享文件夹->共享文件夹设置->添加,名称填英文,比如 webroot,路径选宿主目录,自动挂载勾上,不要勾只读分配。
Linux 客户机挂载:
sudo mkdir -p /mnt/webroot # 共享名必须和固定分配时填写的完全一致,大小写敏感 sudo mount -t vboxsf -o uid=1000,gid=1000,iocharset=utf8 webroot /mnt/webrootuid/gid 不写,挂载点归属 root,普通用户只能看不能写;iocharset=utf8 处理 Windows 传过来的中文文件名,Linux 端乱码基本都是漏了这个参数。如果希望开机自动挂载,写进 /etc/fstab:
webroot /mnt/webroot vboxsf defaults,nofail,uid=1000,gid=1000,iocharset=utf8 0 0nofail 是关键,模块没加载时系统不会因为找不到文件系统卡在启动流程,顶多挂载失败,不会把你锁在登录界面之外。
注意:固定分配的共享名一经创建就不建议改大小写,vboxsf 对共享名的大小写敏感,改名后要么删掉重建,要么同步改 fstab。
4.3 增强功能装不上的兜底:ISO 和网络
总有装不上增强功能的时候,比如 Kali 的最小化安装内核头文件很难对上,或者一个跑了几年的旧虚拟机只是临时传一次文件,不值得为它动内核。这时候最稳妥的兜底方案是 ISO 镜像:把文件打成 ISO,挂到光驱,客户机从光驱里拷出来。
# 把 /tmp/to-vm 目录打成 files.iso;-J 让 Windows 也能读长文件名,-R 保留权限 genisoimage -J -R -o /tmp/files.iso /tmp/to-vmWindows 宿主用软碟通类镜像工具,新建数据盘、拖文件、保存为 ISO 即可。然后在 VirtualBox 存储里把 ISO 挂到光驱,客户机 mount /dev/cdrom 就能看到全部文件。ISO 只读,这条路只能单向传,传完在存储设置里卸载镜像,免得每次启动都提示检测到新光盘。
如果连光驱都懒得动,就回到第 2.4 节的网络通道:客户机有 sshd,宿主直接 scp 推送。增强功能不是文件互传的必需品,它的价值只是让你少配网络、少敲命令;真到极限环境,网络和 ISO 永远兜底。
5. 互传实战避坑清单:五个踩过的坑与排查顺序
下面五条是我在本地与虚拟机互传这件事上踩过的真实坑,按排查优先级排序。每条都按现象、原因、解决的顺序写,遇到问题时先看现象找对应条目,再按解决步骤走,不要一上来就重装系统或恢复快照。
5.1 拖拽一直在转圈,文件就是进不来
现象:从 Windows 宿主把文件拖进 Ubuntu 22.04 虚拟机,光标变成十字,转十几秒后没反应;反过来从虚拟机拖到宿主也一样,小文件偶尔成功,传 PDF 和压缩包必卡。
原因:客户机图形会话跑在 Wayland 下,而虚拟机的拖拽通道走的是 X11 特有的拖放协议,Wayland 默认收紧剪贴板和拖放权限,辅助进程拿不到内容。另一种可能是只装了 open-vm-tools,漏了 open-vm-tools-desktop,拖拽组件没部署。
解决:先执行 echo $XDG_SESSION_TYPE 确认会话类型;是 wayland 就注销,在登录界面选择 Ubuntu on Xorg 重新登录。同时确认 open-vm-tools-desktop 已安装,再试拖拽。如果 VMware 提示无法连接到虚拟机,先看 vmtoolsd 服务在不在,而不是急着重装系统。这条我当年排查了两天,最后只是会话问题。
5.2 /mnt/hgfs 目录存在,但里面空荡荡
现象:共享文件夹已添加并设为总是启用,客户机 ls /mnt/hgfs 也有挂载点,但里面没有预期共享名,或者有共享名却访问不到内容。
原因:最常见是宿主的共享路径带了中文或空格,vmtoolsd 解析共享名时处理坏了;其次是共享名大小写不对,比如共享名是 Workspace,你用 /mnt/hgfs/workspace 去看;第三种是 vmtoolsd 用户态服务掉线,挂载缓存还是旧的。
解决:把宿主共享目录改成纯英文短路径,比如 D:\vm-share\workspace,删除原共享重新添加一次;客户机执行 systemctl restart vmtoolsd,再 ls /mnt/hgfs 看结果;还是不行的,手动用 vmhgfs-fuse 挂载,绕过默认自动挂载。Windows 宿主用户名如果是中文,桌面目录天然带中文,共享一定不要指到桌面。
5.3 大文件传一半卡死或校验不过
现象:传 8GB 的 ISO,拖拽进度条走到 60% 后不动,过一会报复制失败;或者两边都显示传完了,md5sum 一比对发现不一致。
原因:拖拽复制本质走的是窗口剪贴板通道,文件内容会被分段送进客户机,任意一段丢失就整体失败;VirtualBox 的拖拽在大文件上也不可靠。这不是虚拟系统坏了,是通道本身不适合大数据。
解决:超过 1GB 的文件直接放弃拖拽,用共享文件夹,它是文件系统级别的读写,不会丢段;或者宿主起 HTTP 服务,客户机 curl 拉取,拉完 md5sum 对比。血泪经验:传大文件后算一次校验值,比等到跑起来才发现文件损坏省事得多。
5.4 VirtualBox 挂载时报 wrong fs type, bad option, bad superblock
现象:mount -t vboxsf webroot /mnt/webroot 报错 wrong fs type, bad option, bad superblock on webroot,或者提示 Filesystem type vboxsf not configured in kernel。
原因:vboxsf 内核模块没编译进当前内核。常见两种:装增强功能前没装 dkms 和匹配的头文件,模块编译失败但脚本显示成功;或者虚拟机内核升级过,vboxsf 模块没跟上,lsmod 看不到它。
解决:先 lsmod | grep vboxsf 确认模块是否在,没有就装 build-essential、dkms、linux-headers-$(uname -r),重新挂载增强功能 ISO 再跑一次 VBoxLinuxAdditions.run,最后 modprobe vboxsf。注意重跑前用 uname -r 和 dpkg -l | grep linux-headers 对比版本,跨版本升级后最容易翻车。
5.5 Windows 客户机里看不到共享文件夹
现象:共享文件夹配置完,Windows 客户机的资源管理器里找不到盘符,网络位置也是空的,以为共享没生效。
原因:VMware 和 VirtualBox 在 Windows 客户机里都是以 UNC 网络路径暴露共享目录的,不是新盘符,也不是此电脑里的普通文件夹。还有人把 VirtualBox 共享建成了临时分配,Windows 客户机不会自动挂载,所以找不到。
解决:运行框直接输入 \vmware-host\Shared Folders(VMware)或 \vboxsvr\sharename(VirtualBox),能列出内容说明共享正常。想方便就右键映射网络驱动器,填这个路径。VirtualBox 用户把共享改成固定分配后重启客户机,Windows 会自动把它挂成可见的网络位置。排查顺序我一般固定为:先看配置,再看网络路径,最后才重装增强功能。
6. 进阶用法:不启动虚拟机,从虚拟磁盘里取出单文件
6.1 只读挂载 VMDK/VDI
多数时候我们要传的是整包文件,偶尔却有另一种需求:虚拟机死活起不来,或者不想为了拿一个配置文件启动整台系统,只想从虚拟磁盘里抠出 /etc/hosts、/var/log/syslog 这种小文件。Linux 宿主上 libguestfs 就能干这活,只读挂载,不碰原盘:
# -i 自动识别分区,--ro 只读,防止误写原盘 guestmount -i -a /path/to/Ubuntu20.vmdk --ro /mnt/vmdisk # 取完文件后一定要卸载,别留着挂载点 guestunmount /mnt/vmdisk如果是多文件 VMDK,-a 要指向主 vmdk;虚拟机有快照时磁盘状态链复杂,guestmount 可能识别不出来,这时候建议换用 guestfish 单条命令取文件:
guestfish -a Ubuntu20.vmdk --ro -i cat /etc/hostnameWindows 宿主更省事,7-Zip 可以直接打开 vmdk 和 vdi 文件,把它当压缩包浏览,右键提取单文件,零风险。这个技巧适合拿来做后悔药,别用来改写客户机里正在运行的磁盘。
6.2 传完文件之后的校验习惯
不管用拖拽、共享文件夹、HTTP 还是 ISO,文件到了客户机之后,我建议你在两头各算一次校验值。Linux 下是 md5sum 文件,Windows 下是 certutil -hashfile 文件 MD5,两个值一致再继续下一步。这个习惯看着笨,但在虚拟磁盘本身的读写异常没暴露之前,它总能帮你把文件损坏和系统故障区分开。
传文件这事我现在的习惯是:能走共享文件夹就不走拖拽,能走网络就不挂光驱,所有超过 1GB 的文件传完必算 md5。这个习惯帮我翻的车越来越少,也从一堆说不清的玄学问题里保住过不少现场。希望帮到你。
本文还有配套的精品资源,点击获取