用 VirtualBox 跑 Ubuntu 虚拟机干活的人,应该都有过这种抓狂时刻:宿主机里明明放着现成的安装包、配置文件、资料压缩包,虚拟机里却拿不到,要么开 U 盘拷贝,要么临时搭个本地服务,搞个文件还得绕一大圈。我在实际使用中踩了各种坑之后,把 VirtualBox 虚拟机里设置 Ubuntu 共享文件夹这件事彻底理顺了,整个过程拆开看其实就三件事:装增强功能、设置共享目录、挂载权限收尾。这篇就把每一步的来龙去脉、操作细节和常见坑全部摆出来,手把手帮你把宿主机和 Ubuntu 虚拟机之间的文件通道直接打通。
要说清楚“共享文件夹”,得先明白 VirtualBox 这套机制的原理:它不是网络共享,也不是单独再开一个虚拟硬盘,而是靠 VirtualBox 的增强功能(Guest Additions)在宿主机和虚拟机之间架起一座“桥”,让 Ubuntu 能直接把宿主机里某个真实目录当作本地文件夹来访问。所以整个流程的关键,是先把这个“桥”搭稳了,再去配置目录,最后处理访问权限。下面按我的实操顺序一步步讲。
1. 整体思路与方案选型:为什么共享文件夹非得靠增强功能
1.1 共享文件夹解决了什么痛点
开发测试、跨平台编译、文档整理,这几个场景基本是虚拟机的“主战场”。比如我在宿主机 Windows 上写脚本,想放到 Ubuntu 里跑一遍,或者反过来,Ubuntu 里生成了一份报表想拷到宿主机上交档。如果没有共享文件夹,最常见做法是:开个网盘、发邮件给自己、U 盘来回插,或者临时起一个 HTTP 服务下载。这些办法不是不能用,但都有一个通病:效率低,而且同步不及时。文件改动一次,就得重新传一次,来回折腾的时间累积起来相当可观。
共享文件夹等于给宿主机和虚拟机开了一条“直连通道”,目录在宿主机上,虚拟机里直接访问,同一份文件两边同时看到,修改后立即可见,不用拷贝,也不用同步。这条通道走的是 VirtualBox 实现的高效文件共享机制,读写速度远超想象,日常的文本编辑、拷贝安装包、传输代码几乎感觉不到损耗。对需要频繁在两套系统之间交换文件的人来说,这功能属于“没它不干活”的基础配置。
1.2 为什么必须先安装增强功能
很多人第一次设共享文件夹时,直接在 VirtualBox 的“设置-共享文件夹”里把宿主机目录加进去了,然后进 Ubuntu 一看,啥也没有。这就是没装增强功能的典型症状。增强功能(Guest Additions)是 VirtualBox 为用户虚拟机准备的一套驱动与系统组件合集,里面包含显卡驱动、鼠标指针集成、剪贴板共享、拖放支持,以及最重要的共享文件夹驱动模块 vboxsf。
说白了,共享文件夹不是一个“纯软件设置”,它需要虚拟机系统里有一个内核模块来识别 VirtualBox 的共享文件系统格式。这个模块就是由增强功能安装进去的。没有它,宿主机的共享目录即使配置好了,Ubuntu 启动后也找不到入口,更谈不上挂载。所以任何跳过这步的尝试都会卡在同一个地方:目录配了,却看不见、挂不上。
另外顺手一提,装好增强功能之后还有附带收益:Ubuntu 的屏幕分辨率能自动适配虚拟机窗口,不用再忍受默认的 800x600,鼠标进出虚拟机也不用按 Host 键释放,这些体验提升叠加在一起,说明增强功能属于“一次性投入、长期受益”的基础设施。
1.3 方案对比:为什么不用 Samba、NFS 或网络驱动器
除了增强功能,宿主机和虚拟机之间传文件还能走 Samba 网络共享或 NFS,这也是一种思路。但从实用角度讲,我不推荐作为主力方案。原因有几条:
- 配置复杂度高:Samba 要在宿主机上装服务端、开防火墙端口、配用户认证,NFS 在 Windows 宿主机上支持也很别扭。
- 性能和稳定性差一个等级:走网络协议栈转发,小文件传输延迟明显,大量小文件场景容易卡顿。
- 依赖 IP 地址:虚拟机网络模式一变(比如从 NAT 切成桥接),IP 变了共享就断,还得重新配。
- 增强功能方案是零网络依赖:走 VirtualBox 自己的虚拟通道,不占局域网带宽,也不受网络模式影响。
所以在 VirtualBox 这个特定环境里,用增强功能自带的共享文件夹机制,是性价比最高、最稳的选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与增强功能安装实战
2.1 安装前的系统状态检查
在动手装增强功能之前,我建议先花一分钟确认三件事,不然中途容易翻车:
- Ubuntu 系统已更新到较新状态。老内核搭配新版本 VirtualBox 的增强功能,偶尔会出现编译失败的情况,所以进入 Ubuntu 后先跑一次更新比较稳妥。
- 虚拟机网络能连上外网。安装增强功能时需要编译内核模块,可能需要临时下载依赖包,没网络就得先从宿主机传包进去,绕一圈很麻烦。
- 磁盘空间够用。增强功能编译安装时会占用几百 MB 空间,空间太满会导致安装中断。
确认完这三点,打开 Ubuntu 虚拟机,登录进桌面,准备开始。
2.2 安装增强功能的标准流程
在 VirtualBox 的窗口菜单栏里找到“设备”菜单,点击“安装增强功能…”,VirtualBox 会加载一个虚拟光驱镜像(VBoxGuestAdditions.iso),Ubuntu 桌面上通常会自动弹出这个光驱。如果没弹出来,也可以手动在文件管理器里找到它。
紧接着打开终端,按下面几步操作:
bash复制# 查看光驱设备名并挂载(一般会自动挂载,若没有则手动挂载)
lsblk
sudo mkdir -p /media/cdrom
sudo mount /dev/sr0 /media/cdrom
挂载好之后,切换到光驱目录,运行安装脚本:
bash复制cd /media/cdrom
sudo ./VBoxLinuxAdditions.run
执行过程中,终端会输出一堆编译信息,正常情况下最后会显示类似 Building the VirtualBox Guest Additions kernel modules 和 Successfully installed 的提示。这里我额外提醒一句:如果宿主机 VirtualBox 版本比较新,而 Ubuntu 内核也刚更新过,编译过程会稍慢,属正常现象,不要因为屏幕长时间不动就强行终止进程。
看到成功提示后,执行重启:
bash复制sudo reboot
2.3 安装失败的高频原因与应对
增强功能安装失败,我身边的朋友踩过的坑集中在下面几类,一个个说清楚:
- 缺少编译工具链和内核头文件。增强功能的内核模块需要本地编译,Ubuntu 默认不带完整 build-essential 与 linux-headers。解决办法是安装前手动装好:
bash复制sudo apt update
sudo apt install -y build-essential linux-headers-$(uname -r)
- 报错提示
Unable to find the sources of your current Linux kernel。这就是内核头文件缺失的典型信号,装上对应版本头文件后重试即可。 - 安装时提示没有权限或者脚本执行不了。检查是否用了
sudo,以及光驱挂载目录是否有执行权限。有些精简版系统会把/media挂载参数写得很严格,建议直接手动挂载到自定义目录再执行。 - 增强功能版本和 VirtualBox 版本不匹配。例如用老 ISO 配新版 VirtualBox。最稳妥的做法是 VirtualBox 菜单里自动挂载的 ISO 一定是配套版本,不要图省事去网上单独下载增强功能包。
安装成功后的验证方式也简单:重启后在终端执行 lsmod | grep vboxsf,能出现一行类似 vboxsf 24576 2 的输出,就说明共享文件夹内核模块已经加载上了。做到这一步,等于桥墩已经打稳。
3. 共享文件夹的配置方法与参数详解
3.1 图形界面配置步骤
增强功能装好并重启后,就可以正式配置共享目录了。这一步可以在虚拟机开机状态下做,也可以先关机在 VirtualBox 主管理器里做。运行中的虚拟机会更方便,因为不用来回切换。
在虚拟机窗口的菜单栏选择“设备 – 共享文件夹 – 共享文件夹设置…”,或者在 VirtualBox 主管理器选中虚拟机后点击“设置 – 共享文件夹”,两种入口指向的是同一个配置界面。然后在弹窗右侧点“添加共享文件夹”按钮(一个带加号的小图标),就会弹出一个配置表单。
表单里的关键字段如下:
- “文件夹路径”:点下拉框旁边的浏览按钮,在宿主机文件系统里选中想要共享的真实目录。
- “文件夹名称”:VirtualBox 会依据所选路径自动填一个名字,这个名字是 Ubuntu 里识别共享目录的代号,建议改成纯英文小写加下划线,比如
share_code,后面挂载时会用到。 - “自动挂载”:勾选后,Ubuntu 启动时会自动把该共享目录挂载到
/media/sf_+ 文件夹名称 的位置,我建议默认勾上,省去手动挂载的麻烦。 - “只读分配”:这个选项慎勾。勾了之后 Ubuntu 对共享目录只有读权限,无法通过虚拟机向里面写文件。如果只是单方向传递文件,勾选能防止误删宿主机的文件;但如果要双向编辑,就得保持不勾选。
配置完点击“确定”,在 VirtualBox 界面里就能看到新增的共享目录列表了。
3.2 命令行配置方式(适合批量操作)
如果平时习惯用命令行管理 VirtualBox,或者需要在一台宿主机上给多个虚拟机配置重复的共享目录,可以用 VBoxManage 命令来做。先切换到 VirtualBox 安装目录,然后执行:
bash复制VBoxManage sharedfolder add "虚拟机名称" --name "share_code" --hostpath "D:\share_dir" --automount --transient
参数分别对应图形界面里的各项设置:--name 是共享名称,--hostpath 是宿主机真实目录路径,--automount 表示自动挂载。去掉 --transient 则会写进虚拟机的持久配置里,关机重启后依然有效。我建议没特殊需求的话,直接走图形界面就行,命令行用的场景更多是批量部署或在脚本里自动配置。
3.3 共享目录的命名与目录结构规划
命名和目录规划这个细节很多人不在意,实际用起来差别很大。我自己的经验是:共享目录不要直接拿宿主机整个盘或者“桌面”这种大而杂的路径来做。最合理的做法是,在宿主机建一个专门的共享总目录,比如 /home/用户名/shared(Windows 上就是如 D:\shared),然后在下面按用途分子目录,借给不同虚拟机。这样既能避免虚拟机误读宿主机其他隐私文件,也让共享目标非常清晰。
共享名称尽量保持简单。后续挂载命令和自动挂载脚本里会多次引用这个名称,太复杂的名字容易打错,最好控制在 20 个字符以内。
4. 在 Ubuntu 中挂载共享目录并解决权限问题
4.1 手动挂载与开机自动挂载
先看手动挂载。如果之前没有勾选“自动挂载”,或者挂载因为某种原因没生效,可以打开终端手动挂载:
bash复制sudo mkdir -p /mnt/share_code
sudo mount -t vboxsf share_code /mnt/share_code
这个命令里的 -t vboxsf 就是告诉系统使用 VirtualBox 共享文件夹文件系统。执行完没有任何报错就代表挂载成功了,进入 /mnt/share_code 就能看到宿主机的文件。若执行时报错 mount: unknown filesystem type 'vboxsf',那说明增强功能的内核模块没正确加载,需要回到第 2 章重新检查安装过程。
如果想要开机自动挂载,在 /etc/fstab 文件里加一行即可。不过这里有一个需要注意的细节:fstab 的配置格式和时机容易出错,我建议先手动挂载验证没问题后再写进 fstab。打开 fstab:
bash复制sudo nano /etc/fstab
在文件末尾追加:
code复制share_code /mnt/share_code vboxsf defaults,rw,uid=1000,gid=1000 0 0
注意这里 uid=1000, gid=1000 要换成你自己 Ubuntu 登录用户的 UID 和 GID,默认第一个创建的用户一般是 1000,用 id 命令可以确认。加上 UID/GID 参数的好处是挂载后目录归属直接对应当前用户,访问起来不会有权限坑。写好后保存退出,执行 sudo mount -a 测试 fstab 是否配置正确,没报错就说明没问题。
4.2 用户权限问题的解决思路
权限问题可能是共享文件夹使用中最让人头疼的一环,值得单独说透。初次配置共享目录,进入 /media/sf_share_code(自动挂载的位置)时,经常会看到目录属性显示 drwxrws---,所有者是 root 或 vboxsf 组,而当前用户根本不在那个组里,于是打不开目录或者无法读写文件。
常规解法是把当前用户加入 vboxsf 组。这也是官方推荐的姿势,因为自动挂载创建的挂载点默认属于该组,组成员就能获得访问权。执行:
bash复制sudo usermod -aG vboxsf $USER
然后注销重新登录,或者重启虚拟机。之后再用 ls -l 查看挂载目录时,就发现当前用户已经有了读写的权利。如果你用的不是自动挂载而是手动挂载 /mnt/share_code,除了加组之外,还可以在 mount 命令里直接指定所有者参数,更省事一些:
bash复制sudo mount -t vboxsf -o uid=1000,gid=1000,rw share_code /mnt/share_code
这两种方式的区别在于:加组的方式对所有按默认方式挂载的共享目录都有效,一劳永逸;指定 UID/GID 的方式则只针对单次挂载,更灵活但需要每次配置。我个人的做法是两者结合,自动挂载共享目录时装好 vboxsf 组,手动挂载时用参数方式指定当前用户,两手准备,基本不会再遇到权限报错。
4.3 锁文件与写权限的额外排查
如果配置了双向读写(没有勾选只读),但在 Ubuntu 里往共享目录写入文件时提示 Permission denied,而用户明明已经在 vboxsf 组里,此时要检查两个点:
第一,宿主机上共享目录对应的真实路径,其 NTFS 或 exFAT 分区权限是否允许当前用户写入。Windows 系统里,如果宿主机用户没有对该目录的写权限,虚拟机里无论如何授权都白搭,这是链路最外层的一道闸。
第二,某些高性能场景下共享目录里会出现 .lock 文件无法删除的情况,一般是因为某个进程占用。解决方法是先关闭占用进程,再删除锁文件,切忌用 sudo rm -rf 硬删,容易造成数据不一致。
5. 常用配置速查与问题定位技巧
5.1 一次搞定共享文件夹的配置清单
为了方便新环境快速配置,我把完整流程整理成清单,照着做基本不会漏步骤:
| 步骤 | 操作 | 验证方式 |
|---|---|---|
| 1 | 安装 Ubuntu 必要依赖 | 编译安装时不报缺包 |
| 2 | 运行增强功能安装脚本 | 重启后 lsmod | grep vboxsf 有输出 |
| 3 | 在 VirtualBox 中添加共享目录 | 配置列表出现目标记录 |
| 4 | 勾选自动挂载并确认共享名称 | 重启后 /media/sf_ 目录存在 |
| 5 | 将用户加入 vboxsf 组 | groups 显示 vboxsf |
| 6 | 测试读写文件 | 宿主机与虚拟机均可见修改 |
按这个清单顺序执行,我还没遇到过卡住的情况。
5.2 重启后共享目录消失的排查思路
重启过之后发现 /media/sf_share_code 路径里是空的,或者干脆没有这个挂载点,可以从三个方向依次排查:
- 确认 VirtualBox 里的共享目录配置还在不在。有时候用户误点“临时共享”选项,配置没写进持久设置,重启自然就丢了。重新打开 VirtualBox 的设置页查看。
- 检查自动挂载是否真的勾选。如果只是设置了共享目录但没勾“自动挂载”,重启后不会主动挂载,得手动挂载。
- 查看 fstab 是否正确配置了自动挂载。如果之前是通过 fstab 实现的自动挂载,重启后挂载失败,多数是路径或 UUID 写错。执行
dmesg | grep -i mount或sudo mount -a能看到具体报错原因。
5.3 找不到共享目录但驱动已加载的处理记录
有一个比较隐蔽的情况我是在实际排查中遇到的:lsmod | grep vboxsf 显示内核模块已加载,但 Ubuntu 里就是看不到任何共享目录。当时我的第一反应是配置没生效,反复重新添加了几遍共享目录都没有。后来发现,问题不在 VirtualBox 这边,而是 Ubuntu 的 systemd 在启动时因为载入顺序问题,没有执行到自动挂载逻辑。
处理办法非常简单:重新执行一次 sudo mount -a,共享目录立刻就出现了。为了从根本上解决,我把共享目录的自动挂载从 VirtualBox 的“自动挂载”改成了 fstab 方式,并配置了 _netdev 选项,让 systemd 等待网络设备就绪后再挂载,后续重启没有再丢过。这个案例值得记下来,因为系统日志里往往没有明确的错误提示,只看表面会觉得“系统器质性故障”,实际就是个启动顺序的小问题。
5.4 高速大文件读写的额外调优
如果共享目录用来存放比较大的文件或者代码仓库,传输速度会成为体验瓶颈。默认配置下共享目录的读写性能能满足一般办公需求,但遇到几千个小文件或单个几十 GB 级别的数据,性能就会明显下降。这时候可以尝试调整挂载参数。
手动挂载时加上 iocharset=utf8 能避免中文文件名乱码,加上 norecovery 可以提高异常中断后的挂载成功率。另外,在 VirtualBox 的“存储”设置里,如果宿主机本身用的是固态硬盘,建议把虚拟机的磁盘控制器类型设置为 NVMe 或 SATA,并在虚拟机设置中开启“使用主机 I/O 缓存”,这能在一定程度上提升共享目录的读写效率。
我自己实际测试过,在共享目录里执行 git clone 大型仓库时,开启“使用主机 I/O 缓存”后耗时比默认设置缩短了三成左右。如果你经常做这类操作,建议花一分钟调整这个选项。
6. 我的实操经验与后续扩展思路
6.1 实操中积累的小技巧
分享几个看似不起眼但很省事的细节,都是反复用出来的经验:
- 共享目录里的文件夹,如果想在 Ubuntu 侧通过软链接快速访问,直接
ln -s /media/sf_share_code ~/share_link就行,不用每次跑一堆路径。输错路径时,Tab 键补全在挂载目录中同样有效。 - 如果虚拟机里跑的是 Server 版没有桌面,自动挂载的目录可能不会出现在
/media下,这时改成 fstab 方式挂载更可靠。 - 以普通用户身份写入共享目录时,如果宿主机开启了 Windows Defender 实时病毒扫描,偶尔会出现文件写入延迟,这是宿主机安全软件在拦截,不是共享配置有问题。
- Ubuntu 里删除共享目录中的文件时,回收站机制不会生效,直接物理删除。所以删除操作前多确认一下,别的手一抖宿主机文件就没了。
6.2 交叉编译与远程开发场景的自然延伸
共享文件夹打通后,能干的事不只是传文件。我在实际工作中用得比较多的是交叉编译场景:宿主机上编写代码,共享目录同步到 Ubuntu 虚拟机里编译运行,因为共享目录是实时可见的,修改代码后虚拟机里立刻就能看到,编译流程非常顺畅。另外一个高频场景是容器化开发,宿主机编写 Dockerfile 和源码,共享目录直接作为虚拟机的构建上下文,省去了每次把代码复制进虚拟机的环节,整套开发链路流畅不少。
这个共享通道后续还能扩展成数据备份通道、内网测试文件分发节点等,但不管怎么扩展,底层就是那一条:增强功能装对、共享目录配好、挂载权限理顺。
6.3 遇到新版本的适配心态
VirtualBox 和 Ubuntu 的版本迭代都比较快,每次大版本升级后,我遇到过的最大概率问题还是增强功能需要重装。因为 Ubuntu 内核升级后,原有的 vboxsf 模块可能和当前内核不匹配,表现为共享目录突然挂载不上。遇到这种情况不必慌,按本文第 2 章的流程重新安装一遍增强功能并重启即可,配置的共享目录本身不会丢。
我在多台宿主机、多个 Ubuntu 版本上实测过,这套流程在 VirtualBox 6.x 到 7.x 上都适用,Ubuntu 18.04 到 24.04 的桌面版和 Server 版也都验证过。只要掌握“先装增强功能、再配共享目录、最后管权限”的主线,后面换版本、换机器都不容易迷路。
这套设置看起来繁琐,但只要完整走通一次,以后就是几分钟的事。回头再面对“虚拟机里怎么拿宿主机文件”这类问题时,你只会觉得:原来就这么简单。
