ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Windows与VMware Ubuntu虚拟机文件共享方案详解

Windows与VMware Ubuntu虚拟机文件共享方案详解 本地win系统和vmware 虚拟机 ubuntu实现文件共享这事儿我前前后后在好几台机器上折腾过踩过的坑能写小半本笔记。先说结论如果你还在用U盘来回拷、靠微信传文件、或者每次都在虚拟机里开个网盘下载那这篇文章就是给你准备的。Windows宿主机和VMware里的Ubuntu虚拟机之间做文件共享本质就是把两个隔离的系统之间搬运数据这件事变得像操作本地文件夹一样自然。我见过不少朋友装了Ubuntu虚拟机却一直用低效方式传文件其实解决路径就那么几条搞清楚原理之后半小时就能搭好。这篇文章适合所有在Windows上跑VMware Workstation、里面装了Ubuntu虚拟机的朋友不管你是开发、测试还是单纯想体验Linux生态。我会把拖拽、共享文件夹、Samba、FTP这几条路线全部捋一遍重点讲共享文件夹方案的完整落地步骤和排错思路最后附上我个人长期使用下来的一些实践经验。1. 为什么要在Windows和Ubuntu虚拟机之间共享文件三个真实场景1.1 场景一代码开发的分工模式我是做后端开发的日常工作流很典型Windows上开着IDE写代码Ubuntu虚拟机里跑编译、跑测试、跑服务。为什么这么折腾因为很多依赖库在Linux下装起来省心编译参数、运行环境也更贴近生产服务器。但代码文件在Windows这边虚拟机那边需要同步读取。最早我图省事直接在虚拟机的Ubuntu里装了个Git仓库两边各自clone一份写完代码就push。但本地分支来回切、临时改文件、改完忘push这种事每天都要发生好几次。更崩溃的是有时候只是微调一个配置文件两边各改一遍内容漂移了都不知道。后来用了文件共享Windows这边改完保存Ubuntu里立刻能看到编译测试直接跑效率和准确率都上来了。1.2 场景二数据备份与迁移我有个习惯虚拟机里偶尔会下载一些较大的数据包、生成一些日志文件这些数据我不想一直堆在虚拟磁盘里——毕竟给虚拟机分配的磁盘空间是固定的Ubuntu里随便缓存几个G的数据宿主机磁盘就告急。有了共享文件夹之后我直接把Ubuntu里的下载目录、日志目录软链到共享目录宿主机Windows自动接管存储。虚拟机里跑完任务数据落地就直接在Windows磁盘上随时随地用Windows的工具去分析、去备份根本不需要再经历先拷出来、再清理虚拟机磁盘的流程。1.3 场景三跨平台工具链配合还有一个很常见的场景是跨平台工具配合。比如我在Windows上有一些图形化工具、批处理脚本Ubuntu里有一些命令行工具两边处理的数据是同一批。如果没有文件共享就得做两套数据拷贝路径不同、版本不同最后的比对工作让人头大。用共享文件夹把同一份数据放在一个物理位置Windows和Ubuntu看到的是同一份文件。这样两边工具处理的是完全一致的数据源排查问题的时候也不用纠结是不是拷错了版本。2. 方案选型拖拽、共享文件夹、Samba、HTTP各有各的命2.1 四种常见方案的优缺点对比我先放一张对比表这是我根据实际使用体验整理的。不同方案适合不同场景不存在绝对好坏就看你的使用习惯和网络条件。方案传输方式适合场景优点缺点拖拽复制VMware Tools自带VMware虚拟通道小文件、临时传输零配置、直观大文件容易卡顿传输速度和稳定性一般共享文件夹vmhgfs-fuse虚拟机服务日常开发、频繁读写速度快、双向实时、Windows和Ubuntu都能直接访问需要装VMware Tools或open-vm-tools偶尔有权限和挂载问题Samba/SMB网络共享多设备、跨主机、长期稳定共享不依赖VMware局域网内其他机器也能访问配置稍复杂性能和宿主机磁盘IO有关FTP/HTTP服务网络传输单向传输、向外部提供文件通用性强、无需安装客户端单向操作居多实时协作场景不灵活2.2 为什么默认推荐共享文件夹如果只让我给一个最实用的选择日常开发场景我首选共享文件夹。原因有三。第一速度和实时性极佳。共享文件夹走的是VMware虚拟机与宿主机之间的虚拟通道数据吞吐比拖拽高一个量级而且读写是双向的Windows里写进去Ubuntu里马上看到Linux缓存同步机制基本无感。第二操作体验最接近本地目录。挂载之后在Ubuntu文件管理器里你能直接看到Windows的盘符和路径IDE的打开文件夹、Git的仓库路径、编译脚本的输出路径全部可以指向共享目录。开发过程中的路径问题少了很多。第三不依赖额外网络服务。Samba和FTP本质上是网络协议涉及IP、端口、防火墙、认证。共享文件夹是虚拟机层面的机制只要VMware Tools正常工作基本不操心网络干扰。2.3 什么情况下你应该改用Samba或FTP共享文件夹也有力所不逮的时候。如果你的Ubuntu虚拟机不止跑在本机VMware上还要被局域网里的其他Windows、Mac、甚至手机访问那就得考虑Samba。Samba把共享目录变成一个标准的SMB网络位置任何支持SMB协议的操作系统都能访问。FTP则更适合单向分发场景比如虚拟机里生成了一批文件需要让其他同事批量下载这时候起一个FTP服务给个用户密码访问方式一目了然也不涉及到复杂的权限配置。还有一个场景是宿主机的磁盘分区在Windows里被加密或锁定了部分VMware环境访问这类分区会有障碍此时Samba的灵活性和通用性反而更好。3. VMware Tools和共享文件夹的完整配置实操3.1 环境准备确认VMware和Ubuntu版本我用的环境是Windows 11宿主机 VMware Workstation 17 Pro Ubuntu 22.04 LTS。这个组合在共享文件夹支持上没有任何问题旧版本例如VMware 15/16和Ubuntu 18/20也基本通用只是界面文字略有差异。写这篇内容之前我特意去看了下VMware官方文档当前Workstation Pro已经免费提供给个人用户使用安装包在官网直接下载就行。安装的时候一路Next注意勾选增强型虚拟键盘这个选项对Linux虚拟机键盘输入体验有帮助。Ubuntu虚拟机建议至少分配2GB内存磁盘预留20GB以上——共享文件夹本身不占虚拟机磁盘空间但系统运行和软件安装需要空间。3.2 安装open-vm-tools共享文件夹的地基共享文件夹依赖虚拟机的Tools服务。VMware Workstation支持两种方式官方VMware Tools和开源版open-vm-tools。我强烈建议使用open-vm-tools理由很直接官方VMware Tools在Ubuntu新版本上经常出现内核模块编译失败、版本不匹配等问题而open-vm-tools直接由Ubuntu软件源维护兼容性最稳。打开Ubuntu终端执行sudo apt update sudo apt install open-vm-tools open-vm-tools-desktop安装完成后建议重启一次虚拟机或者执行sudo systemctl restart vmtoolsd验证Tools是否正常工作vmware-toolbox-cmd -v能看到版本号输出就说明Tools服务正常。装好之后拖拽复制功能立即可用但共享文件夹还需要在VMware界面里配置。3.3 配置共享文件夹宿主机和虚拟机的设置这一步需要在VMware Workstation界面操作。确保虚拟机处于开机但未启动状态时配置也可以但我推荐先打开虚拟机电源配置完再重新启动虚拟机里面的Ubuntu系统这样挂载更干净。操作流程选中你的Ubuntu虚拟机点击菜单栏虚拟机VM - 设置Settings。切换到选项Options标签页在左侧找到共享文件夹Shared Folders。右侧选择总是启用Always enabled。点击添加Add向导会一步步让你选宿主机上的文件夹路径比如我在Windows上建了一个 D:\VMShare。给这个共享起个名字例如VMShare注意这个名字会直接成为Ubuntu里的挂载点名称的一部分。勾选启用此共享Enable this share完成。这里有额外一步非常关键确保虚拟机的硬件Hardware标签里CD/DVD设备没有占用VMware Tools的ISO文件。如果之前你手动挂载了linux.iso建议移除这个虚拟光驱设备否则某些版本会出现open-vm-tools和ISO版本冲突的异常。3.4 在Ubuntu里挂载共享文件夹配置完成后回到Ubuntu系统。手动挂载最简单的方式是执行sudo mkdir -p /mnt/hgfs/VMShare sudo vmhgfs-fuse .host:/VMShare /mnt/hgfs/VMShare -o allow_other -o uid1000解释一下这条命令的每个部分.host:/VMShare里的VMShare必须和你在VMware里起的共享名完全一致大小写敏感。/mnt/hgfs/VMShare是Ubuntu里的挂载点目录你可以自定义路径但/ mnt/hgfs是约定俗成的目录。-o allow_other允许其他用户访问避免权限问题。-o uid1000把挂载点所有者指定为uid 1000在Ubuntu里这通常是你的第一个用户。如果手动挂载成功在/mnt/hgfs/VMShare目录里应该能看到宿主机D:\VMShare文件夹下的内容。在Windows那边往这个目录里放文件Ubuntu里立刻就能看到反过来也一样。3.5 配置开机自动挂载避免每次重启后重新执行手动挂载有个痛点虚拟机重启之后挂载会丢失每次都要执行一遍命令。解决方案是把挂载命令写入开机启动服务。我采用的方式是创建一个systemd服务。新建一个文件sudo nano /etc/systemd/system/vmhgfs-share.service内容如下[Unit] DescriptionMount VMware Shared Folders Afternetwork.target vmtoolsd.service [Service] Typeoneshot RemainAfterExityes ExecStart/usr/bin/vmhgfs-fuse .host:/VMShare /mnt/hgfs/VMShare -o allow_other -o uid1000 [Install] WantedBymulti-user.target保存后执行sudo systemctl enable vmhgfs-share.service sudo systemctl start vmhgfs-share.service这样每次启动Ubuntu共享文件夹都会自动挂载到指定位置。我在实际使用中测试过重启多次都能稳定挂载。3.6 配置自动挂载的第二个方案fstab还有一个备选方案是写入/etc/fstab但我的经验是这个方案在部分内核版本上会因为挂载时机、fuse加载顺序而出问题所以我不太推荐。如果你喜欢fstab方式可以在/etc/fstab末尾加一行.host:/VMShare /mnt/hgfs/VMShare fuse.vmhgfs-fuse allow_other,uid1000 0 0但要注意fstab方式如果出现挂载失败系统可能会在启动时报错甚至卡住建议对fstab不熟的朋友直接用systemd方案容错性更强。4. 实测中的坑权限、挂载丢失和文件锁我一个个踩给你看4.1 权限问题明明能看到文件却写不进去这是我最初遇到的头号问题。共享目录挂载后ls 能看到Windows那边的文件但想创建新文件或者修改内容直接报 Permission denied。排查方法很简单先用id命令查看当前用户的uid和gidid如果当前用户不是uid 1000那就在挂载命令里用你自己的uid覆盖sudo vmhgfs-fuse .host:/VMShare /mnt/hgfs/VMShare -o allow_other -o uid$(id -u) -o gid$(id -g)问题往往就出在这里open-vm-tools 默认把共享目录的所有者分配为root或某个固定uid而你的日常用户没有写权限。加上uid参数明确指定归属后基本能解决。另外如果Windows那边的文件夹本身开了只读属性Ubuntu这边无论如何也写不进去。Windows文件夹右键 - 属性去掉只读勾选再刷新挂载。4.2 挂载丢失重启后目录空空如也这个问题在手动挂载时代几乎每次重启都遇到。挂载点还在但里面是空的或者干脆提示 Transport endpoint is not connected。原因通常是vmtoolsd服务启动顺序和挂载命令不一致。我遇到过好几次系统启动到一半vmtoolsd还没完全就绪挂载命令已经执行了结果挂载失败。解决办法就是把挂载过程交给systemd服务并且给vmtoolsd加个依赖Afternetwork.target vmtoolsd.service这样能确保虚拟机工具服务先起来再执行挂载。如果你的机器上vmtoolsd服务名不是这个可以先查一下systemctl list-units | grep vmtools实际服务名带上vmtoolsd.service或open-vm-tools.service的变体然后调整After后面的名字。4.3 文件锁和并发写入问题共享文件夹的同步机制有时对文件锁的处理不太成熟。我在Windows上用VS Code编辑一个文件Ubuntu里同时用另一个编辑器打开同一个文件两边各自保存就会出现文件内容互相覆盖的情况。这个问题无解吗其实不算无解只是需要你养成好的习惯同一时间只在一端编辑同一个文件。如果非要多端协作建议用Git做版本管理而不是把共享文件夹当成多人编辑的实时同步工具。另外要注意一些数据库和应用在共享目录上直接读写会有问题因为虚拟文件系统对文件锁的支持有局限。遇到数据库文件放在共享目录导致启动失败的情况把数据迁到虚拟机本地磁盘只把导出的备份放到共享目录里。4.4 中文文件名乱码问题之前帮朋友排查过Windows那边的中文文件名在Ubuntu共享目录里显示为乱码。这是因为挂载时缺少编码参数。解决方式是在挂载命令里加上字符集参数sudo vmhgfs-fuse .host:/VMShare /mnt/hgfs/VMShare -o allow_other -o uid$(id -u) -o iocharsetutf8加上 iocharsetutf8 后中文文件名基本就能正常显示了。如果你用的还是旧的CIFS/Samba方案对应参数是iocharsetutf8或者codepagecp936位置类似。4.5 VMware配置里的共享文件夹选项灰色无法勾选还有一个很隐蔽的坑VMware里的共享文件夹配置是灰色的无法启用。遇到这种情况先确认虚拟机是否处于运行状态。VMware允许在虚拟机运行时修改共享文件夹设置但如果当前虚拟机被暂停或挂起部分选项会被禁用。如果确认运行中还是灰色检查虚拟机类型和VMware Tools状态。右键虚拟机标签 - 查看VMware Tools状态如果显示未安装或已过期那就回到第3.2节先把open-vm-tools装好。还有一种极端情况虚拟机使用的硬件兼容性版本过旧比如兼容VMware 10.x时代的虚拟机在VMware 17里打开时共享文件夹选项会异常。这种可以先尝试升级虚拟机硬件版本路径是虚拟机菜单 - VMware Tools安装/更新旁边会有升级虚拟机硬件执行后再看。5. 备用方案Samba和FTP的正确打开方式5.1 Samba让局域网里的所有设备都能访问你的共享共享文件夹方案的高手进阶版就是在Ubuntu虚拟机里装Samba把Windows宿主机文件夹通过SMB协议共享出去。这样不仅Windows宿主机能用局域网里其他设备也能访问。安装Sambasudo apt update sudo apt install samba然后编辑配置文件sudo nano /etc/samba/smb.conf在文件末尾添加共享段[share] path /mnt/hgfs/VMShare browseable yes read only no guest ok no create mask 0644 directory mask 0755 valid users your_username这里的path指向你挂载的共享目录也可以指向虚拟机本地任意目录。设置Samba用户密码sudo smbpasswd -a your_username重启服务sudo systemctl restart smbd在Windows上打开资源管理器地址栏输入\\虚拟机IP\share比如\\192.168.x.x\share输入账号密码就能访问。5.2 Samba踩坑记录防火墙和SELinuxSamba踩过的坑主要是防火墙。Ubuntu默认防火墙可能阻止SMB端口137-139445如果Windows访问超时执行sudo ufw allow samba sudo ufw reload如果Ubuntu里装了SELinux默认没有但你从某些定制版镜像装的话可能有需要放行Samba相关上下文sudo setsebool -P samba_enable_home_dirs on sudo setsebool -P use_samba_home_dirs on这一步我在排查时卡了十几分钟因为是同事的机器装的是CentOS风格的Ubuntu定制版SELinux是强制模式。正常情况下Ubuntu的AppArmor相对温和不太会拦Samba。5.3 FTP单向分发文件时的轻量选择FTP适合的场景是批量分发尤其是虚拟机里跑批处理生成了大量日志、导出文件需要一次性拷走。装个vsftpd配置简单直接sudo apt install vsftpd sudo nano /etc/vsftpd.conf关键配置项anonymous_enableNO local_enableYES write_enableYES local_umask022 chroot_local_userYES其中 chroot_local_userYES 表示把用户限制在自家目录增强安全性。重启服务sudo systemctl restart vsftpdWindows端直接用文件资源管理器地址栏输入ftp://虚拟机IP或者用FileZilla等客户端输入账号密码即可连接。注意FTP是明文协议密码和数据都不加密只能在可信局域网里用。如果涉及公网传输建议换成SFTPSSH文件传输协议sudo apt install openssh-server然后使用支持SFTP的客户端连接sftp://虚拟机IP数据加密、密码安全配置成本几乎为零。5.4 什么时候不要用共享文件夹直接上Git或网盘最后说说什么时候共享文件夹反而碍事。如果你在两个系统间传递的是代码仓库那我强烈建议用Git共享文件夹里多个副本的Git仓库维护成本极高分支状态容易混乱而且Git的软链接、权限元数据在共享文件系统上偶尔会有奇怪表现。如果是大体量、非频繁访问的归档文件用网盘同步工具比如Nextcloud、Syncthing反而省心。共享文件夹在网络断连或虚拟机挂起时文件状态可能不一致而专门的同步工具会记录版本和冲突。说到底共享文件夹是操作系统的文件系统级同步它解决的是日常读写问题不是万能的文件分发平台。搞清楚边界用起来才顺手。6. 从固定IP到Nginx多域名共享文件夹场景下的进阶搭配6.1 设置固定的虚拟机IP让宿主机稳定访问如果你打算长期使用Samba、FTP、SSH这些网络服务就应该给虚拟机配置固定IP而不是依赖DHCP随机分配的地址。DHCP的问题在于虚拟机重启后IP可能变化Windows里的连接地址就要跟着改很烦。在Ubuntu 22.04上我用netplan配置静态IP。编辑配置文件sudo nano /etc/netplan/01-network-manager-all.yaml内容示例network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: no addresses: - 192.168.226.150/24 routes: - to: default via: 192.168.226.2 nameservers: addresses: - 223.5.5.5 - 114.114.114.114注意这里的网卡名、网关地址要和你VMware的网络模式匹配。我用的是NAT模式网关通常是VMware虚拟网卡VMnet8的地址比如192.168.226.2。改成桥接模式的话网关就是你局域网的真实网关。配置好之后执行sudo netplan apply如果提示找不到配置文件先执行ls /etc/netplan/看看实际文件名不同版本可能叫00-installer-config.yaml。6.2 共享目录与Nginx多站点开发环境的配合聊到Nginx是因为我见过不少同行在虚拟机里搭本地开发环境把共享目录直接作为Nginx的站点根目录。这样Windows上改代码Nginx直接跑新内容省去部署流程。配置方法就是在Nginx的server块里把 root 指向共享目录server { listen 80; server_name local.test; root /mnt/hgfs/VMShare/www/site1; index index.html index.php; }然后在Windows的C:\Windows\System32\drivers\etc\hosts文件里加一行192.168.226.150 local.test这样浏览器输入http://local.test就能直接访问到共享目录里的网站。好处是代码改动即时生效坏处是如果共享目录里有大量小文件Nginx的静态文件IO性能会比本地磁盘略低因为每次IO都经过fuse层。面对大量小文件的场景我一般把静态资源放在虚拟机本地目录只在共享目录里保留源代码和配置文字类文件。6.3 虚拟磁盘扩容和快照的配合使用最后提一个共享文件夹与虚拟磁盘配合的经验。共享文件夹解决了日常数据放宿主机的问题但虚拟机的系统盘、软件安装目录还是需要足够的空间。如果发现Ubuntu根目录空间不足在VMware里给虚拟磁盘扩容关闭虚拟机电源。虚拟机设置 - 硬盘 - 磁盘工具 - 扩展。调整到需要的容量。重新启动Ubuntu。在Ubuntu里扩展分区和文件系统sudo parted /dev/sda resizepart 2 100% sudo resize2fs /dev/sda2具体分区号和文件系统类型要先看lsblk和df -h来确认不同Ubuntu版本分区方案有差异别直接复制命令。配合共享文件夹虚拟机本地磁盘只放系统和软件重要数据走共享目录扩容需求就会小很多。快照功能适合在重要变更前打一个点万一改坏了能快速回滚这个我每次配置完都会做。7. 我用了半年共享文件夹之后的一些体会从最初忍受U盘拷来拷去到后来配置好共享文件夹再到现在Samba、共享文件夹两套方案并行这个过程大概花了一下午。回头总结经验核心就一句话先想清楚你的文件是做日常读写、跨设备访问还是单向分发再选方案不要一上来就埋头敲命令。共享文件夹对VMware Ubuntu的组合来说是最省心的方案。open-vm-tools装好、挂载命令写对、systemd服务做持久化剩下的就是每天无感地两侧互访。Samba适合那些需要多设备访问同一份文件的场景搭配固定IP之后体验也很顺畅。FTP/SFTP则留给临时分发任务用完即止。最后分享一个小技巧。如果你经常在两个系统间传递文件可以在Windows的共享目录里建立一个incoming和outgoing文件夹一个放从Ubuntu拷回来的文件一个放准备给Ubuntu的文件。分类清晰之后找文件省了很多事也避免了共享目录变成垃圾桶。文件共享这件事配置不难难的是习惯的养成。希望这篇内容能让你少走点弯路早点从拷贝文件的苦海里解脱出来。
返回列表