☰
VirtualBox虚拟机迁移实操:vdi文件搬家与vboxmanage命令行全流程
2026/10/20 9:37:11 网站建设 项目流程

C盘红了,这是很多 VirtualBox 用户绕不过去的坎。虚拟机装了几个系统之后,一个 .vdi 虚拟硬盘少说二三十 GB,多则一两百 GB,全都堆在系统盘里,磁盘空间告急只是时间问题。这时候最直接的办法就是给虚拟机“更换目录”,把虚拟硬盘甚至整个虚拟机目录搬到别的分区或外置硬盘。这个操作不算复杂,但里面有几个关键点如果不搞明白,很容易折腾到虚拟机起不来。这篇文章我会把迁移流程、vboxmanage 命令行用法、快照处理和常见坑都完整过一遍,帮你一次搞定。

1. 迁移前的准备:先摸清虚拟机目录的构成

1.1 虚拟机目录里到底有什么

大部分人对虚拟机的印象就是一个窗口里跑着系统,但在磁盘上,一台虚拟机是由一组文件构成的。默认情况下,VirtualBox 会把每台虚拟机放在一个单独的文件夹里,例如C:\Users\你的用户名\VirtualBox VMs\Win10测试。这个文件夹里通常有这几个东西:

  • .vbox文件:虚拟机的硬件配置文件,记录内存大小、CPU 核心数、网卡设置、存储控制器连接关系等。它本质上是一个 XML 文件。
  • .vdi文件:虚拟硬盘,是虚拟机系统和数据的真正载体,体积最大。
  • .vbox-prev文件:上一次配置变更前的自动备份,防止你改坏配置时有后悔药。
  • .sav文件:虚拟机处于“保存状态”时产生的内存镜像,相当于把整个系统暂停并在磁盘上留了个快照。
  • Snapshots子目录:存放快照的差分虚拟硬盘文件。只要你在 VirtualBox 里对虚拟机做过快照,这个目录就会出现,里面的文件会和根 .vdi 构成一条父子链。

很多新手以为只要把 .vdi 拷走就完事了,但 .vbox 里还记着磁盘的路径和挂载关系。你移动了 .vdi 却不改 .vbox 里的引用,启动时 VirtualBox 就会满世界找那个旧路径,然后抛出一个“找不到虚拟硬盘”的报错。所以迁移的核心并不是“复制文件”这么简单,而是“移动文件 + 更新注册信息”。

1.2 两条迁移路线的选择逻辑

针对“更换目录”这个需求,实际操作中存在两条差别很大的路线:

第一条是“只迁移虚拟硬盘”。虚拟机配置文件、快照文件留在原位置,只把 .vdi 挪到新目录,然后通过命令或界面更新虚拟介质注册和挂载信息。这种方式适合你想把系统盘腾出来、但虚拟机的其他小文件无所谓的场景。

第二条是“整体迁移虚拟机目录”。把整个虚拟机文件夹从 C 盘搬到 D 盘或外置硬盘,然后重新注册虚拟机。这种方式最稳定,因为它把 .vbox、.vdi、.sav、快照链全都保持原样搬走,只要注册路径正确,基本上不会有幺蛾子。

选哪条,取决于你有没有快照、这个虚拟机是否能接受短暂的停机、目标磁盘空间是否足够。我的建议是:如果条件允许,优先选整体迁移;如果只想挪走大体积的 .vdi,再考虑第一条。

1.3 动手前必须确认的三件事

我每次迁移前都会强制自己过一遍这三件事,缺一件都可能让后面的步骤白做:

  1. 虚拟机必须处于关机状态,而不是“保存状态”。关机就是像正常 Windows 一样关闭系统,状态是“已关机”。如果状态是“已保存”,目录里会留下 .sav 文件。保存状态和虚拟机当前运行时的内存有关,路径变化后 VirtualBox 在恢复时会因为找不到内存镜像或路径不匹配而出问题。稳妥起见,开机进入系统正常关机,或者直接右键虚拟机选择“关机”。

  2. 先看快照列表。打开 VirtualBox 主界面,选中虚拟机,在右侧“快照”标签页里看有没有快照记录。有快照就说明存在差分盘,差分盘和基础盘之间有父子引用关系,单独移动根盘很容易断链。如果你根本不打算保留快照,提前删掉所有快照,让系统把改动合并回基础盘,这一步反而能简化后续迁移。

  3. 目标目录空间充足,而且迁移期间不要断电。看起来是废话,但很多人栽在这上面。一个 100 GB 的虚拟硬盘,复制过程可能要几十分钟甚至更久,如果复制到 U 盘或者移动硬盘这种不稳定介质上,中途断了就全废。建议先把虚拟机关机,再复制文件,复制完成后核对一下文件大小或哈希值,确认无误再删除旧文件。

2. vboxmanage 命令行迁移的全流程实录

2.1 查清虚拟机名称、控制器和硬盘

VirtualBox 图形界面里没有“Change Folder”这种一键搬家按钮,所以我更习惯用 vboxmanage 命令行。它是 VirtualBox 自带的工具,Windows、Linux、macOS 都可用。先查一下当前有哪些虚拟机:

vboxmanage list vms

输出格式大概是:

"Win10测试" {0e3f6a1d-2e2b-4f7c-9a23-8a0e5b6c7d8e} "UbuntuServer" {1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d}

记住你要操作的虚拟机名称,比如Win10测试。接着查看这台虚拟机的配置,重点是存储控制器和当前磁盘挂载位置:

vboxmanage showvminfo "Win10测试" | findstr /i "SATA Controller"

如果你在 Linux 或者 macOS 下操作,把findstr换成grep:

vboxmanage showvminfo "Win10测试" | grep -i "SATA Controller"

输出里能看到类似这样的内容:

SATA Controller (0, 0): C:\Users\me\VirtualBox VMs\Win10测试\Win10测试.vdi (UUID: 3a7b9c2d-4e5f-4a6b-8c7d-9e8f7a6b5c4d)

这行信息很关键:SATA Controller是存储控制器名称,(0, 0)表示端口 0、设备 0,后面是硬盘的完整路径和 UUID。这三个信息后面都要用到。有些虚拟机用的是 IDE 或 SAS 控制器,写法类似,比如IDE Controller (1, 0)。

再顺手看一眼全局介质注册表,确认这台硬盘在系统里的注册状态:

vboxmanage list hdds

输出里会列出所有已被 VirtualBox 识别的虚拟硬盘,包括 UUID、父 UUID、格式、完整路径和类型。找到你刚才那个 .vdi 的 UUID,记下来。如果看到 State 一栏是created,说明它正常注册;如果显示closed,说明它已经处于未挂载状态。

2.2 解挂硬盘并关闭旧介质注册

迁移前,第一步是让虚拟机“放弃”这块硬盘的连接。这一步用 storageattach 命令,把挂载位置上的介质置为 none,意思是“解除这个端口上的硬盘连接”:

vboxmanage storageattach "Win10测试" --storagectl "SATA" --port 0 --device 0 --type hdd --medium none

这里有几个参数要仔细核对:--storagectl后面的名称必须和 showvminfo 里完全一致,--port和--device必须对上前面看到的(0, 0)。如果你写错端口,命令会直接报错说找不到可用的设备槽。这一条命令执行成功后,虚拟机配置里就没有这块硬盘了,但磁盘文件还留在原目录。

紧接着把这块磁盘从 VirtualBox 的全局介质注册表里“关掉”。这条命令叫 closemedium,意思是关闭这个介质的注册,但不会删除文件:

vboxmanage closemedium "C:\Users\me\VirtualBox VMs\Win10测试\Win10测试.vdi"

注意这里要用完整的旧路径。如果系统提示介质仍被占用,说明上一步的 storageattach 没成功,或者后台的 VBoxSVC 进程还锁着文件。这种情况下不要硬来,先确认 VirtualBox 主界面、后台托盘图标都已经退出,再试一次。

为什么必须先解挂、再关闭注册,顺序不能反?因为 VirtualBox 中一台虚拟机的存储控制器仍然引用着这块介质时,closemedium 会拒绝执行,它会认为这块盘正在被使用。手动先断开连接,再关闭介质注册,就相当于先把 VM 和磁盘之间的“管线”拔掉,再去注销磁盘本身的身份。如果反着来,很容易遇到各种锁定错误。

2.3 移动虚拟硬盘并重新挂载

现在文件已经处于“无主”状态,可以放心移动了。移动和复制在效果上有区别:移动省时间且不留旧文件,但当目标路径上的文件已经存在时会直接覆盖;复制则更安全,因为源文件还在,可以随时回滚。我的习惯是先复制,验证没问题再删源文件,但这样需要双倍磁盘空间。

在 Windows PowerShell 里移动:

Move-Item "C:\Users\me\VirtualBox VMs\Win10测试\Win10测试.vdi" "D:\VMs\Win10测试\"

或者在 Linux 下:

mv "/home/someone/VirtualBox VMs/Win10测试/Win10测试.vdi" "/mnt/d/VMs/Win10测试/"

如果你用的是外置硬盘,提前把外置盘挂载好,确认路径可写。文件大时等待时间比较长,不要中途直接拔盘。

文件移动到新位置后,把新路径重新挂载回虚拟机的 SATA 控制器:

vboxmanage storageattach "Win10测试" --storagectl "SATA" --port 0 --device 0 --type hdd --medium "D:\VMs\Win10测试\Win10测试.vdi" --mtype normal

最后的--mtype normal表示这块虚拟硬盘的类型是普通的可读写盘。如果你原先是 immutable(不可变盘)或者其他类型,要改成对应的类型;拿不准就还写 normal,绝大多数情况都是这个。

挂载完成后,可以用 showvminfo 再确认一次,看 SATA Controller 那行的路径是否已经指向新目录:

vboxmanage showvminfo "Win10测试" | findstr /i "SATA Controller"

看到新路径出现在输出里,说明配置已经生效。

2.4 启动验证与旧文件清理

配置改完不是终点,真正的验证是启动虚拟机,进去跑一圈。我先启动看看能不能进系统:

vboxmanage startvm "Win10测试" --type gui

正常进入系统后,我会做三件事:

  1. 打开系统盘的磁盘管理,确认虚拟硬盘的容量、分区都和迁移前一样;
  2. 随便打开几个软件,或者读写几个文件,确认系统在“新路径”下没有 IO 异常;
  3. 关机,再启动一次,确保冷启动也没问题。

如果一切正常,再回头看旧目录。因为前面如果是用“复制”方式,旧目录里还躺着一份完整的 .vdi,确认新虚拟机稳定运行后就可以删掉。如果旧目录里还有一些无关紧要的 .vbox、.sav 文件,也一并处理掉,避免以后打开 VirtualBox 时误注册到旧配置。

这里要特别提醒一句:删除旧文件时,务必确认你删的是旧路径下的文件,而不是新路径下的。我曾经见过有人复制完之后搞混方向,结果把新目录里的文件删了,旧目录反而留着,等于又回到了原点。最稳妥的办法是,在删除前先看一眼文件的修改时间或者大小,做到心里有数。

3. 特殊场景与进阶操作

3.1 带快照的虚拟机怎么迁最省心

快照是很多人的习惯,尤其在调试系统或者做实验时,时不时拍个快照。但迁移时,快照就是最大的变量。每个快照都会生成一个差分盘,存放在Snapshots子目录里,差分盘依赖它的父盘,父盘可能是基础盘,也可能是更早的快照盘。如果你只移动了根盘,快照差分盘的父盘引用就会失效,启动时会直接报错。

我对带快照虚拟机的迁移建议分两种:

  • 不想保留快照:在 VirtualBox 主界面里右键快照,选择“删除”,等 VirtualBox 把差分盘的数据合并回父盘。这个过程可能很漫长,取决于快照之后产生的数据量,但完成后整个虚拟机就只有一块基础盘,后续迁移就变成普通场景了。删快照时不用害怕,VirtualBox 的“删除”默认是合并数据而不是删除虚拟硬盘文件,和你理解的“丢弃快照”是一回事。
  • 必须保留快照:不要单独移动 .vdi,而是选择整体迁移整个虚拟机目录。因为整体移动时,Snapshots目录里的差分盘和根盘一起搬走,路径关系保持不变,快照链不会断。

3.2 整体移动虚拟机目录并重新注册

整体迁移是最省心的一条路。操作流程如下:

先复制整个虚拟机目录,例如:

Copy-Item "C:\Users\me\VirtualBox VMs\Win10测试" "D:\VMs\Win10测试" -Recurse

然后在 VirtualBox 中取消注册这台虚拟机,但保留磁盘文件不删。这一步很重要,很多人后面发现“虚拟机已经存在”就是因为没做这一步:

vboxmanage unregistervm "Win10测试" --keep

--keep参数的意思是只移除虚拟机的注册信息,不删除任何文件。如果没有这个参数,它会连同 .vdi 一起删掉,那损失就大了。

接着注册新路径下的 .vbox 文件:

vboxmanage registervm "D:\VMs\Win10测试\Win10测试.vbox"

注册成功后,列表里会出现一台虚拟机,名称和原来一样。启动前先看一眼确认路径正常,再开机。由于 .vbox 内部大量使用相对路径,整体目录移动后内部的磁盘引用通常不需要手动修改,这就是它比“只移 vdi”更省心的根本原因。

3.3 手动修改 .vbox 路径引用的场景

有时候你不愿意重新注册,或者迁移的是第二块数据盘,那直接编辑 .vbox 文件也是一种办法。.vbox 是纯文本 XML 文件,可以用记事本或者 VS Code 打开。找里面包含location=并且指向 .vdi 的标签,把它改成新路径。

例如原来:

<HardDisk uuid="{3a7b9c2d-...}" location="C:\Users\me\VirtualBox VMs\Win10测试\Win10测试.vdi" format="VDI" type="Normal"/>

改成:

<HardDisk uuid="{3a7b9c2d-...}" location="D:\VMs\Win10测试\Win10测试.vdi" format="VDI" type="Normal"/>

改这种文件时有个原则:先备份再修改。复制一份 .vbox 到别处,改坏了还能还原。另一个容易踩的坑是,XML 里的反斜杠和转义符。Windows 路径里的反斜杠在 XML 中不需要转义,所以可以直接写D:\VMs\...,但有些编辑器会自作聪明地转成D:\\VMs\\...,导致 VirtualBox 读不到正确路径。改完后建议用 VirtualBox 打开虚拟机看一眼,一旦报路径错误,多半就是这里出了问题。

3.4 顺手改掉新建虚拟机的默认目录

“更换目录”这件事,除了迁移现有虚拟机,还有一个前置性的需求:如何让以后新建的虚拟机默认就不往 C 盘放。这个用一条命令就能解决:

vboxmanage setproperty machinefolder "D:\VMs"

执行之后,VirtualBox 再新建虚拟机时,默认目录就会变成D:\VMs。这条命令不影响已经存在的虚拟机,它们各自的路径仍然保持原样。我习惯在迁移完一台虚拟机后顺手执行一次,因为不这么做的话,下一次新建虚拟机的时候它又会傻乎乎地跑回系统盘,等于白折腾一场。

4. 常见问题排查与实操经验

4.1 启动报错速查表

迁移过程中最容易遇到的就是启动时报错,我把实际遇到过的几种典型情况整理成一张表,方便你对号入座:

报错或现象出现原因处理办法
Cannot open the disk image ... is already registered介质 UUID 冲突或重复注册用 vboxmanage closemedium 关闭旧注册;必要时执行 vboxmanage internalcommands setvdiuuid "新路径.vdi" 给磁盘重新生成 UUID
Could not find the virtual disk路径未更新或文件不在目标目录检查 storageattach 挂载路径和 .vbox 中的 location 是否指向新目录
VERR_PATH_NOT_FOUND目标目录不存在或拼写错误先创建好新目录,再执行挂载命令
The machine 'xxx' is already registered旧注册信息还在,新路径又注册了一次执行 vboxmanage unregistervm "xxx" --keep 解除旧注册
启动后卡在开机的转圈界面vdi 文件损坏或快照链断了核对文件哈希,确认源文件完整;有快照时先合并快照再迁移
文件被锁定、无法移动或删除VirtualBox 后台进程 VBoxSVC 仍在占用文件退出 VirtualBox 主程序和系统托盘图标,必要时在任务管理器结束 VBoxSVC 进程

我见过的最多的一种情况是:迁移后启动提示“找不到虚拟硬盘”,但文件明明在新目录里。这种绝大多数是挂载时路径写错了,或者 .vbox 里还留着旧路径。先运行vboxmanage showvminfo "虚拟机名"看 SATA Controller 显示的实际路径,再对比实际文件位置,通常一眼就能发现问题。

4.2 路径中的空格、中文和盘符问题

虚拟硬盘路径里带空格非常常见,比如C:\Users\Me\My Virtual Machines\。命令行操作时,所有路径都必须用英文双引号包起来,否则命令会把它拆成多个参数。另外 VirtualBox 对中文字符的兼容性虽然这几年好了不少,但在老版本上,中文路径偶尔会引发无法创建会话或者显示乱码的问题。我个人的习惯是迁移后的目录统一用英文命名,比如D:\VMs\Win10Test,能省掉很多莫名其妙的坑。

盘符问题则更隐蔽。如果你把虚拟机从 C 盘迁移到了外置移动硬盘,今天插上显示E:,明天插上变成F:,那 .vbox 里的绝对路径就失效了。这种情况有两个思路:一是每次插入后都给移动硬盘分配固定盘符,在 Windows 的磁盘管理里可以把分区设置为指定盘符;二是尽量用相对路径,比如让 .vbox 和 .vdi 都放在同一个文件夹下,.vbox 里写相对路径,这样盘符变了也不影响。

4.3 多硬盘、光驱等挂载项的迁移提醒

一台虚拟机如果挂载了多块虚拟硬盘,比如系统盘一块、数据盘一块,那迁移时每块盘都要单独处理。每一块都要执行一次 storageattach 解挂、closemedium、移动文件、再挂载的完整流程。挂载时注意端口不能冲突,第一块盘通常在--port 0 --device 0,第二块可能在--port 1 --device 0,具体以 showvminfo 输出为准。

另外还有一类容易被忽略的挂载项:光驱里加载的 ISO 镜像。如果 ISO 文件也放在旧目录或者旧盘上,迁移后光驱设备会尝试访问一个不存在的路径,导致虚拟机开机自检时报错。处理办法是在迁移前把光驱里的镜像卸载,或者迁移后重新给光驱挂载新的 ISO 路径。

4.4 我的操作习惯和避坑心得

十几台虚拟机的迁移经验下来,我自己总结了一套操作习惯,每次照着走踩坑概率很低:

第一,先复制,后移动,再删除。空间允许就复制,复制完先启动一次新路径的虚拟机,确认进入系统、磁盘读写正常后,再删除旧文件。空间不允许只能移动时,迁移前先把旧虚拟机的磁盘拍个快照或者备份一份关键数据。这个多花的时间,相比迁移失败后重新配环境的成本,是完全值得的。

第二,迁移前先做一次“干净关机”。不是保存状态,不是直接关 VirtualBox 窗口,而是进入系统正常关机。这样能确保所有虚拟磁盘和状态文件都处于一致状态,复制出来的文件才可能是可用的。

第三,移动巨型 .vdi 时不要省校验这一步。我移动完一个 80 GB 的系统盘后,因为图快跳过了校验,直接启动,结果系统在滚动开机画面时反复重启。后来重新对比源文件和目标文件的哈希值,发现是复制时磁盘内存缓存刷写异常,某个扇区没写完整。虽然有备份可以回滚,但那半天时间白折腾了。现在无论多急,复制完至少对比一下文件大小,再启动虚拟机。

最后分享一个小技巧:迁移完所有虚拟机后,打开 VirtualBox 的“虚拟介质管理器”,看看列表里还有没有显示为“无法访问”或者路径在前面目录的旧介质。如果有,右键移除即可。这一步能把迁移后的残留注册信息彻底清干净,避免下一次打开虚拟机时 VirtualBox 弹出一堆路径失效警告。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询