ARTICLE DETAIL

资讯详情

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

VirtualBox虚拟机添加磁盘全攻略:从图形界面到命令行挂载

VirtualBox虚拟机添加磁盘全攻略:从图形界面到命令行挂载 1. 为什么需要手动给VirtualBox虚拟机加磁盘1.1 真实场景从磁盘耗尽到加盘决策大概三个月前我宿主机上跑了一个编译用的Linux虚拟机创建的时候图省事系统盘只分配了20G用的还是动态分配。一开始觉得绰绰有余装完系统、装好编译工具链还剩下七八个G。结果过了一段时间依赖缓存、构建产物、Docker镜像一多df -h一敲/直接98%。系统开始各种报错日志写不进去sudo命令都慢半拍。当时面临两个选择要么重建一个更大的虚拟机重新部署环境要么直接在现有虚拟机上加一块磁盘把重数据迁过去。重建系统听着干净但意味着环境配置、密钥、缓存全部重来至少折腾一晚上。我果断选择了后者——给VirtualBox虚拟机添加磁盘。这不是什么高级操作是装了VirtualBox之后迟早会碰到的常规维护技能。说实话给虚拟机加盘的需求比想象中高频除了空间不够还有想单独拿一块盘放数据库不想动系统盘但要把日志隔离出去Windows虚拟机想加个D盘用来放安装包……每种场景本质都一样在虚拟机层面加一块虚拟硬盘然后在系统内部把它识别、分区、格式化、挂载。整个流程既涉及图形界面操作也涉及命令行细节我这次一并整理出来。1.2 先搞清楚是扩容还是加数据盘动手之前必须先想明白一件事你是希望原本那个C盘/根分区变大还是多一个新磁盘设备这两个方向操作完全不同。如果你是想让原来的系统盘变大不需要添加新磁盘而是要在VirtualBox里把现有虚拟磁盘文件调大然后在系统内用分区工具扩展分区。这个方案后面单独讲。如果你是想多一块独立的盘不管是Windows下的D盘还是Linux下的/data那就走添加磁盘流程新建一个虚拟磁盘文件挂到存储控制器上再进系统分区格式化。我自己这次的需求是后者编译缓存和构建产物占空间不适合和系统混在一起单独一整块盘管理起来也清爽。另外提醒一句无论哪种方向操作前都先做快照或者备份虚拟机尤其是数据不能丢的环境。VirtualBox的快照功能在Windows和Linux宿主机上都能用新建快照几十秒就完成但关键时刻能救命。1.3 添加磁盘前需要提前确认的三件事在动手前花30秒做三个确认缺一个都可能中途卡壳。第一虚拟机当前必须是关机状态。SATA控制器如果没有勾选允许热插拔开机状态下加盘是不生效的即便勾了也容易遇到系统不自动识别的情况。最稳妥的做法是正常关机再操作不要用暂停状态。第二注意宿主机的剩余磁盘空间。虚拟磁盘无论选择动态分配还是固定大小最终都会占用宿主机空间。我见过有人创建了100G的虚拟磁盘宿主机只剩10G结果虚拟机运行到一半磁盘写满直接卡死排查半天才发现是宿主空间不够。第三检查快照。如果虚拟机有多个快照而且当前状态不是最新分支状态后面用命令行扩容可能报错。这个坑在第6章会展开讲连同解决办法一起写。2. 添加磁盘前必须搞懂的三个概念2.1 虚拟磁盘格式VDI、VHD、VMDK怎么选VirtualBox新建虚拟硬盘时默认会让你选格式列表里有VDI、VHD、VMDK三种。我见过不少人在这一步直接一路Next用默认其实三个格式适用场景不太一样。VDI是VirtualBox原生格式兼容性最稳功能支持最全默认就是我们最终生成的磁盘文件格式。VHD是微软虚拟化产品的标准格式如果以后你可能把这块盘挂到Hyper-V上用选VHD会方便一点但VirtualBox对VHD的高级特性支持不如VDI完整。VMDK是VMware的格式虚拟化环境混用或者要和ESXi迁移时选它更合适但VirtualBox打开VMDK偶尔会有兼容性警告。我的建议很简单没有特殊迁移需求直接用VDI。VirtualBox自己的格式踩坑最少克隆、压缩、调整大小这些维护操作支持得最完整。我在帮别人远程指导时也反复强调不要看VMDK眼熟就选不是越通用越好。2.2 动态分配与固定大小空间占用与实际性能选完格式紧接着就是分配方式这步很多人不重视。动态分配Dynamically allocated的意思是虚拟磁盘文件开始很小比如20G的盘可能刚开始只有几百M的大小随着虚拟系统往里写数据文件逐渐膨胀最大不超过设定上限。固定大小Fixed size则是创建瞬间就把整个大小从宿主机划走。两种方式怎么选我实际体验是固定大小磁盘在连续大量读写时性能略好一点因为它不需要在写入过程中动态扩展文件能减少一部分文件系统层的开销但差别在日常使用里基本感知不到除非你在虚拟机里跑数据库这类高IO负载。动态分配的优势是省空间比如我开了好几个虚拟机每台都分配了50G但实际使用的可能只有10G动态分配宿主机压力就小很多。我的建议如果宿主机是固态硬盘且空间紧张优先动态分配如果虚拟机里要跑重度数据库、大数据组件这类高IO应用可以直接固定大小顺便也能提前确认宿主空间够不够。添加磁盘时可以先用动态分配事后觉得不行也能用VBoxManage把它转成固定大小modifymedium --variant Fixed会花时间重新拷贝数据。2.3 存储控制器IDE、SATA、SAS、NVMe的识别差异VirtualBox的存储设置里控制器类型比很多人想象的更重要。不同控制器类型决定了虚拟机系统里磁盘的设备名和识别方式也直接影响能不能正常启动。典型的VirtualBox虚拟机创建时会有一个SATA控制器默认叫SATA下面挂着系统盘。我这次加盘就是把它加到同一个SATA控制器的下一个端口。SATA控制器的盘在Linux里一般显示为/dev/sdX在Windows里显示为正常磁盘。IDE控制器则是老接口Windows XP这类老系统如果没有SATA驱动必须用IDE口安装否则安装过程就找不到硬盘。SCSI控制器VirtualBox有LsiLogic和BusLogic两种性能更好但需要客户机装对应驱动。新版VirtualBox还支持NVMe控制器Linux新内核能直接用Windows需要装驱动。这里有个关键点给老系统加盘时如果你把它挂到SATA口而系统没有SATA驱动开机后系统里看不到这块新盘但你明明在设置里看到盘已经挂上了。这不是VirtualBox出问题是客户机缺少控制器驱动。我遇到过Windows XP虚拟机加盘不生效的案例最后把盘挂到IDE控制器上才正常识别。普通用户如果系统是Win7以上、常见Linux发行版直接挂SATA就行不用纠结。3. 图形界面添加磁盘的完整操作3.1 第一步打开存储设置前的准备图形界面操作本身不复杂但顺序和细节别跳过。先把正确顺序列出来再补充每一步容易出错的地方。先关闭目标虚拟机然后选中虚拟机点设置进入存储选项卡。这一步记得在VirtualBox主界面选中虚拟机后再点设置不是点虚拟机列表里的某个盘。如果菜单里设置是灰色的说明虚拟机还在运行状态先关机再操作。存储设置页面左边是存储树能看到控制器和现有的虚拟光盘。右侧属性区域显示当前选中的存储设备信息。我们要做的是把一个新造的虚拟硬盘挂到控制器空余的端口上。注意看控制器名称比如默认的SATA控制器下面一般有SATA端口0到端口29可用选中控制器后可以在右侧勾选允许热插拔这个我们一般不勾保持默认。3.2 第二步创建虚拟硬盘并挂载到控制器核心操作是在存储树里选中控制器比如SATA控制器然后点控制器右侧那个添加虚拟硬盘的小图标一个硬盘加号。如果找不到注意看存储树上方的按钮区鼠标放上去会显示添加虚拟硬盘。点击后弹出的窗口有五个选项空添加磁盘文件创建虚拟硬盘添加光盘镜像新建虚拟光盘。这里我们点创建虚拟硬盘——这个选项会打开新建虚拟硬盘向导走一遍格式、分配大小、存储位置三个步骤。关于磁盘大小多说两句。如果给Windows系统盘加D盘按默认提示给个40G到100G都行如果是给Linux加数据盘建议按实际数据量留30%余量。位置保持默认就行VirtualBox会放到底层虚拟机的目录下VirtualBox管理界面的全局设置 常规 默认虚拟电脑位置决定。如果想把所有虚拟磁盘统一管理也可以把新盘放到同一个数据目录比如D:\VMs\disk2.vdi注意路径别带中文和空格否则后面用命令行操作时容易出幺蛾子。点击创建后回到存储设置页刚才创建的磁盘已经挂在控制器上了。此时默认端口号可能是空的不用刻意去调只要不和已有设备冲突即可。确认无误后点确定虚拟机就挂载好新盘了。到这里VirtualBox层面已经完成但还差关键一步——进入虚拟机系统里把那块盘激活。3.3 第三步验证新磁盘是否生效很多人以为在VirtualBox设置里挂上盘就完事了开机进系统发现没有以为失败了。排除法里最重要的一步是确认VirtualBox确实把盘交给了虚拟机。一个快速的检查方法是看存储设置里新盘的信息确认位置字段是某个.vdi路径而不是不可访问或无效设置。另一个方法是启动虚拟机前在VirtualBox主界面底部状态栏找相关磁盘提示老版本VirtualBox并不直接显示所以更可靠的办法是进系统后用磁盘工具看。Windows系统下右键此电脑 - 管理 - 磁盘管理如果看到一块未初始化的新磁盘说明VirtualBox传盘成功这时就进入系统内挂载阶段。Linux下执行lsblk如果看到sdb之类的设备不同于系统盘的sda同样说明VirtualBox传盘成功。确认成功后再进行分区挂载千万别一进系统就开始格式化先确认盘符确实是新增的那块盘。4. 系统内部识别与挂载Linux和Windows两条线VirtualBox把磁盘送到虚拟机门口不等于系统已经准备好使用。第3章做完只是接上了线操作系统要真正使用它还需要在系统内部做磁盘初始化。下面按Linux和Windows两个常见系统分别说明。4.1 Linux下从识别到挂载的完整链路Linux里加盘的核心命令就几条按顺序走基本不出错。第一步查看新盘是否被识别lsblk如果看到类似sdb的设备而之前没有说明盘已经被系统识别。假如你记不清之前的磁盘列表可以用lsblk -f顺便看看文件系统类型此时新盘通常是空的没有文件系统。第二步分区。现代Linux用fdisk或parted都行虚拟磁盘推荐整块盘做一个分区sudo fdisk /dev/sdb进入fdisk交互界面后输入n新建分区默认全盘大小直接回车输入w写入分区表。写完后执行sudo partprobe刷新分区表老内核可能需要重启再用lsblk确认出现sdb1。第三步格式化。按你的文件系统需求选择一般Linux内部数据盘用ext4就够想和Windows兼容可以考虑exFAT或NTFS但这个场景很少见sudo mkfs.ext4 /dev/sdb1第四步挂载。先建一个挂载点目录比如/datasudo mkdir -p /data sudo mount /dev/sdb1 /data这时候df -h已经能看到新盘了。但要记住mount命令是临时的重启后会失效。要让系统开机自动挂载需要把它写进/etc/fstab。建议用分区的UUID而不是设备名因为设备名/dev/sdb1在以后调整盘顺序时可能变化UUID才稳定。sudo blkid /dev/sdb1 # 输出类似 /dev/sdb1: UUIDxxxx TYPEext4然后把下面这行追加到/etc/fstab末尾UUIDxxxx /data ext4 defaults 0 2写完之后用sudo mount -a验证配置是否正确没有报错就是成功了。这里有个常见误区fstab的挂载点目录必须是已经存在的如果目录不存在开机时会报错建议先mkdir -p再写fstab。4.2 Windows下从识别到分区的步骤Windows加盘比Linux更图形化。开机进入Windows后右键开始按钮选磁盘管理或者按WinR输入diskmgmt.msc。如果是Windows Server一般会多一步新磁盘默认脱机需要右键选联机。然后弹出初始化磁盘窗口选择MBR还是GPT——如果这块盘小于2TBMBR足够如果大于2TB建议直接用GPT。初始化完成之后磁盘管理里会出现一整块未分配的空间。右键选新建简单卷按照向导一路下一步分配盘符、选择文件系统NTFS默认分配单元大小默认即可、设置卷标最后完成。完成后在此电脑里就能看到新盘符了容量、可用空间一目了然。Windows场景还要注意一个点如果是给Windows 7、XP这类老系统加的盘盘可能无法正常识别。如果磁盘管理里能看到磁盘但提示无法初始化或者初始化卡在正在联系磁盘服务之类的状态多半是VirtualBox控制器的驱动问题。之前遇到过Windows落在AHCI控制器下有盘不认换到IDE控制器马上好了这种解法在控制器部分已经提过。4.3 挂载后如何确认数据真的能写不要以为挂载完就完事最保险的是实际读写验证一下。Linux下可以这样sudo dd if/dev/zero of/data/testfile bs1M count1024 sync sudo rm /data/testfile这条命令向挂载目录写一个1G的测试文件然后同步落盘再删掉。如果没报错说明新盘的挂载是可用的权限、文件系统都正常。Windows下直接往新盘符里复制几个大文件再重启一次确认数据还在就算验证完成。有些人在这一步会踩到权限坑Linux下/data挂载后普通用户写不了需要chown或sudo操作建议按需调整属主sudo chown $USER:$USER /data5. 不新建磁盘直接扩容的替代方案加数据盘是加法但不少人真正的诉求是把原来的盘变大。这一章说清楚更省事也更常见的扩容方案。5.1 用VBoxManage直接调大原虚拟磁盘VirtualBox给现有虚拟磁盘扩容的工具是VBoxManage。首先找出虚拟机磁盘文件路径可以用下面的命令VBoxManage showvminfo 你的虚拟机名 | grep -i vdi或者直接在存储设置里看磁盘的位置字段。确认路径后执行VBoxManage modifymedium disk /path/to/你的磁盘.vdi --resize 40960其中40960是MB即扩容到40G。注意这里给的是目标总大小不是追加大小。比如原来20G想加到40G就填40960。执行完成后进入虚拟机系统用分区工具把新建的未分配空间扩展到现有分区。Linux用fdisk或growpartWindows用磁盘管理右键扩展卷。系统分区如果用的是LVM则还要先pvresize再lvextend这块内容比较多这里不展开。5.2 快照和不可变镜像对扩容的限制modifymedium --resize听着简单但有两个前提经常让人卡住。第一个是快照。如果虚拟机当前拥有一个或多个快照而且当前状态不是你最后一次做快照后的当前态分支VirtualBox会拒绝resize报错大意为无法调整大小因为有快照依赖该磁盘。解决办法有两个把所有快照删除合并会丢失快照点谨慎或者把当前状态克隆成一个不依赖快照的新磁盘再扩容。我更推荐后者因为快照有时候是救命稻草为扩容删快照风险很高。克隆命令VBoxManage clonemedium disk /path/原来.vdi /path/克隆.vdi克隆完成后把虚拟机里原来的磁盘换成克隆盘再对新盘做resize这样能保住原来的快照链建议先关虚拟机再换盘。第二个是磁盘类型。如果创建时选择了不可变镜像immutable或磁盘设置了加密resize同样会失败。解决方法是在设置里把盘重新改为正常类型如果允许的话或者重新克隆成标准盘再操作。5.3 动态分配磁盘的只长不缩与压缩技巧动态分配的虚拟磁盘有个特性增长容易回收难。你删掉了虚拟机里几十G数据但宿主上.vdi文件大小并不会自动缩回去因为VirtualBox不知道哪些空间还是脏的。要压缩必须做一次零填充清理再压缩。Linux客户机里可以用zerofree或dd写零来清理未使用空间注意一定是在卸载分区后执行否则数据危险Windows里可以用sdelete的-z参数做零填充。清理完成后在虚拟机完全关闭的状态下执行VBoxManage modifymedium disk /path/磁盘.vdi --compact--compact会扫描虚拟磁盘里的零块并从镜像文件中丢弃宿主机上文件大小自然就缩回来了。这个操作很多文章提过但真正常用的人不多——其实在频繁增删数据的虚拟机里非常实用建议每隔一段时间做一次。顺带提一句固定大小的虚拟磁盘不能--compact因为它本身就是分配满的压缩无意义。如果想彻底优化可以把固定大小转成动态分配VBoxManage modifymedium disk /path/磁盘.vdi --variant Standard不过这个操作同样会重新拷贝数据耗时会比较久转换前务必确认宿主机空间充足。6. 添加磁盘过程中的典型踩坑与排查链路最后这一部分我把实际VirtualBox加盘过程中最容易踩的坑按现象 - 排查 - 解决的方式写一遍。这些问题很多在官方文档里找不到但社区里每天都有大量讨论。6.1 坑一启动虚拟机报 rc-1908 内核驱动未加载有段时间我给宿主机升级了内核重启后一打开VirtualBox虚拟机直接弹出错误Kernel driver not installed (rc-1908) The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv这个错误和添加磁盘本身没有直接关系但它会阻断你任何进一步操作。原因是VirtualBox的内核模块需要针对当前运行的Linux内核版本重新编译内核升级后模块没跟上vboxdrv加载失败。排查顺序是这样的先看模块服务状态sudo systemctl status vboxdrv如果显示加载失败执行sudo /sbin/vboxconfig它会调用本机编译工具链重新编译vboxdrv。编译前需要安装相应的内核开发包sudo apt install linux-headers-$(uname -r) build-essentialFedora系用dnf install kernel-devel kernel-headers gcc make。重编完成后再sudo systemctl restart vboxdrv然后重启VirtualBox。还有一个隐蔽原因是Secure Boot。很多新机器默认开启Secure Boot而内核模块没有签名时会被拒绝加载。如果执行vboxconfig时提示模块签名失败要么给模块签名要么进BIOS暂时关掉Secure Boot。装Linux系统时如果开启了Secure Boot官方推荐用MOKMachine Owner Key方式导入密钥但步骤比较繁琐很多新手直接把Secure Boot关了——这也是可行方案只要你能接受安全级别略降。6.2 坑二用命令行动作时提示VBoxManage不存在或权限不足有时候图形界面操作到一半需要命令行辅助结果终端输入VBoxManage直接提示command not found。这个通常是因为VirtualBox的命令行工具不在PATH环境变量里。Windows下要进VirtualBox的安装目录比如C:\Program Files\Oracle\VirtualBox在CMD/PowerShell里先cd再执行或直接写全路径 C:\Program Files\Oracle\VirtualBox\VBoxManage.exe list vmsLinux下如果是用发行版仓库装的通常VBoxManage已经在/usr/bin里如果是官方包独立安装就可能在/opt/VirtualBox/VBoxManage需要自己加软链或写全路径。此外涉及修改虚拟机的命令都需要root权限或至少当前用户属于vboxusers组如果遇到Access is denied可以检查sudo或用户组。实际操作中我还遇到过一种情况虚拟机进程还在运行你执行modifymedium相关命令报VMDI is locked之类的错误。原因很简单磁盘被正在运行的虚拟机占用了先把虚拟机关掉再操作。VirtualBox的图形界面可能看不出虚拟机没完全退干净确认方法是用ps aux | grep VBoxHeadless或者任务管理器看VBoxSVC是否还在。6.3 坑三克隆或复制虚拟磁盘后UUID冲突给虚拟机加盘时可能会图省事直接复制一个已有.vdi文件过来用。这么做有个坑同一个vdi文件被两个虚拟机挂载或者同一份vdi在同一个虚拟机里挂了两遍会在启动时收到类似磁盘有重复的UUID的报错。因为VirtualBox靠UUID区分磁盘复制也把UUID复制了。正确做法是用VirtualBox自身的克隆命令VBoxManage clonemedium disk /path/原来.vdi /path/新副本.vdi它会给新磁盘生成新的UUID。如果已经复制了文件也可以用这个命令修改UUIDVBoxManage internalcommands sethduuid /path/复制过来的.vdi这个命令会为现有vdi重新生成UUID适合救急。另外如果要把这个vdi再挂到别的虚拟机VirtualBox在图形界面添加磁盘文件时也会自动重新生成UUID所以很多时候其实不需要手动操心但理解原理能帮你快速判断报错原因。6.4 坑四老版本VirtualBox与新系统或特定工具的兼容性问题搜索里经常会看到ENSP与VirtualBox不兼容virtualbox 5.2.44这类词。华为的ENSP模拟器工具早期版本依赖VirtualBox 5.2.x系列如果装了新版VirtualBox 6.xENSP创建的AR设备会启动失败网上很多讨论围绕旧版VirtualBox无法在新系统上安装或无法启动服务展开。这和你给虚拟机加盘有什么关系关系大了——不少人用ENSP想给模拟设备扩容结果发现底层VirtualBox驱动起不来所以看到的错误不是加盘失败而是虚拟机根本启动不了。这类问题的排查思路一般就两步确认ENSP要求的VirtualBox版本然后卸载当前版本安装匹配的旧版本。旧版本在Win10/11上安装时可能弹兼容性警告右键安装包选兼容性疑难解答或者以管理员身份运行能解决一部分问题。新版操作系统下旧版VirtualBox内核驱动可能无法通过签名校验这时可以参考6.1的Secure Boot处理思路优先用MOK签名或临时关闭Secure Boot完成模块加载。说完这个特殊的兼容性场景还想提一个操作习惯无论给哪个虚拟机加盘推荐在VirtualBox安装目录下用VBoxManage list vms先确认虚拟机名字和UUID很多命令报错就是因为虚拟机名称写错或者带了空格。比较稳的做法是先用下面命令拿到唯一名称VBoxManage list vms输出格式类似Ubuntu-Web {4f6d6c1f-...}然后把名字原样加引号传到命令里避免空格问题。7. 几个能直接抄作业的收尾技巧加盘这件事操作完按我的习惯还会顺手做三件事也算是不成文的经验。第一把新增磁盘的信息记录在虚拟机的备注里。VirtualBox主界面右键虚拟机选设置 - 描述把磁盘路径、容量、挂载点写清楚。时间一长虚拟机多了你会感谢当年的自己。第二设置vboxusers组权限把日常用户加进去避免每次操作都要sudosudo usermod -aG vboxusers $USER加完组需要重新登录生效。这一步做一次后面用VBoxManage便捷很多。第三磁盘的备份不要靠快照一辈子。快照是针对虚拟机状态的和vdi文件增长没有必然关系如果条件允许用VBoxManage clonemedium定期把重要vdi克隆一份到独立磁盘。我经历过一次宿主机磁盘损坏后靠克隆盘快速恢复环境的情况那会儿才真正体会到任何虚拟机磁盘操作前多留一手永远不亏。这次的完整流程从为什么要加盘讲到图形界面加盘再从系统内挂载讲到命令行扩容最后把常见的驱动问题、UUID冲突和版本兼容性坑也过了一遍。VirtualBox的磁盘操作整体并不复杂复杂的是操作前想清楚需求、操作中认真核实每一步、操作后留好退路。下次如果虚拟机再报磁盘空间不足打开这篇照着走基本不会卡住。
返回列表